From 079b0dc63f4bd46e0adc130a8f785cf503c7c28f Mon Sep 17 00:00:00 2001 From: rinkk <karsten.rink@ufz.de> Date: Thu, 26 Sep 2019 17:23:01 +0200 Subject: [PATCH] fixing issue where app would crash when dimension where defined implicitely --- .../Utils/FileConverter/NetCdfConverter.cpp | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/Applications/Utils/FileConverter/NetCdfConverter.cpp b/Applications/Utils/FileConverter/NetCdfConverter.cpp index b4c4e198640..a00727742e7 100644 --- a/Applications/Utils/FileConverter/NetCdfConverter.cpp +++ b/Applications/Utils/FileConverter/NetCdfConverter.cpp @@ -97,6 +97,12 @@ static NcVar getDimVar(NcFile const& dataset, NcVar const& var, return dataset.getVar(dim_obj.getName()); } +static std::pair<double, double> getDimLength(NcVar const& var, + std::size_t const dim) +{ + return std::make_pair(0.0, static_cast<double>(var.getDim(dim).getSize())); +} + static std::vector<std::string> getArrays(NcFile const& dataset) { auto const& names = dataset.getVars(); @@ -150,7 +156,7 @@ static std::pair<double, double> getBoundaries(NcVar const& var) } static MathLib::Point3d getOrigin(NcFile const& dataset, NcVar const& var, - std::array<std::size_t, 4> const& dim_idx_map, + std::vector<std::size_t> const& dim_idx_map, bool is_time_dep) { std::size_t const temp_offset = (is_time_dep) ? 1 : 0; @@ -159,7 +165,8 @@ static MathLib::Point3d getOrigin(NcFile const& dataset, NcVar const& var, for (std::size_t i = temp_offset; i < n_dims; ++i) { NcVar const& dim = getDimVar(dataset, var, dim_idx_map[i]); - auto const bounds = getBoundaries(dim); + auto const bounds = (dim.isNull()) ? getDimLength(var, dim_idx_map[i]) + : getBoundaries(dim); origin[i - temp_offset] = (bounds.first < bounds.second) ? bounds.first : bounds.second; } @@ -205,7 +212,7 @@ static std::string arraySelectionLoop(NcFile const& dataset) } static bool dimensionSelectionLoop(NcVar const& var, - std::array<std::size_t, 4>& dim_idx_map) + std::vector<std::size_t>& dim_idx_map) { showArraysDims(var); std::size_t const n_dims(var.getDimCount()); @@ -270,15 +277,14 @@ static bool dimensionSelectionLoop(NcVar const& var, } static std::pair<std::size_t, std::size_t> timestepSelectionLoop( - NcFile const& dataset, NcVar const& var, std::size_t const dim_idx) + NcVar const& var, std::size_t const dim_idx) { std::size_t const n_time_steps = var.getDim(dim_idx).getSize(); std::pair<std::size_t, std::size_t> bounds( std::numeric_limits<std::size_t>::max(), std::numeric_limits<std::size_t>::max()); std::cout << "\nThe dataset contains " << n_time_steps << " time steps.\n"; - bounds.first = - parseInput("Specify first time step to export: ", n_time_steps, false); + bounds.first = parseInput("Specify first time step to export: ", n_time_steps, false); while (bounds.first > bounds.second || bounds.second > n_time_steps) bounds.second = parseInput( "Specify last time step to export: ", n_time_steps, false); @@ -349,7 +355,9 @@ static std::string getIterationString(std::size_t i, std::size_t max) static double getResolution(NcFile const& dataset, NcVar const& var) { std::size_t const dim_idx = var.getDimCount() - 1; - auto const bounds = getBoundaries(getDimVar(dataset, var, dim_idx)); + NcVar const dim_var (getDimVar(dataset, var, dim_idx)); + auto const bounds = (dim_var.isNull()) ? getDimLength(var, dim_idx) + : getBoundaries(dim_var); std::size_t const dim_size = var.getDim(dim_idx).getSize(); std::string const err_msg("Dimension \"" + var.getDim(dim_idx).getName() + "\" has size 0. Aborting..."); @@ -359,7 +367,7 @@ static double getResolution(NcFile const& dataset, NcVar const& var) static GeoLib::RasterHeader createRasterHeader( NcFile const& dataset, NcVar const& var, - std::array<std::size_t, 4> const& dim_idx_map, + std::vector<std::size_t> const& dim_idx_map, std::vector<std::size_t> const& length, bool is_time_dep) { MathLib::Point3d const origin = getOrigin(dataset, var, dim_idx_map, is_time_dep); @@ -378,7 +386,6 @@ static std::vector<std::size_t> getLength(NcVar const& var, bool const is_time_d std::size_t const temp_offset = (is_time_dep) ? 1 : 0; std::size_t const n_dims = (var.getDimCount()); std::vector<std::size_t> length(n_dims, 1); - std::size_t array_length = 1; for (std::size_t i = temp_offset; i < n_dims; ++i) { length[i] = var.getDim(i).getSize(); @@ -401,14 +408,16 @@ static std::vector<double> getData(NcFile const& dataset, NcVar const& var, // reverse lines in vertical direction if the original file has its origin // in the northwest corner - auto const bounds = getBoundaries(getDimVar(dataset, var, n_dims - 1)); + NcVar const dim_var (getDimVar(dataset, var, n_dims - 1)); + auto const bounds = (dim_var.isNull()) ? getDimLength(var, n_dims - 1) + : getBoundaries(dim_var); if (bounds.first > bounds.second) flipRaster(data_vec, length[n_dims - 2], length[n_dims - 1]); return data_vec; } static bool assignDimParams(NcVar const& var, - std::array<std::size_t, 4>& dim_idx_map, + std::vector<std::size_t>& dim_idx_map, TCLAP::ValueArg<std::size_t>& arg_dim_time, TCLAP::ValueArg<std::size_t>& arg_dim1, TCLAP::ValueArg<std::size_t>& arg_dim2, @@ -433,10 +442,9 @@ static bool assignDimParams(NcVar const& var, return false; } - bool const is_time_dep = arg_dim_time.isSet(); - if (is_time_dep) + if (arg_dim_time.isSet()) dim_idx_map[0] = arg_dim_time.getValue(); - std::size_t const temp_offset = (is_time_dep) ? 1 : 0; + std::size_t const temp_offset = (arg_dim_time.isSet()) ? 1 : 0; dim_idx_map[0 + temp_offset] = arg_dim1.getValue(); dim_idx_map[1 + temp_offset] = arg_dim2.getValue(); if (n_dims == (3 + temp_offset)) @@ -492,7 +500,7 @@ static MeshLib::MeshElemType assignElemType( static bool convert(NcFile const& dataset, NcVar const& var, std::string const& output_name, - std::array<std::size_t, 4> const& dim_idx_map, + std::vector<std::size_t> const& dim_idx_map, bool const is_time_dep, std::pair<std::size_t, std::size_t> const& time_bounds, bool const use_single_file, MeshLib::MeshElemType const elem_type) @@ -661,7 +669,7 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - std::array<std::size_t, 4> dim_idx_map; + std::vector<std::size_t> dim_idx_map(var.getDimCount(), 0); bool is_time_dep (false); if (arg_dim1.isSet() && arg_dim2.isSet()) { @@ -679,7 +687,7 @@ int main(int argc, char* argv[]) time_bounds = (arg_time_start.isSet()) ? assignTimeBounds(getDimVar(dataset, var, dim_idx_map[0]), arg_time_start, arg_time_end) - : timestepSelectionLoop(dataset, var, dim_idx_map[0]); + : timestepSelectionLoop(var, dim_idx_map[0]); bool use_single_file(true); if (arg_time_start.isSet()) -- GitLab