From 8e7d45cb762f957e2ac61cf740e41a5825980615 Mon Sep 17 00:00:00 2001
From: Gregor Olenik <gregor.olenik@web.de>
Date: Mon, 3 Jun 2024 11:31:11 +0200
Subject: [PATCH 1/2] fix ir build

---
 CMakeLists.txt    |  3 +-
 Solver/IR/GKOIR.H | 76 +++++++++++++++++++++++++----------------------
 2 files changed, 42 insertions(+), 37 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4fb85d091..02ec9640c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -170,7 +170,8 @@ target_sources(
           HostMatrix/HostMatrixFreeFunctions.C
           Solver/CG/GKOCG.C
           Solver/BiCGStab/GKOBiCGStab.C
-          # Solver / IR / GKOIR.C Solver / Multigrid / GKOMultigrid.C
+          Solver/IR/GKOIR.C
+          # Solver / Multigrid / GKOMultigrid.C
           Solver/GMRES/GKOGMRES.C
   # LduMatrix / GKOACG / GKOACG.C
   PUBLIC common/common.H
diff --git a/Solver/IR/GKOIR.H b/Solver/IR/GKOIR.H
index 94b9d9516..e162a358f 100644
--- a/Solver/IR/GKOIR.H
+++ b/Solver/IR/GKOIR.H
@@ -74,19 +74,28 @@ public:
           outerStoppingCriterion_(solverControls),
           innerStoppingCriterion_(StoppingCriterion(innerSolverControls_)){};
 
-    CREATE_SOLVER_METHODS(ir)
+
+    std::unique_ptr<ir::Factory, std::default_delete<ir::Factory>>  
+    create_dist_solver(                                                     
+        std::shared_ptr<gko::Executor> exec,                                
+        std::shared_ptr<gko::LinOp> gkomatrix, std::shared_ptr<dist_vec> x, 
+        std::shared_ptr<dist_vec> b, const label verbose,                   
+        const bool export_res, std::shared_ptr<gko::LinOp> precond) const   
+    {                                                                       
+        outerStoppingCriterionVec_.push_back(                                    
+            outerStoppingCriterion_.build_dist_stopping_criterion(               
+                exec, gkomatrix, x, b, verbose, export_res,                 
+                get_prev_number_of_iterations(),                            
+                get_solve_prev_rel_res_cost()));                            
+                                                                            
+        return create_default(exec);                                        
+    };
+
 
     std::unique_ptr<ir::Factory,
                     std::default_delete<gko::solver::Ir<scalar>::Factory>>
-    create_default(std::shared_ptr<gko::Executor> exec,
-                   std::shared_ptr<mtx> gkomatrix, std::shared_ptr<vec> x,
-                   std::shared_ptr<vec> b, const label verbose) const
+    create_default(std::shared_ptr<gko::Executor> exec) const
     {
-        innerStoppingCriterionVec_.push_back(
-            innerStoppingCriterion_.build_stopping_criterion(
-                exec, gkomatrix, x, b, verbose, false, 0));
-
-
         auto inner = gko::share(gko::solver::Cg<scalar>::build()
                                     .with_criteria(innerStoppingCriterionVec_)
                                     .on(exec));
@@ -99,29 +108,6 @@ public:
         return ir;
     };
 
-    std::unique_ptr<gko::solver::Ir<scalar>::Factory,
-                    std::default_delete<gko::solver::Ir<scalar>::Factory>>
-    create_scalar_jacobi(std::shared_ptr<gko::Executor> exec,
-                         std::shared_ptr<mtx> gkomatrix, std::shared_ptr<vec> x,
-                         std::shared_ptr<vec> b, const label verbose) const
-    {
-        using bj = gko::preconditioner::Jacobi<>;
-        label blockSize =
-            innerSolverControls_.lookupOrDefault("maxBlockSize", label(1));
-        auto bj_factory = bj::build()
-                              .with_max_block_size(blockSize)
-                              .with_skip_sorting(true)
-                              // .with_storage_optimization(
-                              //     gko::precision_reduction::autodetect())
-                              .on(exec);
-
-        auto ir = ir::build()
-                      .with_solver(gko::share(bj_factory))
-                      .with_criteria(outerStoppingCriterionVec_)
-                      .on(exec);
-
-        return ir;
-    };
 
     scalar get_init_res_norm() const
     {
@@ -135,7 +121,7 @@ public:
 
     scalar get_res_norm_time() const
     {
-        return stoppingCriterion_.get_res_norm_time();
+        return outerStoppingCriterion_.get_res_norm_time();
     }
 
 
@@ -147,15 +133,33 @@ public:
     void store_number_of_iterations() const
     {
         set_solve_prev_iters(sysMatrixName_, db_,
-                             stoppingCriterion_.get_num_iters(),
-                             stoppingCriterion_.get_is_final());
+                             outerStoppingCriterion_.get_num_iters(),
+                             outerStoppingCriterion_.get_is_final());
     }
 
     label get_prev_number_of_iterations() const
     {
         return get_solve_prev_iters(sysMatrixName_, db_,
-                                    stoppingCriterion_.get_is_final());
+                                    outerStoppingCriterion_.get_is_final());
+    }
+
+    label get_number_of_iterations() const
+    {
+        return outerStoppingCriterion_.get_num_iters();
+    }
+
+    // TODO FIXME add via macro or base class
+    void set_prev_rel_res_cost(scalar prev_rel_res_cost) const
+    {
+        return ::Foam::set_solve_prev_rel_res_cost(sysMatrixName_, db_,
+                                                   prev_rel_res_cost);
+    }
+
+    scalar get_solve_prev_rel_res_cost() const
+    {
+        return ::Foam::get_solve_prev_rel_res_cost(sysMatrixName_, db_);
     }
+
 };
 
 /*---------------------------------------------------------------------------*\

From e96c7b75016d519480edf6c5286e7b87c5de05cb Mon Sep 17 00:00:00 2001
From: Gregor Olenik <gregor.olenik@web.de>
Date: Mon, 3 Jun 2024 11:31:24 +0200
Subject: [PATCH 2/2] cleanup

---
 Solver/CG/GKOCG.H | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Solver/CG/GKOCG.H b/Solver/CG/GKOCG.H
index 427a58ca9..a644e4f8f 100644
--- a/Solver/CG/GKOCG.H
+++ b/Solver/CG/GKOCG.H
@@ -36,7 +36,6 @@ namespace Foam {
 
 class GKOCGFactory {
 private:
-    using mtx = gko::matrix::Csr<scalar>;
     using vec = gko::matrix::Dense<scalar>;
     using cg = gko::solver::Cg<scalar>;