22 Notch (amrex::Vector<amrex::Geometry> &_geom) :
IC(_geom)
28 moll = Mollifier::Dirac;
37 for (amrex::MFIter mfi(*a_field[lev],
true); mfi.isValid(); ++mfi)
40 amrex::Box bx = mfi.tilebox();
41 bx.grow(a_field[lev]->nGrow());
42 amrex::Array4<Set::Scalar>
const& field = a_field[lev]->array(mfi);
43 amrex::IndexType type = a_field[lev]->ixType();
44 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
48 if (type == amrex::IndexType::TheNodeType())
50 AMREX_D_TERM(x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i)) *
geom[lev].CellSize()[0];,
51 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j)) *
geom[lev].CellSize()[1];,
52 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k)) *
geom[lev].CellSize()[2];);
54 else if (type == amrex::IndexType::TheCellType())
56 AMREX_D_TERM(x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i) + 0.5) *
geom[lev].CellSize()[0];,
57 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j) + 0.5) *
geom[lev].CellSize()[1];,
58 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k) + 0.5) *
geom[lev].CellSize()[2];);
63 for (
int m = 0; m <
nCenter.size(); m++)
70 value = 0.5 + 0.5*std::erf(
t /
eps);
72 else if (
moll == Mollifier::Dirac)
74 if (
t < 0.0) value = 0.0;
77 else if (
moll == Mollifier::Cosine)
79 if (
t < 0.0) value = 0.0;
80 else if (
t <
eps) value = 0.5 - 0.5*std::cos(pi*
t/
eps);
92 nLeft2 = nLeft + correction;
93 nRight2 = nRight - correction;
111 value = 0.5 + 0.5*std::erf( ((x-nLeft).lpNorm<2>() -
nThickness[m]/2.0) /
eps );
113 else if (
moll == Mollifier::Dirac)
115 if (
t < 0.0) value = 0.0;
118 else if (
moll == Mollifier::Cosine)
130 if(angTop <= 0.0 && angBot >= 0.0)
132 if (t2 < 0.0) value = 0.0;
133 else if (t2 <
eps) value = 0.5 - 0.5*std::cos(pi*t2/
eps);
136 else if(angTop > 0.0 && angBot > 0.0)
139 if (t3 < 0.0) value = 0.0;
140 else if (t3 <
eps) value = 0.5 - 0.5*std::cos(pi*t3/
eps);
146 if (t3 < 0.0) value = 0.0;
147 else if (t3 <
eps) value = 0.5 - 0.5*std::cos(pi*t3/
eps);
154 if (std::abs(cosLeft) > cosR)
156 if (
t < 0.0) value = 0.0;
157 else if (
t <
eps) value = 0.5 - 0.5*std::cos(pi*
t/
eps);
166 if (t2 < 0.0) value = 0.0;
167 else if (t2 <
eps) value = 0.5 - 0.5*std::cos(pi*t2/
eps);
173 if (t2 < 0.0) value = 0.0;
174 else if (t2 <
eps) value = 0.5 - 0.5*std::cos(pi*t2/
eps);
186 value = 0.5 + 0.5*std::erf( ((x-nRight).lpNorm<2>() -
nThickness[m]/2.0) /
eps );
188 else if (
moll == Mollifier::Dirac)
190 if (
t < 0.0) value = 0.0;
193 else if (
moll == Mollifier::Cosine)
204 if(angTop <= 0.0 && angBot >= 0.0)
206 if (t2 < 0.0) value = 0.0;
207 else if (t2 <
eps) value = 0.5 - 0.5*std::cos(pi*t2/
eps);
210 else if(angTop > 0.0 && angBot > 0.0)
213 if (t3 < 0.0) value = 0.0;
214 else if (t3 <
eps) value = 0.5 - 0.5*std::cos(pi*t3/
eps);
220 if (t3 < 0.0) value = 0.0;
221 else if (t3 <
eps) value = 0.5 - 0.5*std::cos(pi*t3/
eps);
228 if (std::abs(cosRight) > cosR)
230 if (
t < 0.0) value = 0.0;
231 else if (
t <
eps) value = 0.5 - 0.5*std::cos(pi*
t/
eps);
240 if (t2 < 0.0) value = 0.0;
241 else if (t2 <
eps) value = 0.5 - 0.5*std::cos(pi*t2/
eps);
247 if (t2 < 0.0) value = 0.0;
248 else if (t2 <
eps) value = 0.5 - 0.5*std::cos(pi*t2/
eps);
256 min_value = value < min_value ? value : min_value;
258 field(i,j,k) = min_value;
260 if (field(i,j,k) < 0.) field(i,j,k) = 0.;
261 if (field(i,j,k) > 1.) field(i,j,k) = 1.;
264 a_field[lev]->FillBoundary();
283 amrex::Vector<Set::Scalar> center;
286 if(center.size() >= AMREX_SPACEDIM)
288 for (
int i = 0; i<center.size(); i+=AMREX_SPACEDIM)
295 amrex::Vector<Set::Scalar> orientation;
298 if(orientation.size()>=AMREX_SPACEDIM && orientation.size() == center.size())
300 for (
int i=0; i < orientation.size(); i+=AMREX_SPACEDIM)
328 for (
int i=0; i<value.
nLength.size(); i++)
334 for (
int i=0; i<value.
nRadius.size(); i++)
340 for (
int i=0; i<value.
nRadius.size(); i++)
347 if(value.
eps <= 0.) value.
eps = 1.e-5;
349 std::string mollifier;
351 if(mollifier ==
"Dirac" || mollifier ==
"dirac")
352 value.
moll = Mollifier::Dirac;
353 else if (mollifier ==
"gauss" || mollifier ==
"Gauss")
356 for (
int i=0; i<value.
nRadius.size(); i++)
359 else if (mollifier ==
"erf" || mollifier ==
"Erf")
362 for (
int i=0; i<value.
nRadius.size(); i++)
365 else if (mollifier ==
"cos" || mollifier ==
"Cosine")
366 value.
moll = Mollifier::Cosine;
368 value.
moll = Mollifier::Dirac;
379 value.
nNormal[i] = Set::Vector::Zero();