20#include "pism/util/io/SynchronousOutputWriter.hh"
21#include "pism/util/Config.hh"
22#include "pism/util/VariableMetadata.hh"
23#include "pism/util/io/File.hh"
24#include "pism/util/io/IO_Flags.hh"
25#include "pism/util/error_handling.hh"
26#include "pism/util/GridInfo.hh"
32 if (
m_files[file_name] ==
nullptr) {
44 const std::set<VariableMetadata> & ) {
56 const std::string &variable_name,
57 const std::vector<std::string> &dims,
60 const auto &output_file =
file(file_name);
62 if (output_file.variable_exists(variable_name)) {
66 output_file.define_variable(variable_name, type, dims);
77 const std::string &text) {
78 const auto &output_file =
file(file_name);
80 auto old_history = output_file.read_text_attribute(
"PISM_GLOBAL",
"history");
82 output_file.write_attribute(
"PISM_GLOBAL",
"history", old_history + text);
86 if (
m_files[file_name] ==
nullptr) {
97 if (
m_files[file_name] !=
nullptr) {
104 const std::string &name,
unsigned int length) {
105 const auto &output_file =
file(file_name);
107 if (output_file.dimension_exists(name)) {
111 output_file.define_dimension(name, length);
115 const std::string &file_name,
const std::map<std::string, std::string> &strings,
116 const std::map<std::string, std::vector<double> > &numbers) {
121 const std::string &file_name,
const std::string &var_name,
122 const std::map<std::string, std::string> &strings,
123 const std::map<std::string, std::vector<double> > &numbers,
io::Type output_type) {
124 const auto &output_file =
file(file_name);
127 for (
const auto &s : strings) {
128 const auto &name = s.first;
129 const auto &value = s.second;
135 output_file.write_attribute(var_name, name, value);
139 for (
const auto &d : numbers) {
140 const auto &name = d.first;
141 const auto &values = d.second;
143 if (values.empty()) {
152 output_file.write_attribute(var_name, name, output_type, values);
157 const auto &output_file =
file(file_name);
158 return output_file.dimension_length(
time_name());
162 const auto &output_file =
file(file_name);
164 auto t_length = output_file.dimension_length(
time_name());
168 output_file.read_variable(
"time", { t_length - 1 }, { 1 }, &time);
172 "time dimension in '%s' is absent or has length zero",
177 const std::string &variable_name,
178 const std::vector<unsigned int> &start,
179 const std::vector<unsigned int> &
count,
180 const double *data) {
181 const auto &output_file =
file(file_name);
183 output_file.write_variable(variable_name, start,
count, data);
187 const std::string &variable_name,
188 const std::vector<unsigned int> &start,
189 const std::vector<unsigned int> &
count,
190 const std::string &input) {
191 const auto &output_file =
file(file_name);
193 output_file.write_text_variable(variable_name, start,
count, input);
197 const std::string &variable_name,
198 const double *data) {
200 const auto &output_file =
file(file_name);
204 if (metadata.grid_info() ==
nullptr) {
206 variable_name.c_str());
209 const auto &grid = *metadata.grid_info();
211 unsigned int n_levels = std::max(metadata.levels().size(), (std::size_t)1);
213 std::vector<unsigned int> start = { grid.ys, grid.xs, 0 };
214 std::vector<unsigned int>
count = { grid.ym, grid.xm, n_levels };
216 if (metadata.get_time_dependent()) {
218 auto t_start = t_length > 0 ? t_length - 1 : 0;
220 start.insert(start.cbegin(), t_start);
225 start.insert(start.cbegin(), 0);
229 output_file.write_variable(variable_name, start,
count, data);
double get_number(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
std::string get_string(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
A class for storing and accessing PISM configuration flags and parameters.
void set_compression_level(int level) const
High-level PISM I/O class.
unsigned int time_dimension_length(const std::string &file_name)
void set_is_async(bool flag)
const std::string & time_name() const
const std::string & experiment_id() const
const VariableMetadata & variable_info(const std::string &variable_name) const
void write_array(const std::string &file_name, const std::string &variable_name, const std::vector< unsigned int > &start, const std::vector< unsigned int > &count, const std::vector< double > &input)
static RuntimeError formatted(const ErrorLocation &location, const char format[],...) __attribute__((format(printf
build a RuntimeError with a formatted message
void append_history_impl(const std::string &file_name, const std::string &text)
const File & file(const std::string &file_name)
void define_dimension_impl(const std::string &file_name, const std::string &name, unsigned int length)
void write_text_impl(const std::string &file_name, const std::string &variable_name, const std::vector< unsigned int > &start, const std::vector< unsigned int > &count, const std::string &input)
SynchronousOutputWriter(MPI_Comm comm, const Config &config)
void write_distributed_array_impl(const std::string &file_name, const std::string &variable_name, const double *data)
void append_impl(const std::string &file_name)
void write_attributes(const std::string &file_name, const std::string &var_name, const std::map< std::string, std::string > &strings, const std::map< std::string, std::vector< double > > &numbers, io::Type output_type)
std::map< std::string, std::shared_ptr< File > > m_files
void define_variable_impl(const std::string &file_name, const std::string &variable_name, const std::vector< std::string > &dims, io::Type type, const VariableAttributes &attributes)
unsigned int time_dimension_length_impl(const std::string &file_name)
void append_time_impl(const std::string &file_name, double time_seconds)
void set_global_attributes_impl(const std::string &file_name, const std::map< std::string, std::string > &strings, const std::map< std::string, std::vector< double > > &numbers)
void write_array_impl(const std::string &file_name, const std::string &variable_name, const std::vector< unsigned int > &start, const std::vector< unsigned int > &count, const double *data)
void close_impl(const std::string &file_name)
void sync_impl(const std::string &file_name)
void initialize_impl(const std::set< VariableMetadata > &array_variables)
double last_time_value_impl(const std::string &file_name)
std::map< std::string, std::string > strings
string and boolean attributes
std::map< std::string, std::vector< double > > numbers
scalar and array attributes
#define PISM_ERROR_LOCATION
@ PISM_READWRITE_MOVE
create a file for writing, move foo.nc to foo.nc~ if present
@ PISM_READWRITE
open an existing file for reading and writing
io::Backend string_to_backend(const std::string &backend)