From 5255e1a7c6fe5958ae4b3360f248f6933f149bce Mon Sep 17 00:00:00 2001
From: Nils-Arne Dreier <dreier@dkrz.de>
Date: Fri, 6 Sep 2024 10:43:34 +0200
Subject: [PATCH] refactor(cmake): project structure

---
 CMakeLists.txt                                | 25 +++----------------
 pipelines/CMakeLists.txt                      |  2 ++
 pipelines/gridwriter/CMakeLists.txt           | 20 +++++++++++++++
 .../gridwriter/gridwriter.py                  | 11 +++++---
 pipelines/live/CMakeLists.txt                 | 20 +++++++++++++++
 pvExample.py => pipelines/live/live.py        |  4 +--
 src/CMakeLists.txt                            |  2 ++
 .../catalyst_adapter.cpp                      | 15 ++++++-----
 test/CMakeLists.txt                           | 12 +++++++++
 9 files changed, 76 insertions(+), 35 deletions(-)
 create mode 100644 pipelines/CMakeLists.txt
 create mode 100644 pipelines/gridwriter/CMakeLists.txt
 rename gridwriter.py => pipelines/gridwriter/gridwriter.py (88%)
 create mode 100644 pipelines/live/CMakeLists.txt
 rename pvExample.py => pipelines/live/live.py (91%)
 create mode 100644 src/CMakeLists.txt
 rename catalyst_adapter.cpp => src/catalyst_adapter.cpp (96%)
 create mode 100644 test/CMakeLists.txt

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ed252ac..902248c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,25 +14,6 @@ endif()
 find_package(catalyst 2.0 REQUIRED)
 find_package(ComIn REQUIRED)
 
-add_library(catalyst_adapter MODULE catalyst_adapter.cpp)
-target_link_libraries(catalyst_adapter PRIVATE ComIn::ComIn catalyst::catalyst)
-
-
-if(BUILD_TESTING)
-  comin_add_replay_data(
-    NAME test_nwp_R02B04_R02B05_nest
-    URL "https://gitlab.dkrz.de/api/v4/projects/139706/packages/generic/test_nwp_R02B04_R02B05_nest/1/test_nwp_R02B04_R02B05_nest.tar.gz"
-    MD5HASH 103c0b673fbef0bc07c567b7f3acf975)
-  
-  comin_add_replay_test(NAME catalyst_test
-    REPLAY_DATA "test_nwp_R02B04_R02B05_nest"
-    NUM_PROCS 3
-  )
-
-  comin_test_add_plugin(TEST catalyst_test
-    NAME "catalyst_adapter"
-    PLUGIN_LIBRARY "$<TARGET_FILE:catalyst_adapter>"
-    OPTIONS "/home/nils/projects/comin/catalyst_adaptor/pvExample.py"
-    #   OPTIONS "/home/nils/projects/comin/catalyst_adaptor/gridwriter.py"
-  )
-endif()
+add_subdirectory(src/)
+add_subdirectory(test/)
+add_subdirectory(pipelines/)
diff --git a/pipelines/CMakeLists.txt b/pipelines/CMakeLists.txt
new file mode 100644
index 0000000..34c110f
--- /dev/null
+++ b/pipelines/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(live/)
+add_subdirectory(gridwriter/)
diff --git a/pipelines/gridwriter/CMakeLists.txt b/pipelines/gridwriter/CMakeLists.txt
new file mode 100644
index 0000000..922bacc
--- /dev/null
+++ b/pipelines/gridwriter/CMakeLists.txt
@@ -0,0 +1,20 @@
+set(REPLAY_DATA_NAME "test_nwp_R02B04_R02B05_nest")
+get_target_property(REPLAY_DATA_PATH "download_replay_data_${REPLAY_DATA_NAME}" DATA_DIRECTORY)
+file(GENERATE OUTPUT master.nml
+  CONTENT "&comin_nml
+  plugin_list(1)%name = \"comin_var_replay_plugin\"
+  plugin_list(1)%plugin_library = \"$<TARGET_FILE:ComIn::comin_var_replay_plugin>\"
+  plugin_list(1)%options = \"${REPLAY_DATA_PATH}/vars_\"
+  plugin_list(2)%name = \"catalyst_adapter\"
+  plugin_list(2)%plugin_library = \"${PROJECT_BINARY_DIR}/src/libcatalyst_adapter.so\"
+  plugin_list(2)%options = \"${CMAKE_CURRENT_SOURCE_DIR}/gridwriter.py\"
+/
+")
+file(GENERATE OUTPUT run.sh
+  CONTENT "#!/bin/sh
+cmake --build . --target \"download_replay_data_${REPLAY_DATA_NAME}\"
+cd ${CMAKE_CURRENT_BINARY_DIR}
+set -e
+${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3  \"$<TARGET_FILE:ComIn::comin_replay>\" \"${REPLAY_DATA_PATH}/\"
+"
+FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ)
diff --git a/gridwriter.py b/pipelines/gridwriter/gridwriter.py
similarity index 88%
rename from gridwriter.py
rename to pipelines/gridwriter/gridwriter.py
index 1a339fb..a3e8c77 100644
--- a/gridwriter.py
+++ b/pipelines/gridwriter/gridwriter.py
@@ -7,7 +7,7 @@
 # Input parameters
 #---------------------------------------------------------
 # Specify the Catalyst channel name
-catalystChannel = "domain1"
+catalystChannel = "2d_domain1"
 
 # Specify the write frequency
 frequency = 1
@@ -54,10 +54,15 @@ def create_extractor(data):
 
 
 # Pipeline
-data = TrivialProducer(registrationName=catalystChannel)
+domain1 = TrivialProducer(registrationName=catalystChannel)
+
+lonlat2sphere = '-1*sin(coordsX)*cos(coordsY)*iHat+cos(coordsX)*cos(coordsY)*jHat+sin(coordsY)*kHat'
+calculator1 = Calculator(registrationName='Calculator1', Input=domain1)
+calculator1.CoordinateResults = 1
+calculator1.Function = lonlat2sphere
 
 # Returns extractor type based on data (or you can manually specify
-extractor = create_extractor(data)
+extractor = create_extractor(calculator1)
 
 # ------------------------------------------------------------------------------
 # Catalyst options
diff --git a/pipelines/live/CMakeLists.txt b/pipelines/live/CMakeLists.txt
new file mode 100644
index 0000000..1a4c5ee
--- /dev/null
+++ b/pipelines/live/CMakeLists.txt
@@ -0,0 +1,20 @@
+set(REPLAY_DATA_NAME "test_nwp_R02B04_R02B05_nest")
+get_target_property(REPLAY_DATA_PATH "download_replay_data_${REPLAY_DATA_NAME}" DATA_DIRECTORY)
+file(GENERATE OUTPUT master.nml
+  CONTENT "&comin_nml
+  plugin_list(1)%name = \"comin_var_replay_plugin\"
+  plugin_list(1)%plugin_library = \"$<TARGET_FILE:ComIn::comin_var_replay_plugin>\"
+  plugin_list(1)%options = \"${REPLAY_DATA_PATH}/vars_\"
+  plugin_list(2)%name = \"catalyst_adapter\"
+  plugin_list(2)%plugin_library = \"${PROJECT_BINARY_DIR}/src/libcatalyst_adapter.so\"
+  plugin_list(2)%options = \"${CMAKE_CURRENT_SOURCE_DIR}/live.py\"
+/
+")
+file(GENERATE OUTPUT run.sh
+  CONTENT "#!/bin/sh
+cmake --build . --target \"download_replay_data_${REPLAY_DATA_NAME}\"
+cd ${CMAKE_CURRENT_BINARY_DIR}
+set -e
+${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3  \"$<TARGET_FILE:ComIn::comin_replay>\" \"${REPLAY_DATA_PATH}/\"
+"
+FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ)
diff --git a/pvExample.py b/pipelines/live/live.py
similarity index 91%
rename from pvExample.py
rename to pipelines/live/live.py
index 255ed2f..a1eccee 100644
--- a/pvExample.py
+++ b/pipelines/live/live.py
@@ -12,13 +12,13 @@ options.CatalystLiveTrigger = 'TimeStep'
 
 lonlat2sphere = '-1*sin(coordsX)*cos(coordsY)*iHat+cos(coordsX)*cos(coordsY)*jHat+sin(coordsY)*kHat'
 
-domain1 = TrivialProducer(registrationName='domain1')
+domain1 = TrivialProducer(registrationName='2d_domain1')
 calculator1 = Calculator(registrationName='Calculator1', Input=domain1)
 calculator1.CoordinateResults = 1
 calculator1.Function = lonlat2sphere
 calculator1Display = Show(calculator1)
 
-domain2 = TrivialProducer(registrationName='domain2')
+domain2 = TrivialProducer(registrationName='2d_domain2')
 calculator2 = Calculator(registrationName='Calculator2', Input=domain2)
 calculator2.CoordinateResults = 1
 calculator2.Function = lonlat2sphere
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..c1ce8c3
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_library(catalyst_adapter MODULE catalyst_adapter.cpp)
+target_link_libraries(catalyst_adapter PRIVATE ComIn::ComIn catalyst::catalyst)
diff --git a/catalyst_adapter.cpp b/src/catalyst_adapter.cpp
similarity index 96%
rename from catalyst_adapter.cpp
rename to src/catalyst_adapter.cpp
index ace9e7d..0dd235d 100644
--- a/catalyst_adapter.cpp
+++ b/src/catalyst_adapter.cpp
@@ -5,7 +5,6 @@
 #include <comin.h>
 #include <catalyst.hpp>
 
-int ierr = COMIN_SUCCESS;
 void catalyst_adapter_secondary_constructor();
 void catalyst_adapter_execute();
 void catalyst_adapter_destruct();
@@ -19,7 +18,7 @@ extern "C"{ // avoid name-mangling
 
     const char* script_file = NULL;
     int script_file_len;
-    comin_current_get_plugin_options(&script_file, &script_file_len, &ierr);
+    comin_current_get_plugin_options(&script_file, &script_file_len);
     catalyst_init_params["catalyst/scripts/script/filename"] = std::string(script_file, script_file_len);
 
     catalyst_status err = catalyst_initialize(conduit_cpp::c_node(&catalyst_init_params));
@@ -34,9 +33,9 @@ extern "C"{ // avoid name-mangling
     }
     about_node.print();
 
-    comin_callback_register(EP_SECONDARY_CONSTRUCTOR, catalyst_adapter_secondary_constructor, &ierr);
-    comin_callback_register(EP_ATM_WRITE_OUTPUT_BEFORE, catalyst_adapter_execute, &ierr);
-    comin_callback_register(EP_DESTRUCTOR, catalyst_adapter_destruct, &ierr);
+    comin_callback_register(EP_SECONDARY_CONSTRUCTOR, catalyst_adapter_secondary_constructor);
+    comin_callback_register(EP_ATM_WRITE_OUTPUT_BEFORE, catalyst_adapter_execute);
+    comin_callback_register(EP_DESTRUCTOR, catalyst_adapter_destruct);
   }
 }
 
@@ -45,7 +44,7 @@ void catalyst_adapter_secondary_constructor(){
   // prepare the execute node
   for(int jg = 1; jg<=comin_descrdata_get_global_n_dom(); ++jg){
     std::cout << "dom: " << jg << std::endl;
-    auto channel = catalyst_exec_params[std::string("catalyst/channels/domain")+std::to_string(jg)];
+    auto channel = catalyst_exec_params[std::string("catalyst/channels/2d_domain")+std::to_string(jg)];
     // now, create the mesh.
     channel["type"] = "mesh";
 
@@ -84,9 +83,9 @@ void catalyst_adapter_secondary_constructor(){
         it != nullptr;
         it = comin_var_get_descr_list_next(it)){
       t_comin_var_descriptor var_desc;
-      comin_var_get_descr_list_var_desc(it, &var_desc, &ierr);
+      comin_var_get_descr_list_var_desc(it, &var_desc);
       int zaxis_id = -1;
-      comin_metadata_get_integer(var_desc, "zaxis_id", &zaxis_id, &ierr);
+      comin_metadata_get_integer(var_desc, "zaxis_id", &zaxis_id);
       if(var_desc.id == jg &&
          zaxis_id == COMIN_ZAXIS_2D){
         // TODO split tracers in separate arrays
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..a6b73c2
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,12 @@
+if(BUILD_TESTING)
+  comin_add_replay_test(NAME catalyst_test
+    REPLAY_DATA "test_nwp_R02B04_R02B05_nest"
+    NUM_PROCS 3
+  )
+
+  comin_test_add_plugin(TEST catalyst_test
+    NAME "catalyst_adapter"
+    PLUGIN_LIBRARY "$<TARGET_FILE:catalyst_adapter>"
+    OPTIONS "/home/nils/projects/comin/catalyst_adaptor/pvExample.py"
+  )
+endif()
-- 
GitLab