154 auto& data = *
m_levels[
static_cast<std::size_t
>(level)];
156 "M2 auxiliary inert tracer cannot advance before its static measure is built");
157 AuxiliaryStageRecipe recipe;
158 std::string diagnostic;
160 amrex::Abort(
"M2 auxiliary inert tracer stage recipe: " + diagnostic);
162 if (!std::isfinite(step_old_time) || !std::isfinite(input_time) ||
163 !std::isfinite(target_time)) {
164 amrex::Abort(
"M2 auxiliary inert tracer received a nonfinite semantic time");
166 if (!data.ledger.is_defined()) {
167 amrex::Abort(
"M2 auxiliary inert tracer ledger is not defined");
169 if (stage == 0 && data.ledger.step_active()) {
170 amrex::Abort(
"M2 auxiliary inert tracer received stage 0 before the prior step completed");
174 amrex::Abort(
"M2 auxiliary inert tracer anchor density: " + diagnostic);
177 amrex::Abort(
"M2 auxiliary inert tracer target density: " + diagnostic);
181 amrex::MultiFab::Copy(data.anchor, data.state, 0, 0, 1, 0);
182 data.have_previous_rate =
false;
186 const ConstTimedFieldView state_input{&data.state, 0, input_time};
187 const ConstTimedFieldView rho_input{&conserved_input,
Rho_comp, input_time};
192 amrex::Abort(
"M2 auxiliary inert tracer intensive state: " + diagnostic);
194 data.intensive.FillBoundary(geometry.periodicity());
199 for (amrex::MFIter mfi(data.intensive, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
200 const amrex::Box bx = mfi.tilebox();
201 amrex::GpuArray<const amrex::Array4<amrex::Real>, AMREX_SPACEDIM> flux_views{
202 data.rate.dir(0).array(mfi), data.rate.dir(1).array(mfi),
203 data.rate.dir(2).array(mfi)};
205 bx, data.intensive.const_array(mfi), 0, flux_views, 0,
206 avg_xmom.const_array(mfi), avg_ymom.const_array(mfi), avg_zmom.const_array(mfi),
214 amrex::max(avg_xmom.norm0(0), avg_ymom.norm0(0)), avg_zmom.norm0(0));
216 amrex::max(data.rate.dir(0).norm0(0), data.rate.dir(1).norm0(0)),
217 data.rate.dir(2).norm0(0));
219 amrex::Abort(
"M2 auxiliary inert tracer fixture requires a nonzero native host carrier");
222 const amrex::Real stage_rate_delta = data.have_previous_rate ?
224 data.max_stage_rate_delta = amrex::max(data.max_stage_rate_delta, stage_rate_delta);
228 if (!data.ledger.accept_stage(method, stage, step_old_time, recipe, data.rate, diagnostic)) {
229 amrex::Abort(
"M2 auxiliary inert tracer stage sequence: " + diagnostic);
232 AuxiliaryStageContext context;
233 context.method = method;
234 context.level = level;
235 context.stage = stage;
236 context.step_old_time = step_old_time;
237 context.input_time = input_time;
238 context.target_time = target_time;
239 context.recurrence = recipe;
240 context.state_anchor = {&data.anchor, 0, step_old_time};
241 context.state_input = {&data.state, 0, input_time};
242 context.state_target = {&data.target, 0, target_time};
243 context.rho_anchor = {&conserved_anchor,
Rho_comp, step_old_time};
244 context.rho_input = {&conserved_input,
Rho_comp, input_time};
245 context.rho_target = {&conserved_target,
Rho_comp, target_time};
246 context.measure_anchor = {&data.measure, 0, step_old_time};
247 context.measure_input = {&data.measure, 0, input_time};
248 context.measure_target = {&data.measure, 0, target_time};
253 context.carrier = {&avg_xmom, &avg_ymom, &avg_zmom};
257 amrex::Abort(
"M2 auxiliary inert tracer produced a nonfinite state: " + diagnostic);
261 std::swap(data.state, data.target);
263 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
264 amrex::MultiFab::Copy(data.previous_rate.dir(dir), data.rate.dir(dir), 0, 0, 1, 0);
266 data.have_previous_rate =
true;
269 <<
" stage=" << stage
270 <<
" step_time=" << step_old_time
271 <<
" input_time=" << input_time
272 <<
" target_time=" << target_time
273 <<
" carrier_max=" << carrier_max
274 <<
" rate_max=" << rate_max
275 <<
" rate_stage_delta=" << stage_rate_delta
276 <<
" finite_state=true"
277 <<
" ledger_weight=" << recipe.completed_ledger_time << std::endl;
279 if (data.ledger.step_complete()) {
282 amrex::Abort(
"M2 auxiliary inert tracer did not produce stage-varying mapped face rates");
285 amrex::MultiFab residual(data.state.boxArray(), data.state.DistributionMap(), 1, 0);
286 amrex::MultiFab scaled_residual(data.state.boxArray(), data.state.DistributionMap(), 1, 0);
287 const auto dx_inv = geometry.InvCellSizeArray();
288 const amrex::Real min_scale = std::numeric_limits<amrex::Real>::min();
289 for (amrex::MFIter mfi(data.state, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
290 const amrex::Box bx = mfi.tilebox();
291 const auto final_u = data.state.const_array(mfi);
292 const auto old_u = data.anchor.const_array(mfi);
293 const auto omega = data.measure.const_array(mfi);
294 const auto fx = data.ledger.integrated_flux().dir(0).const_array(mfi);
295 const auto fy = data.ledger.integrated_flux().dir(1).const_array(mfi);
296 const auto fz = data.ledger.integrated_flux().dir(2).const_array(mfi);
297 const auto out = residual.array(mfi);
298 const auto scaled = scaled_residual.array(mfi);
299 const auto dx = dx_inv[0];
300 const auto dy = dx_inv[1];
301 const auto dz = dx_inv[2];
306 fx(i + 1, j, k, 0), fx(i, j, k, 0),
307 fy(i, j + 1, k, 0), fy(i, j, k, 0),
308 fz(i, j, k + 1, 0), fz(i, j, k, 0),
dx,
dy,
dz);
311 amrex::max(amrex::Math::abs(h_final), amrex::Math::abs(h_old)),
312 amrex::max(amrex::Math::abs(div), min_scale));
314 scaled(i, j, k, 0) = amrex::Math::abs(r) / scale;
317 const amrex::Real max_absolute = residual.norm0(0);
318 const amrex::Real max_scaled = scaled_residual.norm0(0);
322 amrex::Print() <<
"AUX_M2_LEDGER max_abs_residual=" << max_absolute
323 <<
" max_scaled_residual=" << max_scaled
324 <<
" roundoff_tolerance=" << tolerance
325 <<
" max_stage_rate_delta=" << data.max_stage_rate_delta << std::endl;
326 if (!(max_scaled <= tolerance)) {
327 std::ostringstream message;
328 message <<
"completed-step mapped flux ledger failed local closure: abs="
329 << max_absolute <<
" scaled=" << max_scaled
330 <<
" tolerance=" << tolerance;
331 amrex::Abort(message.str());
void BuildScalarAdvectionFluxes(const amrex::Box &bx, const amrex::Array4< const amrex::Real > &scalar, const int scalar_comp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const AdvType horiz_adv_type, const AdvType vert_adv_type, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac)
Definition: ERF_AdvectionSrcForScalars.H:204
#define Rho_comp
Definition: ERF_IndexDefines.H:42
const Real dy
Definition: ERF_InitCustomPert_ABL.H:45
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
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
bool is_defined(int level) const
Definition: ERF_AuxiliaryInertTracer.cpp:342
@ omega
Definition: ERF_Morrison.H:55
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
Definition: ERF_ConsoleIO.cpp:17
void ApplyAuxiliaryMappedStage(const AuxiliaryStageContext &context, const MappedFaceFluxRate &rate, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv, const int rate_component)
Definition: ERF_AuxiliaryStage.cpp:169
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 MakeAuxiliaryStageRecipe(const HostIntegrator method, const int stage, const double host_stage_interval, AuxiliaryStageRecipe &recipe, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:67
bool ValidatePositiveFiniteComponent(const amrex::MultiFab &field, const int component, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:294
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
const char * HostIntegratorName(const HostIntegrator method) noexcept
Definition: ERF_AuxiliaryStage.cpp:57
bool BuildAuxiliaryIntensiveState(const ConstTimedFieldView &state_input, const ConstTimedFieldView &rho_input, const double input_time, amrex::MultiFab &intensive, const AuxiliaryFieldValidationPolicy validation, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:113
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
amrex::Real dryscal_horiz_upw_frac
Upwind blending fraction for horizontal dry scalar advection.
Definition: ERF_AdvStruct.H:453
AdvType dryscal_horiz_adv_type
Horizontal advection scheme for dry scalar variables.
Definition: ERF_AdvStruct.H:443
amrex::Real dryscal_vert_upw_frac
Upwind blending fraction for vertical dry scalar advection.
Definition: ERF_AdvStruct.H:454
AdvType dryscal_vert_adv_type
Vertical advection scheme for dry scalar variables.
Definition: ERF_AdvStruct.H:444