1 #ifndef ERF_AUXILIARY_MAPPED_TRANSPORT_H_
2 #define ERF_AUXILIARY_MAPPED_TRANSPORT_H_
4 #include <AMReX_Array4.H>
6 #include <AMReX_GpuQualifiers.H>
7 #include <AMReX_MultiFab.H>
19 template <
typename Tag>
29 const
amrex::DistributionMapping& dm,
36 for (
int dir = 0;
dir < AMREX_SPACEDIM; ++
dir) {
37 m_faces[
static_cast<std::size_t
>(
dir)] = std::make_unique<amrex::MultiFab>(
38 amrex::convert(cell_ba, amrex::IntVect::TheDimensionVector(
dir)),
46 amrex::MultiFab&
dir (
const int direction)
50 return *
m_faces[
static_cast<std::size_t
>(direction)];
53 const amrex::MultiFab&
dir (
const int direction)
const
57 return *
m_faces[
static_cast<std::size_t
>(direction)];
63 for (
auto& face :
m_faces) { face->setVal(value); }
67 std::array<std::unique_ptr<amrex::MultiFab>, AMREX_SPACEDIM>
m_faces{};
75 bool SameCellLayout (
const amrex::MultiFab& lhs,
const amrex::MultiFab& rhs);
78 template <
typename Tag>
80 const amrex::BoxArray& cell_ba,
81 const amrex::DistributionMapping& dm)
84 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
85 const auto& face = faces.
dir(dir);
86 if (face.boxArray() !=
87 amrex::convert(cell_ba, amrex::IntVect::TheDimensionVector(dir)) ||
88 face.DistributionMap() != dm) {
95 template <
typename Tag>
97 const amrex::MultiFab& cell)
103 template <
typename LhsTag,
typename RhsTag>
108 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
109 if (lhs.
dir(dir).boxArray() != rhs.
dir(dir).boxArray() ||
110 lhs.
dir(dir).DistributionMap() != rhs.
dir(dir).DistributionMap()) {
118 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
amrex::Real
129 return (fx_hi - fx_lo) * dx_inv +
130 (fy_hi - fy_lo) * dy_inv +
131 (fz_hi - fz_lo) * dzeta_inv;
135 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
amrex::Real
144 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx_inv) noexcept
148 amrex::max(-fx_lo,
amrex::Real(0.0))) * dx_inv[0] +
150 amrex::max(-fy_lo,
amrex::Real(0.0))) * dx_inv[1] +
153 return outward / (measure * density);
159 const amrex::MultiFab& rho_u,
160 const amrex::MultiFab& rho_v,
161 const amrex::MultiFab&
omega,
162 const amrex::MultiFab& ax,
163 const amrex::MultiFab& ay,
164 const amrex::MultiFab& az,
165 const amrex::MultiFab& mf_uy,
166 const amrex::MultiFab& mf_vx,
167 const amrex::MultiFab& mx,
168 const amrex::MultiFab& my,
169 std::string& diagnostic);
174 const amrex::MultiFab& rho_u,
175 const amrex::MultiFab& rho_v,
176 const amrex::MultiFab& rho_w,
177 std::string& diagnostic);
182 const amrex::MultiFab& measure,
183 const amrex::MultiFab& conserved,
184 int density_component,
185 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx_inv,
187 std::string& diagnostic);
192 double& hard_limit) noexcept;
196 const amrex::MultiFab& detJ,
197 const amrex::MultiFab& mx,
198 const amrex::MultiFab& my,
199 std::string& diagnostic);
204 std::string& diagnostic);
209 std::string& diagnostic);
215 template <
typename Tag>
219 const amrex::MultiFab&
omega,
220 const int omega_comp,
221 amrex::MultiFab& tendency,
222 const int tendency_comp,
223 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx_inv)
232 for (amrex::MFIter mfi(tendency, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
233 const amrex::Box bx = mfi.tilebox();
234 const auto fx = flux.
dir(0).const_array(mfi);
235 const auto fy = flux.
dir(1).const_array(mfi);
236 const auto fz = flux.
dir(2).const_array(mfi);
237 const auto measure =
omega.const_array(mfi);
238 const auto out = tendency.array(mfi);
239 const auto dx = dx_inv[0];
240 const auto dy = dx_inv[1];
241 const auto dz = dx_inv[2];
245 fx(i + 1, j, k, flux_comp), fx(i, j, k, flux_comp),
246 fy(i, j + 1, k, flux_comp), fy(i, j, k, flux_comp),
247 fz(i, j, k + 1, flux_comp), fz(i, j, k, flux_comp),
249 out(i, j, k, tendency_comp) = -div / measure(i, j, k, omega_comp);
const Real dy
Definition: ERF_InitCustomPert_ABL.H:45
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_AuxiliaryMappedTransport.H:20
MappedFaceField()=default
const amrex::MultiFab & dir(const int direction) const
Definition: ERF_AuxiliaryMappedTransport.H:53
MappedFaceField(MappedFaceField &&) noexcept=default
std::array< std::unique_ptr< amrex::MultiFab >, AMREX_SPACEDIM > m_faces
Definition: ERF_AuxiliaryMappedTransport.H:67
int nComp() const noexcept
Definition: ERF_AuxiliaryMappedTransport.H:44
amrex::MultiFab & dir(const int direction)
Definition: ERF_AuxiliaryMappedTransport.H:46
MappedFaceField(const MappedFaceField &)=delete
bool is_defined() const noexcept
Definition: ERF_AuxiliaryMappedTransport.H:43
int m_ncomp
Definition: ERF_AuxiliaryMappedTransport.H:68
void define(const amrex::BoxArray &cell_ba, const amrex::DistributionMapping &dm, const int ncomp, const int ngrow=0)
Definition: ERF_AuxiliaryMappedTransport.H:28
MappedFaceField & operator=(const MappedFaceField &)=delete
void setVal(const amrex::Real value)
Definition: ERF_AuxiliaryMappedTransport.H:60
@ omega
Definition: ERF_Morrison.H:55
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
Definition: ERF_ConsoleIO.cpp:17
Definition: ERF_AuxiliaryInertTracer.cpp:15
bool BuildMappedCellMeasure(amrex::MultiFab &omega, const amrex::MultiFab &detJ, const amrex::MultiFab &mx, const amrex::MultiFab &my, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:42
void AccumulateIntegratedFaceFlux(IntegratedMappedFaceFlux &ledger, const MappedFaceFluxRate &rate, const amrex::Real weight)
Definition: ERF_AuxiliaryMappedTransport.cpp:378
bool ComputeMaxMappedOutgoingRate(const MappedFaceFluxRate &rate, const amrex::MultiFab &measure, const amrex::MultiFab &conserved, const int density_component, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv, amrex::Real &max_rate, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:218
void ApplyMappedFluxTendency(const MappedFaceField< Tag > &flux, const int flux_comp, const amrex::MultiFab &omega, const int omega_comp, amrex::MultiFab &tendency, const int tendency_comp, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv)
Definition: ERF_AuxiliaryMappedTransport.H:216
amrex::Real MaxFaceFieldDifference(const MappedFaceFluxRate &lhs, const int lhs_comp, const MappedFaceFluxRate &rhs, const int rhs_comp)
Definition: ERF_AuxiliaryMappedTransport.cpp:349
bool ValidateFiniteComponent(const amrex::MultiFab &field, const int component, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:322
bool CopyNativeMappedDryAirCarrierFluxRate(MappedFaceFluxRate &rate, const amrex::MultiFab &rho_u, const amrex::MultiFab &rho_v, const amrex::MultiFab &rho_w, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:179
MappedFaceField< MappedFaceFluxRateTag > MappedFaceFluxRate
Definition: ERF_AuxiliaryMappedTransport.H:71
bool BuildMappedDryAirCarrierFluxRate(MappedFaceFluxRate &rate, const amrex::MultiFab &rho_u, const amrex::MultiFab &rho_v, const amrex::MultiFab &omega, const amrex::MultiFab &ax, const amrex::MultiFab &ay, const amrex::MultiFab &az, const amrex::MultiFab &mf_uy, const amrex::MultiFab &mf_vx, const amrex::MultiFab &mx, const amrex::MultiFab &my, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:90
bool ValidatePositiveFiniteComponent(const amrex::MultiFab &field, const int component, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:294
MappedFaceField< IntegratedMappedFaceFluxTag > IntegratedMappedFaceFlux
Definition: ERF_AuxiliaryMappedTransport.H:72
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ComputationalMappedDivergence(const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real dx_inv, const amrex::Real dy_inv, const amrex::Real dzeta_inv) noexcept
Definition: ERF_AuxiliaryMappedTransport.H:119
bool MappedFaceLayoutMatchesCellLayout(const MappedFaceField< Tag > &faces, const amrex::BoxArray &cell_ba, const amrex::DistributionMapping &dm)
Definition: ERF_AuxiliaryMappedTransport.H:79
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real MappedOutgoingDemandRate(const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real measure, const amrex::Real density, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv) noexcept
Definition: ERF_AuxiliaryMappedTransport.H:136
bool SameCellLayout(const amrex::MultiFab &lhs, const amrex::MultiFab &rhs)
Definition: ERF_AuxiliaryMappedTransport.cpp:36
bool FixedDtExceedsMappedDonorLimit(const double fixed_dt, const amrex::Real max_outgoing_rate, double &hard_limit) noexcept
Definition: ERF_AuxiliaryMappedTransport.cpp:268
bool SameMappedFaceLayout(const MappedFaceField< LhsTag > &lhs, const MappedFaceField< RhsTag > &rhs)
Definition: ERF_AuxiliaryMappedTransport.H:104
Definition: ERF_AuxiliaryMappedTransport.H:16
Definition: ERF_AuxiliaryMappedTransport.H:15