30 int nx = 0, ny = 0, nz = 0, ndata = 0;
34 std::ifstream infile(filename, std::ios::binary);
36 amrex::Abort(
"Error: Could not open file " + filename);
39 auto read_or_abort = [&](
auto& dest,
const std::string& field_name) {
40 infile.read(
reinterpret_cast<char*
>(&dest),
sizeof(dest));
42 amrex::Abort(
"Error reading " + field_name +
" from " + filename);
46 auto read_float_vector = [&](amrex::Vector<amrex::Real>& dest,
48 const std::string& field_name)
51 amrex::Abort(
"Error: negative element count for " + field_name +
" in " + filename);
54 dest.reserve(dest.size() + count);
55 for (
int idx = 0; idx < count; ++idx) {
56 read_or_abort(
value, field_name);
57 dest.emplace_back(
value);
62 read_or_abort(nx,
"nx");
63 read_or_abort(ny,
"ny");
64 read_or_abort(nz,
"nz");
65 read_or_abort(ndata,
"ndata");
67 if (nx <= 0 || ny <= 0 || nz <= 0) {
68 amrex::Abort(
"Error: invalid custom binary dimensions in " + filename);
71 if (ndata < 0 || ndata > 8) {
72 amrex::Abort(
"Error: unsupported number of data fields in " + filename);
75 read_float_vector(latvec_h, nx*ny,
"latitude");
76 read_float_vector(lonvec_h, nx*ny,
"longitude");
77 read_float_vector(xvec_h, nx,
"x coordinates");
78 read_float_vector(yvec_h, ny,
"y coordinates");
79 read_float_vector(zvec_h, nz,
"z coordinates");
81 std::array<amrex::Vector<amrex::Real>*, 8> data_fields = {
82 &
rho_h, &uvel_h, &vvel_h, &wvel_h, &theta_h, &qv_h, &qc_h, &qr_h
86 for (
int idx = 0; idx < ndata; ++idx) {
87 read_float_vector(*data_fields[idx], nx * ny * nz,
88 "data field " + std::to_string(idx));
amrex::Real value
Definition: ERF_HurricaneDiagnostics.H:20
Vector< Real > rho_h(khi+1, zero)