19 #ifndef PISM_DIAGNOSTIC_HH
20 #define PISM_DIAGNOSTIC_HH
30 #include "pism/util/error_handling.hh"
31 #include "pism/util/io/File.hh"
32 #include "pism/util/IceModelVec2V.hh"
33 #include "pism/util/io/io_helpers.hh"
64 typedef std::shared_ptr<Diagnostic>
Ptr;
68 static Ptr wrap(
const T &input);
82 void init(
const File &input,
unsigned int time);
91 void set_attrs(
const std::string &long_name,
92 const std::string &standard_name,
93 const std::string &units,
94 const std::string &glaciological_units,
112 std::vector<SpatialVariableMetadata>
m_vars;
132 for (
unsigned int j = 0; j < input.ndof(); ++j) {
133 m_vars.emplace_back(input.metadata(j));
141 result->set_name(
m_input.get_name());
142 for (
unsigned int k = 0;
k <
m_vars.size(); ++
k) {
160 template <
class Model>
193 "accumulator for the " + name +
" diagnostic";
227 unsigned int t_start = time_length > 0 ? time_length - 1 : 0;
280 typedef std::shared_ptr<TSDiagnostic>
Ptr;
285 void update(
double t0,
double t1);
290 std::shared_ptr<std::vector<double>> requested_times);
311 void set_units(
const std::string &units,
const std::string &glaciological_units);
357 void evaluate(
double t0,
double t1,
double v);
372 void evaluate(
double t0,
double t1,
double change);
402 template <
class D,
class M>
405 TSDiag(
const M *m,
const std::string &name)
406 :
D(m->grid(), name),
model(m) {
std::shared_ptr< const Config > ConstPtr
virtual void update_impl(double dt)
VariableMetadata m_time_since_reset
virtual void reset_impl()
void init_impl(const File &input, unsigned int time)
IceModelVec2S m_accumulator
virtual const IceModelVec2S & model_input()
virtual IceModelVec::Ptr compute_impl() const
DiagAverageRate(const M *m, const std::string &name, InputKind kind)
void write_state_impl(const File &output) const
void define_state_impl(const File &output) const
DiagWithDedicatedStorage(const T &input)
IceModelVec::Ptr compute_impl() const
A template derived from Diagnostic, adding a "Model".
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.
static Ptr wrap(const T &input)
virtual void reset_impl()
virtual ~Diagnostic()=default
double m_fill_value
fill value (used often enough to justify storing it)
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
std::shared_ptr< Diagnostic > Ptr
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.
Class representing diagnostic computations in PISM.
void read_variable(const std::string &variable_name, const std::vector< unsigned int > &start, const std::vector< unsigned int > &count, double *ip) const
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.
unsigned int dimension_length(const std::string &name) const
Get the length of a dimension.
High-level PISM I/O class.
std::shared_ptr< const IceGrid > ConstPtr
void add(double alpha, const IceModelVec2S &x)
std::shared_ptr< IceModelVec2S > Ptr
SpatialVariableMetadata & metadata(unsigned int N=0)
Returns a reference to the SpatialVariableMetadata object containing metadata for the compoment N.
std::shared_ptr< IceModelVec > Ptr
void set(double c)
Result: v[j] <- c for all j.
void read(const std::string &filename, unsigned int time)
void define(const File &file, IO_Type default_type=PISM_DOUBLE) const
Define variables corresponding to an IceModelVec in a file opened using file.
void write(const std::string &filename) const
const std::string & get_name() const
Get the name of an IceModelVec object.
static RuntimeError formatted(const ErrorLocation &location, const char format[],...) __attribute__((format(printf
build a RuntimeError with a formatted message
TSDiag(const M *m, const std::string &name)
const units::System::Ptr m_sys
the unit system
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::string m_time_name
time series object used to store computed values and metadata
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
std::shared_ptr< TSDiagnostic > Ptr
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)
Scalar diagnostic reporting a "flux".
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)
Scalar diagnostic reporting a snapshot of a quantity modeled by PISM.
std::shared_ptr< System > Ptr
#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 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.
std::map< std::string, TSDiagnostic::Ptr > TSDiagnosticList
std::map< std::string, Diagnostic::Ptr > DiagnosticList
std::shared_ptr< IceModelVec2S > duplicate(const IceModelVec2S &source)