Advanced Multi-Physics (AMP)
On-Line Documentation
MechanicsManufacturedSolutions.h
Go to the documentation of this file.
1#include "AMP/utils/Database.h"
2#include "AMP/utils/UtilityMacros.h"
3
4#include <memory>
5#include <string>
6#include <vector>
7
8
10
18class MMS
19{
20public:
30 MMS( double YM = 0.0, double PR = 0.0 );
31
33 virtual ~MMS() {}
34
38 void setYoungsModulus( double YM ) { E = YM; }
39
43 void setPoissonsRatio( double PR ) { nu = PR; }
44
51 void scaleX( double L ) { Lx = L; }
52 void scaleY( double L ) { Ly = L; }
53 void scaleZ( double L ) { Lz = L; }
54 void scaleXYZ( double L )
55 {
56 Lx = L;
57 Ly = L;
58 Lz = L;
59 }
60 void multX( double M ) { Mx = M; }
61 void multY( double M ) { My = M; }
62 void multZ( double M ) { Mz = M; }
63 void multXYZ( double M )
64 {
65 Mx = M;
66 My = M;
67 Mz = M;
68 }
69
76 void set_axx( double v ) { axx = v; }
77 void set_bxx( double v ) { bxx = v; }
78 void set_axy( double v ) { axy = v; }
79 void set_bxy( double v ) { bxy = v; }
80 void set_axz( double v ) { axz = v; }
81 void set_bxz( double v ) { bxz = v; }
82 void set_ayx( double v ) { ayx = v; }
83 void set_byx( double v ) { byx = v; }
84 void set_ayy( double v ) { ayy = v; }
85 void set_byy( double v ) { byy = v; }
86 void set_ayz( double v ) { ayz = v; }
87 void set_byz( double v ) { byz = v; }
88 void set_azx( double v ) { azx = v; }
89 void set_bzx( double v ) { bzx = v; }
90 void set_azy( double v ) { azy = v; }
91 void set_bzy( double v ) { bzy = v; }
92 void set_azz( double v ) { azz = v; }
93 void set_bzz( double v ) { bzz = v; }
94
98 const std::string &getName() const { return name; }
99
105 virtual double getExactSolutionX( double x, double y, double z ) const = 0;
106 virtual double getExactSolutionY( double x, double y, double z ) const = 0;
107 virtual double getExactSolutionZ( double x, double y, double z ) const = 0;
108 virtual double getForcingTermX( double x, double y, double z ) const = 0;
109 virtual double getForcingTermY( double x, double y, double z ) const = 0;
110 virtual double getForcingTermZ( double x, double y, double z ) const = 0;
111 // I deactivated this because there was no need for it so far but I can provide these on request
112 // virtual std::vector<double> getGradientX(double x, double y, double z) const = 0;
113 // virtual std::vector<double> getGradientY(double x, double y, double z) const = 0;
114 // virtual std::vector<double> getGradientZ(double x, double y, double z) const = 0;
115 // virtual std::vector<double> getStrainTensor(double x, double y, double z) const = 0;
116
122 virtual std::vector<double> getStressTensor( double x, double y, double z ) const = 0;
123
131 std::vector<double> getExactSolutions( double x, double y, double z ) const
132 {
133 std::vector<double> ExactSolutions;
134 ExactSolutions.push_back( getExactSolutionX( x, y, z ) );
135 ExactSolutions.push_back( getExactSolutionY( x, y, z ) );
136 ExactSolutions.push_back( getExactSolutionZ( x, y, z ) );
137 return ExactSolutions;
138 }
139 std::vector<double> getForcingTerms( double x, double y, double z ) const
140 {
141 std::vector<double> ForcingTerms;
142 ForcingTerms.push_back( getForcingTermX( x, y, z ) );
143 ForcingTerms.push_back( getForcingTermY( x, y, z ) );
144 ForcingTerms.push_back( getForcingTermZ( x, y, z ) );
145 return ForcingTerms;
146 }
147 std::vector<double> getExactSolutions( const std::vector<double> &xyz ) const
148 {
149 return getExactSolutions( xyz[0], xyz[1], xyz[2] );
150 }
151 std::vector<double> getForcingTerms( const std::vector<double> &xyz ) const
152 {
153 return getForcingTerms( xyz[0], xyz[1], xyz[2] );
154 }
155 double getExactSolutionX( const std::vector<double> &xyz ) const
156 {
157 AMP_ASSERT( xyz.size() != 3 );
158 return getExactSolutionX( xyz[0], xyz[1], xyz[2] );
159 }
160 double getExactSolutionY( const std::vector<double> &xyz ) const
161 {
162 AMP_ASSERT( xyz.size() != 3 );
163 return getExactSolutionY( xyz[0], xyz[1], xyz[2] );
164 }
165 double getExactSolutionZ( const std::vector<double> &xyz ) const
166 {
167 AMP_ASSERT( xyz.size() != 3 );
168 return getExactSolutionZ( xyz[0], xyz[1], xyz[2] );
169 }
170 double getForcingTermX( const std::vector<double> &xyz ) const
171 {
172 AMP_ASSERT( xyz.size() != 3 );
173 return getForcingTermX( xyz[0], xyz[1], xyz[2] );
174 }
175 double getForcingTermY( const std::vector<double> &xyz ) const
176 {
177 AMP_ASSERT( xyz.size() != 3 );
178 return getForcingTermY( xyz[0], xyz[1], xyz[2] );
179 }
180 double getForcingTermZ( const std::vector<double> &xyz ) const
181 {
182 AMP_ASSERT( xyz.size() != 3 );
183 return getForcingTermZ( xyz[0], xyz[1], xyz[2] );
184 }
185 // std::vector<double> getGradientX(const std::vector<double>& xyz) const {
186 // AMP_ASSERT(xyz.size()!=3); return
187 // getGradientX(xyz[0], xyz[1], xyz[2]); }
188 // std::vector<double> getGradientY(const std::vector<double>& xyz) const {
189 // AMP_ASSERT(xyz.size()!=3); return
190 // getGradientY(xyz[0], xyz[1], xyz[2]); }
191 // std::vector<double> getGradientZ(const std::vector<double>& xyz) const {
192 // AMP_ASSERT(xyz.size()!=3); return
193 // getGradientZ(xyz[0], xyz[1], xyz[2]); }
194 // std::vector<double> getStrainTensor(const std::vector<double>& xyz) const {
195 // AMP_ASSERT(xyz.size()!=3); return
196 // getStrainTensor(xyz[0], xyz[1], xyz[2]); }
197 std::vector<double> getStressTensor( const std::vector<double> &xyz ) const
198 {
199 AMP_ASSERT( xyz.size() != 3 );
200 return getStressTensor( xyz[0], xyz[1], xyz[2] );
201 }
202
203protected:
204 double E;
205 double nu;
206 double Lx, Ly, Lz;
207 double Mx, My, Mz;
212 double axx, bxx, axy, bxy, axz, bxz;
213 double ayx, byx, ayy, byy, ayz, byz;
214 double azx, bzx, azy, bzy, azz, bzz;
215 std::string name;
216}; // end class MMS
217
218
234class MMSLinear : public MMS
235{
236public:
237 MMSLinear( double E = 0.0, double nu = 0.0 ) : MMS( E, nu ) { name = "Linear"; }
238 double getExactSolutionX( double x, double y, double z ) const override;
239 double getExactSolutionY( double x, double y, double z ) const override;
240 double getExactSolutionZ( double x, double y, double z ) const override;
241 double getForcingTermX( double /* x */, double y, double z ) const override;
242 double getForcingTermY( double x, double /* y */, double z ) const override;
243 double getForcingTermZ( double x, double y, double /* z */ ) const override;
244 std::vector<double> getStressTensor( double x, double y, double z ) const override;
245}; // end class MMSLinear
246
247
261class MMSTrigonometric : public MMS
262{
263public:
264 MMSTrigonometric( double E = 0.0, double nu = 0.0 ) : MMS( E, nu ) { name = "Trigonometric"; }
265 double getExactSolutionX( double x, double y, double z ) const override;
266 double getExactSolutionY( double /* x */, double y, double z ) const override;
267 double getExactSolutionZ( double /* x */, double y, double z ) const override;
268 double getForcingTermX( double x, double y, double z ) const override;
269 double getForcingTermY( double x, double y, double z ) const override;
270 double getForcingTermZ( double x, double y, double z ) const override;
271 std::vector<double> getStressTensor( double x, double y, double z ) const override;
272}; // end class MMSTrigonometric
273
274
282{
283public:
285
286 static std::shared_ptr<MMS> createMMS( std::shared_ptr<AMP::Database> mmsDatabase );
287}; // end class MMSBuilder
288
289
290} // namespace AMP::MechanicsManufacturedSolution
static std::shared_ptr< MMS > createMMS(std::shared_ptr< AMP::Database > mmsDatabase)
double getForcingTermZ(double x, double y, double) const override
std::vector< double > getStressTensor(double x, double y, double z) const override
double getExactSolutionX(double x, double y, double z) const override
double getForcingTermX(double, double y, double z) const override
double getExactSolutionZ(double x, double y, double z) const override
double getForcingTermY(double x, double, double z) const override
double getExactSolutionY(double x, double y, double z) const override
double getExactSolutionX(double x, double y, double z) const override
double getForcingTermX(double x, double y, double z) const override
double getForcingTermZ(double x, double y, double z) const override
double getExactSolutionY(double, double y, double z) const override
double getForcingTermY(double x, double y, double z) const override
std::vector< double > getStressTensor(double x, double y, double z) const override
double getExactSolutionZ(double, double y, double z) const override
virtual double getForcingTermY(double x, double y, double z) const =0
double getForcingTermZ(const std::vector< double > &xyz) const
virtual double getExactSolutionZ(double x, double y, double z) const =0
virtual double getForcingTermZ(double x, double y, double z) const =0
std::vector< double > getExactSolutions(const std::vector< double > &xyz) const
std::string name
name/type of mechanics manufactured solution
double getExactSolutionZ(const std::vector< double > &xyz) const
std::vector< double > getStressTensor(const std::vector< double > &xyz) const
double getExactSolutionX(const std::vector< double > &xyz) const
virtual double getForcingTermX(double x, double y, double z) const =0
std::vector< double > getExactSolutions(double x, double y, double z) const
virtual double getExactSolutionY(double x, double y, double z) const =0
double getExactSolutionY(const std::vector< double > &xyz) const
virtual std::vector< double > getStressTensor(double x, double y, double z) const =0
double getForcingTermX(const std::vector< double > &xyz) const
MMS(double YM=0.0, double PR=0.0)
std::vector< double > getForcingTerms(const std::vector< double > &xyz) const
std::vector< double > getForcingTerms(double x, double y, double z) const
virtual double getExactSolutionX(double x, double y, double z) const =0
double getForcingTermY(const std::vector< double > &xyz) const
#define AMP_ASSERT(EXP)
Assert error.



Advanced Multi-Physics (AMP)
Oak Ridge National Laboratory
Idaho National Laboratory
Los Alamos National Laboratory
This page automatically produced from the
source code by doxygen
Last updated: Tue Mar 10 2026 13:06:41.
Comments on this page