From 7a0ef346e598bd5f76ced611cb8e5fdd06ef7059 Mon Sep 17 00:00:00 2001
From: Henry Korb <henry.korb@geo.uu.se>
Date: Thu, 24 Jun 2021 17:50:48 +0200
Subject: [PATCH] created geometry helper

---
 .../Utilities/geometry_helper.h               | 205 ++++++++++++++++++
 1 file changed, 205 insertions(+)
 create mode 100644 src/gpu/VirtualFluids_GPU/Utilities/geometry_helper.h

diff --git a/src/gpu/VirtualFluids_GPU/Utilities/geometry_helper.h b/src/gpu/VirtualFluids_GPU/Utilities/geometry_helper.h
new file mode 100644
index 000000000..73580d33a
--- /dev/null
+++ b/src/gpu/VirtualFluids_GPU/Utilities/geometry_helper.h
@@ -0,0 +1,205 @@
+#ifndef geometry_helper_H
+#define geometry_helper_H
+
+#include <cuda.h>
+#include <cuda_runtime.h>
+#include <helper_cuda.h>
+
+
+__host__ __device__ __inline__ void rotate2D(real &angle, real &posX, real &posY, real &newPosX, real &newPosY, real &originX, real &originY)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+
+    newPosX = distX*cos(angle) - distY*sin(angle);
+    newPosY = distX*sin(angle) + distY*cos(angle);  
+
+    newPosX += originX;
+    newPosY += originY;
+}
+
+__host__ __device__ __inline__ void invRotate2D(real &angle, real &posX, real &posY, real &newPosX, real &newPosY, real &originX, real &originY)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+
+    newPosX =  distX*cos(angle) + distY*sin(angle);
+    newPosY = -distX*sin(angle) + distX*cos(angle);  
+
+    newPosX += originX;
+    newPosY += originY;
+}
+
+__host__ __device__ __inline__ void rotateAboutX3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ, real &originX, real &originY, real &originZ)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+    real distZ = posZ - originZ;
+
+    newPosX = posX;
+    newPosY = distY*cos(angle) - distZ*sin(angle);
+    newPosZ = distY*sin(angle) + distZ*cos(angle);
+
+    newPosX += originX;
+    newPosY += originY;
+    newPosZ += originZ;
+}
+
+__host__ __device__ __inline__ void invRotateAboutX3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ, real &originX, real &originY, real &originZ)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+    real distZ = posZ - originZ;
+
+    newPosX = distX;
+    newPosY =  distY*cos(angle) + distZ*sin(angle);
+    newPosZ = -distY*sin(angle) + distZ*cos(angle);
+
+    newPosX += originX;
+    newPosY += originY;
+    newPosZ += originZ;
+}
+
+__host__ __device__ __inline__ void rotateAboutY3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ, real &originX, real &originY, real &originZ)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+    real distZ = posZ - originZ;
+
+    newPosX =  distX*cos(angle) + distZ*sin(angle);
+    newPosY =  distY;
+    newPosZ = -distX*sin(angle) + distZ*cos(angle);
+
+    newPosX += originX;
+    newPosY += originY;
+    newPosZ += originZ;
+}
+
+__host__ __device__ __inline__ void invRotateAboutY3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ, real &originX, real &originY, real &originZ)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+    real distZ = posZ - originZ;
+
+    newPosX = distX*cos(angle) - distZ*sin(angle);
+    newPosY = distY;
+    newPosZ = distX*sin(angle) + distZ*cos(angle);
+
+    newPosX += originX;
+    newPosY += originY;
+    newPosZ += originZ;
+}
+
+__host__ __device__ __inline__ void rotateAboutZ3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ, real &originX, real &originY, real &originZ)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+    real distZ = posZ - originZ;
+
+    newPosX = distX*cos(angle) - distY*sin(angle);
+    newPosY = distX*sin(angle) + distY*cos(angle);
+    newPosZ = distZ;
+
+    newPosX += originX;
+    newPosY += originY;
+    newPosZ += originZ;
+}
+
+__host__ __device__ __inline__ void invRotateAboutZ3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ, real &originX, real &originY, real &originZ)
+{
+    real distX = posX - originX;
+    real distY = posY - originY;
+    real distZ = posZ - originZ;
+
+    newPosX =  distX*cos(angle) + distY*sin(angle);
+    newPosY = -distX*sin(angle) + distY*cos(angle);
+    newPosZ = distZ;
+
+    newPosX += originX;
+    newPosY += originY;
+    newPosZ += originZ;
+}
+
+__host__ __device__ __inline__ void rotate2D(real &angle, real &posX, real &posY, real &newPosX, real &newPosY)
+{
+    newPosX = posX*cos(angle) - posY*sin(angle);
+    newPosY = posX*sin(angle) + posY*cos(angle);  
+}
+
+__host__ __device__ __inline__ void invRotate2D(real &angle, real &posX, real &posY, real &newPosX, real &newPosY)
+{
+    newPosX =  posX*cos(angle) + posY*sin(angle);
+    newPosY = -posX*sin(angle) + posY*cos(angle);  
+}
+
+__host__ __device__ __inline__ void rotateAboutX3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ)
+{
+    newPosX = posX;
+    newPosY = posY*cos(angle) - posZ*sin(angle);
+    newPosZ = posY*sin(angle) + posZ*cos(angle);
+}
+
+__host__ __device__ __inline__ void invRotateAboutX3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ)
+{
+    newPosX = posX;
+    newPosY =  posY*cos(angle) + posZ*sin(angle);
+    newPosZ = -posY*sin(angle) + posZ*cos(angle);
+}
+
+__host__ __device__ __inline__ void rotateAboutY3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ)
+{
+    newPosX =  posX*cos(angle) + posZ*sin(angle);
+    newPosY =  posY;
+    newPosZ = -posX*sin(angle) + posZ*cos(angle);
+}
+
+__host__ __device__ __inline__ void invRotateAboutY3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ)
+{
+    newPosX = posX*cos(angle) - posZ*sin(angle);
+    newPosY = posY;
+    newPosZ = posX*sin(angle) + posZ*cos(angle);
+}
+
+__host__ __device__ __inline__ void rotateAboutZ3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ)
+{
+    newPosX = posX*cos(angle) - posY*sin(angle);
+    newPosY = posX*sin(angle) + posY*cos(angle);
+    newPosZ = posZ;
+}
+
+__host__ __device__ __inline__ void invRotateAboutZ3D(real &angle, real &posX, real &posY, real &posZ, real &newPosX, real &newPosY, real &newPosZ)
+{
+    newPosX =  posX*cos(angle) + posY*sin(angle);
+    newPosY = -posX*sin(angle) + posY*cos(angle);
+    newPosZ = posZ;
+}
+
+__host__ __device__ uint find_nearest_cellBSW(uint index, 
+                                              real* coordsX, real* coordsY, real* coordsZ, 
+                                              real posX, real posY, real posZ, 
+                                              uint* neighborsX, uint* neighborsY, uint* neighborsZ, uint* neighborsWSB){   
+    uint new_index = index;
+
+    while(coordsX[new_index] > posX && coordsY[new_index] > posY && coordsZ[new_index] > posZ ){ new_index = max(1, neighborsWSB[new_index]);}
+
+    while(coordsX[new_index] > posX && coordsY[new_index] > posY ){ new_index = max(1, neighborsZ[neighborsWSB[new_index]]);}
+    while(coordsX[new_index] > posX && coordsZ[new_index] > posZ ){ new_index = max(1, neighborsY[neighborsWSB[new_index]]);}
+    while(coordsY[new_index] > posY && coordsZ[new_index] > posZ ){ new_index = max(1, neighborsX[neighborsWSB[new_index]]);}
+
+    while(coordsX[new_index] > posX){ new_index = max(1, neighborsY[neighborsZ[neighborsWSB[new_index]]]);}
+    while(coordsY[new_index] > posY){ new_index = max(1, neighborsX[neighborsZ[neighborsWSB[new_index]]]);}
+    while(coordsZ[new_index] > posZ){ new_index = max(1, neighborsX[neighborsY[neighborsWSB[new_index]]]);}
+
+    while(coordsX[new_index] < posX){ new_index = max(1, neighborsX[new_index]);}
+    while(coordsY[new_index] < posY){ new_index = max(1, neighborsY[new_index]);}
+    while(coordsZ[new_index] < posZ){ new_index = max(1, neighborsZ[new_index]);}
+
+    return neighborsWSB[new_index];
+}
+
+
+
+
+
+
+#endif
\ No newline at end of file
-- 
GitLab