diff --git a/python/genericio.cpp b/python/genericio.cpp index 53df6f5502cec0c448fe6eb2b86e38315c10fc57..a29d478f35d38ecbcf05d88bb8237410cc05dcaf 100644 --- a/python/genericio.cpp +++ b/python/genericio.cpp @@ -8,6 +8,7 @@ #include <map> #include <cstdint> #include <optional> +#include <stdexcept> #ifndef GENERICIO_NO_MPI #include <mpi.h> @@ -119,6 +120,10 @@ public: std::map<std::string, py::array> result; for(const std::string& var_name: *var_names) { + // check if it's not already defined (caused some segfaults at some point) + if(result.count(var_name)) { + throw std::invalid_argument(std::string("variable name was passed multiple times: ") + var_name); + } auto varp = std::find_if( variables.begin(), variables.end(), @@ -127,24 +132,28 @@ public: if (varp != variables.end()) { // extra space py::ssize_t readsize = num_elem + requestedExtraSpace()/(*varp).ElementSize; + // py::array_t constructor: (shape, stride) -> some compilers or numpy + // versions require stride to be explicitly specified if((*varp).IsFloat && (*varp).ElementSize == 4) { - result[var_name] = py::array_t<float>(readsize); + result[var_name] = py::array_t<float>({readsize}, {4}); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); } else if((*varp).IsFloat && (*varp).ElementSize == 8) { - result[var_name] = py::array_t<double>(readsize); + result[var_name] = py::array_t<double>({readsize}, {8}); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); } else if(!(*varp).IsFloat && (*varp).ElementSize == 4) { - result[var_name] = py::array_t<int32_t>(readsize); + result[var_name] = py::array_t<int32_t>({readsize}, {4}); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); } else if(!(*varp).IsFloat && (*varp).ElementSize == 8) { - result[var_name] = py::array_t<int64_t>(readsize); + result[var_name] = py::array_t<int64_t>({readsize}, {8}); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); } else if(!(*varp).IsFloat && (*varp).ElementSize == 2) { - result[var_name] = py::array_t<uint16_t>(readsize); + result[var_name] = py::array_t<uint16_t>({readsize}, {2}); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); } else { - throw std::runtime_error(std::string("Unknown data type in GenericIO for variable ") + var_name); + throw std::runtime_error(std::string("unknown data type in GenericIO for variable: ") + var_name); } + } else { // variable not found + throw std::invalid_argument(std::string("requested variable is not defined in GenericIO file: ") + var_name); } }