21 #include "pism/util/Time.hh"
24 #include "pism/util/Logger.hh"
25 #include "pism/util/pism_utilities.hh"
26 #include "pism/util/Context.hh"
32 m_sys(grid->ctx()->unit_system()),
33 m_config(grid->ctx()->config()),
34 m_fill_value(m_config->get_number(
"output.fill_value")) {
60 out =
m_vars.at(0).get_string(
"glaciological_units");
62 in =
m_vars.at(0).get_string(
"units");
71 out =
m_vars.at(0).get_string(
"glaciological_units"),
72 in =
m_vars.at(0).get_string(
"units");
113 "variable metadata index %d is out of bounds",
126 for (
const auto &v :
m_vars) {
133 const std::string &standard_name,
134 const std::string &units,
135 const std::string &glaciological_units,
139 "N (%d) >= m_dof (%d)", N,
140 static_cast<int>(
m_vars.size()));
143 m_vars[N][
"pism_intent"] =
"diagnostic";
145 m_vars[N][
"long_name"] = long_name;
147 m_vars[N][
"standard_name"] = standard_name;
149 if (units == glaciological_units) {
156 m_vars[N].set_units_without_validation(units);
158 m_vars[N][
"units"] = units;
160 if (not (
m_config->get_flag(
"output.use_MKS") or glaciological_units.empty())) {
161 m_vars[N][
"glaciological_units"] = glaciological_units;
168 std::vector<std::string> names;
169 for (
const auto &v :
m_vars) {
170 names.push_back(v.get_name());
172 std::string all_names =
join(names,
",");
174 m_grid->ctx()->log()->message(3,
"- Computing %s...\n", all_names.c_str());
176 m_grid->ctx()->log()->message(3,
"- Done computing %s.\n", all_names.c_str());
183 m_config(grid->ctx()->config()),
184 m_sys(grid->ctx()->unit_system()),
185 m_time_name(grid->ctx()->config()->get_string(
"time.dimension_name")),
186 m_variable(name, m_sys),
187 m_dimension(m_time_name, m_sys),
188 m_time_bounds(m_time_name +
"_bounds", m_sys) {
195 m_variable[
"ancillary_variables"] = name +
"_aux";
208 const std::string &glaciological_units) {
211 if (not
m_config->get_flag(
"output.use_MKS")) {
212 m_variable[
"glaciological_units"] = glaciological_units;
222 :
TSDiagnostic(grid, name), m_accumulator(0.0), m_v_previous(0.0), m_v_previous_set(false) {
247 const double t_s = (*m_requested_times)[
k - 1];
248 const double t_e = (*m_requested_times)[
k];
261 static const double epsilon = 1e-4;
284 const double t_s = (*m_requested_times)[
k - 1];
285 const double t_e = (*m_requested_times)[
k];
292 total_change =
m_accumulator + change * (t_e - t0) / (t1 - t0);
293 const double dt = t_e - t_s;
295 rate = total_change / dt;
300 rate = change / (t1 - t0);
333 static const double epsilon = 1e-4;
335 if (fabs(t1 - t0) < epsilon) {
345 const double v = this->
compute();
357 static const double epsilon = 1e-4;
359 if (fabs(t1 - t0) < epsilon) {
369 auto time_name =
m_config->get_string(
"time.dimension_name");
389 if (last_time <
m_time.front()) {
394 auto time_name =
m_config->get_string(
"time.dimension_name");
423 std::shared_ptr<std::vector<double>> requested_times) {
void write_state(const File &output) const
virtual void write_state_impl(const File &output) const
IceModelVec::Ptr compute() const
Compute a diagnostic quantity and return a pointer to a newly-allocated IceModelVec.
virtual void reset_impl()
const units::System::Ptr m_sys
the unit system
double to_internal(double x) const
std::vector< SpatialVariableMetadata > m_vars
metadata corresponding to NetCDF variables
virtual void define_state_impl(const File &output) const
void init(const File &input, unsigned int time)
virtual void update_impl(double dt)
void define(const File &file, IO_Type default_type) const
virtual IceModelVec::Ptr compute_impl() const =0
IceGrid::ConstPtr m_grid
the grid
double to_external(double x) const
void define_state(const File &output) const
virtual void define_impl(const File &file, IO_Type default_type) const
Define NetCDF variables corresponding to a diagnostic quantity.
unsigned int n_variables() const
Get the number of NetCDF variables corresponding to a diagnostic quantity.
Diagnostic(IceGrid::ConstPtr g)
virtual void init_impl(const File &input, unsigned int time)
void set_attrs(const std::string &long_name, const std::string &standard_name, const std::string &units, const std::string &glaciological_units, unsigned int N=0)
A method for setting common variable attributes.
SpatialVariableMetadata & metadata(unsigned int N=0)
Get a metadata object corresponding to variable number N.
const Config::ConstPtr m_config
Configuration flags and parameters.
VariableLookupData find_variable(const std::string &short_name, const std::string &std_name) const
Find a variable using its standard name and/or short name.
std::string filename() const
unsigned int dimension_length(const std::string &name) const
Get the length of a dimension.
std::vector< double > read_dimension(const std::string &name) const
Get dimension data (a coordinate variable).
High-level PISM I/O class.
std::shared_ptr< const IceGrid > ConstPtr
std::shared_ptr< IceModelVec > Ptr
static RuntimeError formatted(const ErrorLocation &location, const char format[],...) __attribute__((format(printf
build a RuntimeError with a formatted message
std::vector< double > m_values
std::shared_ptr< std::vector< double > > m_requested_times
requested times
VariableMetadata m_dimension
unsigned int m_current_time
index into m_times
unsigned int m_start
starting index used when flushing the buffer
VariableMetadata m_time_bounds
std::vector< double > m_bounds
size_t m_buffer_size
size of the buffer used to store data
VariableMetadata m_variable
std::string m_output_filename
const Config::ConstPtr m_config
Configuration flags and parameters.
std::vector< double > m_time
IceGrid::ConstPtr m_grid
the grid
virtual double compute()=0
TSDiagnostic(IceGrid::ConstPtr g, const std::string &name)
void set_units(const std::string &units, const std::string &glaciological_units)
const VariableMetadata & metadata() const
virtual void update_impl(double t0, double t1)=0
void define(const File &file) const
void init(const File &output_file, std::shared_ptr< std::vector< double >> requested_times)
void update(double t0, double t1)
PISM's scalar time-series diagnostics.
void update_impl(double t0, double t1)
TSFluxDiagnostic(IceGrid::ConstPtr g, const std::string &name)
double m_accumulator
accumulator of changes (used to compute rates of change)
void update_impl(double t0, double t1)
void evaluate(double t0, double t1, double change)
double m_v_previous
last two values, used to compute the change during a time step
TSRateDiagnostic(IceGrid::ConstPtr g, const std::string &name)
Scalar diagnostic reporting the rate of change of a quantity modeled by PISM.
TSSnapshotDiagnostic(IceGrid::ConstPtr g, const std::string &name)
void evaluate(double t0, double t1, double v)
void update_impl(double t0, double t1)
#define PISM_ERROR_LOCATION
void define_timeseries(const VariableMetadata &var, const std::string &dimension_name, const File &file, IO_Type nctype)
Define a NetCDF variable corresponding to a time-series.
void define_spatial_variable(const SpatialVariableMetadata &var, const IceGrid &grid, const File &file, IO_Type default_type)
Define a NetCDF variable corresponding to a VariableMetadata object.
void write_time_bounds(const File &file, const VariableMetadata &metadata, size_t t_start, const std::vector< double > &data)
void define_time_bounds(const VariableMetadata &var, const std::string &dimension_name, const std::string &bounds_name, const File &file, IO_Type nctype)
void write_timeseries(const File &file, const VariableMetadata &metadata, size_t t_start, const std::vector< double > &data)
Write a time-series data to a file.
double convert(System::Ptr system, double input, const std::string &spec1, const std::string &spec2)
Convert a quantity from unit1 to unit2.
@ PISM_READWRITE
open an existing file for reading and writing
std::string join(const std::vector< std::string > &strings, const std::string &separator)
Concatenate strings, inserting separator between elements.
double vector_max(const std::vector< double > &input)