ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
erf_interval_means Namespace Reference

Namespaces

 detail
 

Classes

struct  LevelMetadata
 
struct  Metadata
 

Functions

bool parse_metadata (std::istream &input, Metadata &result, std::string &error)
 
std::string validate_metadata (const Metadata &metadata, int expected_levels, int expected_components, const amrex::Vector< amrex::BoxArray > &expected_boxes)
 
int global_reset_done (const Metadata &metadata)
 
int legacy_reset_done (bool time_reset_mode, double checkpoint_time, double reset_time)
 
bool initialization_accumulates_state (bool restarting) noexcept
 
bool initialization_clears_interval (bool restarting, bool compute_mean_vars, const std::string &reset_mode) noexcept
 

Function Documentation

◆ global_reset_done()

int erf_interval_means::global_reset_done ( const Metadata &  metadata)
inline
174 {
175  for (const auto& record : metadata.level) {
176  if (record.reset_done != 0) return 1;
177  }
178  return 0;
179 }

Referenced by ERF::ReadCheckpointFile().

Here is the caller graph for this function:

◆ initialization_accumulates_state()

bool erf_interval_means::initialization_accumulates_state ( bool  restarting)
inlinenoexcept
189 {
190  return !restarting;
191 }

Referenced by ERF::InitData_post().

Here is the caller graph for this function:

◆ initialization_clears_interval()

bool erf_interval_means::initialization_clears_interval ( bool  restarting,
bool  compute_mean_vars,
const std::string &  reset_mode 
)
inlinenoexcept
207 {
208  return !restarting && compute_mean_vars && reset_mode == "plotfile";
209 }

Referenced by ERF::InitData_post().

Here is the caller graph for this function:

◆ legacy_reset_done()

int erf_interval_means::legacy_reset_done ( bool  time_reset_mode,
double  checkpoint_time,
double  reset_time 
)
inline
183 {
184  return time_reset_mode && checkpoint_time >= reset_time ? 1 : 0;
185 }

Referenced by ERF::ReadCheckpointFile().

Here is the caller graph for this function:

◆ parse_metadata()

bool erf_interval_means::parse_metadata ( std::istream &  input,
Metadata &  result,
std::string &  error 
)
inline
86 {
87  std::string title;
88  if (!std::getline(input, title) || title != "ERF interval means checkpoint v1") {
89  error = "expected ERF interval means checkpoint v1 title";
90  return false;
91  }
92  if (!(input >> result.levels >> result.components) || result.levels < 0 ||
93  result.components < 0) {
94  error = "missing or invalid interval-mean level/component counts";
95  return false;
96  }
97 
98  result.level.clear();
99  result.level.resize(result.levels);
100  for (int lev = 0; lev < result.levels; ++lev) {
101  auto& record = result.level[lev];
102  if (!(input >> record.level >> record.accumulation_count >> record.reset_done) ||
103  record.level != lev || !std::isfinite(record.accumulation_count) ||
104  record.accumulation_count < 0.0 ||
105  (record.reset_done != 0 && record.reset_done != 1)) {
106  error = "invalid interval-mean level record " + std::to_string(lev);
107  return false;
108  }
109 
110  if (!detail::read_box_array(input, record.boxes)) {
111  error = "truncated interval-mean BoxArray record for level " +
112  std::to_string(lev);
113  return false;
114  }
115  std::string box_remainder;
116  if (!std::getline(input, box_remainder)) {
117  error = "truncated interval-mean BoxArray line for level " +
118  std::to_string(lev);
119  return false;
120  }
121 
122  long long map_size = -1;
123  if (!(input >> map_size) || map_size < 0 ||
124  map_size != static_cast<long long>(record.boxes.size())) {
125  error = "invalid interval-mean processor-map size for level " +
126  std::to_string(lev);
127  return false;
128  }
129  // The map records the writer's ranks, which need not exist in the
130  // restarted run, so only reject entries that cannot be a rank at all.
131  record.processor_map.resize(static_cast<std::size_t>(map_size));
132  for (long long ibox = 0; ibox < map_size; ++ibox) {
133  int& rank = record.processor_map[static_cast<std::size_t>(ibox)];
134  if (!(input >> rank)) {
135  error = "truncated interval-mean processor map for level " +
136  std::to_string(lev);
137  return false;
138  }
139  if (rank < 0) {
140  error = "invalid interval-mean processor-map rank " +
141  std::to_string(rank) + " for level " + std::to_string(lev);
142  return false;
143  }
144  }
145  }
146  return true;
147 }
bool read_box_array(std::istream &input, amrex::BoxArray &result)
Definition: ERF_IntervalMeansCheckpoint.H:35

Referenced by ERF::ReadCheckpointFile().

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

◆ validate_metadata()

std::string erf_interval_means::validate_metadata ( const Metadata &  metadata,
int  expected_levels,
int  expected_components,
const amrex::Vector< amrex::BoxArray > &  expected_boxes 
)
inline
154 {
155  if (metadata.levels != expected_levels || metadata.components != expected_components) {
156  return "expected " + std::to_string(expected_levels) + " levels and " +
157  std::to_string(expected_components) + " components";
158  }
159  if (static_cast<int>(expected_boxes.size()) < expected_levels ||
160  static_cast<int>(metadata.level.size()) != expected_levels) {
161  return "interval-mean metadata level count does not match the restart";
162  }
163  for (int lev = 0; lev < expected_levels; ++lev) {
164  if (!(metadata.level[lev].boxes == expected_boxes[lev])) {
165  return "interval-mean checkpoint BoxArray does not match level " +
166  std::to_string(lev);
167  }
168  }
169  return {};
170 }

Referenced by ERF::ReadCheckpointFile().

Here is the caller graph for this function: