1 #ifndef ERF_INTERVAL_MEANS_CHECKPOINT_H_
2 #define ERF_INTERVAL_MEANS_CHECKPOINT_H_
11 #include <AMReX_BoxArray.H>
12 #include <AMReX_IntVect.H>
13 #include <AMReX_Vector.H>
23 if (!(input >> delimiter) || delimiter !=
'(')
return false;
24 for (
int idir = 0; idir < AMREX_SPACEDIM; ++idir) {
25 if (idir > 0 && (!(input >> delimiter) || delimiter !=
','))
return false;
26 if (!(input >> value[idir]))
return false;
28 return static_cast<bool>(input >> delimiter) && delimiter ==
')';
39 unsigned long long hash;
40 if (!(input >> delimiter) || delimiter !=
'(' ||
41 !(input >> box_count >> hash) || box_count < 0 ||
42 box_count >
static_cast<long long>(std::numeric_limits<int>::max())) {
46 std::vector<amrex::Box> boxes;
47 boxes.reserve(
static_cast<std::size_t
>(box_count));
48 for (
long long ibox = 0; ibox < box_count; ++ibox) {
49 if (!(input >> delimiter) || delimiter !=
'(')
return false;
50 amrex::IntVect small, big, type;
53 !(input >> delimiter) || delimiter !=
')') {
56 boxes.emplace_back(small, big, type);
58 if (!(input >> delimiter) || delimiter !=
')')
return false;
60 result = boxes.empty()
62 : amrex::BoxArray(boxes.data(),
static_cast<int>(boxes.size()));
81 amrex::Vector<LevelMetadata>
level;
88 if (!std::getline(input, title) || title !=
"ERF interval means checkpoint v1") {
89 error =
"expected ERF interval means checkpoint v1 title";
94 error =
"missing or invalid interval-mean level/component counts";
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);
111 error =
"truncated interval-mean BoxArray record for level " +
115 std::string box_remainder;
116 if (!std::getline(input, box_remainder)) {
117 error =
"truncated interval-mean BoxArray line for level " +
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 " +
129 record.processor_map.resize(
static_cast<std::size_t
>(map_size));
130 for (
long long ibox = 0; ibox < map_size; ++ibox) {
131 if (!(input >> record.processor_map[
static_cast<std::size_t
>(ibox)])) {
132 error =
"truncated interval-mean processor map for level " +
144 int expected_components,
145 const amrex::Vector<amrex::BoxArray>& expected_boxes)
147 if (metadata.
levels != expected_levels || metadata.
components != expected_components) {
148 return "expected " + std::to_string(expected_levels) +
" levels and " +
149 std::to_string(expected_components) +
" components";
151 if (
static_cast<int>(expected_boxes.size()) < expected_levels ||
152 static_cast<int>(metadata.
level.size()) != expected_levels) {
153 return "interval-mean metadata level count does not match the restart";
155 for (
int lev = 0; lev < expected_levels; ++lev) {
156 if (!(metadata.
level[lev].boxes == expected_boxes[lev])) {
157 return "interval-mean checkpoint BoxArray does not match level " +
167 for (
const auto& record : metadata.
level) {
168 if (record.reset_done != 0)
return 1;
176 return time_reset_mode && checkpoint_time >= reset_time ? 1 : 0;
187 bool interval_diagnostic_selected) noexcept
189 return !restarting && interval_diagnostic_selected;
bool read_box_array(std::istream &input, amrex::BoxArray &result)
Definition: ERF_IntervalMeansCheckpoint.H:35
bool read_int_vector(std::istream &input, amrex::IntVect &value)
Definition: ERF_IntervalMeansCheckpoint.H:20
Definition: ERF_IntervalMeansCheckpoint.H:15
bool initialization_plot_consumes_interval(bool restarting, bool interval_diagnostic_selected) noexcept
Definition: ERF_IntervalMeansCheckpoint.H:186
int legacy_reset_done(bool time_reset_mode, double checkpoint_time, double reset_time)
Definition: ERF_IntervalMeansCheckpoint.H:174
bool initialization_accumulates_state(bool restarting) noexcept
Definition: ERF_IntervalMeansCheckpoint.H:180
std::string validate_metadata(const Metadata &metadata, int expected_levels, int expected_components, const amrex::Vector< amrex::BoxArray > &expected_boxes)
Definition: ERF_IntervalMeansCheckpoint.H:142
bool parse_metadata(std::istream &input, Metadata &result, std::string &error)
Definition: ERF_IntervalMeansCheckpoint.H:85
int global_reset_done(const Metadata &metadata)
Definition: ERF_IntervalMeansCheckpoint.H:165