From bd76c30c53f2541caa67abd0ee58ad9ddc7ffc86 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Thu, 8 Feb 2024 16:33:47 +0100
Subject: [PATCH] Fix some issues in runtime code

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 runtime/domain/block_forest.hpp       |  5 ++--
 runtime/domain/regular_6d_stencil.hpp |  1 +
 runtime/interfaces/dem.hpp            | 41 +++++++++++++++++++++++++++
 runtime/pairs.cpp                     |  2 +-
 runtime/pairs.hpp                     |  2 +-
 5 files changed, 46 insertions(+), 5 deletions(-)
 create mode 100644 runtime/interfaces/dem.hpp

diff --git a/runtime/domain/block_forest.hpp b/runtime/domain/block_forest.hpp
index 04446d2..7a447c1 100644
--- a/runtime/domain/block_forest.hpp
+++ b/runtime/domain/block_forest.hpp
@@ -19,7 +19,7 @@ private:
     std::vector<int> naabbs;
     std::vector<double> aabbs;
     real_t *subdom;
-    int world_size, rank, nranks, naabbs;
+    int world_size, rank, nranks, total_aabbs;
     bool balance_workload;
 
 public:
@@ -34,13 +34,12 @@ public:
         delete[] subdom;
     }
 
-    void setBoundingBox();
     void initialize(int *argc, char ***argv);
     void finalize();
     int getWorldSize() const { return world_size; }
     int getRank() const { return rank; }
     int getNumberOfNeighborRanks() { return this->nranks; }
-    int getNumberOfNeighborAABBs() { return this->naabbs; }
+    int getNumberOfNeighborAABBs() { return this->total_aabbs; }
 
     void initializeWorkloadBalancer();
     void updateNeighborhood();
diff --git a/runtime/domain/regular_6d_stencil.hpp b/runtime/domain/regular_6d_stencil.hpp
index 4aa95cd..84c01a7 100644
--- a/runtime/domain/regular_6d_stencil.hpp
+++ b/runtime/domain/regular_6d_stencil.hpp
@@ -59,6 +59,7 @@ public:
     int getNumberOfNeighborAABBs() { return 6; }
 
     int isWithinSubdomain(real_t x, real_t y, real_t z);
+    void copyRuntimeArray(const std::string& name, void *dest, const int size);
     void fillArrays(int *neighbor_ranks, int *pbc, real_t *subdom);
     void communicateSizes(int dim, const int *send_sizes, int *recv_sizes);
     void communicateData(
diff --git a/runtime/interfaces/dem.hpp b/runtime/interfaces/dem.hpp
new file mode 100644
index 0000000..b593c27
--- /dev/null
+++ b/runtime/interfaces/dem.hpp
@@ -0,0 +1,41 @@
+#include "../pairs.hpp"
+
+namespace pairs_host_interface {
+
+int get_uid(int *uid, int i) { return uid[i]; }
+int get_shape(int *shape, int i) { return shape[i]; }
+int get_flags(int *flags, int i) { return flags[i]; }
+double get_position(double *position, int i, int j, int capacity) { return position[i * 3 + j]; }
+double get_mass(double *mass, int i) { return mass[i]; }
+double get_linear_velocity(double *linear_velocity, int i, int j, int capacity) { return linear_velocity[i * 3 + j]; }
+double get_angular_velocity(double *angular_velocity, int i, int j, int capacity) { return angular_velocity[i * 3 + j]; }
+double get_force(double *force, int i, int j, int capacity) { return force[i * 3 + j]; }
+double get_torque(double *torque, int i, int j, int capacity) { return torque[i * 3 + j]; }
+double get_radius(double *radius, int i) { return radius[i]; }
+double get_normal(double *normal, int i, int j, int capacity) { return normal[i * 3 + j]; }
+double get_inv_inertia(double *inv_inertia, int i, int j, int capacity) { return inv_inertia[i * 9 + j]; }
+double get_rotation_matrix(double *rotation_matrix, int i, int j, int capacity) { return rotation_matrix[i * 9 + j]; }
+double get_rotation_quat(double *rotation_quat, int i, int j, int capacity) { return rotation_quat[i * 4 + j]; }
+int get_type(int *type, int i) { return type[i]; }
+
+}
+
+namespace pairs_cuda_interface {
+
+__inline__ __device__ int get_uid(int *uid, int i) { return uid[i]; }
+__inline__ __device__ int get_shape(int *shape, int i) { return shape[i]; }
+__inline__ __device__ int get_flags(int *flags, int i) { return flags[i]; }
+__inline__ __device__ double get_position(double *position, int i, int j, int capacity) { return position[i * 3 + j]; }
+__inline__ __device__ double get_mass(double *mass, int i) { return mass[i]; }
+__inline__ __device__ double get_linear_velocity(double *linear_velocity, int i, int j, int capacity) { return linear_velocity[i * 3 + j]; }
+__inline__ __device__ double get_angular_velocity(double *angular_velocity, int i, int j, int capacity) { return angular_velocity[i * 3 + j]; }
+__inline__ __device__ double get_force(double *force, int i, int j, int capacity) { return force[i * 3 + j]; }
+__inline__ __device__ double get_torque(double *torque, int i, int j, int capacity) { return torque[i * 3 + j]; }
+__inline__ __device__ double get_radius(double *radius, int i) { return radius[i]; }
+__inline__ __device__ double get_normal(double *normal, int i, int j, int capacity) { return normal[i * 3 + j]; }
+__inline__ __device__ double get_inv_inertia(double *inv_inertia, int i, int j, int capacity) { return inv_inertia[i * 9 + j]; }
+__inline__ __device__ double get_rotation_matrix(double *rotation_matrix, int i, int j, int capacity) { return rotation_matrix[i * 9 + j]; }
+__inline__ __device__ double get_rotation_quat(double *rotation_quat, int i, int j, int capacity) { return rotation_quat[i * 4 + j]; }
+__inline__ __device__ int get_type(int *type, int i) { return type[i]; }
+
+}
diff --git a/runtime/pairs.cpp b/runtime/pairs.cpp
index 09030f3..f4179cb 100644
--- a/runtime/pairs.cpp
+++ b/runtime/pairs.cpp
@@ -515,7 +515,7 @@ void PairsSimulation::communicateContactHistoryData(
     #endif
 }
 
-void PairsSimulation::copyRuntimeArray(const std::string& name, const void *dest, const int size) {
+void PairsSimulation::copyRuntimeArray(const std::string& name, void *dest, const int size) {
     this->getDomainPartitioner()->copyRuntimeArray(name, dest, size);
 }
 
diff --git a/runtime/pairs.hpp b/runtime/pairs.hpp
index ca56b6e..93f4583 100644
--- a/runtime/pairs.hpp
+++ b/runtime/pairs.hpp
@@ -296,7 +296,7 @@ public:
         const real_t *send_buf, const int *contact_soffsets, const int *nsend_contact,
         real_t *recv_buf, int *contact_roffsets, int *nrecv_contact);
 
-    void copyRuntimeArray(const std::string& name, const void *dest, const int size);
+    void copyRuntimeArray(const std::string& name, void *dest, const int size);
     int getNumberOfNeighborRanks() { return this->getDomainPartitioner()->getNumberOfNeighborRanks(); }
     int getNumberOfNeighborAABBs() { return this->getDomainPartitioner()->getNumberOfNeighborAABBs(); }
 
-- 
GitLab