From 1b4c92cadfd839daba34b32b3e5d588255bc6db0 Mon Sep 17 00:00:00 2001 From: robin Date: Mon, 6 May 2024 17:46:44 +0200 Subject: [PATCH 1/2] feat: boundary conditions --- particle-track-and-trace/src/CMakeLists.txt | 12 +++++---- .../advection/{ => kernel}/AdvectionKernel.h | 2 +- .../{ => kernel}/EulerAdvectionKernel.cpp | 2 +- .../{ => kernel}/EulerAdvectionKernel.h | 2 +- .../{ => kernel}/RK4AdvectionKernel.cpp | 2 +- .../{ => kernel}/RK4AdvectionKernel.h | 2 +- .../kernel/SnapBoundaryConditionKernel.cpp | 26 +++++++++++++++++++ .../kernel/SnapBoundaryConditionKernel.h | 22 ++++++++++++++++ .../src/layers/LGlyphLayer.h | 2 +- particle-track-and-trace/src/main.cpp | 10 ++++--- 10 files changed, 67 insertions(+), 15 deletions(-) rename particle-track-and-trace/src/advection/{ => kernel}/AdvectionKernel.h (98%) rename particle-track-and-trace/src/advection/{ => kernel}/EulerAdvectionKernel.cpp (93%) rename particle-track-and-trace/src/advection/{ => kernel}/EulerAdvectionKernel.h (96%) rename particle-track-and-trace/src/advection/{ => kernel}/RK4AdvectionKernel.cpp (98%) rename particle-track-and-trace/src/advection/{ => kernel}/RK4AdvectionKernel.h (96%) create mode 100644 particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.cpp create mode 100644 particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h 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..dbbeb2f --- /dev/null +++ b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h @@ -0,0 +1,22 @@ +#ifndef SNAPBOUNDARYCONDITIONKERNEL_H +#define SNAPBOUNDARYCONDITIONKERNEL_H + +#include +#include "AdvectionKernel.h" +#include "../UVGrid.h" + +/** + * When + */ +class SnapBoundaryConditionKernel: public AdvectionKernel { + std::unique_ptr kernel; + std::shared_ptr uvGrid; +public: + SnapBoundaryConditionKernel(std::unique_ptr kernel, std::shared_ptr uvGrid); + +private: + 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..6c4f928 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -14,7 +14,8 @@ #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; @@ -22,13 +23,14 @@ using namespace std; int main() { cout << "reading data..." << endl; - shared_ptr uvGrid = std::make_shared(); + 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); From 5a2e9a8a7aed3b364687b30e50f1dacd573394e6 Mon Sep 17 00:00:00 2001 From: robin Date: Mon, 6 May 2024 17:52:26 +0200 Subject: [PATCH 2/2] comments --- .../src/advection/kernel/SnapBoundaryConditionKernel.h | 9 +++++++-- particle-track-and-trace/src/main.cpp | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h index dbbeb2f..f43c79d 100644 --- a/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h +++ b/particle-track-and-trace/src/advection/kernel/SnapBoundaryConditionKernel.h @@ -6,15 +6,20 @@ #include "../UVGrid.h" /** - * When + * 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); -private: std::pair advect(int time, double latitude, double longitude, int dt) const override; }; diff --git a/particle-track-and-trace/src/main.cpp b/particle-track-and-trace/src/main.cpp index 6c4f928..f6a794e 100644 --- a/particle-track-and-trace/src/main.cpp +++ b/particle-track-and-trace/src/main.cpp @@ -22,7 +22,7 @@ using namespace std; #define DT 60 * 60 // 60 sec/min * 60 mins int main() { - cout << "reading data..." << endl; + cout << "Reading data..." << endl; shared_ptr uvGrid = make_shared(); auto kernelRK4 = make_unique(uvGrid); auto kernelRK4BoundaryChecked = make_unique(std::move(kernelRK4), uvGrid);