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

#include <ERF_AuxiliaryProjection.H>

Collaboration diagram for erf_auxiliary::AuxiliaryProjection:

Public Member Functions

 AuxiliaryProjection ()=default
 
 AuxiliaryProjection (std::vector< ProjectionRule > rules)
 
const std::vector< ProjectionRule > & rules () const noexcept
 
ProjectionValidation validate (const int source_components) const
 

Private Attributes

std::vector< ProjectionRule > m_rules
 

Detailed Description

Generic, fixed-range projection metadata.

Constructor & Destructor Documentation

◆ AuxiliaryProjection() [1/2]

erf_auxiliary::AuxiliaryProjection::AuxiliaryProjection ( )
default

◆ AuxiliaryProjection() [2/2]

erf_auxiliary::AuxiliaryProjection::AuxiliaryProjection ( std::vector< ProjectionRule >  rules)
inlineexplicit
32  : m_rules(std::move(rules)) {}
std::vector< ProjectionRule > m_rules
Definition: ERF_AuxiliaryProjection.H:38
const std::vector< ProjectionRule > & rules() const noexcept
Definition: ERF_AuxiliaryProjection.H:34

Member Function Documentation

◆ rules()

const std::vector<ProjectionRule>& erf_auxiliary::AuxiliaryProjection::rules ( ) const
inlinenoexcept
34 { return m_rules; }

◆ validate()

ProjectionValidation erf_auxiliary::AuxiliaryProjection::validate ( const int  source_components) const
8 {
9  if (source_components < 0) return {false, "negative auxiliary component count"};
10  std::set<std::string> targets;
11  std::vector<int> seen(static_cast<std::size_t>(source_components), 0);
12  for (const auto& rule : m_rules) {
13  if (rule.target.empty()) return {false, "projection target is empty"};
14  if (rule.target_kind != ProjectionTargetKind::BulkCoupling) {
15  return {false, "non-bulk target cannot be used by this coupling projection"};
16  }
17  if (rule.source_kind != ProjectionSourceKind::AuxiliaryMass) {
18  return {false, "only auxiliary mass components may enter this coupling projection"};
19  }
20  if (!targets.insert(rule.target).second) return {false, "duplicate projection target"};
21  if (rule.source_begin < 0 || rule.source_count <= 0 ||
22  rule.source_begin + rule.source_count > source_components) {
23  return {false, "projection source range is outside the auxiliary state"};
24  }
25  for (int c = rule.source_begin; c < rule.source_begin + rule.source_count; ++c) {
26  if (seen[static_cast<std::size_t>(c)] != 0) return {false, "overlapping projection source ranges"};
27  seen[static_cast<std::size_t>(c)] = 1;
28  }
29  }
30  return {true, {}};
31 }

Referenced by erf_sbm::SBMLayout::SBMLayout().

Here is the caller graph for this function:

Member Data Documentation

◆ m_rules

std::vector<ProjectionRule> erf_auxiliary::AuxiliaryProjection::m_rules
private

Referenced by rules(), and validate().


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