57 for (amrex::MFIter mfi(*a_field[lev],
true); mfi.isValid(); ++mfi)
60 amrex::Box bx = mfi.tilebox();
61 bx.grow(a_field[lev]->nGrow());
62 amrex::Array4<Set::Scalar>
const &field = a_field[lev]->array(mfi);
63 amrex::IndexType type = a_field[lev]->ixType();
64 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
67 if (type == amrex::IndexType::TheNodeType())
69 AMREX_D_TERM( x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i)) *
geom[lev].CellSize()[0];,
70 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j)) *
geom[lev].CellSize()[1];,
71 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k)) *
geom[lev].CellSize()[2];);
73 else if (type == amrex::IndexType::TheCellType())
75 AMREX_D_TERM( x(0) =
geom[lev].ProbLo()[0] + ((amrex::Real)(i) + 0.5) *
geom[lev].CellSize()[0];,
76 x(1) =
geom[lev].ProbLo()[1] + ((amrex::Real)(j) + 0.5) *
geom[lev].CellSize()[1];,
77 x(2) =
geom[lev].ProbLo()[2] + ((amrex::Real)(k) + 0.5) *
geom[lev].CellSize()[2];);
82 for (
int m = 0; m <
nCenter.size(); m++)
89 value = 0.5 + 0.5 * std::erf(
t /
eps);
93 value = (
t >= 0.0) ? 1.0 - std::exp(-0.5 * (4.0 *
t /
eps) * (4.0 *
t /
eps)) : 0.0;
111 value = 0.5 - 0.5 * std::cos(pi *
t /
eps);
124 nLeft2 = nLeft + correction;
125 nRight2 = nRight - correction;
142 value = 0.5 + 0.5 * std::erf(((x - nLeft).lpNorm<2>() -
nThickness[m] / 2.0) /
eps);
146 t = ((x - nLeft).lpNorm<2>() -
nThickness[m] / 2.0);
147 value = (
t >= 0.0) ? 1.0 - std::exp(-0.5 * (4.0 *
t /
eps) * (4.0 *
t /
eps)) : 0.0;
151 t = ((x - nLeft).lpNorm<2>() -
nThickness[m] / 2.0);
152 value = (
t >= 0.0) ? ((
t >
eps) ? 1.0 :
t /
eps) : 0.0;
173 if (angTop <= 0.0 && angBot >= 0.0)
178 value = 0.5 - 0.5 * std::cos(pi * t2 /
eps);
182 else if (angTop > 0.0 && angBot > 0.0)
188 value = 0.5 - 0.5 * std::cos(pi * t3 /
eps);
198 value = 0.5 - 0.5 * std::cos(pi * t3 /
eps);
206 if (std::abs(cosLeft) > cosR)
211 value = 0.5 - 0.5 * std::cos(pi *
t /
eps);
224 value = 0.5 - 0.5 * std::cos(pi * t2 /
eps);
234 value = 0.5 - 0.5 * std::cos(pi * t2 /
eps);
247 value = 0.5 + 0.5 * std::erf(((x - nRight).lpNorm<2>() -
nThickness[m] / 2.0) /
eps);
251 t = ((x - nRight).lpNorm<2>() -
nThickness[m] / 2.0);
252 value = (
t >= 0.0) ? 1.0 - std::exp(-0.5 * (4.0 *
t /
eps) * (4.0 *
t /
eps)) : 0.0;
256 t = ((x - nRight).lpNorm<2>() -
nThickness[m] / 2.0);
257 value = (
t >= 0.0) ? ((
t >
eps) ? 1.0 :
t /
eps) : 0.0;
277 if (angTop <= 0.0 && angBot >= 0.0)
282 value = 0.5 - 0.5 * std::cos(pi * t2 /
eps);
286 else if (angTop > 0.0 && angBot > 0.0)
292 value = 0.5 - 0.5 * std::cos(pi * t3 /
eps);
302 value = 0.5 - 0.5 * std::cos(pi * t3 /
eps);
310 if (std::abs(cosRight) > cosR)
315 value = 0.5 - 0.5 * std::cos(pi *
t /
eps);
328 value = 0.5 - 0.5 * std::cos(pi * t2 /
eps);
338 value = 0.5 - 0.5 * std::cos(pi * t2 /
eps);
347 min_value = value < min_value ? value : min_value;
349 field(i, j, k) = min_value;
351 if (field(i, j, k) < 0.)
353 if (field(i, j, k) > 1.)
357 a_field[lev]->FillBoundary();
377 amrex::Vector<Set::Scalar> center;
380 if (center.size() >= AMREX_SPACEDIM)
382 for (
int i = 0; i < center.size(); i += AMREX_SPACEDIM)
383 value.
nCenter.push_back(
Set::Vector(AMREX_D_DECL(center[i], center[i + 1], center[i + 2])));
389 amrex::Vector<Set::Scalar> orientation;
392 if (orientation.size() >= AMREX_SPACEDIM && orientation.size() == center.size())
394 for (
int i = 0; i < orientation.size(); i += AMREX_SPACEDIM)
395 value.
nOrientation.push_back(
Set::Vector(AMREX_D_DECL(orientation[i], orientation[i + 1], orientation[i + 2])));
413 for (
int i = 0; i < value.
nThickness.size(); i++)
421 for (
int i = 0; i < value.
nThickness.size(); i++)
428 for (
int i = 0; i < value.
nThickness.size(); i++)
435 for (
int i = 0; i < value.
nLength.size(); i++)
442 for (
int i = 0; i < value.
nRadius.size(); i++)
449 for (
int i = 0; i < value.
nRadius.size(); i++)
461 std::string mollifier;
463 if (mollifier ==
"Dirac" || mollifier ==
"dirac")
465 else if (mollifier ==
"gauss" || mollifier ==
"Gauss")
468 for (
int i = 0; i < value.
nRadius.size(); i++)
471 else if (mollifier ==
"linear" || mollifier ==
"Linear")
474 for (
int i = 0; i < value.
nRadius.size(); i++)
477 else if (mollifier ==
"erf" || mollifier ==
"Erf")
480 for (
int i = 0; i < value.
nRadius.size(); i++)
483 else if (mollifier ==
"cos" || mollifier ==
"Cosine")
497 value.
nNormal[i] = Set::Vector::Zero();