17#ifndef IC_ELLIPSOID_H_
18#define IC_ELLIPSOID_H_
31 static constexpr const char*
name =
"ellipsoid";
35 Ellipsoid (amrex::Vector<amrex::Geometry> &_geom) :
IC(_geom) {}
44 for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
46 amrex::Box bx = mfi.tilebox();
47 bx.grow(a_field[lev]->nGrow());
48 amrex::IndexType type = a_field[lev]->ixType();
50 amrex::Array4<Set::Scalar>
const& field = a_field[lev]->array(mfi);
51 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
56 for (
int i=0 ; i <
center.size(); i++)
60 value = 0.5 + 0.5*std::erf(((x-
center[i]).transpose() *
A[i] * (x-
center[i]) - 1.0) /
eps[i] / norm);
62 min_value = value < min_value ? value : min_value;
64 field(i,j,k) = min_value;
69 a_field[lev]->FillBoundary();
75 amrex::Vector<Set::Scalar>
eps;
76 amrex::Vector<Set::Matrix>
A;
85 amrex::Vector<Set::Scalar>
center;
88 if(
center.size() < AMREX_SPACEDIM) value.
center.push_back(Set::Vector::Zero());
91 for (
int i = 0; i<
center.size(); i+=AMREX_SPACEDIM)
95 amrex::Vector<Set::Scalar>
A;
99 if(
A.size() < AMREX_SPACEDIM*AMREX_SPACEDIM) value.
A.push_back(Set::Matrix::Identity());
104 for (i=0; i<
A.size(); i+=AMREX_SPACEDIM)
106 for (j=0; j<AMREX_SPACEDIM; j++)
109 if((i+j) % (AMREX_SPACEDIM*AMREX_SPACEDIM) == 0)
111 value.
A.push_back(temp);
112 temp = Set::Matrix::Zero();
119 amrex::Vector<Set::Scalar> a_radius;
122 if (a_radius.size() < AMREX_SPACEDIM) value.
A.push_back(Set::Matrix::Identity());
125 for (
int i = 0; i<a_radius.size(); i+=AMREX_SPACEDIM)
128 AMREX_D_TERM( temp(0,0) = 1./(a_radius[i]*a_radius[i]) ;, temp(1,1) = 1./(a_radius[i+1]*a_radius[i+1]) ;, temp(2,2) = 1./(a_radius[i+2]*a_radius[i+2]) ; );
129 value.
A.push_back(temp);
134 amrex::Vector<Set::Scalar>
eps;
137 if(
eps.size() < 1) value.
eps.push_back(1.e-5);
138 for (
int i =0; i < value.
A.size(); i++)
140 if (
eps[i] <= 0.0)
eps[i] = 1.e-5;
141 value.
eps.push_back(
eps[i]);
148 std::string mollifier;
150 if(mollifier ==
"Dirac" || mollifier ==
"dirac")
#define pp_query_default(...)
#define pp_queryclass(...)
Ellipsoid(amrex::Vector< amrex::Geometry > &_geom)
amrex::Vector< Set::Scalar > eps
static constexpr const char * name
void Add(const int &lev, Set::Field< Set::Scalar > &a_field, Set::Scalar)
Ellipsoid(amrex::Vector< amrex::Geometry > &_geom, IO::ParmParse &pp, std::string name)
static void Parse(Ellipsoid &value, IO::ParmParse &pp)
amrex::Vector< Set::Vector > center
amrex::Vector< Set::Matrix > A
amrex::Vector< amrex::Geometry > & geom
bool contains(std::string name, const std::source_location &location=std::source_location::current())
static bool IgnoreInTraversalMode(std::string note="This input parser is not yet compliant with traversal mode; its inputs are not fully documented.", const std::source_location &location=std::source_location::current())
Initialize a spherical inclusion.
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
AMREX_FORCE_INLINE Vector Position(const int &i, const int &j, const int &k, const amrex::Geometry &geom, const amrex::IndexType &ixType)
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix