Merge branch 'main' into djairo-wrapping
This commit is contained in:
commit
95d1724af4
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -6,84 +6,89 @@
|
|||
|
||||
class UVGrid {
|
||||
private:
|
||||
/**
|
||||
* 1D data vector of all the us and vs
|
||||
*/
|
||||
std::vector<Vel> uvData;
|
||||
/**
|
||||
* 1D data vector of all the us and vs
|
||||
*/
|
||||
std::vector<Vel> uvData;
|
||||
public:
|
||||
UVGrid();
|
||||
/**
|
||||
* Constructs the UVGrid.
|
||||
* @param path The data path where the constructor expects to find
|
||||
* the files hydrodynamic_U.h5, hydrodynamic_V.h5, and grid.h5
|
||||
*/
|
||||
UVGrid(std::string path);
|
||||
|
||||
/**
|
||||
* The matrix has shape (timeSize, latSize, lonSize)
|
||||
*/
|
||||
size_t timeSize;
|
||||
size_t latSize;
|
||||
size_t lonSize;
|
||||
/**
|
||||
* The matrix has shape (timeSize, latSize, lonSize)
|
||||
*/
|
||||
size_t timeSize;
|
||||
size_t latSize;
|
||||
size_t lonSize;
|
||||
|
||||
/**
|
||||
* Assuming grid is a regular grid, gives the longitudinal spacing of grid.
|
||||
* @return longitudinal spacing
|
||||
*/
|
||||
double lonStep() const;
|
||||
/**
|
||||
* Assuming grid is a regular grid, gives the longitudinal spacing of grid.
|
||||
* @return longitudinal spacing
|
||||
*/
|
||||
double lonStep() const;
|
||||
|
||||
/**
|
||||
* Assuming grid is a regular grid, gives the latitudinal spacing of grid.
|
||||
* @return latitudinal spacing
|
||||
*/
|
||||
double latStep() const;
|
||||
/**
|
||||
* Assuming grid is a regular grid, gives the latitudinal spacing of grid.
|
||||
* @return latitudinal spacing
|
||||
*/
|
||||
double latStep() const;
|
||||
|
||||
/**
|
||||
* Assuming grid is a regular grid, gives the time spacing of grid.
|
||||
* @return time spacing
|
||||
*/
|
||||
int timeStep() const;
|
||||
/**
|
||||
* Assuming grid is a regular grid, gives the time spacing of grid.
|
||||
* @return time spacing
|
||||
*/
|
||||
int timeStep() const;
|
||||
|
||||
/**
|
||||
* Returns the lowest longitudinal value of grid.
|
||||
* @return minimum longitude
|
||||
*/
|
||||
double lonMin() const;
|
||||
double lonMin() const;
|
||||
|
||||
/**
|
||||
* Returns the highest longitudinal value of grid.
|
||||
* @return maximum longitude
|
||||
*/
|
||||
double lonMax() const;
|
||||
double lonMax() const;
|
||||
|
||||
/**
|
||||
* Returns the lowest latitudinal value of grid.
|
||||
* @return minimum latitude
|
||||
*/
|
||||
double latMin() const;
|
||||
double latMin() const;
|
||||
|
||||
/**
|
||||
* Returns the higehst latitudinal value of grid.
|
||||
* @return maximum latitude
|
||||
*/
|
||||
double latMax() const;
|
||||
double latMax() const;
|
||||
|
||||
/**
|
||||
* times, lats, lons are vector of length timeSize, latSize, lonSize respectively.
|
||||
* The maintain the following invariant:
|
||||
* grid[timeIndex,latIndex,lonIndex] gives the u,v at the point with latitude at lats[latIndex],
|
||||
* with longitude at lons[lonIndex], and with time at times[timeIndex].
|
||||
*/
|
||||
std::vector<int> times;
|
||||
std::vector<double> lats;
|
||||
std::vector<double> lons;
|
||||
/**
|
||||
* times, lats, lons are vector of length timeSize, latSize, lonSize respectively.
|
||||
* The maintain the following invariant:
|
||||
* grid[timeIndex,latIndex,lonIndex] gives the u,v at the point with latitude at lats[latIndex],
|
||||
* with longitude at lons[lonIndex], and with time at times[timeIndex].
|
||||
*/
|
||||
std::vector<int> times;
|
||||
std::vector<double> lats;
|
||||
std::vector<double> lons;
|
||||
|
||||
/**
|
||||
* The 3D index into the data. The array is sized by [8761][67][116]
|
||||
* @return Velocity at that index
|
||||
*/
|
||||
const Vel& operator[](size_t timeIndex, size_t latIndex, size_t lonIndex) const;
|
||||
/**
|
||||
* The 3D index into the data. The array is sized by [8761][67][116]
|
||||
* @return Velocity at that index
|
||||
*/
|
||||
const Vel &operator[](size_t timeIndex, size_t latIndex, size_t lonIndex) const;
|
||||
|
||||
/**
|
||||
* Streams a slice at timeIndex t of the matrix to the outstream given by os
|
||||
* @param os outstream
|
||||
* @param t index with which to slice matrix
|
||||
*/
|
||||
void streamSlice(std::ostream &os, size_t t);
|
||||
/**
|
||||
* Streams a slice at timeIndex t of the matrix to the outstream given by os
|
||||
* @param os outstream
|
||||
* @param t index with which to slice matrix
|
||||
*/
|
||||
void streamSlice(std::ostream &os, size_t t);
|
||||
};
|
||||
|
||||
#endif //UVGRID_H
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -23,17 +23,18 @@ 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();
|
||||
l->setDt(DT);
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue