Skip to content

Commit e1a7a01

Browse files
committed
added infinite extents to histogram diagnostics, along with check for monotonic bin values (test updated too)
1 parent 4e3985a commit e1a7a01

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

components/eamxx/src/diagnostics/histogram.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,23 @@ namespace scream {
88

99
HistogramDiag::HistogramDiag(const ekat::Comm &comm, const ekat::ParameterList &params)
1010
: AtmosphereDiagnostic(comm, params) {
11-
const auto &field_name = m_params.get<std::string>("field_name");
12-
m_bin_configuration = params.get<std::string>("bin_configuration");
13-
m_diag_name = field_name + "_histogram_" + m_bin_configuration;
11+
const auto &field_name = m_params.get<std::string>("field_name");
12+
const std::string bin_config = m_params.get<std::string>("bin_configuration");
13+
m_diag_name = field_name + "_histogram_" + bin_config;
14+
15+
// extract bin values from configuration, append end values, and check
16+
const std::vector<std::string> bin_strings = ekat::split(bin_config, "_");
17+
m_bin_reals.resize(bin_strings.size()+2);
18+
m_bin_reals[0] = std::numeric_limits<Real>::lowest();
19+
for (int i=1; i < m_bin_reals.size()-1; i++)
20+
{
21+
m_bin_reals[i] = std::stod(bin_strings[i-1]);
22+
EKAT_REQUIRE_MSG(m_bin_reals[i] > m_bin_reals[i-1],
23+
"Error! HistogramDiag bin values must be monotonically "
24+
"increasing.\n"
25+
" - bin configuration: " + bin_config + "\n");
26+
}
27+
m_bin_reals.back() = std::numeric_limits<Real>::max();
1428
}
1529

1630
void HistogramDiag::set_grids(const std::shared_ptr<const GridsManager> grids_manager) {
@@ -34,11 +48,8 @@ void HistogramDiag::initialize_impl(const RunType /*run_type*/) {
3448
" - field layout: " +
3549
field_layout.to_string() + "\n");
3650

37-
// extract bin values from configuration
38-
std::vector<std::string> bin_strings = ekat::split(m_bin_configuration, "_");
39-
const int num_bins = bin_strings.size()-1;
40-
4151
// allocate histogram field
52+
const int num_bins = m_bin_reals.size()-1;
4253
FieldLayout diagnostic_layout({CMP}, {num_bins}, {"bin"});
4354
FieldIdentifier diagnostic_id(m_diag_name, diagnostic_layout,
4455
FieldIdentifier::Units::nondimensional(),
@@ -56,7 +67,7 @@ void HistogramDiag::initialize_impl(const RunType /*run_type*/) {
5667
using RangePolicy = Kokkos::RangePolicy<Field::device_t::execution_space>;
5768
Kokkos::parallel_for("store_histogram_bin_values_" + field.name(),
5869
RangePolicy(0, bin_values_layout.dim(0)), [&] (int i) {
59-
bin_values_view(i) = std::stod(bin_strings[i]);
70+
bin_values_view(i) = m_bin_reals[i];
6071
});
6172
}
6273

components/eamxx/src/diagnostics/histogram.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ class HistogramDiag : public AtmosphereDiagnostic {
3131

3232
protected:
3333
std::string m_diag_name;
34-
std::string m_bin_configuration;
35-
34+
std::vector<Real> m_bin_reals;
3635
Field m_bin_values;
3736
};
3837

components/eamxx/src/diagnostics/tests/histogram_test.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ TEST_CASE("histogram") {
4646
auto grid = gm->get_grid("Physics");
4747

4848
// Specify histogram bins
49-
const std::string bin_configuration = "0_50_100_150_200";
50-
const std::vector<Real> bin_values = {0.0, 50.0, 100.0, 150.0, 200.0};
49+
const std::string bin_configuration = "50_100_150";
50+
const std::vector<Real> bin_values = {-100.0, 50.0, 100.0, 150.0, 1000.0};
5151

5252
// Input (randomized) qc
5353
FieldLayout scalar1d_layout{{COL}, {ncols}};
@@ -97,7 +97,12 @@ TEST_CASE("histogram") {
9797
REQUIRE_THROWS(diag_factory.create("HistogramDiag", comm,
9898
params)); // Still no bin configuration
9999

100+
params.set<std::string>("bin_configuration", "100_25");
101+
REQUIRE_THROWS(diag_factory.create("HistogramDiag", comm,
102+
params)); // Non-monotonic bin configuation
103+
100104
params.set<std::string>("bin_configuration", bin_configuration);
105+
101106
// Now we should be good to go...
102107
auto diag1 = diag_factory.create("HistogramDiag", comm, params);
103108
auto diag2 = diag_factory.create("HistogramDiag", comm, params);

0 commit comments

Comments
 (0)