Alamo
Elastic.H
Go to the documentation of this file.
1#ifndef OPERATOR_ELASTIC_H_
2#define OPERATOR_ELASTIC_H_
3
4#include <AMReX_MLCellLinOp.H>
5#include <AMReX_Array.H>
6#include <limits>
7#include "Set/Set.H"
8#include "Operator/Operator.H"
9#include "Model/Solid/Solid.H"
11#include "Numeric/Stencil.H"
12#include "IC/IC.H"
13
14using namespace amrex;
15
16namespace Operator
17{
18///
19/// \todo Remove Elastic derived classes. They have been replaced with the Model construction.
20///
21template<int SYM>
22class Elastic : public Operator<Grid::Node>
23{
25 using TArrayBox = amrex::BaseFab<MATRIX4>;
26 using MultiTab = amrex::FabArray<TArrayBox>;
27public:
29 enum class Boundary {Lo, Hi, None};
30
31 Elastic () {}
32 Elastic (const Vector<Geometry>& a_geom,
33 const Vector<BoxArray>& a_grids,
34 const Vector<DistributionMapping>& a_dmap,
35 const LPInfo& a_info,
36 bool a_conservative_face_flux = false);
37 virtual ~Elastic ();
38 Elastic (const Elastic&) = delete;
39 Elastic (Elastic&&) = delete;
40 Elastic& operator= (const Elastic&) = delete;
42
43 void define (const Vector<Geometry>& a_geom,
44 const Vector<BoxArray>& a_grids,
45 const Vector<DistributionMapping>& a_dmap,
46 const LPInfo& a_info = LPInfo(),
47 const Vector<FabFactory<FArrayBox> const*>& a_factory = {},
48 bool a_conservative_face_flux = false);
49
50 virtual void SetHomogeneous (bool a_homogeneous) override {m_homogeneous = a_homogeneous;}
52 void SetModel (int amrlev, const MultiTab& a_model);
53 void SetModel (const amrex::Vector<MultiTab> & a_model)
54 { for (int ilev = 0; ilev < a_model.size(); ilev++) SetModel(ilev,a_model[ilev]);}
56 { for (int ilev = 0; ilev < a_model.size(); ilev++) SetModel(ilev,*a_model[ilev]);}
57 void SetPsi (int amrlev, const amrex::MultiFab& a_psi);
58 void SetPsi (int amrlev, const amrex::MultiFab& a_psi, const Set::Scalar &a_psi_small)
59 {m_psi_small = a_psi_small; SetPsi(amrlev,a_psi);}
60
61 /// The different types of Boundary Condtiions are listed in the `BC::Operator::Elastic` documentation
62 ///
64 {
65 m_bc = a_bc;
66 m_bc_set = true;
67 };
69 {
70 return *m_bc;
71 }
72
73 /// Compute strain \f$\mathbf{\epsilon}\f$ given the displacement field \f$\mathbf{u}\f$
74 /// by
75 /// \f[\mathbf{\epsilon}_{ij} = \frac{1}{2}(u_{i,j} + u_{j,i})\f]
76 ///
77 void Strain (int amrlev, amrex::MultiFab& epsfab, const amrex::MultiFab& ufab, bool voigt = false) const;
78
79 /// Compute stress \f$\mathbf{\sigma}\f$ given the displacement field \f$\mathbf{u}\f$
80 /// by
81 /// \f[\mathbf{\sigma}_{ij} = \mathbb{C}_{ijkl}\,u_{k,l}\f]
82 /// where, \f$\mathbb{C}\f$ is furnished by the templated `model`
83 ///
84 void Stress (int amrlev, amrex::MultiFab& sigmafab, const amrex::MultiFab& ufab, bool voigt = false, bool a_homogeneous=false);
85
86 /// Compute energy density \f$\mathbb{W}\f$ given the displacement field \f$\mathbf{u}\f$
87 /// by
88 /// \f[\mathbb{W} = \mathbb{\Sigma}\mathbb{\Sigma}\mathbf{\sigma}_{ij}\mathbf{\epsilon}_{ij}\f]
89 /// where \f$\mathbf{\sigma}\f$ and \f$\mathbf{\epsilon}\f$ are as defined above
90 ///
91 void Energy (int amrlev, amrex::MultiFab& energy, const amrex::MultiFab& u, bool a_homogeneous=false);
92
93 //void Energy (int amrlev, amrex::MultiFab& energies, const amrex::MultiFab& u, std::vector<SOLID> models, bool a_homogeneous=false);
94
95 /// This function is depricated and should not be used. Use the other `SetBC` function.
96 ///
97 void SetBC(const std::array<std::array<BC,AMREX_SPACEDIM>,AMREX_SPACEDIM> &a_bc_lo,
98 const std::array<std::array<BC,AMREX_SPACEDIM>,AMREX_SPACEDIM> &a_bc_hi)
99 {
100 Util::Abort(INFO,"This is now depricated. Use the other SetBC function.");
101 m_bc_lo = a_bc_lo;m_bc_hi = a_bc_hi;
102 };
103
104 void Error0x (int amrlev, int mglev, MultiFab& R0x, const MultiFab& x) const;
105
106 void SetTesting(bool a_testing) {m_testing = a_testing;}
107 void SetUniform(bool a_uniform) {m_uniform = a_uniform;}
108 virtual void SetAverageDownCoeffs(bool a_average_down_coeffs) override
109 {m_average_down_coeffs = a_average_down_coeffs;}
110
111 using Operator::Reflux;
112
113protected:
114
115 virtual void Diagonal (int amrlev, int mglev, amrex::MultiFab& diag) override;
116
117 virtual void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const override final;
118 virtual void FFlux (int amrlev, const MFIter& mfi,
119 const std::array<FArrayBox*,AMREX_SPACEDIM>& flux,
120 const FArrayBox& sol, const int face_only=0) const final;
121
122
123
124
125 virtual int getNComp() const override {return AMREX_SPACEDIM;};
126 virtual bool isCrossStencil () const { return false; }
127 bool useQuadraticAmrInterpolation() const override
128 { return m_conservative_face_flux; }
129 bool relaxCoarseFineGhostRows() const override
130 { return !m_conservative_face_flux; }
131 virtual void prepareForSolve () override
132 {
133 if (!m_model_set) Util::Abort(INFO,"Attempting to use operator before calling SetModel!");
134 if (!m_bc_set) Util::Warning(INFO,"Attempting to use operator before calling SetBC!");
136 };
137
138private:
139 /// Simple arrays storing boundary conditions for each component and each face.
140 std::array<std::array<BC,AMREX_SPACEDIM>, AMREX_SPACEDIM> m_bc_lo; // m_bc_lo[face][dimension]
141 std::array<std::array<BC,AMREX_SPACEDIM>, AMREX_SPACEDIM> m_bc_hi; // m_bc_hi[face][dimension]
142
143 /// This is a multifab-type object containing objects of type
144 /// Model::Solid::Elastic::Isotropic::Isotropic
145 /// (or some other model type). T is the template argument.
146 /// The models contain elastic constants and contain methods for converting strain to stress
147 amrex::Vector<Set::Field<Set::Matrix4<AMREX_SPACEDIM,SYM>>> m_ddw_mf;
148
149 // This is a mask variable.
150 amrex::Vector<Set::Field<Set::Scalar>> m_psi_mf;
152 bool m_psi_set = false;
154
155 virtual void averageDownCoeffs () override;
156 void averageDownCoeffsDifferentAmrLevels (int fine_amrlev);
157
158 /// \fn averageDownCoeffsSameAmrLevel
159 /// \brief Update coarse-level AMR coefficients with data from fine level
160 ///
161 /// This function is called before the solve, and it updates the Matrix4 coefficients
162 /// on coarse levels with averaged versions on the fine levels.
163 /// Typically, this is not necessary, since the coefficients are computed on each level
164 /// already.
165 /// However, there are some cases where this messes up the multigrid solver.
166 /// (Phase field fracture is the primary example.)
167 ///
168 /// This is disabled by default. In order to enable, call
169 ///
170 /// elasticoperator.SetAverageDownCoeffs(true);
171 ///
172 void averageDownCoeffsSameAmrLevel (int amrlev);
173
174 void FillBoundaryCoeff (MultiTab& sigma, const amrex::Periodicity& p);
175 void FillBoundaryCoeff (MultiFab& psi, const amrex::Periodicity& p);
176
177 bool m_testing = false;
178 bool m_uniform = false;
179 bool m_homogeneous = false;
180
182
184
185 bool m_model_set = false;
186 bool m_bc_set = false;
187
188public:
189 static void Parse(Elastic<SYM> & value, IO::ParmParse & pp)
190 {
191 // Regularization offset value used in near-singular elastic solves.
192 // It should be small - if it is too large, you will get better convergence
193 // but less correct values!
194 pp_query("small",value.m_psi_small);
195 }
196
197};
198}
199
200#endif
#define pp_query(...)
Definition ParmParse.H:129
#define INFO
Definition Util.H:24
void SetModel(int amrlev, const MultiTab &a_model)
static void Parse(Elastic< SYM > &value, IO::ParmParse &pp)
Definition Elastic.H:189
amrex::Vector< Set::Field< Set::Matrix4< AMREX_SPACEDIM, SYM > > > m_ddw_mf
This is a multifab-type object containing objects of type Model::Solid::Elastic::Isotropic::Isotropic...
Definition Elastic.H:147
Set::Scalar m_psi_small
Definition Elastic.H:151
bool m_conservative_face_flux
Definition Elastic.H:153
void SetModel(Set::Matrix4< AMREX_SPACEDIM, SYM > &a_model)
Definition Elastic.cpp:67
amrex::FabArray< TArrayBox > MultiTab
Definition Elastic.H:26
void SetBC(::BC::Operator::Elastic::Elastic *a_bc)
The different types of Boundary Condtiions are listed in the BC::Operator::Elastic documentation.
Definition Elastic.H:63
bool relaxCoarseFineGhostRows() const override
Definition Elastic.H:129
void Stress(int amrlev, amrex::MultiFab &sigmafab, const amrex::MultiFab &ufab, bool voigt=false, bool a_homogeneous=false)
Compute stress given the displacement field by.
Definition Elastic.cpp:620
virtual int getNComp() const override
Definition Elastic.H:125
virtual bool isCrossStencil() const
Definition Elastic.H:126
void SetTesting(bool a_testing)
Definition Elastic.H:106
void SetUniform(bool a_uniform)
Definition Elastic.H:107
std::array< std::array< BC, AMREX_SPACEDIM >, AMREX_SPACEDIM > m_bc_lo
Simple arrays storing boundary conditions for each component and each face.
Definition Elastic.H:140
virtual void FFlux(int amrlev, const MFIter &mfi, const std::array< FArrayBox *, AMREX_SPACEDIM > &flux, const FArrayBox &sol, const int face_only=0) const final
Definition Elastic.cpp:542
void Error0x(int amrlev, int mglev, MultiFab &R0x, const MultiFab &x) const
Definition Elastic.cpp:515
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FArrayBox > const * > &a_factory={}, bool a_conservative_face_flux=false)
Definition Elastic.cpp:28
void FillBoundaryCoeff(MultiTab &sigma, const amrex::Periodicity &p)
Definition Elastic.cpp:1069
virtual void prepareForSolve() override
Definition Elastic.H:131
std::array< std::array< BC, AMREX_SPACEDIM >, AMREX_SPACEDIM > m_bc_hi
Definition Elastic.H:141
::BC::Operator::Elastic::Elastic & GetBC()
Definition Elastic.H:68
bool useQuadraticAmrInterpolation() const override
Definition Elastic.H:127
void SetBC(const std::array< std::array< BC, AMREX_SPACEDIM >, AMREX_SPACEDIM > &a_bc_lo, const std::array< std::array< BC, AMREX_SPACEDIM >, AMREX_SPACEDIM > &a_bc_hi)
This function is depricated and should not be used.
Definition Elastic.H:97
void SetModel(const amrex::Vector< MultiTab > &a_model)
Definition Elastic.H:53
bool m_average_down_coeffs
Definition Elastic.H:181
void averageDownCoeffsSameAmrLevel(int amrlev)
Update coarse-level AMR coefficients with data from fine level.
Definition Elastic.cpp:888
virtual void SetHomogeneous(bool a_homogeneous) override
Definition Elastic.H:50
Elastic & operator=(const Elastic &)=delete
::BC::Operator::Elastic::Elastic * m_bc
Definition Elastic.H:183
virtual ~Elastic()
Definition Elastic.cpp:23
void Strain(int amrlev, amrex::MultiFab &epsfab, const amrex::MultiFab &ufab, bool voigt=false) const
Compute strain given the displacement field by.
Definition Elastic.cpp:559
void SetPsi(int amrlev, const amrex::MultiFab &a_psi, const Set::Scalar &a_psi_small)
Definition Elastic.H:58
virtual void SetAverageDownCoeffs(bool a_average_down_coeffs) override
Definition Elastic.H:108
Elastic(Elastic &&)=delete
amrex::Vector< Set::Field< Set::Scalar > > m_psi_mf
Definition Elastic.H:150
void Energy(int amrlev, amrex::MultiFab &energy, const amrex::MultiFab &u, bool a_homogeneous=false)
Compute energy density given the displacement field by.
Definition Elastic.cpp:685
void averageDownCoeffsDifferentAmrLevels(int fine_amrlev)
Definition Elastic.cpp:761
void SetModel(const Set::Field< Set::Matrix4< AMREX_SPACEDIM, SYM > > &a_model)
Definition Elastic.H:55
virtual void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const override final
Definition Elastic.cpp:158
amrex::BaseFab< MATRIX4 > TArrayBox
Definition Elastic.H:25
Elastic(const Elastic &)=delete
virtual void averageDownCoeffs() override
Definition Elastic.cpp:738
void SetPsi(int amrlev, const amrex::MultiFab &a_psi)
Definition Elastic.cpp:137
Collection of boundary condition (BC) objects.
Definition BC.cpp:5
Documentation for operator namespace.
Definition Diagonal.cpp:14
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:21
void Warning(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:213
AMREX_GPU_HOST_DEVICE void Abort(const char *msg)
Definition Util.cpp:406