diff --git a/particle-track-and-trace/src/CMakeLists.txt b/particle-track-and-trace/src/CMakeLists.txt index d08133f..9364e77 100644 --- a/particle-track-and-trace/src/CMakeLists.txt +++ b/particle-track-and-trace/src/CMakeLists.txt @@ -54,19 +54,21 @@ add_executable(ParticleTrackTrace MACOSX_BUNDLE main.cpp commands/CameraMoveCallback.cpp commands/CameraMoveCallback.h CartographicTransformation.cpp - advection/AdvectionKernel.h - advection/EulerAdvectionKernel.cpp - advection/EulerAdvectionKernel.h + advection/kernel/AdvectionKernel.h + advection/kernel/EulerAdvectionKernel.cpp + advection/kernel/EulerAdvectionKernel.h advection/interpolate.cpp advection/interpolate.h advection/readdata.cpp advection/readdata.h - advection/RK4AdvectionKernel.cpp - advection/RK4AdvectionKernel.h + advection/kernel/RK4AdvectionKernel.cpp + advection/kernel/RK4AdvectionKernel.h advection/UVGrid.cpp advection/UVGrid.h advection/Vel.cpp advection/Vel.h + advection/kernel/SnapBoundaryConditionKernel.h + advection/kernel/SnapBoundaryConditionKernel.cpp ) execute_process( diff --git a/particle-track-and-trace/src/advection/AdvectionKernel.h b/particle-track-and-trace/src/advection/kernel/AdvectionKernel.h similarity index 98% rename from particle-track-and-trace/src/advection/AdvectionKernel.h rename to particle-track-and-trace/src/advection/kernel/AdvectionKernel.h index 5479858..394a2ff 100644 --- a/particle-track-and-trace/src/advection/AdvectionKernel.h +++ b/particle-track-and-trace/src/advection/kernel/AdvectionKernel.h @@ -3,7 +3,7 @@ #include -#include "Vel.h" +#include "../Vel.h" /* * Implement this class for every integration method. diff --git a/particle-track-and-trace/src/advection/EulerAdvectionKernel.cpp b/particle-track-and-trace/src/advection/kernel/EulerAdvectionKernel.cpp similarity index 93% rename from particle-track-and-trace/src/advection/EulerAdvectionKernel.cpp rename to particle-track-and-trace/src/advection/kernel/EulerAdvectionKernel.cpp index f9a4b52..1e5eb0d 100644 --- a/particle-track-and-trace/src/advection/EulerAdvectionKernel.cpp +++ b/particle-track-and-trace/src/advection/kernel/EulerAdvectionKernel.cpp @@ -1,6 +1,6 @@ #include "EulerAdvectionKernel.h" -#include "interpolate.h" +#include "../interpolate.h" using namespace std; diff --git a/particle-track-and-trace/src/advection/EulerAdvectionKernel.h b/particle-track-and-trace/src/advection/kernel/EulerAdvectionKernel.h similarity index 96% rename from particle-track-and-trace/src/advection/EulerAdvectionKernel.h rename to particle-track-and-trace/src/advection/kernel/EulerAdvectionKernel.h index a098a06..e37e587 100644 --- a/particle-track-and-trace/src/advection/EulerAdvectionKernel.h +++ b/particle-track-and-trace/src/advection/kernel/EulerAdvectionKernel.h @@ -2,7 +2,7 @@ #define EULERADVECTIONKERNEL_H #include "AdvectionKernel.h" -#include "UVGrid.h" +#include "../UVGrid.h" #include /** diff --git a/particle-track-and-trace/src/advection/RK4AdvectionKernel.cpp b/particle-track-and-trace/src/advection/kernel/RK4AdvectionKernel.cpp similarity index 98% rename from particle-track-and-trace/src/advection/RK4AdvectionKernel.cpp rename to particle-track-and-trace/src/advection/kernel/RK4AdvectionKernel.cpp index 85104b5..b0eedc6 100644 --- a/particle-track-and-trace/src/advection/RK4AdvectionKernel.cpp +++ b/particle-track-and-trace/src/advection/kernel/RK4AdvectionKernel.cpp @@ -1,5 +1,5 @@ #include "RK4AdvectionKernel.h" -#include "interpolate.h" +#include "../interpolate.h" using namespace std; diff --git a/particle-track-and-trace/src/advection/RK4AdvectionKernel.h b/particle-track-and-trace/src/advection/kernel/RK4AdvectionKernel.h similarity index 96% rename from particle-track-and-trace/src/advection/RK4AdvectionKernel.h rename to particle-track-and-trace/src/advection/kernel/RK4AdvectionKernel.h index 94668ce..f40406e 100644 --- a/particle-track-and-trace/src/advection/RK4AdvectionKernel.h +++ b/particle-track-and-trace/src/advection/kernel/RK4AdvectionKernel.h @@ -2,7 +2,7 @@ #define RK4ADVECTIONKERNEL_H #include "AdvectionKernel.h" -#include "UVGrid.h" +#include "../UVGrid.h" #include /** diff --git a/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.cpp b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.cpp new file mode 100644 index 0000000..f8382ce --- /dev/null +++ b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.cpp @@ -0,0 +1,26 @@ +#include "SnapBoundaryConditionKernel.h" + +SnapBoundaryConditionKernel::SnapBoundaryConditionKernel(std::unique_ptr kernel, + std::shared_ptr uvGrid) : + kernel(std::move(kernel)), + uvGrid(uvGrid) { } +std::pair SnapBoundaryConditionKernel::advect(int time, double latitude, double longitude, int dt) const { + auto [newLat, newLon] = kernel->advect(time, latitude, longitude, dt); + double minLat = uvGrid->lats.front(); + double maxLat = uvGrid->lats.back(); + double minLon = uvGrid->lons.front(); + double maxLon = uvGrid->lons.back(); + if (newLat < minLat) { + newLat = minLat; + } + if (newLat > maxLat) { + newLat = maxLat; + } + if (newLon < minLon) { + newLon = minLon; + } + if (newLon > maxLon) { + newLon = maxLon; + } + return {newLat, newLon}; +} \ No newline at end of file diff --git a/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h new file mode 100644 index 0000000..f43c79d --- /dev/null +++ b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h @@ -0,0 +1,27 @@ +#ifndef SNAPBOUNDARYCONDITIONKERNEL_H +#define SNAPBOUNDARYCONDITIONKERNEL_H + +#include +#include "AdvectionKernel.h" +#include "../UVGrid.h" + +/** + * When a point goes outside of the grid, this Kernel will snap it to the closest edge. + * This kernel wraps around another kernel, and implements only the boundary conditions. + */ +class SnapBoundaryConditionKernel: public AdvectionKernel { + std::unique_ptr kernel; + std::shared_ptr uvGrid; +public: + /** + * Construct the kernel. + * @param kernel The kernel to be called first before boundary conditions are applied + * @param uvGrid The grid that is used to check boundary conditions against + */ + SnapBoundaryConditionKernel(std::unique_ptr kernel, std::shared_ptr uvGrid); + + std::pair advect(int time, double latitude, double longitude, int dt) const override; +}; + + +#endif //SNAPBOUNDARYCONDITIONKERNEL_H diff --git a/particle-track-and-trace/src/layers/LGlyphLayer.h b/particle-track-and-trace/src/layers/LGlyphLayer.h index 422cfcb..125282f 100644 --- a/particle-track-and-trace/src/layers/LGlyphLayer.h +++ b/particle-track-and-trace/src/layers/LGlyphLayer.h @@ -2,7 +2,7 @@ #define LGLYPHLAYER_H #include "Layer.h" -#include "../advection/AdvectionKernel.h" +#include "../advection/kernel/AdvectionKernel.h" #include "../commands/SpawnPointCallback.h" #include #include diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index 49e44bb..f6a794e 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -14,21 +14,23 @@ #include "layers/LGlyphLayer.h" #include "Program.h" #include "advection/UVGrid.h" -#include "advection/RK4AdvectionKernel.h" +#include "advection/kernel/RK4AdvectionKernel.h" +#include "advection/kernel/SnapBoundaryConditionKernel.h" using namespace std; #define DT 60 * 60 // 60 sec/min * 60 mins int main() { - cout << "reading data..." << endl; - shared_ptr uvGrid = std::make_shared(); + cout << "Reading data..." << endl; + shared_ptr uvGrid = make_shared(); auto kernelRK4 = make_unique(uvGrid); + auto kernelRK4BoundaryChecked = make_unique(std::move(kernelRK4), uvGrid); cout << "Starting vtk..." << endl; - auto l = new LGlyphLayer(uvGrid, std::move(kernelRK4)); + auto l = new LGlyphLayer(uvGrid, std::move(kernelRK4BoundaryChecked)); - Program *program = new Program(DT); + unique_ptr program = make_unique(DT); program->addLayer(new BackgroundImage("../../../../data/map_661-661.png")); program->addLayer(new EGlyphLayer(uvGrid)); program->addLayer(l);