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 <pup.h>
8 :
9 : #include "DataStructures/DataBox/Prefixes.hpp"
10 : #include "DataStructures/DataVector.hpp"
11 : #include "DataStructures/TaggedTuple.hpp"
12 : #include "DataStructures/Tensor/Tensor.hpp"
13 : #include "Elliptic/Systems/Elasticity/Tags.hpp"
14 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
15 : #include "NumericalAlgorithms/Spectral/Mesh.hpp"
16 : #include "Options/String.hpp"
17 : #include "PointwiseFunctions/InitialDataUtilities/AnalyticSolution.hpp"
18 : #include "Utilities/MakeWithValue.hpp"
19 : #include "Utilities/Serialization/CharmPupable.hpp"
20 : #include "Utilities/TMPL.hpp"
21 :
22 : namespace Elasticity::Solutions {
23 :
24 : /*!
25 : * \brief The trivial solution \f$\xi^i(x)=0\f$ of the Elasticity equations.
26 : * Useful as initial guess.
27 : */
28 : template <size_t Dim>
29 1 : class Zero : public elliptic::analytic_data::AnalyticSolution {
30 : public:
31 0 : using options = tmpl::list<>;
32 0 : static constexpr Options::String help{
33 : "The trivial solution, useful as initial guess."};
34 :
35 0 : Zero() = default;
36 0 : Zero(const Zero&) = default;
37 0 : Zero& operator=(const Zero&) = default;
38 0 : Zero(Zero&&) = default;
39 0 : Zero& operator=(Zero&&) = default;
40 0 : ~Zero() override = default;
41 0 : std::unique_ptr<elliptic::analytic_data::AnalyticSolution> get_clone()
42 : const override {
43 : return std::make_unique<Zero>(*this);
44 : }
45 :
46 : /// \cond
47 : explicit Zero(CkMigrateMessage* m)
48 : : elliptic::analytic_data::AnalyticSolution(m) {}
49 : using PUP::able::register_constructor;
50 : WRAPPED_PUPable_decl_template(Zero); // NOLINT
51 : /// \endcond
52 :
53 : /// Retrieve a collection of variables at coordinates `x`
54 : template <typename DataType, typename... RequestedTags>
55 1 : tuples::TaggedTuple<RequestedTags...> variables(
56 : const tnsr::I<DataType, Dim>& x,
57 : tmpl::list<RequestedTags...> /*meta*/) const {
58 : using supported_tags =
59 : tmpl::list<Tags::Displacement<Dim>,
60 : ::Tags::deriv<Tags::Displacement<Dim>, tmpl::size_t<Dim>,
61 : Frame::Inertial>,
62 : Tags::Strain<Dim>, Tags::MinusStress<Dim>,
63 : Tags::PotentialEnergyDensity<Dim>,
64 : ::Tags::FixedSource<Tags::Displacement<Dim>>>;
65 : static_assert(tmpl::size<tmpl::list_difference<tmpl::list<RequestedTags...>,
66 : supported_tags>>::value == 0,
67 : "The requested tag is not supported");
68 : return {make_with_value<typename RequestedTags::type>(x, 0.)...};
69 : }
70 :
71 : template <typename... RequestedTags>
72 0 : tuples::TaggedTuple<RequestedTags...> variables(
73 : const tnsr::I<DataVector, Dim>& x, const Mesh<Dim>& /*mesh*/,
74 : const InverseJacobian<DataVector, Dim, Frame::ElementLogical,
75 : Frame::Inertial>& /*inv_jacobian*/,
76 : tmpl::list<RequestedTags...> meta) const {
77 : return variables(x, meta);
78 : }
79 : };
80 :
81 : /// \cond
82 : template <size_t Dim>
83 : PUP::able::PUP_ID Zero<Dim>::my_PUP_ID = 0; // NOLINT
84 : /// \endcond
85 :
86 : template <size_t Dim>
87 0 : bool operator==(const Zero<Dim>& /*lhs*/, const Zero<Dim>& /*rhs*/) {
88 : return true;
89 : }
90 :
91 : template <size_t Dim>
92 0 : bool operator!=(const Zero<Dim>& /*lhs*/, const Zero<Dim>& /*rhs*/) {
93 : return false;
94 : }
95 : } // namespace Elasticity::Solutions
|