1#include <AMReX_MLPoisson.H>
49 amrex::FFT::R2C my_fft(this->geom[lev].Domain());
50 auto const &[cba, cdm] = my_fft.getSpectralDataLayout();
52 amrex::Box
const & domain = this->geom[lev].Domain();
58 Set::Scalar scaling = 1.0 / geom[lev].Domain().d_numPts();
63 for ( amrex::MFIter mfi(*
eta_mf[lev],
true); mfi.isValid(); ++mfi )
65 const amrex::Box& bx = mfi.tilebox();
66 amrex::Array4<const amrex::Real>
const& eta =
eta_mf[lev]->array(mfi);
67 amrex::Array4<amrex::Real>
const& grad_chempot =
grad_chempot_mf[lev]->array(mfi);
68 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
70 grad_chempot(i, j, k) = eta(i, j, k) * eta(i, j, k) * eta(i, j, k);
79 amrex::FabArray<amrex::BaseFab<amrex::GpuComplex<Set::Scalar> > > eta_hat_mf(cba, cdm, 1, 0);
80 my_fft.forward(*
eta_mf[lev], eta_hat_mf);
85 amrex::FabArray<amrex::BaseFab<amrex::GpuComplex<Set::Scalar> > > chempot_hat_mf(cba, cdm, 1, 0);
91 for (amrex::MFIter mfi(eta_hat_mf, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
93 const amrex::Box &bx = mfi.tilebox();
95 amrex::Array4<amrex::GpuComplex<Set::Scalar>>
const & eta_hat = eta_hat_mf.array(mfi);
96 amrex::Array4<amrex::GpuComplex<Set::Scalar>>
const & N_hat = chempot_hat_mf.array(mfi);
98 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int m,
int n,
int p) {
103 Set::Scalar k2 = (n < domain.length(1)/2 ? n * pi_Ly : (n - domain.length(1)) * pi_Ly);,
104 Set::Scalar k3 = (p < domain.length(2)/2 ? p * pi_Lz : (p - domain.length(2)) * pi_Lz););
106 Set::Scalar omega2 = AMREX_D_TERM(k1 * k1, + k2 * k2, + k3 * k3);
110 eta_hat(m, n, p) = eta_hat(m, n, p) -
dt * omega2 * N_hat(m, n, p);
111 eta_hat(m,n,p) /= 1.0 +
dt * ((
q0*
q0*
q0*
q0 -
eps)*omega2 - 2.0*
q0*
q0 * omega4 + omega6);
112 eta_hat(m,n,p) *= scaling;
119 my_fft.backward(eta_hat_mf, *
eta_mf[lev]);
void Initialize(const int &a_lev, Set::Field< T > &a_field, Set::Scalar a_time=0.0)
Set each point to a random value.
int query_required(std::string name, T &value, std::string file="", std::string func="", int line=-1)
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
void RegisterNewFab(Set::Field< Set::Scalar > &new_fab, BC::BC< Set::Scalar > *new_bc, int ncomp, int nghost, std::string name, bool writeout, std::vector< std::string > suffix={})
Add a new cell-based scalar field.
amrex::Vector< amrex::Real > dt
Timesteps for each level of refinement.
Set::Field< Set::Scalar > grad_chempot_mf
Order parameter field.
void TagCellsForRefinement(int lev, amrex::TagBoxArray &tags, amrex::Real time, int ngrow) override
Mark any cells that need to be refined.
~PFC()
Destroy pointers defined in Parse.
static void Parse(PFC &value, IO::ParmParse &pp)
Scan input values and initialize fields.
PFC()
Basic constructor (don't use)
IC::IC< Set::Scalar > * ic
eta's bc object
Set::Field< Set::Scalar > eta_mf
BC::BC< Set::Scalar > * bc
Field to calculate FFT of nonlinar part.
Set::Scalar q0
eta's ic object
void Initialize(int lev) override
Set values in fields.
void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
Integrate eta over one timestep on lev.
Collection of numerical integrator objects.
static const Set::Scalar Pi
void Abort(const char *msg)