Skip to content

Commit

Permalink
Fix "pismv -report_file file.nc"
Browse files Browse the repository at this point in the history
This rewrite was needed because of the changes in the time series code.
  • Loading branch information
ckhroulev committed Sep 9, 2020
1 parent b1e14d1 commit 92b2731
Showing 1 changed file with 49 additions and 104 deletions.
153 changes: 49 additions & 104 deletions src/verification/iceCompModel.cc
Expand Up @@ -594,6 +594,21 @@ void IceCompModel::print_summary(bool /* tempAndAge */) {
IceModel::print_summary(true);
}

static void write(units::System::Ptr sys,
const File &file,
size_t start,
const char *name,
const char *units,
const char *long_name,
double value,
IO_Type type=PISM_DOUBLE) {
VariableMetadata v(name, sys);
v.set_string("units", units);
v.set_string("long_name", long_name);

io::define_timeseries(v, "N", file, type);
io::write_timeseries(file, v, start, {value});
}

void IceCompModel::reportErrors() {
// geometry errors to report (for all tests except K and O):
Expand Down Expand Up @@ -733,135 +748,65 @@ void IceCompModel::reportErrors() {
IO_Mode mode = append ? PISM_READWRITE : PISM_READWRITE_MOVE;

if (report_file.is_set()) {
unsigned int start;
VariableMetadata err("N", m_sys);

err.set_string("units", "1");

m_log->message(2, "Also writing errors to '%s'...\n", report_file->c_str());

// Find the number of records in this file:
File file(m_grid->com, report_file, PISM_NETCDF3, mode); // OK to use netcdf3

start = file.dimension_length("N");
size_t start = file.dimension_length("N");

io::write_attributes(file, m_output_global_attributes, PISM_DOUBLE);

// Write the dimension variable:
io::write_timeseries(file, err, (size_t)start, {(double)(start + 1)});
write(m_sys, file, start, "N", "1", "run number", start + 1);

// Always write grid parameters:
err.set_name("dx");
err.set_string("units", "meters");
io::write_timeseries(file, err, (size_t)start, {m_grid->dx()});
err.set_name("dy");
io::write_timeseries(file, err, (size_t)start, {m_grid->dy()});
err.set_name("dz");
io::write_timeseries(file, err, (size_t)start, {m_grid->dz_max()});
write(m_sys, file, start, "dx", "meter", "grid spacing", m_grid->dx());
write(m_sys, file, start, "dy", "meter", "grid spacing", m_grid->dy());
write(m_sys, file, start, "dz", "meter", "grid spacing", m_grid->dz_max());

// Always write the test name:
err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("test");
io::write_timeseries(file, err, (size_t)start, {(double)m_testname});
write(m_sys, file, start, "test", "", "test name", m_testname);

if ((m_testname != 'K') && (m_testname != 'O')) {
err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("relative_volume");
err.set_string("units", "percent");
err.set_string("long_name", "relative ice volume error");
io::write_timeseries(file, err, (size_t)start, {100*volerr/volexact});

err.set_name("relative_max_eta");
err.set_string("units", "1");
err.set_string("long_name", "relative $\\eta$ error");
io::write_timeseries(file, err, (size_t)start, {maxetaerr/pow(domeHexact,m)});

err.set_name("maximum_thickness");
err.set_string("units", "meters");
err.set_string("long_name", "maximum ice thickness error");
io::write_timeseries(file, err, (size_t)start, {maxHerr});

err.set_name("average_thickness");
err.set_string("units", "meters");
err.set_string("long_name", "average ice thickness error");
io::write_timeseries(file, err, (size_t)start, {avHerr});
write(m_sys, file, start, "relative_volume", "1", "relative volume error", 100*volerr/volexact);
write(m_sys, file, start, "relative_max_eta", "1", "relative $\\eta$ error", maxetaerr/pow(domeHexact,m));
write(m_sys, file, start, "maximum_thickness", "meters", "maximum ice thickness error", maxHerr);
write(m_sys, file, start, "average_thickness", "meters", "average ice thickness error", avHerr);
}

if ((m_testname == 'F') || (m_testname == 'G')) {
err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("maximum_temperature");
err.set_string("units", "Kelvin");
err.set_string("long_name", "maximum ice temperature error");
io::write_timeseries(file, err, (size_t)start, {maxTerr});

err.set_name("average_temperature");
err.set_string("long_name", "average ice temperature error");
io::write_timeseries(file, err, (size_t)start, {avTerr});

err.set_name("maximum_basal_temperature");
err.set_string("long_name", "maximum basal temperature error");
io::write_timeseries(file, err, (size_t)start, {basemaxTerr});
err.set_name("average_basal_temperature");
err.set_string("long_name", "average basal temperature error");
io::write_timeseries(file, err, (size_t)start, {baseavTerr});

err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("maximum_sigma");
err.set_string("units", "J s-1 m-3");
err.set_string("glaciological_units", "1e6 J s-1 m-3");
err.set_string("long_name", "maximum strain heating error");
io::write_timeseries(file, err, (size_t)start, {max_strain_heating_error});

err.set_name("average_sigma");
err.set_string("long_name", "average strain heating error");
io::write_timeseries(file, err, (size_t)start, {av_strain_heating_error});

err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("maximum_surface_velocity");
err.set_string("long_name", "maximum ice surface horizontal velocity error");
err.set_string("units", "m second-1");
err.set_string("glaciological_units", "meters year-1");
io::write_timeseries(file, err, (size_t)start, {maxUerr});

err.set_name("average_surface_velocity");
err.set_string("long_name", "average ice surface horizontal velocity error");
io::write_timeseries(file, err, (size_t)start, {avUerr});

err.set_name("maximum_surface_w");
err.set_string("long_name", "maximum ice surface vertical velocity error");
io::write_timeseries(file, err, (size_t)start, {maxWerr});

err.set_name("average_surface_w");
err.set_string("long_name", "average ice surface vertical velocity error");
io::write_timeseries(file, err, (size_t)start, {avWerr});
write(m_sys, file, start, "maximum_temperature", "Kelvin", "maximum ice temperature error", maxTerr);
write(m_sys, file, start, "average_temperature", "Kelvin", "average ice temperature error", avTerr);
write(m_sys, file, start, "maximum_basal_temperature", "Kelvin", "maximum basal temperature error", basemaxTerr);
write(m_sys, file, start, "average_basal_temperature", "Kelvin", "average basal temperature error", baseavTerr);

{
units::Converter c(m_sys, "J s-1 m-3", "1e6 J s-1 m-3");
write(m_sys, file, start, "maximum_sigma", "1e6 J s-1 m-3", "maximum strain heating error", c(max_strain_heating_error));
write(m_sys, file, start, "average_sigma", "1e6 J s-1 m-3", "average strain heating error", c(av_strain_heating_error));
}

{
units::Converter c(m_sys, "m second-1", "m year-1");
write(m_sys, file, start, "maximum_surface_velocity", "m year-1", "maximum ice surface horizontal velocity error", c(maxUerr));
write(m_sys, file, start, "average_surface_velocity", "m year-1", "average ice surface horizontal velocity error", c(avUerr));
write(m_sys, file, start, "maximum_surface_w", "m year-1", "maximum ice surface vertical velocity error", c(maxWerr));
write(m_sys, file, start, "average_surface_w", "m year-1", "average ice surface vertical velocity error", c(avWerr));
}
}

if ((m_testname == 'K') || (m_testname == 'O')) {
err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("maximum_temperature");
err.set_string("units", "Kelvin");
err.set_string("long_name", "maximum ice temperature error");
io::write_timeseries(file, err, (size_t)start, {maxTerr});

err.set_name("average_temperature");
err.set_string("long_name", "average ice temperature error");
io::write_timeseries(file, err, (size_t)start, {avTerr});

err.set_name("maximum_bedrock_temperature");
err.set_string("long_name", "maximum bedrock temperature error");
io::write_timeseries(file, err, (size_t)start, {maxTberr});

err.set_name("average_bedrock_temperature");
err.set_string("long_name", "average bedrock temperature error");
io::write_timeseries(file, err, (size_t)start, {avTberr});
write(m_sys, file, start, "maximum_temperature", "Kelvin", "maximum ice temperature error", maxTerr);
write(m_sys, file, start, "average_temperature", "Kelvin", "average ice temperature error", avTerr);
write(m_sys, file, start, "maximum_bedrock_temperature", "Kelvin", "maximum bedrock temperature error", maxTberr);
write(m_sys, file, start, "average_bedrock_temperature", "Kelvin", "average bedrock temperature error", avTberr);
}

if (m_testname == 'O') {
err.clear_all_strings(); err.clear_all_doubles(); err.set_string("units", "1");
err.set_name("maximum_basal_melt_rate");
err.set_string("units", "m second-1");
err.set_string("glaciological_units", "meters year-1");
io::write_timeseries(file, err, (size_t)start, {maxbmelterr});
units::Converter c(m_sys, "m second-1", "m year-1");
write(m_sys, file, start, "maximum_basal_melt_rate", "m year -1", "maximum basal melt rate error", c(maxbmelterr));
}
}

Expand Down

0 comments on commit 92b2731

Please sign in to comment.