From 2545fed27411e7dcde2bb71c5ad1f6cb177e81f4 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafael.r.ravedutti@fau.de>
Date: Tue, 9 Apr 2024 22:44:46 +0200
Subject: [PATCH] More preliminary fixes

Signed-off-by: Rafael Ravedutti <rafael.r.ravedutti@fau.de>
---
 CMakeLists.txt             | 20 ++++++++++++----
 examples/main.cpp          | 14 ++++++++++++
 src/pairs/code_gen/cgen.py | 47 ++++----------------------------------
 3 files changed, 35 insertions(+), 46 deletions(-)
 create mode 100644 examples/main.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ce1ea95..c8d9555 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,6 +21,7 @@ option(USE_WALBERLA "USE_WALBERLA" ON)
 option(USE_MPI "USE_MPI" ON)
 option(COMPILE_CUDA "COMPILE_CUDA" ON)
 option(ENABLE_GPU_DIRECT "ENABLE_GPU_DIRECT" ON)
+option(GENERATE_WHOLE_PROGRAM "GENERATE_WHOLE_PROGRAM" OFF)
 
 if(DEBUG)
     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG ")
@@ -45,6 +46,16 @@ set(RUNTIME_COMMON_FILES
 
 set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE STRING "Python executable not set.")
 
+if(NOT GENERATE_WHOLE_PROGRAM)
+    file(
+        COPY ${CMAKE_CURRENT_SOURCE_DIR}/examples/main.cpp
+        DESTINATION ${CMAKE_BINARY_DIR})
+
+    set(EXEC_FILES ${CMAKE_BINARY_DIR}/main.cpp ${RUNTIME_COMMON_FILES})
+else()
+    set(EXEC_FILES ${RUNTIME_COMMON_FILES})
+endif()
+
 if(NOT PYTHON_EXECUTABLE)
     set(PYTHON_EXECUTABLE python3)
 endif()
@@ -62,10 +73,10 @@ execute_process(
 if(USE_WALBERLA)
     waLBerla_add_executable(
         NAME ${CPU_BIN}
-        FILES ${RUNTIME_COMMON_FILES} ${RUNTIME_CPU_FILES} ${CMAKE_BINARY_DIR}/${CPU_SRC}
+        FILES ${EXEC_FILES} ${RUNTIME_CPU_FILES} ${CMAKE_BINARY_DIR}/${CPU_SRC}
         DEPENDS blockforest core pe)
 else()
-    add_executable(${CPU_BIN} ${CPU_SRC} ${RUNTIME_COMMON_FILES} ${RUNTIME_CPU_FILES})
+    add_executable(${CPU_BIN} ${CPU_SRC} ${EXEC_FILES} ${RUNTIME_CPU_FILES})
 endif()
 
 add_library(runtime_cpu STATIC runtime/devices/dummy.cpp)
@@ -80,6 +91,7 @@ add_custom_command(
 add_custom_target(gen_cpu DEPENDS ${CMAKE_BINARY_DIR}/${CPU_SRC})
 add_dependencies(${CPU_BIN} gen_cpu)
 
+
 if(COMPILE_CUDA)
     find_package(CUDA REQUIRED)
     enable_language(CUDA)
@@ -87,10 +99,10 @@ if(COMPILE_CUDA)
     if(USE_WALBERLA)
         waLBerla_add_executable(
             NAME ${GPU_BIN}
-            FILES ${RUNTIME_COMMON_FILES}
+            FILES ${EXEC_FILES}
             DEPENDS blockforest core pe)
     else()
-        add_executable(${GPU_BIN} ${GPU_SRC} ${RUNTIME_COMMON_FILES} ${RUNTIME_GPU_FILES})
+        add_executable(${GPU_BIN} ${GPU_SRC} ${EXEC_FILES} ${RUNTIME_GPU_FILES})
     endif()
 
     if(ENABLE_GPU_DIRECT)
diff --git a/examples/main.cpp b/examples/main.cpp
new file mode 100644
index 0000000..991cbec
--- /dev/null
+++ b/examples/main.cpp
@@ -0,0 +1,14 @@
+#include <iostream>
+//---
+#include "md.hpp"
+
+int main(int argc, char **argv) {
+    PairsSimulation *ps = new PairsSimulation();
+    std::cout << "initialize" << std::endl;
+    ps->initialize(argc, argv);
+    std::cout << "do_timestep" << std::endl;
+    ps->do_timestep();
+    std::cout << "end" << std::endl;
+    ps->end();
+    return 0;
+}
diff --git a/src/pairs/code_gen/cgen.py b/src/pairs/code_gen/cgen.py
index 7872eb2..e220678 100644
--- a/src/pairs/code_gen/cgen.py
+++ b/src/pairs/code_gen/cgen.py
@@ -237,7 +237,6 @@ class CGen:
         self.print = Printer(self.ref + ext)
         self.print.start()
         self.generate_preamble()
-
         self.generate_pairs_object_structure()
 
         for kernel in self.sim.kernels():
@@ -269,6 +268,7 @@ class CGen:
         self.print = Printer(self.ref + ".hpp")
         self.print.start()
 
+        self.generate_preamble()
         self.generate_pairs_object_structure()
         self.generate_module_headers()
 
@@ -755,46 +755,7 @@ class CGen:
             self.print("}")
 
         if isinstance(ast_node, ModuleCall):
-            module = ast_node.module
-            #device_cond = module.run_on_device and self.target.is_gpu()
-
-            #for var in module.read_only_variables():
-            #    decl = var.name()
-            #    module_params += f", {decl}"
-
-            #for var in module.write_variables():
-            #    decl = f"rv_{var.name()}.getDevicePointer()" if device_cond and var.device_flag else f"&{var.name()}"
-            #    module_params += f", {decl}"
-
-            #for array in module.arrays():
-            #    decl = f"d_{array.name()}" if device_cond else array.name()
-            #    module_params += decl if len(module_params) <= 0 else f", {decl}"
-            #    if array in module.host_references():
-            #        decl = array.name()
-            #        module_params += f", {decl}"
-
-            #for prop in module.properties():
-            #    decl = f"d_{prop.name()}" if device_cond else prop.name()
-            #    module_params += f", {decl}"
-            #    if prop in module.host_references():
-            #        decl = prop.name()
-            #        module_params += f", {decl}"
-
-            #for contact_prop in module.contact_properties():
-            #    decl = f"d_{contact_prop.name()}" if device_cond else contact_prop.name()
-            #    module_params += f", {decl}"
-            #    if contact_prop in module.host_references():
-            #        decl = contact_prop.name()
-            #        module_params += f", {decl}"
-
-            #for feature_prop in module.feature_properties():
-            #    decl = f"d_{feature_prop.name()}" if device_cond else feature_prop.name()
-            #    module_params += f", {decl}"
-            #    if feature_prop in module.host_references():
-            #        decl = feature_prop.name()
-            #        module_params += f", {decl}"
-
-            self.print(f"{module.name}(pobj);")
+            self.print(f"{ast_node.module.name}(pobj);")
 
         if isinstance(ast_node, Print):
             self.print(f"PAIRS_DEBUG(\"{ast_node.string}\\n\");")
@@ -961,7 +922,9 @@ class CGen:
 
         if isinstance(ast_node, Deref):
             var = self.generate_expression(ast_node.var)
-            return f"(*{var})"
+            # Dereferences are ignored for write variables when full objects
+            # are generated since they can be directly written into
+            return var if self.generate_full_object_names else f"(*{var})"
 
         if isinstance(ast_node, DeviceStaticRef):
             elem = self.generate_expression(ast_node.elem)
-- 
GitLab