feat: implemented reading hdf5
This commit is contained in:
parent
b7d462178b
commit
2443d96733
|
|
@ -0,0 +1,2 @@
|
|||
.DS_Store
|
||||
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
.DS_Store
|
||||
src/.DS_Store
|
||||
src/.cache
|
||||
src/build
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
cmake_minimum_required (VERSION 3.28)
|
||||
project (ReadHDF5)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 23)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
find_package(netCDF REQUIRED)
|
||||
|
||||
add_executable(ReadHDF5 main.cpp)
|
||||
|
||||
execute_process(
|
||||
COMMAND nc-config --includedir
|
||||
OUTPUT_VARIABLE NETCDF_INCLUDE_DIR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
execute_process(
|
||||
COMMAND ncxx4-config --libdir
|
||||
OUTPUT_VARIABLE NETCDFCXX_LIB_DIR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
target_include_directories(ReadHDF5 PUBLIC ${netCDF_INCLUDE_DIR})
|
||||
|
||||
find_library(NETCDF_LIB NAMES netcdf-cxx4 netcdf_c++4 PATHS ${NETCDFCXX_LIB_DIR} NO_DEFAULT_PATH)
|
||||
target_link_libraries(ReadHDF5 ${NETCDF_LIB})
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
#include <iostream>
|
||||
#include <mdspan>
|
||||
#include <print>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <netcdf>
|
||||
|
||||
using namespace std;
|
||||
using namespace netCDF;
|
||||
|
||||
template <typename T>
|
||||
void printContentsOfVec(const std::vector<T>& vec) {
|
||||
for (const auto& element : vec) {
|
||||
cout << element << " ";
|
||||
}
|
||||
cout << std::endl;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
vector<T> getVarVector(NcVar var) {
|
||||
int length = 1;
|
||||
for (NcDim dim : var.getDims()) {
|
||||
length *= dim.getSize();
|
||||
}
|
||||
|
||||
vector<T> vec(length);
|
||||
|
||||
var.getVar(vec.data());
|
||||
|
||||
return vec;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
using arr3d = std::mdspan<
|
||||
T,
|
||||
std::dextents<
|
||||
std::size_t,
|
||||
3
|
||||
>
|
||||
>;
|
||||
|
||||
|
||||
template <typename T>
|
||||
void print3DMatrixSlice(arr3d<T> arr, int t) {
|
||||
for (int x = 0; x < arr.extent(1); x++) {
|
||||
for (int y = 0; y < arr.extent(2); y++) {
|
||||
print("{} ", arr[t,x,y]);
|
||||
}
|
||||
println("");
|
||||
}
|
||||
}
|
||||
|
||||
void print3DMatrixSlice(arr3d<double> arr, int t) {
|
||||
for (int x = 0; x < arr.extent(1); x++) {
|
||||
for (int y = 0; y < arr.extent(2); y++) {
|
||||
print("{:>10.4f} ", arr[t,x,y]);
|
||||
}
|
||||
println("");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a 3D matrix from a NetCDF variable.
|
||||
* Reads data into a contiguous 1D data vector.
|
||||
* Returns a pair of the size of the matrix (in the form of an extent) with the data vector.
|
||||
*
|
||||
* Inteded usage of this function involves using the two returned values
|
||||
* to create an mdspan:
|
||||
*
|
||||
* auto arr = mdspan(vec.data(), size);
|
||||
*/
|
||||
template <typename T>
|
||||
pair<vector<T>, std::dextents<std::size_t, 3>> get3DMat(NcVar var) {
|
||||
if(var.getDimCount() != 3) {
|
||||
throw invalid_argument("Variable is not 3D");
|
||||
}
|
||||
int timeLength = var.getDim(0).getSize();
|
||||
int latLength = var.getDim(1).getSize();
|
||||
int longLength = var.getDim(2).getSize();
|
||||
vector<T> vec(timeLength*latLength*longLength);
|
||||
var.getVar(vec.data());
|
||||
auto arr = std::mdspan(vec.data(), timeLength, latLength, longLength);
|
||||
|
||||
return {vec, arr.extents()};
|
||||
}
|
||||
|
||||
int main () {
|
||||
netCDF::NcFile data("../../../hdf5/hydrodynamic_U.h5", netCDF::NcFile::read);
|
||||
|
||||
multimap< string, NcVar > vars = data.getVars();
|
||||
|
||||
auto [vec, size] = get3DMat<double>(vars.find("uo")->second);
|
||||
|
||||
auto arr = std::mdspan(vec.data(), size);
|
||||
|
||||
print3DMatrixSlice(arr, 100);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue