7#ifndef INTEGRATOR_DENDRITE_H
8#define INTEGRATOR_DENDRITE_H
15#include "AMReX_ParallelDescriptor.H"
16#include "AMReX_ParmParse.H"
25#include "Numeric/Stencil.H"
32 static constexpr const char*
name =
"dendrite";
111 for (amrex::MFIter mfi(*
temp_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
114 const amrex::Box& bx = mfi.tilebox();
117 amrex::Array4<const Set::Scalar>
const& temp = (*
temp_old_mf[lev]).array(mfi);
118 amrex::Array4<Set::Scalar>
const& temp_new = (*
temp_mf[lev]).array(mfi);
119 amrex::Array4<const Set::Scalar>
const& phi = (*
phi_old_mf[lev]).array(mfi);
120 amrex::Array4<Set::Scalar>
const& phi_new = (*
phi_mf[lev]).array(mfi);
123 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
128 gradphi =
R * gradphi;
135 gradphi(0) * gradphi(0) * gradphi(0) * gradphi(0),
136 +gradphi(1) * gradphi(1) * gradphi(1) * gradphi(1),
137 +gradphi(2) * gradphi(2) * gradphi(2) * gradphi(2));
138 Set::Scalar v22 = gradphi.squaredNorm(); v22 *= v22;
153 Set::Scalar Dphi = (
eps *
eps * lapphi + phi(i, j, k) * (1.0 - phi(i, j, k)) * (phi(i, j, k) - 0.5 + m)) /
tau;
154 phi_new(i, j, k) = phi(i, j, k) +
dt * Dphi;
161 temp_new(i, j, k) = temp(i, j, k) +
dt * (
diffusion*laptemp + Dphi);
172 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
175 for (amrex::MFIter mfi(*
temp_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
178 const amrex::Box& bx = mfi.tilebox();
179 amrex::Array4<char>
const& tags = a_tags.array(mfi);
180 amrex::Array4<Set::Scalar>
const& temp = (*
temp_mf[lev]).array(mfi);
181 amrex::Array4<Set::Scalar>
const& phi = (*
phi_mf[lev]).array(mfi);
184 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
193 tags(i, j, k) = amrex::TagBox::SET;
195 tags(i, j, k) = amrex::TagBox::SET;
#define pp_query_required(...)
#define pp_query_default(...)
Pure abstract IC object from which all other IC objects inherit.
void Initialize(const int &a_lev, Set::Field< T > &a_field, Set::Scalar a_time=0.0)
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Set::Field< Set::Scalar > temp_old_mf
Dendrite(IO::ParmParse &pp)
Set::Scalar refinement_threshold_temp
Set::Field< Set::Scalar > phi_mf
IC::IC< Set::Scalar > * ic_phi
Set::Field< Set::Scalar > phi_old_mf
Set::Scalar refinement_threshold_phi
Set::Field< Set::Scalar > temp_mf
static void Parse(Dendrite &value, IO::ParmParse &pp)
int number_of_ghost_cells
static constexpr const char * name
IC::IC< Set::Scalar > * ic_temp
Set::Field< Set::Scalar > & eta_mf
BC::BC< Set::Scalar > * bc_phi
void Advance(int lev, Set::Scalar, Set::Scalar dt)
BC::BC< Set::Scalar > * bc_temp
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int)
Set::Field< Set::Scalar > & eta_old_mf
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.
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)
static const Set::Scalar Pi
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
AMREX_FORCE_INLINE Set::Matrix reduce(const Set::Matrix3d &in)