19#ifndef PISM_DIAGNOSTIC_HH
20#define PISM_DIAGNOSTIC_HH
26#include "pism/util/Config.hh"
27#include "pism/util/VariableMetadata.hh"
28#include "pism/util/array/Scalar.hh"
29#include "pism/util/error_handling.hh"
30#include "pism/util/io/File.hh"
31#include "pism/util/io/OutputWriter.hh"
67 typedef std::shared_ptr<Diagnostic>
Ptr;
71 static Ptr wrap(
const T &input);
77 std::shared_ptr<array::Array>
compute()
const;
85 std::set<VariableMetadata>
state()
const;
87 void init(
const File &input,
unsigned int time);
94 virtual std::set<VariableMetadata>
state_impl()
const;
109 std::shared_ptr<T>
allocate(
const std::string &name)
const {
110 auto result = std::make_shared<T>(
m_grid, name);
111 for (
unsigned int k = 0;
k < result->ndof(); ++
k) {
141 for (
unsigned int j = 0; j < input.ndof(); ++j) {
142 m_vars.emplace_back(input.metadata(j));
148 auto result =
m_input.duplicate();
150 result->set_name(
m_input.get_name());
151 for (
unsigned int k = 0;
k <
m_vars.size(); ++
k) {
169template <
class Model>
228 unsigned int t_start = time_length > 0 ? time_length - 1 : 0;
249 auto result = Diagnostic::allocate<array::Scalar>(
"diagnostic");
279 typedef std::shared_ptr<TSDiagnostic>
Ptr;
281 TSDiagnostic(std::shared_ptr<const Grid>
g,
const std::string &name);
289 void update(
double t0,
double t1);
299 void init(std::shared_ptr<OutputFile> output_file,
300 std::shared_ptr<std::vector<double> > requested_times);
317 void set_units(
const std::string &units,
const std::string &output_units);
324 std::shared_ptr<units::System>
m_sys;
359 void evaluate(
double t0,
double t1,
double v);
375 void evaluate(
double t0,
double t1,
double change);
407template <
class D,
class M>
410 TSDiag(
const M *m,
const std::string &name)
411 :
D(m->grid(), name),
model(m) {
virtual void update_impl(double dt)
virtual const array::Scalar & model_input()
VariableMetadata m_time_since_reset
array::Scalar m_accumulator
virtual std::shared_ptr< array::Array > compute_impl() const
virtual void reset_impl()
void write_state_impl(const OutputFile &output) const
void init_impl(const File &input, unsigned int time)
std::set< VariableMetadata > state_impl() const
DiagAverageRate(const M *m, const std::string &name, InputKind kind)
std::shared_ptr< array::Array > compute_impl() const
DiagWithDedicatedStorage(const T &input)
A template derived from Diagnostic, adding a "Model".
std::set< VariableMetadata > state() const
std::vector< VariableMetadata > m_vars
metadata corresponding to NetCDF variables
virtual std::shared_ptr< array::Array > compute_impl() const =0
static Ptr wrap(const T &input)
virtual void reset_impl()
VariableMetadata & metadata(unsigned int N=0)
Get a metadata object corresponding to variable number N.
virtual ~Diagnostic()=default
double m_fill_value
fill value (used often enough to justify storing it)
virtual std::set< VariableMetadata > state_impl() const
const grid::DistributedGridInfo & grid_info() const
const units::System::Ptr m_sys
the unit system
std::shared_ptr< const Config > m_config
Configuration flags and parameters.
double to_internal(double x) const
virtual void write_state_impl(const OutputFile &output) const
std::shared_ptr< Diagnostic > Ptr
void init(const File &input, unsigned int time)
virtual void update_impl(double dt)
double to_external(double x) const
unsigned int n_variables() const
Get the number of NetCDF variables corresponding to a diagnostic quantity.
std::shared_ptr< const Grid > m_grid
the grid
void write_state(const OutputFile &output) const
virtual void init_impl(const File &input, unsigned int time)
std::shared_ptr< array::Array > compute() const
Compute a diagnostic quantity and return a pointer to a newly-allocated Array.
std::shared_ptr< T > allocate(const std::string &name) const
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
bool variable_exists(const std::string &short_name) const
Checks if a variable exists.
High-level PISM I/O class.
Describes the PISM grid and the distribution of data across processors.
unsigned int time_dimension_length() const
void write_array(const std::string &variable_name, const std::vector< unsigned int > &start, const std::vector< unsigned int > &count, const std::vector< double > &input) const
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)
std::shared_ptr< units::System > m_sys
the unit system
std::vector< double > m_values
void set_units(const std::string &units, const std::string &output_units)
std::shared_ptr< std::vector< double > > m_requested_times
requested times
unsigned int m_current_time
index into m_times
unsigned int m_start
starting index used when flushing the buffer
std::vector< double > m_bounds
size_t m_buffer_size
size of the buffer used to store data
VariableMetadata m_variable
std::shared_ptr< const Config > m_config
Configuration flags and parameters.
std::shared_ptr< OutputFile > m_output_file
std::vector< double > m_time
virtual double compute()=0
const VariableMetadata & metadata() const
virtual void update_impl(double t0, double t1)=0
std::shared_ptr< const Grid > m_grid
the grid
void init(std::shared_ptr< OutputFile > output_file, std::shared_ptr< std::vector< double > > requested_times)
std::shared_ptr< TSDiagnostic > Ptr
void update(double t0, double t1)
PISM's scalar time-series diagnostics.
void update_impl(double t0, double t1)
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
Scalar diagnostic reporting the rate of change of a quantity modeled by PISM.
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.
void add(double alpha, const Array2D< T > &x)
void read(const std::string &filename, unsigned int time)
void write(const OutputFile &file) const
const std::string & get_name() const
Get the name of an Array object.
void set(double c)
Result: v[j] <- c for all j.
VariableMetadata & metadata(unsigned int N=0)
Returns a reference to the VariableMetadata object containing metadata for the compoment N.
std::shared_ptr< System > Ptr
#define PISM_ERROR_LOCATION
std::map< std::string, TSDiagnostic::Ptr > TSDiagnosticList
std::map< std::string, Diagnostic::Ptr > DiagnosticList