ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
erf_sbm::ConstraintGroup Struct Reference

#include <ERF_SBMConstraintGroups.H>

Collaboration diagram for erf_sbm::ConstraintGroup:

Public Member Functions

bool contains (const int component) const noexcept
 
amrex::Real evaluate (const LinearConstraint &constraint, const std::vector< amrex::Real > &state) const
 
bool admissible (const std::vector< amrex::Real > &state, amrex::Real *minimum_margin=nullptr, std::string *failed_constraint=nullptr) const
 

Public Attributes

int population_id {0}
 
int bin {0}
 
std::string semantic_id
 
MomentMode moment_mode {MomentMode::OneMoment}
 
std::vector< int > members
 
std::vector< int > transport_members
 
std::vector< int > attached_property_indices
 
std::vector< LinearConstraint > constraints
 

Detailed Description

Complete atomic constraint group over one population bin.

Member Function Documentation

◆ admissible()

bool erf_sbm::ConstraintGroup::admissible ( const std::vector< amrex::Real > &  state,
amrex::Real *  minimum_margin = nullptr,
std::string *  failed_constraint = nullptr 
) const
46 {
47  amrex::Real minimum = std::numeric_limits<amrex::Real>::infinity();
48  for (const auto& constraint : constraints) {
49  const amrex::Real value = evaluate(constraint, state);
50  if (!finite(value)) {
51  if (failed_constraint) *failed_constraint = constraint.semantic_id;
52  if (minimum_margin) *minimum_margin = value;
53  return false;
54  }
55  minimum = std::min(minimum, value);
56  const amrex::Real scale = [&]() {
57  amrex::Real s = amrex::Real(0.0);
58  for (const auto& term : constraint.terms) {
59  if (term.component >= 0 && term.component < static_cast<int>(state.size())) {
60  s += std::abs(term.coefficient * state[static_cast<std::size_t>(term.component)]);
61  }
62  }
63  return s;
64  }();
65  const amrex::Real tolerance = amrex::Real(128.0) *
67  if (value < -tolerance) {
68  if (failed_constraint) *failed_constraint = constraint.semantic_id;
69  if (minimum_margin) *minimum_margin = value;
70  return false;
71  }
72  }
73  if (minimum_margin) *minimum_margin = minimum;
74  return true;
75 }
amrex::Real Real
Definition: ERF_ShocInterface.H:19
bool finite(amrex::Real value) noexcept
Definition: ERF_CloudChamber.H:342
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
amrex::Real evaluate(const LinearConstraint &constraint, const std::vector< amrex::Real > &state) const
Definition: ERF_SBMConstraintGroups.cpp:30
std::vector< LinearConstraint > constraints
Definition: ERF_SBMConstraintGroups.H:39
Here is the call graph for this function:

◆ contains()

bool erf_sbm::ConstraintGroup::contains ( const int  component) const
noexcept
25 {
26  for (const int member : members) if (member == component) return true;
27  return false;
28 }
std::vector< int > members
Definition: ERF_SBMConstraintGroups.H:36

◆ evaluate()

amrex::Real erf_sbm::ConstraintGroup::evaluate ( const LinearConstraint &  constraint,
const std::vector< amrex::Real > &  state 
) const
32 {
33  amrex::Real result = amrex::Real(0.0);
34  for (const auto& term : constraint.terms) {
35  if (term.component < 0 || term.component >= static_cast<int>(state.size())) {
36  throw std::out_of_range("constraint references an unavailable component");
37  }
38  result = std::fma(term.coefficient, state[static_cast<std::size_t>(term.component)], result);
39  }
40  return result;
41 }

Referenced by admissible().

Here is the caller graph for this function:

Member Data Documentation

◆ attached_property_indices

std::vector<int> erf_sbm::ConstraintGroup::attached_property_indices

◆ bin

int erf_sbm::ConstraintGroup::bin {0}

◆ constraints

std::vector<LinearConstraint> erf_sbm::ConstraintGroup::constraints

Referenced by admissible().

◆ members

std::vector<int> erf_sbm::ConstraintGroup::members

◆ moment_mode

MomentMode erf_sbm::ConstraintGroup::moment_mode {MomentMode::OneMoment}

◆ population_id

int erf_sbm::ConstraintGroup::population_id {0}

◆ semantic_id

std::string erf_sbm::ConstraintGroup::semantic_id

◆ transport_members

std::vector<int> erf_sbm::ConstraintGroup::transport_members

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