18 static std::mutex sync;
25 static void check_error(
const int status) {
26 assert(status == NC_NOERR && nc_strerror(status));
51 const size_t num_rays) :
57 check_error(nc_create(temp.c_str(),
58 filename.empty() || num_rays == 0 ? NC_DISKLESS : NC_CLOBBER,
61 check_error(nc_def_dim(ncid,
"time", NC_UNLIMITED, &unlimited_dim));
62 check_error(nc_def_dim(ncid,
"num_rays",
63 num_rays ? num_rays : 1,
75 check_error(nc_open(filename.c_str(), NC_WRITE, &ncid));
77 check_error(nc_inq_dimid(ncid,
"time", &unlimited_dim));
78 check_error(nc_inq_dimid(ncid,
"num_rays", &num_rays_dim));
79 check_error(nc_inq_dimlen(ncid, num_rays_dim, &num_rays));
80 check_error(nc_redef(ncid));
88 check_error(nc_close(ncid));
96 check_error(nc_enddef(ncid));
133 return unlimited_dim;
144 check_error(nc_inq_dimlen(ncid, unlimited_dim, &size));
155 check_error(nc_sync(ncid));
165 template<jit::
float_scalar T>
171 std::array<int, 3> dims;
173 std::array<size_t, 3> count;
189 std::vector<variable> variables;
202 std::ptrdiff_t stride;
207 std::vector<reference> references;
218 if (NC_NOERR != nc_inq_dimid(result.
get_ncid(),
221 check_error(nc_def_dim(result.
get_ncid(),
222 "ray_dim_cplx", ray_dim_size,
226 if (NC_NOERR != nc_inq_dimid(result.
get_ncid(),
229 check_error(nc_def_dim(result.
get_ncid(),
230 "ray_dim", ray_dim_size,
259 template<
bool SAFE_MATH=false>
261 const std::string &name,
266 check_error(nc_def_var(result.
get_ncid(), name.c_str(), type,
267 static_cast<int> (dims.size()), dims.data(),
272 variables.push_back(var);
284 template<
bool SAFE_MATH=false>
286 const std::string &name,
290 std::array<int, 3> ref_dims;
293 check_error(nc_inq_varid(result.
get_ncid(),
296 check_error(nc_inq_var(result.
get_ncid(), ref.id, NULL, &type,
297 NULL, ref_dims.data(), NULL));
298 check_error(nc_inq_dimlen(result.
get_ncid(), ref_dims[2],
302 assert(ref.ray_dim_size <= ray_dim_size &&
303 "Context variable too small to read reference.");
305 ref.stride = ref.ray_dim_size < ray_dim_size ? 2 : 1;
306 ref.buffer = node->data();
308 references.push_back(ref);
320 template<
bool SAFE_MATH=false>
322 const std::string &name,
326 std::array<int, 3> ref_dims;
329 check_error(nc_inq_varid(result.
get_ncid(),
332 check_error(nc_inq_var(result.
get_ncid(), ref.id, NULL, &type,
333 NULL, ref_dims.data(), NULL));
334 check_error(nc_inq_dimlen(result.
get_ncid(), ref_dims[2],
338 assert(ref.ray_dim_size == 2 &&
339 "Not a complex variable.");
341 ref.ray_dim_size = 1;
342 ref.stride = ref.ray_dim_size < ray_dim_size ? 2 : 1;
343 ref.buffer = node->data();
345 references.push_back(ref);
364 const size_t index) {
365 const std::array<size_t, 3> start = {
369 for (variable &var : variables) {
373 check_error(nc_put_vara_float(result.
get_ncid(),
377 reinterpret_cast<float *
> (var.buffer)));
379 check_error(nc_put_vara_float(result.
get_ncid(),
387 check_error(nc_put_vara_double(result.
get_ncid(),
391 reinterpret_cast<double *
> (var.buffer)));
393 check_error(nc_put_vara_double(result.
get_ncid(),
413 const size_t index) {
414 const std::array<std::ptrdiff_t, 3> stride = {
418 for (reference &ref : references) {
419 const std::array<size_t, 3> ref_start = {
422 const std::array<size_t, 3> ref_count = {
427 const std::array<std::ptrdiff_t, 3> map = {
434 check_error(nc_get_varm_float(result.
get_ncid(),
440 reinterpret_cast<float *
> (ref.buffer)));
442 check_error(nc_get_varm_float(result.
get_ncid(),
452 check_error(nc_get_varm_double(result.
get_ncid(),
458 reinterpret_cast<double *
> (ref.buffer)));
460 check_error(nc_get_varm_double(result.
get_ncid(),
Class for JIT compile of the GPU kernels.
Definition jit.hpp:49
T * get_buffer(graph::shared_leaf< T, SAFE_MATH > &node)
Get buffer from the gpu_context.
Definition jit.hpp:328
Class representing a netcdf dataset.
Definition output.hpp:166
void read(const result_file &result, const size_t index)
Read step.
Definition output.hpp:412
data_set(const result_file &result)
Construct a dataset.
Definition output.hpp:215
void reference_imag_variable(const result_file &result, const std::string &name, graph::shared_variable< T, SAFE_MATH > &&node)
Load imaginary reference.
Definition output.hpp:321
void write(const result_file &result, const size_t index)
Write step.
Definition output.hpp:363
void reference_variable(const result_file &result, const std::string &name, graph::shared_variable< T, SAFE_MATH > &&node)
Load reference.
Definition output.hpp:285
void create_variable(const result_file &result, const std::string &name, graph::shared_leaf< T, SAFE_MATH > &node, jit::context< T, SAFE_MATH > &context)
Create a variable.
Definition output.hpp:260
void write(const result_file &result)
Write step.
Definition output.hpp:353
Class representing a netcdf based output file.
Definition output.hpp:32
void end_define_mode() const
End define mode.
Definition output.hpp:94
~result_file()
Destructor.
Definition output.hpp:87
size_t get_num_rays() const
Get the number of rays.
Definition output.hpp:114
int get_num_rays_dim() const
Get the number of rays dimension.
Definition output.hpp:123
result_file(const std::string &filename)
Open a new result file.
Definition output.hpp:73
int get_ncid() const
Get ncid.
Definition output.hpp:105
size_t get_unlimited_size() const
Get unlimited size.
Definition output.hpp:141
int get_unlimited_dim() const
Get unlimited dimension.
Definition output.hpp:132
result_file(const std::string &filename, const size_t num_rays)
Construct a new result file.
Definition output.hpp:50
void sync_file() const
Sync the file.
Definition output.hpp:153
Complex scalar concept.
Definition register.hpp:24
float base concept.
Definition register.hpp:37
subroutine assert(test, message)
Assert check.
Definition f_binding_test.f90:38
Class to just in time compile a kernel.
std::shared_ptr< variable_node< T, SAFE_MATH > > shared_variable
Convenience type alias for shared variable nodes.
Definition node.hpp:1727
std::shared_ptr< leaf_node< T, SAFE_MATH > > shared_leaf
Convenience type alias for shared leaf nodes.
Definition node.hpp:673
std::string format_to_string(const T value)
Convert a value to a string while avoiding locale.
Definition register.hpp:211
Name space for output files.
Definition output.hpp:16