From ceaf98e8f6a553020cbf05f18a422cd3b6723a39 Mon Sep 17 00:00:00 2001
From: Nils-Arne Dreier <dreier@dkrz.de>
Date: Fri, 6 Sep 2024 10:54:57 +0200
Subject: [PATCH] refactor: build 2d_domain in separate file

---
 src/2d_domain.cpp        | 75 +++++++++++++++++++++++++++++++++++++++
 src/CMakeLists.txt       |  2 +-
 src/catalyst_adapter.cpp | 76 +++-------------------------------------
 3 files changed, 80 insertions(+), 73 deletions(-)
 create mode 100644 src/2d_domain.cpp

diff --git a/src/2d_domain.cpp b/src/2d_domain.cpp
new file mode 100644
index 0000000..8649b7e
--- /dev/null
+++ b/src/2d_domain.cpp
@@ -0,0 +1,75 @@
+#include <comin.h>
+#include <catalyst.hpp>
+
+conduit_cpp::Node catalyst_adapter_2d_domain(int jg){
+  conduit_cpp::Node channel;
+  // now, create the mesh.
+  channel["type"] = "mesh";
+
+  double *vlon, *vlat;
+  int nverts = comin_descrdata_get_domain_verts_nverts(jg);
+  int nverts_arr[2];
+  comin_descrdata_get_domain_verts_vlon(jg, &vlon, nverts_arr);
+  comin_descrdata_get_domain_verts_vlat(jg, &vlat, nverts_arr);
+  channel["data/coordsets/coords/type"] = "explicit";
+  channel["data/coordsets/coords/values/x"].set_external(vlon, nverts);
+  channel["data/coordsets/coords/values/y"].set_external(vlat, nverts);
+  channel["data/coordsets/coords/values/z"].set(std::vector<double>(nverts, 1.0));
+
+  channel["data/topologies/mesh/type"] = "unstructured";
+  channel["data/topologies/mesh/coordset"] = "coords";
+  channel["data/topologies/mesh/elements/shape"] = "tri";
+
+  int* vertex_idx = NULL;
+  int* vertex_blk = NULL;
+  int vertex_idx_size[3];
+  int ncells = comin_descrdata_get_domain_cells_ncells(jg);
+  comin_descrdata_get_domain_cells_vertex_idx(jg, &vertex_idx, vertex_idx_size);
+  comin_descrdata_get_domain_cells_vertex_blk(jg, &vertex_blk, vertex_idx_size);
+  int offset = vertex_idx_size[0]*vertex_idx_size[1];
+  std::vector<int> vidx(3*ncells);
+  for(int c=0; c<ncells; ++c){
+    vidx[3*c+0] = (vertex_idx[c+0*offset] - 1) + nverts_arr[0]*(vertex_blk[c+0*offset] - 1);
+    vidx[3*c+1] = (vertex_idx[c+1*offset] - 1) + nverts_arr[0]*(vertex_blk[c+1*offset] - 1);
+    vidx[3*c+2] = (vertex_idx[c+2*offset] - 1) + nverts_arr[0]*(vertex_blk[c+2*offset] - 1);
+  }
+  channel["data/topologies/mesh/elements/connectivity"].set(vidx);
+
+  // add all 2d variables
+  for(void* it = comin_var_get_descr_list_head();
+      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);
+    int zaxis_id = -1;
+    comin_metadata_get_integer(var_desc, "zaxis_id", &zaxis_id);
+    if(var_desc.id == jg &&
+       zaxis_id == COMIN_ZAXIS_2D){
+      channel["data/fields/" + std::string(var_desc.name) + "/association"] = "element";
+      channel["data/fields/" + std::string(var_desc.name) + "/topology"] = "mesh";
+      channel["data/fields/" + std::string(var_desc.name) + "/volume_dependend"] = false;
+      int ep = EP_ATM_WRITE_OUTPUT_BEFORE;
+      void* handle = comin_var_get(1, &ep, var_desc, COMIN_FLAG_READ);
+      channel["data/fields/" + std::string(var_desc.name) + "/values"]
+        .set_external(comin_var_get_ptr(handle), ncells);
+    }
+  }
+
+  // add some special fields
+  channel["data/fields/mpi_rank/association"] = "element";
+  channel["data/fields/mpi_rank/topology"] = "mesh";
+  channel["data/fields/mpi_rank/volume_dependend"] = false;
+  channel["data/fields/mpi_rank/values"]
+    .set(std::vector<int>(ncells, comin_parallel_get_host_mpi_rank()));
+
+  channel["data/fields/decomp_domain/association"] = "element";
+  channel["data/fields/decomp_domain/topology"] = "mesh";
+  channel["data/fields/decomp_domain/volume_dependend"] = false;
+  int* decomp_domain_ptr = nullptr;
+  int arr_size2[2];
+  comin_descrdata_get_domain_cells_decomp_domain(jg, &decomp_domain_ptr, arr_size2);
+  channel["data/fields/decomp_domain/values"]
+    .set_external(decomp_domain_ptr, ncells);
+
+  return channel;
+}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c1ce8c3..4bad5b4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,2 +1,2 @@
-add_library(catalyst_adapter MODULE catalyst_adapter.cpp)
+add_library(catalyst_adapter MODULE catalyst_adapter.cpp 2d_domain.cpp)
 target_link_libraries(catalyst_adapter PRIVATE ComIn::ComIn catalyst::catalyst)
diff --git a/src/catalyst_adapter.cpp b/src/catalyst_adapter.cpp
index 0dd235d..3b1cc15 100644
--- a/src/catalyst_adapter.cpp
+++ b/src/catalyst_adapter.cpp
@@ -8,6 +8,7 @@
 void catalyst_adapter_secondary_constructor();
 void catalyst_adapter_execute();
 void catalyst_adapter_destruct();
+conduit_cpp::Node catalyst_adapter_2d_domain(int jg);
 
 static conduit_cpp::Node catalyst_exec_params;
 
@@ -40,80 +41,11 @@ extern "C"{ // avoid name-mangling
 }
 
 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/2d_domain")+std::to_string(jg)];
-    // now, create the mesh.
-    channel["type"] = "mesh";
-
-
-    double *vlon, *vlat;
-    int nverts = comin_descrdata_get_domain_verts_nverts(jg);
-    int nverts_arr[2];
-    comin_descrdata_get_domain_verts_vlon(jg, &vlon, nverts_arr);
-    comin_descrdata_get_domain_verts_vlat(jg, &vlat, nverts_arr);
-    channel["data/coordsets/coords/type"] = "explicit";
-    channel["data/coordsets/coords/values/x"].set_external(vlon, nverts);
-    channel["data/coordsets/coords/values/y"].set_external(vlat, nverts);
-    channel["data/coordsets/coords/values/z"].set(std::vector<double>(nverts, 1.0));
-
-    channel["data/topologies/mesh/type"] = "unstructured";
-    channel["data/topologies/mesh/coordset"] = "coords";
-    channel["data/topologies/mesh/elements/shape"] = "tri";
-
-    int* vertex_idx = NULL;
-    int* vertex_blk = NULL;
-    int vertex_idx_size[3];
-    int ncells = comin_descrdata_get_domain_cells_ncells(jg);
-    comin_descrdata_get_domain_cells_vertex_idx(jg, &vertex_idx, vertex_idx_size);
-    comin_descrdata_get_domain_cells_vertex_blk(jg, &vertex_blk, vertex_idx_size);
-    int offset = vertex_idx_size[0]*vertex_idx_size[1];
-    std::vector<int> vidx(3*ncells);
-    for(int c=0; c<ncells; ++c){
-      vidx[3*c+0] = (vertex_idx[c+0*offset] - 1) + nverts_arr[0]*(vertex_blk[c+0*offset] - 1);
-      vidx[3*c+1] = (vertex_idx[c+1*offset] - 1) + nverts_arr[0]*(vertex_blk[c+1*offset] - 1);
-      vidx[3*c+2] = (vertex_idx[c+2*offset] - 1) + nverts_arr[0]*(vertex_blk[c+2*offset] - 1);
-    }
-    channel["data/topologies/mesh/elements/connectivity"].set(vidx);
-
-    // add all 2d variables
-    for(void* it = comin_var_get_descr_list_head();
-        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);
-      int zaxis_id = -1;
-      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
-        channel["data/fields/" + std::string(var_desc.name) + "/association"] = "element";
-        channel["data/fields/" + std::string(var_desc.name) + "/topology"] = "mesh";
-        channel["data/fields/" + std::string(var_desc.name) + "/volume_dependend"] = false;
-        int ep = EP_ATM_WRITE_OUTPUT_BEFORE;
-        void* handle = comin_var_get(1, &ep, var_desc, COMIN_FLAG_READ);
-        channel["data/fields/" + std::string(var_desc.name) + "/values"]
-          .set_external(comin_var_get_ptr(handle), ncells);
-      }
-    }
-
-    // add some special fields
-    channel["data/fields/mpi_rank/association"] = "element";
-    channel["data/fields/mpi_rank/topology"] = "mesh";
-    channel["data/fields/mpi_rank/volume_dependend"] = false;
-    channel["data/fields/mpi_rank/values"]
-      .set(std::vector<int>(ncells, comin_parallel_get_host_mpi_rank()));
-
-    channel["data/fields/decomp_domain/association"] = "element";
-    channel["data/fields/decomp_domain/topology"] = "mesh";
-    channel["data/fields/decomp_domain/volume_dependend"] = false;
-    int* decomp_domain_ptr = nullptr;
-    int arr_size2[2];
-    comin_descrdata_get_domain_cells_decomp_domain(jg, &decomp_domain_ptr, arr_size2);
-    channel["data/fields/decomp_domain/values"]
-      .set_external(decomp_domain_ptr, ncells);
+    auto domain_node = catalyst_adapter_2d_domain(jg);
+    catalyst_exec_params[std::string("catalyst/channels/2d_domain")+std::to_string(jg)] =
+      domain_node;
   }
 }
 
-- 
GitLab