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