1#include <AMReX_MLPoisson.H>
7#include "Numeric/Stencil.H"
39 value.RegisterNewFab(value.etanew_mf, value.bc, 1, 1,
"eta",
true);
40 value.RegisterNewFab(value.intermediate, value.bc, 1, 1,
"int",
true);
42 if (value.method ==
"realspace")
43 value.RegisterNewFab(value.etaold_mf, value.bc, 1, 1,
"eta_old",
false);
49 if (method ==
"realspace")
50 AdvanceReal(lev, time, dt);
51 else if (method ==
"spectral")
53 if (lev == finest_level) AdvanceSpectral(lev, time, dt);
63 std::swap(etaold_mf[lev], etanew_mf[lev]);
65 for ( amrex::MFIter mfi(*etanew_mf[lev],
true); mfi.isValid(); ++mfi )
67 const amrex::Box& bx = mfi.tilebox();
68 amrex::Array4<const amrex::Real>
const& eta = etaold_mf[lev]->array(mfi);
69 amrex::Array4<amrex::Real>
const& inter = intermediate[lev]->array(mfi);
70 amrex::Array4<amrex::Real>
const& etanew = etanew_mf[lev]->array(mfi);
72 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
78 eta(i,j,k)*eta(i,j,k)*eta(i,j,k)
83 etanew(i,j,k) = eta(i,j,k) - dt*inter(i,j,k);
86 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k){
89 etanew(i,j,k) = eta(i,j,k) + dt*lap_inter;
103 for ( amrex::MFIter mfi(*etanew_mf[lev],
true); mfi.isValid(); ++mfi )
105 const amrex::Box& bx = mfi.tilebox();
106 amrex::Array4<const amrex::Real>
const& eta = etanew_mf[lev]->array(mfi);
107 amrex::Array4<amrex::Real>
const& inter = intermediate[lev]->array(mfi);
108 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
110 inter(i,j,k) = eta(i,j,k)*eta(i,j,k)*eta(i,j,k) - eta(i,j,k);
114 intermediate[lev]->FillBoundary();
119 amrex::FabArray<amrex::BaseFab<Set::Complex> > eta_hat_mf = fft.MakeSpectralFab();
120 fft.Forward(etanew_mf, lev, eta_hat_mf, 0, 0, time);
125 amrex::FabArray<amrex::BaseFab<Set::Complex> > chempot_hat_mf = fft.MakeSpectralFab();
126 fft.Forward(intermediate, lev, chempot_hat_mf, 0, 0, time);
132 for (amrex::MFIter mfi(eta_hat_mf,
false); mfi.isValid(); ++mfi)
134 const amrex::Box &bx = mfi.tilebox();
137 amrex::Array4<Set::Complex>
const & eta_hat = eta_hat_mf.array(mfi);
138 amrex::Array4<Set::Complex>
const & chempot_hat = chempot_hat_mf.array(mfi);
140 fft.ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int m,
int n,
int p,
Set::Scalar omega2) {
144 (eta_hat(m, n, p) - L * omega2 * chempot_hat(m, n, p) * dt) /
145 (1.0 + L * gamma * omega4 * dt);
152 fft.Backward(eta_hat_mf, etanew_mf, lev);
165CahnHilliard::Initialize (
int lev)
167 intermediate[lev]->setVal(0.0);
168 ic->Initialize(lev,etanew_mf);
169 if (method ==
"realspace")
170 ic->Initialize(lev,etaold_mf);
175CahnHilliard::TagCellsForRefinement (
int lev, amrex::TagBoxArray& a_tags,
Set::Scalar ,
int )
178 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
180 for (amrex::MFIter mfi(*etanew_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
182 const amrex::Box& bx = mfi.tilebox();
183 amrex::Array4<char>
const& tags = a_tags.array(mfi);
186 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
189 if (grad.lpNorm<2>() * dr > refinement_threshold)
190 tags(i, j, k) = amrex::TagBox::SET;
Set each point to a random value.
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
int query_default(std::string name, T &value, T defaultvalue)
int query_validate(std::string name, int &value, std::vector< int > possibleintvals)
CahnHilliard()
Basic constructor (don't use)
IC::IC< Set::Scalar > * ic
eta's bc object
Set::Scalar gamma
eta's ic object
Set::Scalar refinement_threshold
BC::BC< Set::Scalar > * bc
Intermediate field used for CH kinetics.
~CahnHilliard()
Destroy pointers defined in Parse.
static void Parse(CahnHilliard &value, IO::ParmParse &pp)
Scan input values and initialize fields.
Collection of numerical integrator objects.
AMREX_FORCE_INLINE Set::Scalar Laplacian(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > &stencil=DefaultType)
AMREX_FORCE_INLINE Set::Vector Gradient(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
void Abort(const char *msg)