1#ifndef OPERATOR_ELASTIC_H_
2#define OPERATOR_ELASTIC_H_
4#include <AMReX_MLCellLinOp.H>
5#include <AMReX_Array.H>
8#include "Operator/Operator.H"
11#include "Numeric/Stencil.H"
32 Elastic (
const Vector<Geometry>& a_geom,
33 const Vector<BoxArray>& a_grids,
34 const Vector<DistributionMapping>& a_dmap,
35 const LPInfo& a_info);
42 void define (
const Vector<Geometry>& a_geom,
43 const Vector<BoxArray>& a_grids,
44 const Vector<DistributionMapping>& a_dmap,
45 const LPInfo& a_info = LPInfo(),
46 const Vector<FabFactory<FArrayBox>
const*>& a_factory = {});
51 void SetModel (
const amrex::Vector<MultiTab> & a_model)
52 {
for (
int ilev = 0; ilev < a_model.size(); ilev++)
SetModel(ilev,a_model[ilev]);}
54 {
for (
int ilev = 0; ilev < a_model.size(); ilev++)
SetModel(ilev,*a_model[ilev]);}
55 void SetPsi (
int amrlev,
const amrex::MultiFab& a_psi);
63 if (this->
Geom(0).isAnyPeriodic())
65 Util::Warning(
INFO,
"Looks like you're using a periodic domain. \nThat is currently VERY DANGEROUS when using linear elastic solver!!!");
79 void Strain (
int amrlev, amrex::MultiFab& epsfab,
const amrex::MultiFab& ufab,
bool voigt =
false)
const;
86 void Stress (
int amrlev, amrex::MultiFab& sigmafab,
const amrex::MultiFab& ufab,
bool voigt =
false,
bool a_homogeneous=
false);
93 void Energy (
int amrlev, amrex::MultiFab& energy,
const amrex::MultiFab& u,
bool a_homogeneous=
false);
99 void SetBC(
const std::array<std::array<BC,AMREX_SPACEDIM>,AMREX_SPACEDIM> &a_bc_lo,
100 const std::array<std::array<BC,AMREX_SPACEDIM>,AMREX_SPACEDIM> &a_bc_hi)
102 Util::Abort(
INFO,
"This is now depricated. Use the other SetBC function.");
106 void Error0x (
int amrlev,
int mglev, MultiFab& R0x,
const MultiFab& x)
const;
113 using Operator::Reflux;
117 virtual void Diagonal (
int amrlev,
int mglev, amrex::MultiFab& diag)
override;
119 virtual void Fapply (
int amrlev,
int mglev, MultiFab& out,
const MultiFab& in)
const override final;
120 virtual void FFlux (
int amrlev,
const MFIter& mfi,
121 const std::array<FArrayBox*,AMREX_SPACEDIM>& flux,
122 const FArrayBox& sol,
const int face_only=0) const final;
127 virtual
int getNComp()
const override {
return AMREX_SPACEDIM;};
138 std::array<std::array<BC,AMREX_SPACEDIM>, AMREX_SPACEDIM>
m_bc_lo;
139 std::array<std::array<BC,AMREX_SPACEDIM>, AMREX_SPACEDIM>
m_bc_hi;
145 amrex::Vector<Set::Field<Set::Matrix4<AMREX_SPACEDIM,SYM>>>
m_ddw_mf;
void SetModel(int amrlev, const MultiTab &a_model)
static void Parse(Elastic< SYM > &value, IO::ParmParse &pp)
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={})
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...
void SetModel(Set::Matrix4< AMREX_SPACEDIM, SYM > &a_model)
amrex::FabArray< TArrayBox > MultiTab
void SetBC(::BC::Operator::Elastic::Elastic *a_bc)
The different types of Boundary Condtiions are listed in the BC::Operator::Elastic documentation.
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.
virtual int getNComp() const override
virtual bool isCrossStencil() const
void SetTesting(bool a_testing)
void SetUniform(bool a_uniform)
std::array< std::array< BC, AMREX_SPACEDIM >, AMREX_SPACEDIM > m_bc_lo
Simple arrays storing boundary conditions for each component and each face.
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
void Error0x(int amrlev, int mglev, MultiFab &R0x, const MultiFab &x) const
virtual void prepareForSolve() override
std::array< std::array< BC, AMREX_SPACEDIM >, AMREX_SPACEDIM > m_bc_hi
::BC::Operator::Elastic::Elastic & GetBC()
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.
void SetModel(const amrex::Vector< MultiTab > &a_model)
bool m_average_down_coeffs
void averageDownCoeffsSameAmrLevel(int amrlev)
Update coarse-level AMR coefficients with data from fine level.
void FillBoundaryCoeff(MultiTab &sigma, const Geometry &geom)
virtual void SetHomogeneous(bool a_homogeneous) override
Elastic & operator=(const Elastic &)=delete
::BC::Operator::Elastic::Elastic * m_bc
void Strain(int amrlev, amrex::MultiFab &epsfab, const amrex::MultiFab &ufab, bool voigt=false) const
Compute strain given the displacement field by.
void SetPsi(int amrlev, const amrex::MultiFab &a_psi, const Set::Scalar &a_psi_small)
virtual void SetAverageDownCoeffs(bool a_average_down_coeffs) override
Elastic(Elastic &&)=delete
amrex::Vector< Set::Field< Set::Scalar > > m_psi_mf
void Energy(int amrlev, amrex::MultiFab &energy, const amrex::MultiFab &u, bool a_homogeneous=false)
Compute energy density given the displacement field by.
void averageDownCoeffsDifferentAmrLevels(int fine_amrlev)
void SetModel(const Set::Field< Set::Matrix4< AMREX_SPACEDIM, SYM > > &a_model)
virtual void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const override final
amrex::BaseFab< MATRIX4 > TArrayBox
Elastic(const Elastic &)=delete
virtual void averageDownCoeffs() override
void SetPsi(int amrlev, const amrex::MultiFab &a_psi)
const Geometry & Geom(int amr_lev, int mglev=0) const noexcept
Collection of boundary condition (BC) objects.
Documentation for operator namespace.
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
void Abort(const char *msg)
void Warning(std::string file, std::string func, int line, Args const &... args)