19#include <gsl/gsl_interp.h>
27#include "pism/icemodel/IceModel.hh"
29#include "pism/util/Grid.hh"
30#include "pism/util/Config.hh"
31#include "pism/util/Diagnostic.hh"
32#include "pism/util/Time.hh"
33#include "pism/util/io/File.hh"
34#include "pism/util/Profiling.hh"
35#include "pism/util/pism_utilities.hh"
36#include "pism/util/Component.hh"
37#include "pism/util/io/IO_Flags.hh"
38#include "pism/util/io/io_helpers.hh"
39#include "pism/util/io/SynchronousOutputWriter.hh"
45 const std::string &description) {
47 const size_t N = times.size();
48 if (t >= times.back()) {
57 j = gsl_interp_bsearch(times.data(), t, 0, N - 1);
60 dt = times[j + 1] - t;
64 if (dt < resolution) {
83 wall_clock.
long_name(
"wall-clock time since the beginning of the run")
89 myph.
long_name(
"average number of model years per processor hour, since the beginning of the run")
90 .
units(
"years / hour")
95 step_counter.
long_name(
"number of time steps since the beginning of the run")
104 auto mapping =
m_grid->get_mapping_info();
106 if (mapping.has_attributes()) {
107 result.insert(mapping);
119 m_log->message(2,
"WARNING: output.file is empty. Using '%s' instead.\n",
124 m_log->message(2,
"PISM WARNING: output file name does not have the '.nc' suffix!\n");
129#if (Pism_USE_PROJ == 1)
131 std::string proj_string =
m_grid->get_mapping_info()[
"proj_params"];
132 if (not proj_string.empty()) {
133 for (std::string v : {
"lon",
"lat"}) {
160 profiling.
begin(
"io.model_state");
161 if (
m_config->get_string(
"output.size") !=
"none") {
179 profiling.
end(
"io.model_state");
185 auto t_start = t_length > 0 ? t_length - 1 : 0;
189 model_years =
m_time->convert_time_interval(
m_time->current() -
m_time->start(),
"years");
191 std::vector<unsigned int> start{};
192 std::vector<unsigned int>
count{};
193 if (
m_config->get_string(
"output.experiment_id").empty()) {
197 start = { 0, t_start };
202 file.
write_array(
"model_years_per_processor_hour", start,
count, { model_years / proc_hours });
207 const std::set<VariableMetadata> &variables)
const {
209 m_grid->get_mapping_info(),
210 m_config->get_flag(
"output.use_MKS"));
218 std::set<VariableMetadata> result{};
222 for (
unsigned int k = 0;
k < v->ndof(); ++
k) {
223 result.insert(v->metadata(
k));
246 m.second->write_state(file);
251 const std::set<std::string> &additional_variables) {
255 std::shared_ptr<OutputWriter> writer =
256 std::make_shared<SynchronousOutputWriter>(
m_grid->com, *
m_config);
260 std::set<std::string> variable_names;
261 for (
const auto &v : variables) {
262 variable_names.insert(v.get_name());
265 writer->initialize(variables);
std::map< std::string, const Component * > m_submodels
the list of sub-models, for writing model states and obtaining diagnostics
void define_variables(const OutputFile &file, const std::set< VariableMetadata > &variables) const
unsigned int m_step_counter
std::set< std::string > m_spatial_vars
std::shared_ptr< Config > m_config
Configuration flags and parameters.
void define_time(const OutputFile &file, bool with_bounds=false) const
void write_run_stats(const OutputFile &file) const
std::shared_ptr< Context > m_ctx
Execution context.
std::shared_ptr< Logger > m_log
Logger.
virtual std::set< VariableMetadata > diagnostic_variables(const std::set< std::string > &variable_names) const
std::set< VariableMetadata > m_output_file_contents
Set of variables that will be written to the output file.
std::set< VariableMetadata > state_variables_diagnostics(const std::set< std::string > &variable_names) const
virtual std::set< VariableMetadata > state_variables() const
std::string save_state_on_error(const std::string &suffix, const std::set< std::string > &additional_variables)
VariableMetadata m_output_global_attributes
stores global attributes saved in a PISM output file
std::shared_ptr< Time > m_time
Time manager.
std::set< VariableMetadata > common_metadata() const
void write_state_diagnostics(const OutputFile &file, const std::set< std::string > &variable_names) const
void write_diagnostics(const OutputFile &file, const std::set< std::string > &variable_names) const
Writes variables listed in variable_names to file.
std::set< array::Array * > m_model_state
virtual std::set< std::string > output_variables(const std::string &keyword)
Assembles a list of diagnostics corresponding to an output file size.
const units::System::Ptr m_sys
Unit system.
void write_final_output()
Save model state in NetCDF format.
std::shared_ptr< OutputWriter > m_output_writer
std::string m_output_filename
Name of the output file.
virtual void write_state(const OutputFile &file) const
virtual void append_history(const std::string &string)
Get time and user/host name and add it to the given string.
std::set< std::string > m_output_vars
const std::shared_ptr< Grid > m_grid
Computational grid.
Combines the max. time step with the flag indicating if a restriction is active. Makes is possible to...
void append_time(double time_seconds) const
unsigned int time_dimension_length() const
void define_variable(const VariableMetadata &variable) 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
void begin(const char *name) const
void end(const char *name) const
void write_config(const Config &config, const std::string &variable_name, const OutputFile &file)
void define_variables(const OutputFile &file, const std::set< VariableMetadata > &variables, const VariableMetadata &mapping, bool use_internal_units)
MaxTimestep reporting_max_timestep(const std::vector< double > ×, double t, double eps, const std::string &description)
double wall_clock_hours(MPI_Comm com, double start_time)
Return time since the beginning of the run, in hours.
bool ends_with(const std::string &str, const std::string &suffix)
Returns true if str ends with suffix and false otherwise.
std::string filename_add_suffix(const std::string &filename, const std::string &separator, const std::string &suffix)
Adds a suffix to a filename.
T combine(const T &a, const T &b)
VariableMetadata config_metadata(const Config &config)
bool set_member(const std::string &string, const std::set< std::string > &set)