19 static constexpr
const char*
name =
"laminate";
22 Laminate(amrex::Vector<amrex::Geometry>& _geom):
IC(_geom) {}
30 for (amrex::MFIter mfi(*a_field[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
32 amrex::Box bx = mfi.tilebox();
33 bx.grow(a_field[lev]->nGrow());
34 amrex::IndexType type = a_field[lev]->ixType();
36 amrex::Array4<Set::Scalar>
const& field = a_field[lev]->array(mfi);
37 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
50 field(i, j, k, m + 1) = 0.5 - 0.5 * std::erf(
t /
eps[m]);
51 if (field(i, j, k, m + 1) < 0.) field(i, j, k, m + 1) = 0.;
52 if (field(i, j, k, m + 1) > 1.) field(i, j, k, m + 1) = 1.;
53 value += field(i, j, k, m + 1);
55 field(i, j, k, 0) = 1.0 - value;
56 if (field(i, j, k, 0) < 0.) field(i, j, k, 0) = 0.;
57 if (field(i, j, k, 0) > 1.) field(i, j, k, 0) = 1.;
62 field(i, j, k, 0) = 0.5 - 0.5 * std::erf(
t /
eps[0]);
63 if (
invert) field(i, j, k, 0) = 1.0 - field(i, j, k, 0);
67 a_field[lev]->FillBoundary();
75 amrex::Vector<Set::Scalar>
eps;
88 Util::Abort(
INFO,
"Number of inclusions must be at least 1. Aborting.");
90 amrex::Vector<Set::Scalar> a_center;
97 for (
int i = 0; i < a_center.size(); i += AMREX_SPACEDIM)
101 amrex::Vector<Set::Scalar> a_thickness;
108 if (a_thickness.size() == 1)
110 if (a_thickness[0] <= 0.0)
Util::Abort(
INFO,
"Invalid value of inclusion thickness");
118 if (a_thickness[i] <= 0.0)
Util::Abort(
INFO,
"Invalid value of inclusion ", i + 1,
" thickness");
119 value.
thickness.push_back(a_thickness[i]);
123 amrex::Vector<Set::Scalar> a_orientation;
127 if (a_orientation.size() != value.
number_of_inclusions * AMREX_SPACEDIM && a_orientation.size() != AMREX_SPACEDIM)
130 if (a_orientation.size() == AMREX_SPACEDIM)
135 for (
int i = 0; i < a_orientation.size(); i += AMREX_SPACEDIM)
147 value.
normal[i] = Set::Vector::Zero();
150 AMREX_D_TERM(value.
normal[i](0) = 1.;, value.
normal[i](1) = 1.;, value.
normal[i](2) = 1.;);
156 AMREX_D_TERM(value.
normal[i](0) = 1.;, value.
normal[i](1) = 1.;, value.
normal[i](2) = 1.;);
162 amrex::Vector<Set::Scalar> a_eps;
166 if (a_eps.size() < 1)
168 value.
eps.push_back(1.e-5);
169 if (a_eps.size() == 1)
177 value.
eps.push_back(a_eps[0]);
182 value.
eps.push_back(a_eps[i]);
185 std::string mollifier;
187 if (mollifier ==
"Dirac" || mollifier ==
"dirac")
188 value.
moll = Mollifier::Dirac;