ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
erf_auxiliary::AuxiliaryInertTracer Class Reference

#include <ERF_AuxiliaryInertTracer.H>

Collaboration diagram for erf_auxiliary::AuxiliaryInertTracer:

Classes

struct  LevelStorage
 

Public Member Functions

 AuxiliaryInertTracer (int number_of_levels)
 
 ~AuxiliaryInertTracer ()
 
 AuxiliaryInertTracer (const AuxiliaryInertTracer &)=delete
 
AuxiliaryInertTracer & operator= (const AuxiliaryInertTracer &)=delete
 
void define (int level, const amrex::BoxArray &cell_ba, const amrex::DistributionMapping &dm)
 
bool rebuild_static_measure (int level, const amrex::MultiFab &detJ, const amrex::MultiFab &mx, const amrex::MultiFab &my, std::string &diagnostic)
 
void initialize (int level, const amrex::MultiFab &conserved, const amrex::Geometry &geometry)
 
void advance_stage (int level, HostIntegrator method, int stage, double step_old_time, double input_time, double target_time, double host_stage_interval, const amrex::MultiFab &conserved_anchor, const amrex::MultiFab &conserved_input, const amrex::MultiFab &conserved_target, const amrex::MultiFab &avg_xmom, const amrex::MultiFab &avg_ymom, const amrex::MultiFab &avg_zmom, const AdvChoice &advection, const amrex::Geometry &geometry)
 
void destroy (int level)
 
bool is_defined (int level) const
 
bool measure_is_ready (int level) const
 
const amrex::MultiFab & static_measure (int level) const
 
const amrex::MultiFab & state (int level) const
 

Static Public Member Functions

static const AuxiliaryStateLayout & layout ()
 

Private Attributes

std::vector< std::unique_ptr< LevelStorage > > m_levels
 

Detailed Description

Test-only, non-SBM proof consumer for the generic mapped transport substrate.

Constructor & Destructor Documentation

◆ AuxiliaryInertTracer() [1/2]

erf_auxiliary::AuxiliaryInertTracer::AuxiliaryInertTracer ( int  number_of_levels)
explicit
34  : m_levels(static_cast<std::size_t>(number_of_levels))
35 {
36  AMREX_ALWAYS_ASSERT(number_of_levels > 0);
37 }
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
std::vector< std::unique_ptr< LevelStorage > > m_levels
Definition: ERF_AuxiliaryInertTracer.H:65
Here is the call graph for this function:

◆ ~AuxiliaryInertTracer()

erf_auxiliary::AuxiliaryInertTracer::~AuxiliaryInertTracer ( )
default

◆ AuxiliaryInertTracer() [2/2]

erf_auxiliary::AuxiliaryInertTracer::AuxiliaryInertTracer ( const AuxiliaryInertTracer &  )
delete

Member Function Documentation

◆ advance_stage()

void erf_auxiliary::AuxiliaryInertTracer::advance_stage ( int  level,
HostIntegrator  method,
int  stage,
double  step_old_time,
double  input_time,
double  target_time,
double  host_stage_interval,
const amrex::MultiFab &  conserved_anchor,
const amrex::MultiFab &  conserved_input,
const amrex::MultiFab &  conserved_target,
const amrex::MultiFab &  avg_xmom,
const amrex::MultiFab &  avg_ymom,
const amrex::MultiFab &  avg_zmom,
const AdvChoice &  advection,
const amrex::Geometry &  geometry 
)
152 {
154  auto& data = *m_levels[static_cast<std::size_t>(level)];
155  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(data.measure_ready,
156  "M2 auxiliary inert tracer cannot advance before its static measure is built");
157  AuxiliaryStageRecipe recipe;
158  std::string diagnostic;
159  if (!MakeAuxiliaryStageRecipe(method, stage, host_stage_interval, recipe, diagnostic)) {
160  amrex::Abort("M2 auxiliary inert tracer stage recipe: " + diagnostic);
161  }
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");
165  }
166  if (!data.ledger.is_defined()) {
167  amrex::Abort("M2 auxiliary inert tracer ledger is not defined");
168  }
169  if (stage == 0 && data.ledger.step_active()) {
170  amrex::Abort("M2 auxiliary inert tracer received stage 0 before the prior step completed");
171  }
172 
173  if (!ValidatePositiveFiniteComponent(conserved_anchor, Rho_comp, diagnostic)) {
174  amrex::Abort("M2 auxiliary inert tracer anchor density: " + diagnostic);
175  }
176  if (!ValidatePositiveFiniteComponent(conserved_target, Rho_comp, diagnostic)) {
177  amrex::Abort("M2 auxiliary inert tracer target density: " + diagnostic);
178  }
179 
180  if (stage == 0) {
181  amrex::MultiFab::Copy(data.anchor, data.state, 0, 0, 1, 0);
182  data.have_previous_rate = false;
183  data.max_stage_rate_delta = amrex::Real(0.0);
184  }
185 
186  const ConstTimedFieldView state_input{&data.state, 0, input_time};
187  const ConstTimedFieldView rho_input{&conserved_input, Rho_comp, input_time};
188  if (!BuildAuxiliaryIntensiveState(state_input, rho_input, input_time,
189  data.intensive,
191  diagnostic)) {
192  amrex::Abort("M2 auxiliary inert tracer intensive state: " + diagnostic);
193  }
194  data.intensive.FillBoundary(geometry.periodicity());
195 
198  data.rate.setVal(amrex::Real(0.0));
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),
207  advection.dryscal_horiz_adv_type, advection.dryscal_vert_adv_type,
208  advection.dryscal_horiz_upw_frac, advection.dryscal_vert_upw_frac);
209  }
210 
211  // These full-domain reductions are qualification-only diagnostics for this
212  // test fixture, not part of the reusable transport operator path.
213  const amrex::Real carrier_max = amrex::max(
214  amrex::max(avg_xmom.norm0(0), avg_ymom.norm0(0)), avg_zmom.norm0(0));
215  const amrex::Real rate_max = amrex::max(
216  amrex::max(data.rate.dir(0).norm0(0), data.rate.dir(1).norm0(0)),
217  data.rate.dir(2).norm0(0));
218  if (!(carrier_max > amrex::Real(0.0))) {
219  amrex::Abort("M2 auxiliary inert tracer fixture requires a nonzero native host carrier");
220  }
221 
222  const amrex::Real stage_rate_delta = data.have_previous_rate ?
223  MaxFaceFieldDifference(data.rate, 0, data.previous_rate, 0) : amrex::Real(0.0);
224  data.max_stage_rate_delta = amrex::max(data.max_stage_rate_delta, stage_rate_delta);
225 
226  // accept_stage is MPI-collective: all ranks on this level must enter even
227  // after a local recoverable error; do not add rank-local early returns.
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);
230  }
231 
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};
249  // This proof consumer is qualified only for a time-invariant mapped
250  // measure. Its three semantic measure views intentionally reference the
251  // same field. A moving-mesh consumer must supply distinct anchor/input/
252  // target measures and is outside this fixture's supported envelope.
253  context.carrier = {&avg_xmom, &avg_ymom, &avg_zmom};
254  ApplyAuxiliaryMappedStage(context, data.rate, geometry.InvCellSizeArray(), 0);
255 
256  if (!ValidateFiniteComponent(data.target, 0, diagnostic)) {
257  amrex::Abort("M2 auxiliary inert tracer produced a nonfinite state: " + diagnostic);
258  }
259  // All reads from the old active state have completed. Promote the result
260  // only after the stage kernel and qualification check have succeeded.
261  std::swap(data.state, data.target);
262 
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);
265  }
266  data.have_previous_rate = true;
267 
268  amrex::Print() << "AUX_M2_STAGE method=" << HostIntegratorName(method)
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;
278 
279  if (data.ledger.step_complete()) {
280  if (!(data.max_stage_rate_delta > std::numeric_limits<amrex::Real>::epsilon() *
281  amrex::max(amrex::Real(1.0), rate_max))) {
282  amrex::Abort("M2 auxiliary inert tracer did not produce stage-varying mapped face rates");
283  }
284 
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];
302  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
303  const amrex::Real h_final = omega(i, j, k, 0) * final_u(i, j, k, 0);
304  const amrex::Real h_old = omega(i, j, k, 0) * old_u(i, j, k, 0);
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);
309  const amrex::Real r = h_final - h_old + div;
310  const amrex::Real scale = amrex::max(
311  amrex::max(amrex::Math::abs(h_final), amrex::Math::abs(h_old)),
312  amrex::max(amrex::Math::abs(div), min_scale));
313  out(i, j, k, 0) = r;
314  scaled(i, j, k, 0) = amrex::Math::abs(r) / scale;
315  });
316  }
317  const amrex::Real max_absolute = residual.norm0(0);
318  const amrex::Real max_scaled = scaled_residual.norm0(0);
319  const int nstages = method == HostIntegrator::CompressibleRK3 ? 3 : 2;
321  amrex::Real(64.0 * (nstages + 1));
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());
332  }
333  }
334 }
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
@ Centered_2nd
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

Referenced by erf_slow_rhs_post().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ define()

void erf_auxiliary::AuxiliaryInertTracer::define ( int  level,
const amrex::BoxArray &  cell_ba,
const amrex::DistributionMapping &  dm 
)
50 {
51  AMREX_ALWAYS_ASSERT(level >= 0 && level < static_cast<int>(m_levels.size()));
52  AMREX_ALWAYS_ASSERT(level == 0);
53  AMREX_ALWAYS_ASSERT(m_levels[static_cast<std::size_t>(level)] == nullptr);
54  auto data = std::make_unique<LevelStorage>();
55  data->state.define(cell_ba, dm, 1, 0);
56  data->target.define(cell_ba, dm, 1, 0);
57  data->anchor.define(cell_ba, dm, 1, 0);
58  data->intensive.define(cell_ba, dm, 1, 1);
59  data->measure.define(cell_ba, dm, 1, 0);
60  data->rate.define(cell_ba, dm, 1, 0);
61  data->previous_rate.define(cell_ba, dm, 1, 0);
62  data->ledger.define(cell_ba, dm, 1);
63  data->state.setVal(amrex::Real(0.0));
64  data->target.setVal(amrex::Real(0.0));
65  data->anchor.setVal(amrex::Real(0.0));
66  data->intensive.setVal(amrex::Real(0.0));
67  data->rate.setVal(amrex::Real(0.0));
68  data->previous_rate.setVal(amrex::Real(0.0));
69 
70  m_levels[static_cast<std::size_t>(level)] = std::move(data);
71 }
Here is the call graph for this function:

◆ destroy()

void erf_auxiliary::AuxiliaryInertTracer::destroy ( int  level)
337 {
338  AMREX_ALWAYS_ASSERT(level >= 0 && level < static_cast<int>(m_levels.size()));
339  m_levels[static_cast<std::size_t>(level)].reset();
340 }
Here is the call graph for this function:

◆ initialize()

void erf_auxiliary::AuxiliaryInertTracer::initialize ( int  level,
const amrex::MultiFab &  conserved,
const amrex::Geometry &  geometry 
)
97 {
99  auto& data = *m_levels[static_cast<std::size_t>(level)];
100  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(data.measure_ready,
101  "M2 auxiliary inert tracer cannot initialize before its static measure is built");
102  std::string diagnostic;
103  if (!ValidatePositiveFiniteComponent(conserved, Rho_comp, diagnostic)) {
104  amrex::Abort("M2 auxiliary inert tracer initialization: " + diagnostic);
105  }
106 
107  const auto prob_lo = geometry.ProbLoArray();
108  const auto prob_hi = geometry.ProbHiArray();
109  const auto cell_size = geometry.CellSizeArray();
110  for (amrex::MFIter mfi(data.state, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
111  const amrex::Box bx = mfi.tilebox();
112  const auto rho = conserved.const_array(mfi);
113  const auto out = data.state.array(mfi);
114  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
115  const amrex::Real x = prob_lo[0] + (i + amrex::Real(0.5)) * cell_size[0];
116  const amrex::Real y = prob_lo[1] + (j + amrex::Real(0.5)) * cell_size[1];
117  const amrex::Real z = prob_lo[2] + (k + amrex::Real(0.5)) * cell_size[2];
118  const amrex::Real lx = prob_hi[0] - prob_lo[0];
119  const amrex::Real ly = prob_hi[1] - prob_lo[1];
120  const amrex::Real lz = prob_hi[2] - prob_lo[2];
121  const amrex::Real ratio = amrex::Real(1.0) + amrex::Real(0.10) *
122  std::sin(amrex::Real(2.0) * amrex::Real(PI) * (x - prob_lo[0]) / lx) +
123  amrex::Real(0.07) * std::sin(amrex::Real(2.0) * amrex::Real(PI) * (y - prob_lo[1]) / ly) +
124  amrex::Real(0.05) * std::sin(amrex::Real(2.0) * amrex::Real(PI) * (z - prob_lo[2]) / lz);
125  out(i, j, k, 0) = rho(i, j, k, Rho_comp) * ratio;
126  });
127  }
128  amrex::MultiFab::Copy(data.anchor, data.state, 0, 0, 1, 0);
129  if (!ValidateFiniteComponent(data.state, 0, diagnostic)) {
130  amrex::Abort("M2 auxiliary inert tracer initialization: " + diagnostic);
131  }
132  amrex::Print() << "AUX_M2_INITIALIZED schema=" << layout().schema_id()
133  << " components=" << layout().ncomp() << std::endl;
134 }
const Real lz
Definition: ERF_InitCustomPertVels_CloudChamber.H:12
const Real lx
Definition: ERF_InitCustomPertVels_CloudChamber.H:10
const Real ly
Definition: ERF_InitCustomPertVels_CloudChamber.H:11
const GpuArray< Real, AMREX_SPACEDIM > prob_lo
Definition: ERF_InitCustomPert_CloudChamber.H:33
const amrex::Real * prob_hi
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:17
constexpr amrex::Real PI
Definition: ERF_NumericalConstants.H:46
static const AuxiliaryStateLayout & layout()
Definition: ERF_AuxiliaryInertTracer.cpp:39
int ncomp() const noexcept
Definition: ERF_AuxiliaryStateLayout.H:29
const std::string & schema_id() const noexcept
Definition: ERF_AuxiliaryStateLayout.H:28
@ rho
Definition: ERF_Kessler.H:25
Here is the call graph for this function:

◆ is_defined()

bool erf_auxiliary::AuxiliaryInertTracer::is_defined ( int  level) const
343 {
344  return level >= 0 && level < static_cast<int>(m_levels.size()) &&
345  m_levels[static_cast<std::size_t>(level)] != nullptr;
346 }

Referenced by advance_stage(), initialize(), measure_is_ready(), and state().

Here is the caller graph for this function:

◆ layout()

const AuxiliaryStateLayout & erf_auxiliary::AuxiliaryInertTracer::layout ( )
static
40 {
41  static const AuxiliaryStateLayout value(
42  "erf-auxiliary-inert-tracer-m2-v1",
43  {{"inert_tracer", "generic.inert.tracer", "kg m^-3"}});
44  return value;
45 }

Referenced by initialize().

Here is the caller graph for this function:

◆ measure_is_ready()

bool erf_auxiliary::AuxiliaryInertTracer::measure_is_ready ( int  level) const
349 {
350  return is_defined(level) && m_levels[static_cast<std::size_t>(level)]->measure_ready;
351 }

Referenced by static_measure().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

AuxiliaryInertTracer& erf_auxiliary::AuxiliaryInertTracer::operator= ( const AuxiliaryInertTracer &  )
delete

◆ rebuild_static_measure()

bool erf_auxiliary::AuxiliaryInertTracer::rebuild_static_measure ( int  level,
const amrex::MultiFab &  detJ,
const amrex::MultiFab &  mx,
const amrex::MultiFab &  my,
std::string &  diagnostic 
)

Build or refresh this proof consumer's time-independent mapped measure.

78 {
79  diagnostic.clear();
80  if (level < 0 || level >= static_cast<int>(m_levels.size()) ||
81  m_levels[static_cast<std::size_t>(level)] == nullptr) {
82  diagnostic = "static mapped measure requires a defined auxiliary level";
83  return false;
84  }
85  auto& data = *m_levels[static_cast<std::size_t>(level)];
86  data.measure_ready = false;
87  if (!BuildMappedCellMeasure(data.measure, detJ, mx, my, diagnostic)) {
88  return false;
89  }
90  data.measure_ready = true;
91  return true;
92 }
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
Here is the call graph for this function:

◆ state()

const amrex::MultiFab & erf_auxiliary::AuxiliaryInertTracer::state ( int  level) const
360 {
362  return m_levels[static_cast<std::size_t>(level)]->state;
363 }
const amrex::MultiFab & state(int level) const
Definition: ERF_AuxiliaryInertTracer.cpp:359
Here is the call graph for this function:

◆ static_measure()

const amrex::MultiFab & erf_auxiliary::AuxiliaryInertTracer::static_measure ( int  level) const

Test-only inspection of the proof consumer's stored static measure.

354 {
356  return m_levels[static_cast<std::size_t>(level)]->measure;
357 }
bool measure_is_ready(int level) const
Definition: ERF_AuxiliaryInertTracer.cpp:348
Here is the call graph for this function:

Member Data Documentation

◆ m_levels

std::vector<std::unique_ptr<LevelStorage> > erf_auxiliary::AuxiliaryInertTracer::m_levels
private

The documentation for this class was generated from the following files: