From 6b2950a2e73656411a1467ea906dcc03d613fe2f Mon Sep 17 00:00:00 2001
From: Jaime Garibay <jaimegaribay.1@gmail.com>
Date: Tue, 4 May 2021 11:58:18 +0200
Subject: [PATCH] [CL] added setReactantVolumeFraction template function

---
 ChemistryLib/PhreeqcIO.cpp | 84 ++++++++++++++++++--------------------
 1 file changed, 40 insertions(+), 44 deletions(-)

diff --git a/ChemistryLib/PhreeqcIO.cpp b/ChemistryLib/PhreeqcIO.cpp
index a4228a09c03..1e61148bea3 100644
--- a/ChemistryLib/PhreeqcIO.cpp
+++ b/ChemistryLib/PhreeqcIO.cpp
@@ -165,6 +165,42 @@ void setReactantMolality(Reactant& reactant,
         (*reactant.molality)[chemical_system_id];
 }
 
+template <typename Reactant>
+void setReactantVolumeFraction(Reactant& reactant,
+                         GlobalIndexType const& chemical_system_id,
+                         MaterialPropertyLib::Medium const* medium,
+                         ParameterLib::SpatialPosition const& pos, double const porosity,
+                         double const t, double const dt)
+{
+    auto const& solid_phase = medium->phase("Solid");
+    auto const& liquid_phase = medium->phase("AqueousLiquid");
+
+    MaterialPropertyLib::VariableArray vars;
+
+    auto const liquid_density =
+        liquid_phase.property(MaterialPropertyLib::PropertyType::density)
+            .template value<double>(vars, pos, t, dt);
+
+    auto const& solid_constituent =
+        solid_phase.component(reactant.name);
+
+    if (solid_constituent.hasProperty(
+            MaterialPropertyLib::PropertyType::molality))
+    {
+        return;
+    }
+
+    auto const molar_volume =
+        solid_constituent
+            .property(MaterialPropertyLib::PropertyType::molar_volume)
+            .template value<double>(vars, pos, t, dt);
+
+    (*reactant.volume_fraction)[chemical_system_id] +=
+        ((*reactant.molality)[chemical_system_id] -
+            (*reactant.molality_prev)[chemical_system_id]) *
+        liquid_density * porosity * molar_volume;
+}
+
 template <typename Reactant>
 static double averageReactantMolality(
     Reactant const& reactant,
@@ -674,56 +710,16 @@ void PhreeqcIO::updateVolumeFractionPostReaction(
     ParameterLib::SpatialPosition const& pos, double const porosity,
     double const t, double const dt)
 {
-    auto const& solid_phase = medium->phase("Solid");
-    auto const& liquid_phase = medium->phase("AqueousLiquid");
-
-    MaterialPropertyLib::VariableArray vars;
-
-    auto const liquid_density =
-        liquid_phase[MaterialPropertyLib::PropertyType::density]
-            .template value<double>(vars, pos, t, dt);
-
     for (auto& kinetic_reactant : _chemical_system->kinetic_reactants)
     {
-        auto const& solid_constituent =
-            solid_phase.component(kinetic_reactant.name);
-
-        if (solid_constituent.hasProperty(
-                MaterialPropertyLib::PropertyType::molality))
-        {
-            continue;
-        }
-
-        auto const molar_volume =
-            solid_constituent[MaterialPropertyLib::PropertyType::molar_volume]
-                .template value<double>(vars, pos, t, dt);
-
-        (*kinetic_reactant.volume_fraction)[chemical_system_id] +=
-            ((*kinetic_reactant.molality)[chemical_system_id] -
-             (*kinetic_reactant.molality_prev)[chemical_system_id]) *
-            liquid_density * porosity * molar_volume;
+        setReactantVolumeFraction(kinetic_reactant, chemical_system_id, medium,
+                            pos, porosity, t, dt);
     }
 
     for (auto& equilibrium_reactant : _chemical_system->equilibrium_reactants)
     {
-        auto const& solid_constituent =
-            solid_phase.component(equilibrium_reactant.name);
-
-        if (solid_constituent.hasProperty(
-                MaterialPropertyLib::PropertyType::molality))
-        {
-            continue;
-        }
-
-        auto const molar_volume =
-            solid_constituent
-                .property(MaterialPropertyLib::PropertyType::molar_volume)
-                .template value<double>(vars, pos, t, dt);
-
-        (*equilibrium_reactant.volume_fraction)[chemical_system_id] +=
-            ((*equilibrium_reactant.molality)[chemical_system_id] -
-             (*equilibrium_reactant.molality_prev)[chemical_system_id]) *
-            liquid_density * porosity * molar_volume;
+        setReactantVolumeFraction(equilibrium_reactant, chemical_system_id, medium,
+                            pos, porosity, t, dt);
     }
 }
 
-- 
GitLab