From 0fbeeb7bbb762337dd6470b85328873c0f5f70e6 Mon Sep 17 00:00:00 2001
From: Tom Fischer <thomas.fischer@ufz.de>
Date: Fri, 12 Apr 2024 08:16:44 +0200
Subject: [PATCH] [NL|MaL] Move NL::LinearSolverBehaviour to MathLib

---
 MathLib/LinAlg/Eigen/EigenLinearSolver.cpp  | 19 +++++++++---------
 MathLib/LinAlg/Eigen/EigenLinearSolver.h    |  8 ++++----
 MathLib/LinAlg/LinearSolverBehaviour.h      | 22 +++++++++++++++++++++
 NumLib/ODESolver/NonlinearSolver.cpp        | 14 +++++++------
 NumLib/ODESolver/NonlinearSystem.h          | 12 +++--------
 NumLib/ODESolver/TimeDiscretizedODESystem.h |  8 ++++----
 6 files changed, 51 insertions(+), 32 deletions(-)
 create mode 100644 MathLib/LinAlg/LinearSolverBehaviour.h

diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index e3a757ad7ed..db3ffc563bd 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -63,7 +63,7 @@ public:
     }
 
     bool compute(Matrix& A, EigenOption& opt,
-                 NumLib::LinearSolverBehaviour const linear_solver_behaviour)
+                 MathLib::LinearSolverBehaviour const linear_solver_behaviour)
     {
 #ifdef USE_EIGEN_UNSUPPORTED
         if (opt.scaling)
@@ -83,7 +83,7 @@ protected:
 
     virtual bool computeImpl(
         Matrix& A, EigenOption& opt,
-        NumLib::LinearSolverBehaviour const linear_solver_behaviour) = 0;
+        MathLib::LinearSolverBehaviour const linear_solver_behaviour) = 0;
 
 private:
 #ifdef USE_EIGEN_UNSUPPORTED
@@ -114,7 +114,7 @@ public:
     }
 
     bool computeImpl(Matrix& A, EigenOption& opt,
-                     [[maybe_unused]] NumLib::LinearSolverBehaviour const
+                     [[maybe_unused]] MathLib::LinearSolverBehaviour const
                          linear_solver_behaviour) override
     {
         INFO("-> compute with Eigen direct linear solver {:s}",
@@ -243,7 +243,7 @@ class EigenIterativeLinearSolver final : public EigenLinearSolverBase
 public:
     bool computeImpl(
         Matrix& A, EigenOption& opt,
-        NumLib::LinearSolverBehaviour const linear_solver_behaviour) override
+        MathLib::LinearSolverBehaviour const linear_solver_behaviour) override
     {
         INFO("-> compute with Eigen iterative linear solver {:s} (precon {:s})",
              EigenOption::getSolverName(opt.solver_type),
@@ -276,7 +276,7 @@ public:
 
         switch (linear_solver_behaviour)
         {
-            case NumLib::LinearSolverBehaviour::RECOMPUTE_AND_STORE:
+            case MathLib::LinearSolverBehaviour::RECOMPUTE_AND_STORE:
             {
                 // matrix must be copied, because Eigen's linear solver stores a
                 // reference to it cf.
@@ -285,12 +285,12 @@ public:
                 compute(A_);
                 break;
             }
-            case NumLib::LinearSolverBehaviour::RECOMPUTE:
+            case MathLib::LinearSolverBehaviour::RECOMPUTE:
             {
                 compute(A);
                 break;
             }
-            case NumLib::LinearSolverBehaviour::REUSE:
+            case MathLib::LinearSolverBehaviour::REUSE:
                 OGS_FATAL(
                     "If NumLib::LinearSolverBehaviour::REUSE is set then "
                     "EigenLinearSolver::compute() should never be executed");
@@ -495,7 +495,8 @@ EigenLinearSolver::EigenLinearSolver(std::string const& /*solver_name*/,
 EigenLinearSolver::~EigenLinearSolver() = default;
 
 bool EigenLinearSolver::compute(
-    EigenMatrix& A, NumLib::LinearSolverBehaviour const linear_solver_behaviour)
+    EigenMatrix& A,
+    MathLib::LinearSolverBehaviour const linear_solver_behaviour)
 {
     INFO("------------------------------------------------------------------");
     INFO("*** Eigen solver compute()");
@@ -513,7 +514,7 @@ bool EigenLinearSolver::solve(EigenVector& b, EigenVector& x)
 
 bool EigenLinearSolver::solve(
     EigenMatrix& A, EigenVector& b, EigenVector& x,
-    NumLib::LinearSolverBehaviour const linear_solver_behaviour)
+    MathLib::LinearSolverBehaviour const linear_solver_behaviour)
 {
     return solver_->compute(A.getRawMatrix(), option_,
                             linear_solver_behaviour) &&
diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.h b/MathLib/LinAlg/Eigen/EigenLinearSolver.h
index ae7a8ee603e..1955f1fd849 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.h
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.h
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include "EigenOption.h"
-#include "NumLib/ODESolver/NonlinearSystem.h"
+#include "MathLib/LinAlg/LinearSolverBehaviour.h"
 
 namespace MathLib
 {
@@ -54,7 +54,7 @@ public:
      * computes the preconditioner of an iterative solver.
      */
     bool compute(EigenMatrix& A,
-                 NumLib::LinearSolverBehaviour const linear_solver_behaviour);
+                 MathLib::LinearSolverBehaviour const linear_solver_behaviour);
     /**
      * Solves the linear system for the given right-hand side \c b and initial
      * guess \c x.
@@ -68,8 +68,8 @@ public:
     bool solve(EigenMatrix& A,
                EigenVector& b,
                EigenVector& x,
-               NumLib::LinearSolverBehaviour const linear_solver_behaviour =
-                   NumLib::LinearSolverBehaviour::RECOMPUTE);
+               MathLib::LinearSolverBehaviour const linear_solver_behaviour =
+                   MathLib::LinearSolverBehaviour::RECOMPUTE);
 
 protected:
     EigenOption option_;
diff --git a/MathLib/LinAlg/LinearSolverBehaviour.h b/MathLib/LinAlg/LinearSolverBehaviour.h
new file mode 100644
index 00000000000..b09ec5aff89
--- /dev/null
+++ b/MathLib/LinAlg/LinearSolverBehaviour.h
@@ -0,0 +1,22 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2024, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#pragma once
+
+namespace MathLib
+{
+enum class LinearSolverBehaviour : int
+{
+    RECOMPUTE,
+    RECOMPUTE_AND_STORE,
+    REUSE
+};
+
+}  // namespace MathLib
diff --git a/NumLib/ODESolver/NonlinearSolver.cpp b/NumLib/ODESolver/NonlinearSolver.cpp
index 613d3bac926..539aa469f85 100644
--- a/NumLib/ODESolver/NonlinearSolver.cpp
+++ b/NumLib/ODESolver/NonlinearSolver.cpp
@@ -29,13 +29,14 @@ namespace detail
 #if !defined(USE_PETSC) && !defined(USE_LIS)
 bool solvePicard(GlobalLinearSolver& linear_solver, GlobalMatrix& A,
                  GlobalVector& rhs, GlobalVector& x,
-                 LinearSolverBehaviour const linear_solver_behaviour)
+                 MathLib::LinearSolverBehaviour const linear_solver_behaviour)
 {
     BaseLib::RunTime time_linear_solver;
     time_linear_solver.start();
 
-    if (linear_solver_behaviour == LinearSolverBehaviour::RECOMPUTE ||
-        linear_solver_behaviour == LinearSolverBehaviour::RECOMPUTE_AND_STORE)
+    if (linear_solver_behaviour == MathLib::LinearSolverBehaviour::RECOMPUTE ||
+        linear_solver_behaviour ==
+            MathLib::LinearSolverBehaviour::RECOMPUTE_AND_STORE)
     {
         if (!linear_solver.compute(A, linear_solver_behaviour))
         {
@@ -60,10 +61,11 @@ bool solvePicard(GlobalLinearSolver& linear_solver, GlobalMatrix& A,
 #else
 bool solvePicard(GlobalLinearSolver& linear_solver, GlobalMatrix& A,
                  GlobalVector& rhs, GlobalVector& x,
-                 LinearSolverBehaviour const linear_solver_behaviour)
+                 MathLib::LinearSolverBehaviour const linear_solver_behaviour)
 {
-    if (linear_solver_behaviour == LinearSolverBehaviour::RECOMPUTE_AND_STORE ||
-        linear_solver_behaviour == LinearSolverBehaviour::REUSE)
+    if (linear_solver_behaviour ==
+            MathLib::LinearSolverBehaviour::RECOMPUTE_AND_STORE ||
+        linear_solver_behaviour == MathLib::LinearSolverBehaviour::REUSE)
     {
         WARN(
             "The performance optimization to skip the linear solver compute() "
diff --git a/NumLib/ODESolver/NonlinearSystem.h b/NumLib/ODESolver/NonlinearSystem.h
index c547b9c5c36..b232e988f18 100644
--- a/NumLib/ODESolver/NonlinearSystem.h
+++ b/NumLib/ODESolver/NonlinearSystem.h
@@ -11,18 +11,11 @@
 #pragma once
 
 #include "EquationSystem.h"
+#include "MathLib/LinAlg/LinearSolverBehaviour.h"
 #include "Types.h"
 
 namespace NumLib
 {
-
-enum class LinearSolverBehaviour : int
-{
-    RECOMPUTE,
-    RECOMPUTE_AND_STORE,
-    REUSE
-};
-
 //! \addtogroup ODESolver
 //! @{
 
@@ -137,7 +130,8 @@ public:
 
     //! Returns whether the assembled matrix \f$A\f$ has changed and the linear
     //! solver must perform the MathLib::EigenLinearSolver::compute() step.
-    virtual LinearSolverBehaviour linearSolverNeedsToCompute() const = 0;
+    virtual MathLib::LinearSolverBehaviour linearSolverNeedsToCompute()
+        const = 0;
 };
 
 //! @}
diff --git a/NumLib/ODESolver/TimeDiscretizedODESystem.h b/NumLib/ODESolver/TimeDiscretizedODESystem.h
index 8a181afefea..b53f6ca426b 100644
--- a/NumLib/ODESolver/TimeDiscretizedODESystem.h
+++ b/NumLib/ODESolver/TimeDiscretizedODESystem.h
@@ -234,21 +234,21 @@ public:
         return _ode.getMatrixSpecifications(process_id);
     }
 
-    LinearSolverBehaviour linearSolverNeedsToCompute() const override
+    MathLib::LinearSolverBehaviour linearSolverNeedsToCompute() const override
     {
         if (_ode.shouldLinearSolverComputeOnlyUponTimestepChange() &&
             _time_disc.getCurrentTimeIncrement() !=
                 _time_disc.getPreviousTimeIncrement())
         {
-            return LinearSolverBehaviour::RECOMPUTE_AND_STORE;
+            return MathLib::LinearSolverBehaviour::RECOMPUTE_AND_STORE;
         }
         if (_ode.shouldLinearSolverComputeOnlyUponTimestepChange() &&
             _time_disc.getCurrentTimeIncrement() ==
                 _time_disc.getPreviousTimeIncrement())
         {
-            return LinearSolverBehaviour::REUSE;
+            return MathLib::LinearSolverBehaviour::REUSE;
         }
-        return LinearSolverBehaviour::RECOMPUTE;
+        return MathLib::LinearSolverBehaviour::RECOMPUTE;
     }
 
 private:
-- 
GitLab