Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <memory> 8 : #include <string> 9 : #include <vector> 10 : 11 : #include "DataStructures/ComplexDataVector.hpp" 12 : #include "DataStructures/Tensor/TypeAliases.hpp" 13 : #include "Domain/Tags.hpp" 14 : #include "Elliptic/BoundaryConditions/BoundaryCondition.hpp" 15 : #include "Elliptic/BoundaryConditions/BoundaryConditionType.hpp" 16 : #include "Options/String.hpp" 17 : #include "Utilities/Gsl.hpp" 18 : #include "Utilities/TMPL.hpp" 19 : 20 : namespace GrSelfForce::BoundaryConditions { 21 : 22 : /*! 23 : * \brief Applies no boundary condition at all. Used to impose nothing but 24 : * regularity at the horizon in horizon-penetrating coordinates. 25 : */ 26 1 : class None : public elliptic::BoundaryConditions::BoundaryCondition<2> { 27 : private: 28 0 : using Base = elliptic::BoundaryConditions::BoundaryCondition<2>; 29 0 : using GradTensorType = 30 : TensorMetafunctions::prepend_spatial_index<tnsr::aa<ComplexDataVector, 3>, 31 : 2, UpLo::Lo, Frame::Inertial>; 32 : 33 : public: 34 0 : static constexpr Options::String help = 35 : "Applies no boundary condition at all. Used to impose nothing but " 36 : "regularity at the horizon in horizon-penetrating coordinates."; 37 0 : using options = tmpl::list<>; 38 : 39 0 : None() = default; 40 0 : None(const None&) = default; 41 0 : None& operator=(const None&) = default; 42 0 : None(None&&) = default; 43 0 : None& operator=(None&&) = default; 44 0 : ~None() override = default; 45 : 46 : /// \cond 47 : explicit None(CkMigrateMessage* m); 48 : using PUP::able::register_constructor; 49 : WRAPPED_PUPable_decl_template(None); 50 : /// \endcond 51 : 52 0 : std::unique_ptr<domain::BoundaryConditions::BoundaryCondition> get_clone() 53 : const override; 54 : 55 0 : std::vector<elliptic::BoundaryConditionType> boundary_condition_types() 56 : const override { 57 : return {elliptic::BoundaryConditionType::Neumann}; 58 : } 59 : 60 0 : using argument_tags = tmpl::list<>; 61 0 : using volume_tags = tmpl::list<>; 62 : 63 0 : void apply( 64 : gsl::not_null<tnsr::aa<ComplexDataVector, 3>*> field, 65 : gsl::not_null<tnsr::aa<ComplexDataVector, 3>*> n_dot_field_gradient, 66 : const GradTensorType& deriv_field) const; 67 : 68 0 : using argument_tags_linearized = tmpl::list<>; 69 0 : using volume_tags_linearized = tmpl::list<>; 70 : 71 0 : void apply_linearized( 72 : gsl::not_null<tnsr::aa<ComplexDataVector, 3>*> field_correction, 73 : gsl::not_null<tnsr::aa<ComplexDataVector, 3>*> 74 : n_dot_field_gradient_correction, 75 : const GradTensorType& deriv_field_correction) const; 76 : 77 : private: 78 0 : friend bool operator==(const None& lhs, const None& rhs); 79 : }; 80 : 81 0 : bool operator!=(const None& lhs, const None& rhs); 82 : 83 : } // namespace GrSelfForce::BoundaryConditions