From 6373c0dece2dd4eee7890ee78e5670be01832fc3 Mon Sep 17 00:00:00 2001
From: renchao_lu <renchao.lu@gmail.com>
Date: Fri, 30 Aug 2019 18:37:01 +0200
Subject: [PATCH] [AP|PL] Replace with chemical solver interface instead.

---
 Applications/ApplicationsLib/ProjectData.cpp | 27 +++++++++++++++-----
 Applications/ApplicationsLib/ProjectData.h   |  2 +-
 ProcessLib/CreateTimeLoop.cpp                |  2 +-
 ProcessLib/CreateTimeLoop.h                  |  4 +--
 ProcessLib/TimeLoop.cpp                      | 17 ++++++------
 ProcessLib/TimeLoop.h                        |  7 ++---
 6 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index 41d92566837..b09ef6e79f8 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -39,7 +39,7 @@
 #include "ProcessLib/DeactivatedSubdomain.h"
 
 // PhreeqcIO
-#include "ChemistryLib/CreatePhreeqcIO.h"
+#include "ChemistryLib/CreateChemicalSolverInterface.h"
 #include "ProcessLib/ComponentTransport/ComponentTransportProcess.h"
 
 // FileIO
@@ -1032,6 +1032,9 @@ void ProjectData::parseChemicalSystem(
             ProcessLib::ComponentTransport::ComponentTransportProcess const*>(
             _processes[0].get()))
     {
+        auto const& process_id_to_component_name_map =
+            component_transport_process->getProcessIDToComponentNameMap();
+
         auto const chemical_solver =
             //! \ogs_file_attr{prj__chemical_system__chemical_solver}
             config->getConfigAttribute<std::string>("chemical_solver");
@@ -1040,20 +1043,30 @@ void ProjectData::parseChemicalSystem(
         {
             INFO(
                 "Configuring phreeqc interface for water chemistry "
-                "calculation.");
+                "calculation using file-based approach.");
 
-            auto const& process_id_to_component_name_map =
-                component_transport_process->getProcessIDToComponentNameMap();
+            _chemical_system = ChemistryLib::createChemicalSolverInterface<
+                ChemistryLib::ChemicalSolver::Phreeqc>(
+                *_mesh_vec[0], process_id_to_component_name_map, *config,
+                output_directory);
+        }
+        else if (boost::iequals(chemical_solver, "PhreeqcKernel"))
+        {
+            INFO(
+                "Configuring phreeqc interface for water chemistry "
+                "calculation by direct memory access.");
 
-            _chemical_system = ChemistryLib::createPhreeqcIO(
+            _chemical_system = ChemistryLib::createChemicalSolverInterface<
+                ChemistryLib::ChemicalSolver::PhreeqcKernel>(
                 *_mesh_vec[0], process_id_to_component_name_map, *config,
                 output_directory);
         }
         else
         {
             OGS_FATAL(
-                "Unknown chemical solver. Please specify Phreeqc as the solver "
-                "for water chemistry calculation instead.");
+                "Unknown chemical solver. Please specify either Phreeqc or "
+                "PhreeqcKernel as the solver for water chemistry calculation "
+                "instead.");
         }
     }
     else
diff --git a/Applications/ApplicationsLib/ProjectData.h b/Applications/ApplicationsLib/ProjectData.h
index 43f52ba86bf..356f8d4990b 100644
--- a/Applications/ApplicationsLib/ProjectData.h
+++ b/Applications/ApplicationsLib/ProjectData.h
@@ -139,5 +139,5 @@ private:
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>>
         _curves;
 
-    std::unique_ptr<ChemistryLib::PhreeqcIO> _chemical_system;
+    std::unique_ptr<ChemistryLib::ChemicalSolverInterface> _chemical_system;
 };
diff --git a/ProcessLib/CreateTimeLoop.cpp b/ProcessLib/CreateTimeLoop.cpp
index 595bffdee4c..225c9f05a9a 100644
--- a/ProcessLib/CreateTimeLoop.cpp
+++ b/ProcessLib/CreateTimeLoop.cpp
@@ -25,7 +25,7 @@ std::unique_ptr<TimeLoop> createTimeLoop(
     const std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>>&
         nonlinear_solvers,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
-    std::unique_ptr<ChemistryLib::PhreeqcIO>& phreeqc_io)
+    std::unique_ptr<ChemistryLib::ChemicalSolverInterface>& phreeqc_io)
 {
     auto const& coupling_config
         //! \ogs_file_param{prj__time_loop__global_process_coupling}
diff --git a/ProcessLib/CreateTimeLoop.h b/ProcessLib/CreateTimeLoop.h
index a19dd65a701..70abe09c277 100644
--- a/ProcessLib/CreateTimeLoop.h
+++ b/ProcessLib/CreateTimeLoop.h
@@ -32,7 +32,7 @@ class NonlinearSolverBase;
 
 namespace ChemistryLib
 {
-class PhreeqcIO;
+class ChemicalSolverInterface;
 }
 
 namespace ProcessLib
@@ -50,6 +50,6 @@ std::unique_ptr<TimeLoop> createTimeLoop(
     std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>> const&
         nonlinear_solvers,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
-    std::unique_ptr<ChemistryLib::PhreeqcIO>& phreeqc_io);
+    std::unique_ptr<ChemistryLib::ChemicalSolverInterface>& phreeqc_io);
 
 }  // namespace ProcessLib
diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp
index b6cba4a41ad..6bf4a9944d9 100644
--- a/ProcessLib/TimeLoop.cpp
+++ b/ProcessLib/TimeLoop.cpp
@@ -12,7 +12,7 @@
 
 #include "BaseLib/Error.h"
 #include "BaseLib/RunTime.h"
-#include "ChemistryLib/CreatePhreeqcIO.h"
+#include "ChemistryLib/ChemicalSolverInterface.h"
 #include "MathLib/LinAlg/LinAlg.h"
 #include "NumLib/ODESolver/ConvergenceCriterionPerComponent.h"
 #include "NumLib/ODESolver/TimeDiscretizedODESystem.h"
@@ -207,13 +207,14 @@ NumLib::NonlinearSolverStatus solveOneTimeStepOneProcess(
     return nonlinear_solver_status;
 }
 
-TimeLoop::TimeLoop(std::unique_ptr<Output>&& output,
-                   std::vector<std::unique_ptr<ProcessData>>&& per_process_data,
-                   const int global_coupling_max_iterations,
-                   std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>&&
-                       global_coupling_conv_crit,
-                   std::unique_ptr<ChemistryLib::PhreeqcIO>&& chemical_system,
-                   const double start_time, const double end_time)
+TimeLoop::TimeLoop(
+    std::unique_ptr<Output>&& output,
+    std::vector<std::unique_ptr<ProcessData>>&& per_process_data,
+    const int global_coupling_max_iterations,
+    std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>&&
+        global_coupling_conv_crit,
+    std::unique_ptr<ChemistryLib::ChemicalSolverInterface>&& chemical_system,
+    const double start_time, const double end_time)
     : _output(std::move(output)),
       _per_process_data(std::move(per_process_data)),
       _start_time(start_time),
diff --git a/ProcessLib/TimeLoop.h b/ProcessLib/TimeLoop.h
index c0b75efe426..184d87d852c 100644
--- a/ProcessLib/TimeLoop.h
+++ b/ProcessLib/TimeLoop.h
@@ -28,7 +28,7 @@ class ConvergenceCriterion;
 
 namespace ChemistryLib
 {
-class PhreeqcIO;
+class ChemicalSolverInterface;
 }
 
 namespace ProcessLib
@@ -44,7 +44,8 @@ public:
              const int global_coupling_max_iterations,
              std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>&&
                  global_coupling_conv_crit,
-             std::unique_ptr<ChemistryLib::PhreeqcIO>&& chemical_system,
+             std::unique_ptr<ChemistryLib::ChemicalSolverInterface>&&
+                 chemical_system,
              const double start_time, const double end_time);
 
     void initialize();
@@ -124,7 +125,7 @@ private:
     std::vector<std::unique_ptr<NumLib::ConvergenceCriterion>>
         _global_coupling_conv_crit;
 
-    std::unique_ptr<ChemistryLib::PhreeqcIO> _chemical_system;
+    std::unique_ptr<ChemistryLib::ChemicalSolverInterface> _chemical_system;
     /**
      *  Vector of solutions of the coupled processes.
      *  Each vector element stores the references of the solution vectors
-- 
GitLab