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
|