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_view const line)
std::vector< double > parseAndFilterChemicalData (std::string_view const line, std::vector< int > const &dropped_item_ids, std::size_t const chemical_system_id)
template<typename DataBlock>
std::ostream & operator<< (std::ostream &os, std::vector< DataBlock > const &data_blocks)
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 332 of file PhreeqcIO.cpp.

335{
336 double const sum = std::accumulate(
337 chemical_system_indices.begin(), chemical_system_indices.end(), 0.0,
338 [&](double const s, GlobalIndexType const id)
339 { return s + (*reactant.molality)[id]; });
340 return sum / chemical_system_indices.size();
341}
GlobalMatrix::IndexType GlobalIndexType

References averageReactantMolality().

Referenced by averageReactantMolality().

◆ extractItemsFromLine()

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

Definition at line 105 of file PhreeqcIO.cpp.

106{
107 std::vector<std::string> items;
108 std::string line_str(line);
109 boost::trim_if(line_str, boost::is_any_of("\t "));
110 boost::algorithm::split(items, line_str, boost::is_any_of("\t "),
111 boost::token_compress_on);
112 return items;
113}

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 165 of file PhreeqcIO.cpp.

172{
173 auto const& solid_constituent = solid_phase.component(reactant.name);
174
175 if (solid_constituent.hasProperty(
177 {
178 auto const molality =
180 .template initialValue<double>(pos, t);
181
182 (*reactant.molality)[chemical_system_id] = molality;
183 (*reactant.molality_prev)[chemical_system_id] = molality;
184 }
185 else
186 {
187 auto const volume_fraction =
188 solid_constituent
190 .template initialValue<double>(pos, t);
191
192 (*reactant.volume_fraction)[chemical_system_id] = volume_fraction;
193
194 (*reactant.volume_fraction_prev)[chemical_system_id] = volume_fraction;
195
196 auto const fluid_density =
198 .template initialValue<double>(pos, t);
199
200 auto const porosity =
202 .template initialValue<double>(pos, t);
203
204 auto const molar_volume =
206 .template initialValue<double>(pos, t);
207
208 (*reactant.molality)[chemical_system_id] =
209 volume_fraction / fluid_density / porosity / molar_volume;
210
211 (*reactant.molality_prev)[chemical_system_id] =
212 (*reactant.molality)[chemical_system_id];
213 }
214}

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 258 of file PhreeqcIO.cpp.

263{
264 auto const& solid_constituent = solid_phase.component(site.name);
265
266 auto const molality =
268 .template initialValue<double>(pos, t);
269
270 (*site.molality)[chemical_system_id] = molality;
271}

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 156 of file PhreeqcIO.cpp.

158{
159 std::copy(data_blocks.begin(), data_blocks.end(),
160 std::ostream_iterator<DataBlock>(os));
161 return os;
162}

◆ 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_view const line,
std::vector< int > const & dropped_item_ids,
std::size_t const chemical_system_id )

Definition at line 115 of file PhreeqcIO.cpp.

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

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

Referenced by parseAndFilterChemicalData().

◆ 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 311 of file PhreeqcIO.cpp.

315{
316 auto const& solid_phase =
318
319 auto const& solid_constituent = solid_phase.component(reactant.name);
320
321 if (solid_constituent.hasProperty(
323 {
324 return;
325 }
326
327 porosity -= ((*reactant.volume_fraction)[chemical_system_id] -
328 (*reactant.volume_fraction_prev)[chemical_system_id]);
329}

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 217 of file PhreeqcIO.cpp.

224{
225 auto const& solid_constituent = solid_phase.component(reactant.name);
226
227 if (solid_constituent.hasProperty(
229 {
230 (*reactant.molality_prev)[chemical_system_id] =
231 (*reactant.molality)[chemical_system_id];
232
233 return;
234 }
235
236 auto const volume_fraction =
237 (*reactant.volume_fraction)[chemical_system_id];
238
239 (*reactant.volume_fraction_prev)[chemical_system_id] =
240 (*reactant.volume_fraction)[chemical_system_id];
241
242 auto const fluid_density =
244 .template value<double>(vars, pos, t, dt);
245
246 auto const molar_volume =
248 .template value<double>(vars, pos, t, dt);
249
250 (*reactant.molality)[chemical_system_id] =
251 volume_fraction / fluid_density / vars.porosity / molar_volume;
252
253 (*reactant.molality_prev)[chemical_system_id] =
254 (*reactant.molality)[chemical_system_id];
255}

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 274 of file PhreeqcIO.cpp.

280{
281 auto const& solid_phase =
283 auto const& liquid_phase =
285
287
288 auto const liquid_density =
290 .template value<double>(vars, pos, t, dt);
291
292 auto const& solid_constituent = solid_phase.component(reactant.name);
293
294 if (solid_constituent.hasProperty(
296 {
297 return;
298 }
299
300 auto const molar_volume =
302 .template value<double>(vars, pos, t, dt);
303
304 (*reactant.volume_fraction)[chemical_system_id] +=
305 ((*reactant.molality)[chemical_system_id] -
306 (*reactant.molality_prev)[chemical_system_id]) *
307 liquid_density * porosity * molar_volume;
308}

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

Referenced by updateReactantVolumeFraction().