90 std::vector<amrex::Geometry> &geom,
96 Util::Assert(
INFO,
TEST(eta_mf[0]->nComp() == 2),
"This only works for 2 component phase fields");
113 for (amrex::MFIter mfi(*eta_mf[max_lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
115 const amrex::Box &bx = mfi.tilebox();
116 amrex::Array4<amrex::Real>
const &eta = (*eta_mf[max_lev]).array(mfi);
117 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
120 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);
123 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;
128 sitex.push_back(geom[max_lev].ProbLo()[0] + ((amrex::Real)(i)) * DX[0]);
129 sitey.push_back(geom[max_lev].ProbLo()[1] + ((amrex::Real)(j)) * DX[1]);
145 if (
sitex.size() > 0)
148 for (
int lev = 0; lev <= max_lev; lev++)
150 amrex::Box domain = geom[lev].Domain();
151 domain.convert(amrex::IntVect::TheNodeVector());
152 const amrex::Real *DX = geom[lev].CellSize();
153 for (amrex::MFIter mfi(*eta_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
155 const amrex::Box bx = mfi.grownnodaltilebox() & domain;
156 amrex::Array4<Set::Scalar>
const &eta = (*eta_mf[lev]).array(mfi);
157 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
161 x(0) = geom[lev].ProbLo()[0] + ((amrex::Real)(i)) * DX[0];,
162 x(1) = geom[lev].ProbLo()[1] + ((amrex::Real)(j)) * DX[1];,
163 x(2) = geom[lev].ProbLo()[2] + ((amrex::Real)(k)) * DX[2];);
164 for (
unsigned int m = 0; m <
phases.size(); m++)
166 amrex::Real r_squared = 0;
168 for (
int n = 0; n < AMREX_SPACEDIM; n++)
170 amrex::Real dist = nucleation_site(n) - x(n);
171 r_squared += dist * dist;
173 amrex::Real bump = exp(-r_squared /
box_size);
174 eta(i, j, k,
phases[m]) = bump * (1 - eta(i, j, k,
phases[m])) + eta(i, j, k,
phases[m]);
175 eta(i, j, k, 1 -
phases[m]) = (1. - bump) * eta(i, j, k, 1 -
phases[m]);