feat: made uvgrid take a path as argument

This commit is contained in:
robin 2024-05-09 08:34:45 +02:00
parent 61b307ee49
commit c50a27948f
5 changed files with 41 additions and 36 deletions

View File

@ -8,14 +8,14 @@
using namespace std;
UVGrid::UVGrid() {
auto us = readHydrodynamicU();
auto vs = readHydrodynamicV();
UVGrid::UVGrid(string path) {
auto us = readHydrodynamicU(path);
auto vs = readHydrodynamicV(path);
if (us.size() != vs.size()) {
throw domain_error(sizeError2);
}
tie(times, lats, lons) = readGrid();
tie(times, lats, lons) = readGrid(path);
timeSize = times.size();
latSize = lats.size();

View File

@ -11,7 +11,7 @@ private:
*/
std::vector<Vel> uvData;
public:
UVGrid();
UVGrid(std::string path);
/**
* The matrix has shape (timeSize, latSize, lonSize)

View File

@ -7,44 +7,48 @@
using namespace std;
using namespace netCDF;
template <typename T>
template<typename T>
vector<T> getVarVector(const NcVar &var) {
int length = 1;
for (NcDim dim : var.getDims()) {
length *= dim.getSize();
}
int length = 1;
for (NcDim dim: var.getDims()) {
length *= dim.getSize();
}
vector<T> vec(length);
vector<T> vec(length);
var.getVar(vec.data());
var.getVar(vec.data());
return vec;
return vec;
}
vector<double> readHydrodynamicU() {
// Vs and Us flipped cause the files are named incorrectly
netCDF::NcFile data("../../../../data/hydrodynamic_V.h5", netCDF::NcFile::read);
vector<double> readHydrodynamicU(string path) {
// Vs and Us flipped cause the files are named incorrectly
string fileName = "hydrodynamic_V.h5";
multimap< string, NcVar > vars = data.getVars();
netCDF::NcFile data(path + '/' + fileName, netCDF::NcFile::read);
return getVarVector<double>(vars.find("vo")->second);
multimap<string, NcVar> vars = data.getVars();
return getVarVector<double>(vars.find("vo")->second);
}
vector<double> readHydrodynamicV() {
// Vs and Us flipped cause the files are named incorrectly
netCDF::NcFile data("../../../../data/hydrodynamic_U.h5", netCDF::NcFile::read);
vector<double> readHydrodynamicV(string path) {
// Vs and Us flipped cause the files are named incorrectly
string fileName = "hydrodynamic_U.h5";
netCDF::NcFile data(path + '/' + fileName, netCDF::NcFile::read);
multimap< string, NcVar > vars = data.getVars();
multimap<string, NcVar> vars = data.getVars();
return getVarVector<double>(vars.find("uo")->second);
return getVarVector<double>(vars.find("uo")->second);
}
tuple<vector<int>, vector<double>, vector<double>> readGrid() {
netCDF::NcFile data("../../../../data/grid.h5", netCDF::NcFile::read);
multimap< string, NcVar > vars = data.getVars();
vector<int> time = getVarVector<int>(vars.find("times")->second);
vector<double> longitude = getVarVector<double>(vars.find("longitude")->second);
vector<double> latitude = getVarVector<double>(vars.find("latitude")->second);
tuple<vector<int>, vector<double>, vector<double>> readGrid(string path) {
string fileName = "grid.h5";
netCDF::NcFile data(path + '/' + fileName, netCDF::NcFile::read);
multimap<string, NcVar> vars = data.getVars();
vector<int> time = getVarVector<int>(vars.find("times")->second);
vector<double> longitude = getVarVector<double>(vars.find("longitude")->second);
vector<double> latitude = getVarVector<double>(vars.find("latitude")->second);
return {time, latitude, longitude};
return {time, latitude, longitude};
}

View File

@ -5,18 +5,18 @@
* reads the file hydrodynamic_U.h5
* @return the data vector of us
*/
std::vector<double> readHydrodynamicU();
std::vector<double> readHydrodynamicU(std::string path);
/**
* reads the file hydrodynamic_V.h5
* @return the data vector of vs
*/
std::vector<double> readHydrodynamicV();
std::vector<double> readHydrodynamicV(std::string path);
/**
* Reads the file grid.h5
* @return a tuple of (times, latitude, longitude)
*/
std::tuple<std::vector<int>, std::vector<double>, std::vector<double>> readGrid();
std::tuple<std::vector<int>, std::vector<double>, std::vector<double>> readGrid(std::string path);
#endif //READDATA_H

View File

@ -23,16 +23,17 @@ using namespace std;
int main() {
cout << "Reading data..." << endl;
shared_ptr<UVGrid> uvGrid = make_shared<UVGrid>();
string dataPath = "../../../../data";
shared_ptr<UVGrid> uvGrid = make_shared<UVGrid>(dataPath);
auto kernelRK4 = make_unique<RK4AdvectionKernel>(uvGrid);
auto kernelRK4BoundaryChecked = make_unique<SnapBoundaryConditionKernel>(std::move(kernelRK4), uvGrid);
cout << "Starting vtk..." << endl;
auto l = new LGlyphLayer(uvGrid, std::move(kernelRK4BoundaryChecked));
l->spoofPoints();
// l->spoofPoints();
unique_ptr<Program> program = make_unique<Program>(DT);
program->addLayer(new BackgroundImage("../../../../data/map_661-661.png"));
program->addLayer(new BackgroundImage(dataPath + "/map_661-661.png"));
program->addLayer(new EGlyphLayer(uvGrid));
program->addLayer(l);