17 #ifndef IC_ELLIPSOID_H_
18 #define IC_ELLIPSOID_H_
33 Ellipsoid (amrex::Vector<amrex::Geometry> &_geom) :
IC(_geom) {}
37 for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
39 amrex::Box bx = mfi.tilebox();
40 bx.grow(a_field[lev]->nGrow());
41 amrex::IndexType type = a_field[lev]->ixType();
43 amrex::Array4<Set::Scalar>
const& field = a_field[lev]->array(mfi);
44 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
49 for (
int i=0 ; i <
center.size(); i++)
53 value = 0.5 + 0.5*std::erf(((x-
center[i]).transpose() *
A[i] * (x-
center[i]) - 1.0) /
eps[i] / norm);
55 min_value = value < min_value ? value : min_value;
57 field(i,j,k) = min_value;
62 a_field[lev]->FillBoundary();
68 amrex::Vector<Set::Scalar>
eps;
69 amrex::Vector<Set::Matrix>
A;
75 amrex::Vector<Set::Scalar>
center;
78 if(
center.size() < AMREX_SPACEDIM) value.
center.push_back(Set::Vector::Zero());
81 for (
int i = 0; i<
center.size(); i+=AMREX_SPACEDIM)
85 amrex::Vector<Set::Scalar>
A;
89 if(
A.size() < AMREX_SPACEDIM*AMREX_SPACEDIM) value.
A.push_back(Set::Matrix::Identity());
94 for (i=0; i<
A.size(); i+=AMREX_SPACEDIM)
96 for (j=0; j<AMREX_SPACEDIM; j++)
99 if((i+j) % (AMREX_SPACEDIM*AMREX_SPACEDIM) == 0)
101 value.
A.push_back(temp);
102 temp = Set::Matrix::Zero();
109 amrex::Vector<Set::Scalar> a_radius;
112 if (a_radius.size() < AMREX_SPACEDIM) value.
A.push_back(Set::Matrix::Identity());
115 for (
int i = 0; i<a_radius.size(); i+=AMREX_SPACEDIM)
118 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]) ; );
119 value.
A.push_back(temp);
124 amrex::Vector<Set::Scalar>
eps;
127 if(
eps.size() < 1) value.
eps.push_back(1.e-5);
128 for (
int i =0; i < value.
A.size(); i++)
130 if (
eps[i] <= 0.0)
eps[i] = 1.e-5;
131 value.
eps.push_back(
eps[i]);
138 std::string mollifier;
140 if(mollifier ==
"Dirac" || mollifier ==
"dirac")
141 value.
moll = Mollifier::Dirac;