15#ifndef INTEGRATOR_HEATCONDUCTION_H
16#define INTEGRATOR_HEATCONDUCTION_H
19#include "AMReX_Array4.H"
20#include "AMReX_GpuComplex.H"
21#include "AMReX_MFIter.H"
23#include <AMReX_ParallelDescriptor.H>
24#include <AMReX_ParmParse.H>
25#include <AMReX_TimeIntegrator.H>
38#include "Numeric/Stencil.H"
46 static constexpr const char*
name =
"heatconduction";
103 if (value.
method ==
"realspace")
134 amrex::TimeIntegrator timeintegrator(*
temp_old_mf[lev], time);
139 timeintegrator.set_rhs([&](amrex::MultiFab & rhs_mf, amrex::MultiFab &
temp_mf,
const Set::Scalar )
145 for (amrex::MFIter mfi(
temp_mf, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
148 const amrex::Box &bx = mfi.tilebox();
155 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
166 timeintegrator.set_post_stage_action([&](amrex::MultiFab & stage_mf,
Set::Scalar time)
169 stage_mf.FillBoundary(
true);
182 amrex::FabArray<amrex::BaseFab<Set::Complex>> Temp_hat = fft.MakeSpectralFab();
183 fft.Forward(*
temp_mf[lev], Temp_hat);
185 for (amrex::MFIter mfi(Temp_hat, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
187 const amrex::Box &bx = mfi.tilebox();
188 amrex::Array4<Set::Complex>
const & T_hat = Temp_hat.array(mfi);
190 fft.ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int m,
int n,
int p,
Set::Scalar lap) {
191 T_hat(m,n,p) *= exp( -
alpha *
dt * lap);
194 fft.Backward(Temp_hat, *
temp_mf[lev]);
208 if (
method==
"spectral")
return;
213 Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
216 for (amrex::MFIter mfi(*
temp_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
219 const amrex::Box& bx = mfi.tilebox();
220 amrex::Array4<char>
const& tags = a_tags.array(mfi);
221 amrex::Array4<Set::Scalar>
const& temp = (*
temp_mf[lev]).array(mfi);
224 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
232 tags(i, j, k) = amrex::TagBox::SET;
virtual void FillBoundary(amrex::BaseFab< T > &in, const amrex::Box &box, int ngrow, int dcomp, int ncomp, amrex::Real time, Orientation face=Orientation::All, const amrex::Mask *mask=nullptr)=0
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, const std::source_location &location=std::source_location::current())
int query_validate(std::string name, int &value, std::vector< int > possibleintvals, const std::source_location &location=std::source_location::current())
static ForwardArgs< ForwardArgStorage< Args >... > forward_args(Args &&... args)
int query_default(std::string name, T &value, T defaultvalue, const std::source_location &location=std::source_location::current())
int query_required(std::string name, T &value, const std::source_location &location=std::source_location::current())
const int number_of_ghost_cells
Set::Field< Set::Scalar > temp_mf
static void Parse(HeatConduction &value, IO::ParmParse &pp)
BC::BC< Set::Scalar > * bc
HeatConduction(int a_nghost=2)
const int number_of_components
void Advance(int lev, Set::Scalar time, Set::Scalar dt)
IC::IC< Set::Scalar > * ic
HeatConduction(IO::ParmParse &pp)
void AdvanceSpectral(int, Set::Scalar, Set::Scalar)
virtual ~HeatConduction()
Set::Scalar refinement_threshold
Set::Field< Set::Scalar > temp_old_mf
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int)
static constexpr const char * name
void RegisterNewFab(Set::Field< Set::Scalar > &new_fab, BC::BC< Set::Scalar > *new_bc, int ncomp, int nghost, std::string name, bool writeout, bool evolving=true, 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_GPU_HOST_DEVICE 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())
AMREX_GPU_HOST_DEVICE 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())
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
AMREX_GPU_HOST_DEVICE void Abort(const char *msg)
static Unit ThermalDiffusivity()
static Unit Temperature()