95 std::vector<amrex::Geometry> &geom,
101 Util::Assert(
INFO,
TEST(eta_mf[0]->nComp() == 2),
"This only works for 2 component phase fields");
118 for (amrex::MFIter mfi(*eta_mf[max_lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
120 const amrex::Box &bx = mfi.tilebox();
121 amrex::Array4<amrex::Real>
const &eta = (*eta_mf[max_lev]).array(mfi);
122 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
125 E0 /=
epsilon + 256.0*eta(i,j,k,0)*eta(i,j,k,0)*eta(i,j,k,0)*eta(i,j,k,0)*eta(i,j,k,1)*eta(i,j,k,1)*eta(i,j,k,1)*eta(i,j,k,1);
128 if (eta(i,j,k,0) < 0 || eta(i,j,k,0) > 1.0 || eta(i,j,k,1) < 0 || eta(i,j,k,1) > 1.0) P = 0.0;
133 sitex.push_back(geom[max_lev].ProbLo()[0] + ((amrex::Real)(i)) * DX[0]);
134 sitey.push_back(geom[max_lev].ProbLo()[1] + ((amrex::Real)(j)) * DX[1]);
150 if (
sitex.size() > 0)
153 for (
int lev = 0; lev <= max_lev; lev++)
155 amrex::Box domain = geom[lev].Domain();
156 domain.convert(amrex::IntVect::TheNodeVector());
157 const amrex::Real *DX = geom[lev].CellSize();
158 for (amrex::MFIter mfi(*eta_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
160 const amrex::Box bx = mfi.grownnodaltilebox() & domain;
161 amrex::Array4<Set::Scalar>
const &eta = (*eta_mf[lev]).array(mfi);
162 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
166 x(0) = geom[lev].ProbLo()[0] + ((amrex::Real)(i)) * DX[0];,
167 x(1) = geom[lev].ProbLo()[1] + ((amrex::Real)(j)) * DX[1];,
168 x(2) = geom[lev].ProbLo()[2] + ((amrex::Real)(k)) * DX[2];);
169 for (
unsigned int m = 0; m <
phases.size(); m++)
171 amrex::Real r_squared = 0;
173 for (
int n = 0; n < AMREX_SPACEDIM; n++)
175 amrex::Real dist = nucleation_site(n) - x(n);
176 r_squared += dist * dist;
178 amrex::Real bump = exp(-r_squared /
box_size);
179 eta(i, j, k,
phases[m]) = bump * (1 - eta(i, j, k,
phases[m])) + eta(i, j, k,
phases[m]);
180 eta(i, j, k, 1 -
phases[m]) = (1. - bump) * eta(i, j, k, 1 -
phases[m]);