From be470482cdf5d6b0998d30dbc212d281981035b3 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 15 Apr 2024 08:58:26 +0200
Subject: [PATCH] Add checkpoint/resume for ItemType variables

---
 src/language/modules/MeshModule.cpp         |  9 +++++++++
 src/utils/checkpointing/CheckpointUtils.cpp | 20 ++++++++++++++++++++
 src/utils/checkpointing/CheckpointUtils.hpp |  6 ++++++
 src/utils/checkpointing/ItemTypeHFType.hpp  | 14 ++++++++++++++
 src/utils/checkpointing/ResumeUtils.cpp     | 10 ++++++++++
 src/utils/checkpointing/ResumeUtils.hpp     |  1 +
 6 files changed, 60 insertions(+)
 create mode 100644 src/utils/checkpointing/ItemTypeHFType.hpp

diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp
index 94fe342c8..e3464e375 100644
--- a/src/language/modules/MeshModule.cpp
+++ b/src/language/modules/MeshModule.cpp
@@ -355,4 +355,13 @@ MeshModule::registerCheckpointResume() const
                            return readIZoneDescriptor(symbol_name, symbol_table_group);
                          }));
 
+  CheckpointResumeRepository::instance()
+    .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const ItemType>>,
+                         std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data,
+                                          HighFive::File& file, HighFive::Group& checkpoint_group,
+                                          HighFive::Group& symbol_table_group) {
+                           writeItemType(symbol_name, embedded_data, file, checkpoint_group, symbol_table_group);
+                         }),
+                         std::function([](const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+                                         -> EmbeddedData { return readItemType(symbol_name, symbol_table_group); }));
 }
diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp
index 4335ee100..b686e89b0 100644
--- a/src/utils/checkpointing/CheckpointUtils.cpp
+++ b/src/utils/checkpointing/CheckpointUtils.cpp
@@ -7,8 +7,10 @@
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
 #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp>
 #include <utils/checkpointing/IZoneDescriptorHFType.hpp>
+#include <utils/checkpointing/ItemTypeHFType.hpp>
 #include <utils/checkpointing/RefItemListHFType.hpp>
 
+#include <mesh/ItemType.hpp>
 #include <mesh/Mesh.hpp>
 #include <mesh/NamedBoundaryDescriptor.hpp>
 #include <mesh/NamedInterfaceDescriptor.hpp>
@@ -285,3 +287,21 @@ writeIZoneDescriptor(const std::string& symbol_name,
   }
   }
 }
+
+void
+writeItemType(const std::string& symbol_name,
+              const EmbeddedData& embedded_data,
+              HighFive::File&,
+              HighFive::Group&,
+              HighFive::Group& symbol_table_group)
+{
+  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<const ItemType> item_type_p =
+    dynamic_cast<const DataHandler<const ItemType>&>(embedded_data.get()).data_ptr();
+
+  const ItemType& item_type = *item_type_p;
+
+  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(item_type_p)>));
+  variable_group.createAttribute("item_type", item_type);
+}
diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp
index 5cfeb0d47..dc4afe88f 100644
--- a/src/utils/checkpointing/CheckpointUtils.hpp
+++ b/src/utils/checkpointing/CheckpointUtils.hpp
@@ -66,4 +66,10 @@ void writeIZoneDescriptor(const std::string& symbol_name,
                           HighFive::Group& checkpoint_group,
                           HighFive::Group& symbol_table_group);
 
+void writeItemType(const std::string& symbol_name,
+                   const EmbeddedData& embedded_data,
+                   HighFive::File& file,
+                   HighFive::Group& checkpoint_group,
+                   HighFive::Group& symbol_table_group);
+
 #endif   // CHECKPOINT_UTILS_HPP
diff --git a/src/utils/checkpointing/ItemTypeHFType.hpp b/src/utils/checkpointing/ItemTypeHFType.hpp
new file mode 100644
index 000000000..e20d18861
--- /dev/null
+++ b/src/utils/checkpointing/ItemTypeHFType.hpp
@@ -0,0 +1,14 @@
+#ifndef ITEM_TYPE_HF_TYPE_HPP
+#define ITEM_TYPE_HF_TYPE_HPP
+
+#include <mesh/ItemType.hpp>
+#include <utils/checkpointing/CheckpointUtils.hpp>
+
+HighFive::EnumType<ItemType> PUGS_INLINE
+create_enum_item_type()
+{
+  return {{"node", ItemType::node}, {"edge", ItemType::edge}, {"face", ItemType::face}, {"cell", ItemType::cell}};
+}
+HIGHFIVE_REGISTER_TYPE(ItemType, create_enum_item_type);
+
+#endif   // ITEM_TYPE_HF_TYPE_HPP
diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp
index d320f9616..e5483347b 100644
--- a/src/utils/checkpointing/ResumeUtils.cpp
+++ b/src/utils/checkpointing/ResumeUtils.cpp
@@ -11,6 +11,7 @@
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
 #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp>
 #include <utils/checkpointing/IZoneDescriptorHFType.hpp>
+#include <utils/checkpointing/ItemTypeHFType.hpp>
 #include <utils/checkpointing/ResumingData.hpp>
 
 EmbeddedData
@@ -109,3 +110,12 @@ readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbo
 
   return embedded_data;
 }
+
+EmbeddedData
+readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  const HighFive::Group item_type_group = symbol_table_group.getGroup("embedded/" + symbol_name);
+  const ItemType item_type              = item_type_group.getAttribute("item_type").read<ItemType>();
+
+  return {std::make_shared<DataHandler<const ItemType>>(std::make_shared<const ItemType>(item_type))};
+}
diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp
index 8ac1ffcf2..2c0b0d486 100644
--- a/src/utils/checkpointing/ResumeUtils.hpp
+++ b/src/utils/checkpointing/ResumeUtils.hpp
@@ -32,5 +32,6 @@ EmbeddedData readMesh(const std::string& symbol_name, const HighFive::Group& sym
 EmbeddedData readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
+EmbeddedData readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 
 #endif   // RESUME_UTILS_HPP
-- 
GitLab