1 #ifndef INTEGRATOR_TOPOP_H
2 #define INTEGRATOR_TOPOP_H
9 #include "AMReX_ParallelDescriptor.H"
10 #include "AMReX_ParmParse.H"
27 #include "Numeric/Stencil.H"
33 #include "Operator/Operator.H"
78 AMREX_D_TERM((value.geom[0].ProbHi()[0] - value.geom[0].ProbLo()[0]),
79 *(value.geom[0].ProbHi()[1] - value.geom[0].ProbLo()[1]),
80 *(value.geom[0].ProbHi()[2] - value.geom[0].ProbLo()[2]));
105 if (a_step > 0)
return;
107 for (
int lev = 0; lev <= finest_level; ++lev)
120 BL_PROFILE(
"TopOp::Advance");
124 amrex::Box domain = geom[lev].Domain();
129 for (amrex::MFIter mfi(*
psi_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
131 amrex::Box bx = mfi.tilebox();
134 amrex::Array4<const Set::Matrix>
const& sig = (*
stress_mf[lev]).array(mfi);
135 amrex::Array4<const Set::Matrix>
const& eps = (*
strain_mf[lev]).array(mfi);
136 amrex::Array4<const Set::Scalar>
const& psi = (*
psi_old_mf[lev]).array(mfi);
137 amrex::Array4<Set::Scalar>
const& psinew = (*
psi_mf[lev]).array(mfi);
139 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
143 driving_force +=
alpha * 2.0 * psi(i, j, k) * (2.0 * psi(i, j, k) * psi(i, j, k) - 3.0 * psi(i, j, k) + 1.0);
149 driving_force += -
gamma * 0.5 * (sig_avg.transpose() * eps_avg).trace() * psi(i, j, k);
153 psinew(i, j, k) = psi(i, j, k) - Lnow *
dt * driving_force;
154 if (psinew(i, j, k) < 0.0) psinew(i, j, k) = 0.0;
155 if (psinew(i, j, k) > 1.0) psinew(i, j, k) = 1.0;
161 const amrex::MFIter& mfi,
const amrex::Box&
box)
override
163 BL_PROFILE(
"TopOp::Integrate");
166 const amrex::Real* DX = geom[amrlev].CellSize();
167 Set::Scalar dv = AMREX_D_TERM(DX[0], *DX[1], *DX[2]);
169 amrex::Array4<amrex::Real>
const& psi = (*
psi_mf[amrlev]).array(mfi);
170 amrex::Array4<const Set::Matrix>
const& sig = (*
stress_mf[amrlev]).array(mfi);
171 amrex::Array4<const Set::Matrix>
const& eps = (*
strain_mf[amrlev]).array(mfi);
172 amrex::ParallelFor(
box, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
174 volume += psi(i, j, k, 0) * dv;
175 w_chem_potential +=
alpha * psi(i, j, k, 0) * psi(i, j, k, 0) * (1. - psi(i, j, k, 0) * psi(i, j, k, 0)) * dv;
180 w_elastic +=
gamma * 0.5 * (sig_avg.transpose() * eps_avg).trace() * psi(i, j, k) * dv;
192 for (amrex::MFIter mfi(*
model_mf[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi)
194 amrex::Box bx = mfi.tilebox();
195 amrex::Array4<char>
const& tags = a_tags.array(mfi);
198 amrex::Array4<Set::Scalar>
const& psi =
psi_mf[lev]->array(mfi);
199 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
205 tags(i, j, k) = amrex::TagBox::SET;