OGS
ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp} Namespace Reference

Classes

struct  overloaded
class  StringViewLineIterator

Functions

template<class... Ts>
 overloaded (Ts...) -> overloaded< Ts... >
std::vector< std::string > extractItemsFromLine (std::string const &line)
std::vector< double > parseAndFilterChemicalData (std::string const &line, std::vector< int > const &dropped_item_ids, std::size_t chemical_system_id)
template<typename DataBlock>
std::ostream & operator<< (std::ostream &os, std::vector< DataBlock > const &data_blocks)
void setAqueousSolution (std::vector< double > const &concentrations, GlobalIndexType const &chemical_system_id, AqueousSolution &aqueous_solution)
template<typename Reactant>
void initializeReactantMolality (Reactant &reactant, GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Phase const &solid_phase, MaterialPropertyLib::Phase const &liquid_phase, MaterialPropertyLib::Medium const &medium, ParameterLib::SpatialPosition const &pos, double const t)
template<typename Reactant>
void setReactantMolality (Reactant &reactant, GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Phase const &solid_phase, MaterialPropertyLib::Phase const &liquid_phase, MaterialPropertyLib::VariableArray const &vars, ParameterLib::SpatialPosition const &pos, double const t, double const dt)
template<typename Site>
void initializeSiteMolality (Site &site, GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Phase const &solid_phase, ParameterLib::SpatialPosition const &pos, double const t)
template<typename Reactant>
void updateReactantVolumeFraction (Reactant &reactant, GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Medium const &medium, ParameterLib::SpatialPosition const &pos, double const porosity, double const t, double const dt)
template<typename Reactant>
void setPorosityPostReaction (Reactant &reactant, GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Medium const &medium, double &porosity)
template<typename Reactant>
static double averageReactantMolality (Reactant const &reactant, std::vector< GlobalIndexType > const &chemical_system_indices)

Function Documentation

◆ averageReactantMolality()

template<typename Reactant>
double ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::averageReactantMolality ( Reactant const & reactant,
std::vector< GlobalIndexType > const & chemical_system_indices )
static

Definition at line 349 of file PhreeqcIO.cpp.

352{
353 double const sum = std::accumulate(
354 chemical_system_indices.begin(), chemical_system_indices.end(), 0.0,
355 [&](double const s, GlobalIndexType const id)
356 { return s + (*reactant.molality)[id]; });
357 return sum / chemical_system_indices.size();
358}
GlobalMatrix::IndexType GlobalIndexType

References averageReactantMolality().

Referenced by averageReactantMolality().

◆ extractItemsFromLine()

std::vector< std::string > ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::extractItemsFromLine ( std::string const & line)

Definition at line 99 of file PhreeqcIO.cpp.

100{
101 std::vector<std::string> items;
102 std::string line_str(line);
103 boost::trim_if(line_str, boost::is_any_of("\t "));
104 boost::algorithm::split(items, line_str, boost::is_any_of("\t "),
105 boost::token_compress_on);
106 return items;
107}

References extractItemsFromLine().

Referenced by extractItemsFromLine(), and parseAndFilterChemicalData().

◆ initializeReactantMolality()

template<typename Reactant>
void ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::initializeReactantMolality ( Reactant & reactant,
GlobalIndexType const & chemical_system_id,
MaterialPropertyLib::Phase const & solid_phase,
MaterialPropertyLib::Phase const & liquid_phase,
MaterialPropertyLib::Medium const & medium,
ParameterLib::SpatialPosition const & pos,
double const t )

Definition at line 182 of file PhreeqcIO.cpp.

189{
190 auto const& solid_constituent = solid_phase.component(reactant.name);
191
192 if (solid_constituent.hasProperty(
194 {
195 auto const molality =
197 .template initialValue<double>(pos, t);
198
199 (*reactant.molality)[chemical_system_id] = molality;
200 (*reactant.molality_prev)[chemical_system_id] = molality;
201 }
202 else
203 {
204 auto const volume_fraction =
205 solid_constituent
207 .template initialValue<double>(pos, t);
208
209 (*reactant.volume_fraction)[chemical_system_id] = volume_fraction;
210
211 (*reactant.volume_fraction_prev)[chemical_system_id] = volume_fraction;
212
213 auto const fluid_density =
215 .template initialValue<double>(pos, t);
216
217 auto const porosity =
219 .template initialValue<double>(pos, t);
220
221 auto const molar_volume =
223 .template initialValue<double>(pos, t);
224
225 (*reactant.molality)[chemical_system_id] =
226 volume_fraction / fluid_density / porosity / molar_volume;
227
228 (*reactant.molality_prev)[chemical_system_id] =
229 (*reactant.molality)[chemical_system_id];
230 }
231}

References MaterialPropertyLib::Phase::component(), MaterialPropertyLib::density, initializeReactantMolality(), MaterialPropertyLib::molality, MaterialPropertyLib::molar_volume, MaterialPropertyLib::porosity, and MaterialPropertyLib::volume_fraction.

Referenced by initializeReactantMolality().

◆ initializeSiteMolality()

template<typename Site>
void ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::initializeSiteMolality ( Site & site,
GlobalIndexType const & chemical_system_id,
MaterialPropertyLib::Phase const & solid_phase,
ParameterLib::SpatialPosition const & pos,
double const t )

Definition at line 275 of file PhreeqcIO.cpp.

280{
281 auto const& solid_constituent = solid_phase.component(site.name);
282
283 auto const molality =
285 .template initialValue<double>(pos, t);
286
287 (*site.molality)[chemical_system_id] = molality;
288}

References MaterialPropertyLib::Phase::component(), initializeSiteMolality(), and MaterialPropertyLib::molality.

Referenced by initializeSiteMolality().

◆ operator<<()

template<typename DataBlock>
std::ostream & ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::operator<< ( std::ostream & os,
std::vector< DataBlock > const & data_blocks )

Definition at line 150 of file PhreeqcIO.cpp.

152{
153 std::copy(data_blocks.begin(), data_blocks.end(),
154 std::ostream_iterator<DataBlock>(os));
155 return os;
156}

◆ overloaded()

template<class... Ts>
ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::overloaded ( Ts... ) -> overloaded< Ts... >

◆ parseAndFilterChemicalData()

std::vector< double > ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::parseAndFilterChemicalData ( std::string const & line,
std::vector< int > const & dropped_item_ids,
std::size_t chemical_system_id )

Definition at line 109 of file PhreeqcIO.cpp.

113{
114 std::vector<double> accepted_items;
115 std::vector<std::string> const items = extractItemsFromLine(line);
116 for (int item_id = 0; item_id < static_cast<int>(items.size()); ++item_id)
117 {
118 if (std::find(dropped_item_ids.begin(), dropped_item_ids.end(),
119 item_id) != dropped_item_ids.end())
120 {
121 continue;
122 }
123 double value;
124 try
125 {
126 value = std::stod(items[item_id]);
127 }
128 catch (const std::invalid_argument& e)
129 {
130 OGS_FATAL(
131 "Invalid argument. Could not convert string '{:s}' to "
132 "double for chemical system {:d}, column {:d}. "
133 "Exception '{:s}' was thrown.",
134 items[item_id], chemical_system_id + 1, item_id, e.what());
135 }
136 catch (const std::out_of_range& e)
137 {
138 OGS_FATAL(
139 "Out of range error. Could not convert string "
140 "'{:s}' to double for chemical system {:d}, column "
141 "{:d}. Exception '{:s}' was thrown.",
142 items[item_id], chemical_system_id + 1, item_id, e.what());
143 }
144 accepted_items.push_back(value);
145 }
146 return accepted_items;
147}
#define OGS_FATAL(...)
Definition Error.h:19
std::vector< std::string > extractItemsFromLine(std::string const &line)
Definition PhreeqcIO.cpp:99

References extractItemsFromLine(), OGS_FATAL, and parseAndFilterChemicalData().

Referenced by parseAndFilterChemicalData().

◆ setAqueousSolution()

void ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::setAqueousSolution ( std::vector< double > const & concentrations,
GlobalIndexType const & chemical_system_id,
AqueousSolution & aqueous_solution )

Definition at line 158 of file PhreeqcIO.cpp.

161{
162 GlobalIndexType const offset = aqueous_solution.pH->getRangeBegin();
163 GlobalIndexType const global_index = offset + chemical_system_id;
164
165 // components
166 auto& components = aqueous_solution.components;
167 for (unsigned component_id = 0; component_id < components.size();
168 ++component_id)
169 {
171 *components[component_id].amount);
172 components[component_id].amount->set(global_index,
173 concentrations[component_id]);
174 }
175
176 // pH
178 aqueous_solution.pH->set(global_index, concentrations.back());
179}
void setLocalAccessibleVector(PETScVector const &x)
Definition LinAlg.cpp:20

References ChemistryLib::PhreeqcIOData::AqueousSolution::components, ChemistryLib::PhreeqcIOData::AqueousSolution::pH, setAqueousSolution(), and MathLib::LinAlg::setLocalAccessibleVector().

Referenced by setAqueousSolution().

◆ setPorosityPostReaction()

template<typename Reactant>
void ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::setPorosityPostReaction ( Reactant & reactant,
GlobalIndexType const & chemical_system_id,
MaterialPropertyLib::Medium const & medium,
double & porosity )

Definition at line 328 of file PhreeqcIO.cpp.

332{
333 auto const& solid_phase =
335
336 auto const& solid_constituent = solid_phase.component(reactant.name);
337
338 if (solid_constituent.hasProperty(
340 {
341 return;
342 }
343
344 porosity -= ((*reactant.volume_fraction)[chemical_system_id] -
345 (*reactant.volume_fraction_prev)[chemical_system_id]);
346}

References MaterialPropertyLib::Phase::component(), MaterialPropertyLib::molality, MaterialPropertyLib::Medium::phase(), setPorosityPostReaction(), and MaterialPropertyLib::Solid.

Referenced by setPorosityPostReaction().

◆ setReactantMolality()

template<typename Reactant>
void ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::setReactantMolality ( Reactant & reactant,
GlobalIndexType const & chemical_system_id,
MaterialPropertyLib::Phase const & solid_phase,
MaterialPropertyLib::Phase const & liquid_phase,
MaterialPropertyLib::VariableArray const & vars,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt )

Definition at line 234 of file PhreeqcIO.cpp.

241{
242 auto const& solid_constituent = solid_phase.component(reactant.name);
243
244 if (solid_constituent.hasProperty(
246 {
247 (*reactant.molality_prev)[chemical_system_id] =
248 (*reactant.molality)[chemical_system_id];
249
250 return;
251 }
252
253 auto const volume_fraction =
254 (*reactant.volume_fraction)[chemical_system_id];
255
256 (*reactant.volume_fraction_prev)[chemical_system_id] =
257 (*reactant.volume_fraction)[chemical_system_id];
258
259 auto const fluid_density =
261 .template value<double>(vars, pos, t, dt);
262
263 auto const molar_volume =
265 .template value<double>(vars, pos, t, dt);
266
267 (*reactant.molality)[chemical_system_id] =
268 volume_fraction / fluid_density / vars.porosity / molar_volume;
269
270 (*reactant.molality_prev)[chemical_system_id] =
271 (*reactant.molality)[chemical_system_id];
272}

References MaterialPropertyLib::Phase::component(), MaterialPropertyLib::density, MaterialPropertyLib::molality, MaterialPropertyLib::molar_volume, MaterialPropertyLib::VariableArray::porosity, and setReactantMolality().

Referenced by setReactantMolality().

◆ updateReactantVolumeFraction()

template<typename Reactant>
void ChemistryLib::PhreeqcIOData::anonymous_namespace{PhreeqcIO.cpp}::updateReactantVolumeFraction ( Reactant & reactant,
GlobalIndexType const & chemical_system_id,
MaterialPropertyLib::Medium const & medium,
ParameterLib::SpatialPosition const & pos,
double const porosity,
double const t,
double const dt )

Definition at line 291 of file PhreeqcIO.cpp.

297{
298 auto const& solid_phase =
300 auto const& liquid_phase =
302
304
305 auto const liquid_density =
307 .template value<double>(vars, pos, t, dt);
308
309 auto const& solid_constituent = solid_phase.component(reactant.name);
310
311 if (solid_constituent.hasProperty(
313 {
314 return;
315 }
316
317 auto const molar_volume =
319 .template value<double>(vars, pos, t, dt);
320
321 (*reactant.volume_fraction)[chemical_system_id] +=
322 ((*reactant.molality)[chemical_system_id] -
323 (*reactant.molality_prev)[chemical_system_id]) *
324 liquid_density * porosity * molar_volume;
325}

References MaterialPropertyLib::AqueousLiquid, MaterialPropertyLib::density, MaterialPropertyLib::molality, MaterialPropertyLib::molar_volume, MaterialPropertyLib::Medium::phase(), MaterialPropertyLib::Solid, and updateReactantVolumeFraction().

Referenced by updateReactantVolumeFraction().