59#ifndef INTEGRATOR_MECHANICS_H
60#define INTEGRATOR_MECHANICS_H
67#include "AMReX_ParallelDescriptor.H"
68#include "AMReX_ParmParse.H"
90#include "Numeric/Stencil.H"
96#include "Operator/Operator.H"
105 static constexpr const char *
name =
"mechanics";
141 if (nmodels > 1 && pp.
contains(
"ic.type"))
170 if (pp.
contains(
"trac_normal.ic.type"))
185 "nmodels does not match the # of specified models");
194 else eta_mf[lev]->setVal(1.0);
206 for (
int lev = 0; lev <= finest_level; ++lev)
209 psi_mf[lev]->FillBoundary();
210 amrex::Box domain = this->geom[lev].Domain();
211 domain.convert(amrex::IntVect::TheNodeVector());
214 for (MFIter mfi(*
model_mf[lev],
false); mfi.isValid(); ++mfi)
216 amrex::Box bx = mfi.nodaltilebox();
219 amrex::Array4<Set::Vector>
const& rhs =
rhs_mf[lev]->array(mfi);
220 amrex::Array4<const Set::Scalar>
const& psi =
psi_mf[lev]->array(mfi);
221 amrex::Array4<const Set::Scalar>
const& trac_normal =
trac_normal_mf[lev]->array(mfi);
223 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
225 rhs(i,j,k) = trac_normal(i,j,k) * grad;
232 if (a_step > 0)
return;
234 for (
int lev = 0; lev <= finest_level; ++lev)
236 eta_mf[lev]->FillBoundary();
238 amrex::Box domain = this->geom[lev].Domain();
239 domain.convert(amrex::IntVect::TheNodeVector());
243 for (MFIter mfi(*
model_mf[lev],
false); mfi.isValid(); ++mfi)
245 amrex::Box bx = mfi.grownnodaltilebox();
247 amrex::Array4<MODEL>
const& model =
model_mf[lev]->array(mfi);
248 amrex::Array4<const Set::Scalar>
const& eta =
eta_mf[lev]->array(mfi);
250 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
251 model(i, j, k) = MODEL::Zero();
252 for (
unsigned int n = 0; n <
models.size(); n++)
253 model(i, j, k) += eta(i, j, k, n) *
models[n];
261 for (MFIter mfi(*
model_mf[lev],
false); mfi.isValid(); ++mfi)
263 amrex::Box bx = mfi.grownnodaltilebox() & domain;
264 amrex::Array4<MODEL>
const& model = this->
model_mf[lev]->array(mfi);
265 const Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
267 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
269 if (i==lo.x && j==lo.y)
270 model(i,j,k) = 0.5*(model(i+1,j,k)+model(i,j+1,k));
271 else if (i==lo.x && j==hi.y)
272 model(i,j,k) = 0.5*(model(i+1,j,k)+model(i,j-1,k));
273 else if (i==hi.x && j==lo.y)
274 model(i,j,k) = 0.5*(model(i-1,j,k)+model(i,j+1,k));
275 else if (i==hi.x && j==hi.y)
276 model(i,j,k) = 0.5*(model(i-1,j,k)+model(i,j-1,k));
279 model(i,j,k) = model(i+1,j,k);
281 model(i,j,k) = model(i-1,j,k);
283 model(i,j,k) = model(i,j+1,k);
285 model(i,j,k) = model(i,j-1,k);
301 for (amrex::MFIter mfi(*
eta_mf[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi)
303 amrex::Box bx = mfi.nodaltilebox();
304 amrex::Array4<char>
const& tags = a_tags.array(mfi);
305 amrex::Array4<Set::Scalar>
const& eta =
eta_mf[lev]->array(mfi);
306 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
309 for (
int n = 0; n <
eta_mf[lev]->nComp(); n++)
313 tags(i, j, k) = amrex::TagBox::SET;
318 amrex::Array4<Set::Scalar>
const& psi =
psi_mf[lev]->array(mfi);
319 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
325 tags(i, j, k) = amrex::TagBox::SET;
#define pp_query_default(...)
Pure abstract IC object from which all other IC objects inherit.
void Initialize(const int &a_lev, Set::Field< T > &a_field, Set::Scalar a_time=0.0)
void queryclass(std::string name, T *value, const std::source_location &location=std::source_location::current())
int queryclass_enumerate(std::string a_name, std::vector< T > &value, int number=1, const std::source_location &location=std::source_location::current())
static ForwardArgs< ForwardArgStorage< Args >... > forward_args(Args &&... args)
static bool InTraversalMode()
bool contains(std::string name, const std::source_location &location=std::source_location::current())
void select(std::string name, PTRTYPE *&ic_eta, const std::source_location &location=std::source_location::current())
Set::Scalar m_elastic_ref_threshold
void Initialize(int lev) override
Use the #ic object to initialize::Temp.
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int) override
Set::Field< Set::Vector > rhs_mf
Set::Field< Set::Scalar > psi_mf
Set::Field< MODEL > model_mf
void RegisterNodalFab(Set::Field< Set::Scalar > &new_fab, int ncomp, int nghost, std::string name, bool writeout, bool evolving=true, std::vector< std::string > suffix={})
Add a new node-based scalar field.
void RegisterNewFab(Set::Field< Set::Scalar > &new_fab, BC::BC< Set::Scalar > *new_bc, int ncomp, int nghost, std::string name, bool writeout, bool evolving=true, std::vector< std::string > suffix={})
Add a new cell-based scalar field.
IC::IC< Set::Scalar > * ic_trac_normal
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar a_time, int a_ngrow) override
IC::IC< Set::Scalar > * ic_eta
Set::Field< Set::Scalar > eta_mf
static void Parse(Mechanics &value, IO::ParmParse &pp)
void Regrid(int lev, Set::Scalar time) override
Mechanics(IO::ParmParse &pp)
std::vector< MODEL > models
BC::BC< Set::Scalar > * bc_trac_normal
void Initialize(int lev) override
bool model_neumann_boundary
BC::BC< Set::Scalar > * bc_psi
Set::Scalar m_eta_ref_threshold
static constexpr const char * name
IC::IC< Set::Scalar > * ic_psi
Set::Field< Set::Scalar > trac_normal_mf
virtual void UpdateModel(int a_step, Set::Scalar time) override
Collection of numerical integrator objects.
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Set::Vector CellGradientOnNode(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > GetStencil(const int i, const int j, const int k, const amrex::Box domain)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Set::Vector Gradient(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType())
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
AMREX_FORCE_INLINE void AssertException(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void Assert(const char *file, const char *func, int line, const char *smt, bool pass, Args const &... args)
AMREX_FORCE_INLINE void RealFillBoundary(amrex::FabArray< amrex::BaseFab< T > > &a_mf, const amrex::Geometry &, const int nghost=2)