From 344a6fba746f4636e04914d4cae5bac9eefa089d Mon Sep 17 00:00:00 2001
From: Max Jaeschke <max.jaeschke@htwk-leipzig.de>
Date: Wed, 18 Dec 2024 11:12:28 +0100
Subject: [PATCH] Filter BHE and soil elements

Sort soil and bhe elements only, if they are unsorted
---
 .../HeatTransportBHEProcess.cpp               | 27 +++++++++++++++++++
 .../HeatTransportBHEProcess.h                 |  4 +++
 2 files changed, 31 insertions(+)

diff --git a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp
index 9629290a4e8..9e70b86e9e0 100644
--- a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp
+++ b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp
@@ -161,6 +161,33 @@ void HeatTransportBHEProcess::initializeConcreteProcess(
     // Create BHE boundary conditions for each of the BHEs
     createBHEBoundaryConditionTopBottom(_bheMeshData.BHE_nodes);
 
+    // Store BHE and soil elements to split the assembly and use the matrix
+    // cache in the linear case only for soil elements
+    if (_process_data._algebraic_BC_Setting._is_linear)
+    {
+        _bhes_element_ids = _bheMeshData.BHE_elements | ranges::views::join |
+                            MeshLib::views::ids | ranges::to<std::vector>;
+
+        // sort bhe elements if needed
+        if (!std::is_sorted(_bhes_element_ids.begin(), _bhes_element_ids.end()))
+        {
+            std::sort(_bhes_element_ids.begin(), _bhes_element_ids.end());
+        }
+
+        _soil_element_ids = mesh.getElements() | MeshLib::views::ids |
+                            ranges::to<std::vector>();
+
+        // sort soil elements if needed
+        if (!std::is_sorted(_soil_element_ids.begin(), _soil_element_ids.end()))
+        {
+            std::sort(_soil_element_ids.begin(), _soil_element_ids.end());
+        }
+
+        _soil_element_ids = ranges::views::set_difference(_soil_element_ids,
+                                                          _bhes_element_ids) |
+                            ranges::to<std::vector>();
+    }
+
     if (_process_data._mass_lumping)
     {
         std::vector<std::size_t> const bhes_node_ids =
diff --git a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.h b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.h
index 27a45147f9b..66e45c4d791 100644
--- a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.h
+++ b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.h
@@ -126,6 +126,10 @@ private:
     const BHEMeshData _bheMeshData;
 
     AssembledMatrixCache _asm_mat_cache;
+
+    std::vector<std::size_t> _bhes_element_ids;
+
+    std::vector<std::size_t> _soil_element_ids;
 };
 }  // namespace HeatTransportBHE
 }  // namespace ProcessLib
-- 
GitLab