Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F70678975
equilibrium_data.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Jul 7, 16:17
Size
3 KB
Mime Type
text/x-c
Expires
Tue, Jul 9, 16:17 (2 d)
Engine
blob
Format
Raw Data
Handle
18781184
Attached To
rSPECMICP SpecMiCP / ReactMiCP
equilibrium_data.cpp
View Options
/*-------------------------------------------------------
- Module : specmicp
- File : equilibrium_data.cpp
- Author : Fabien Georget
Copyright (c) 2014, Fabien Georget, Princeton University
---------------------------------------------------------*/
#include "equilibrium_data.hpp"
#include "database/module.hpp"
#include "physics/constants.hpp"
#define POW10(m) std::pow(10.0, m)
namespace specmicp {
//! return log(IAP) for mineral m
double EquilibriumState::logIAP(int m) const
{
double logiap = 0.0;
for (int i=1; i<m_data->nb_component; ++i) logiap += m_main_variables(i)*m_data->nu_mineral(m, i);
return logiap;
}
double EquilibriumState::logIAP(const std::string& label_mineral) const
{
database::DatabaseModule namer(m_data);
int idm = namer.safe_label_to_id(label_mineral, m_data->labels_minerals);
return logIAP(idm);
}
double EquilibriumState::saturation_index(const std::string& label_mineral) const
{
database::DatabaseModule namer(m_data);
int idm = namer.safe_label_to_id(label_mineral, m_data->labels_minerals);
return logIAP(idm) - m_data->logk_mineral(idm);
}
//! return log(IAP) for mineral m
double EquilibriumState::logIAP_kinetic(int m) const
{
double logiap = 0.0;
for (int i=1; i<m_data->nb_component; ++i) logiap += m_main_variables(i)*m_data->nu_mineral_kinetic(m, i);
return logiap;
}
double EquilibriumState::logIAP_kinetic(const std::string& label_mineral) const
{
database::DatabaseModule namer(m_data);
int idm = namer.safe_label_to_id(label_mineral, m_data->labels_minerals_kinetic);
return logIAP_kinetic(idm);
}
double EquilibriumState::saturation_index_kinetic(const std::string& label_mineral) const
{
database::DatabaseModule namer(m_data);
int idm = namer.safe_label_to_id(label_mineral, m_data->labels_minerals);
return logIAP_kinetic(idm) - m_data->logk_mineral_kinetic(idm);
}
//! Return total concentration of aqueous species for component i
double EquilibriumState::total_aqueous_concentration_component(int i) const
{
double totconc = POW10(m_main_variables(i));
for (int j=0; j<m_data->nb_aqueous; ++j)
{
if (m_data->nu_aqueous(j,i) != 0)
totconc += m_data->nu_aqueous(j,i)*m_concentration_secondary(j);
}
return totconc;
}
void EquilibriumState::total_aqueous_concentrations(Eigen::VectorXd& totconc) const
{
assert(totconc.rows() == m_data->nb_component);
totconc(0) = m_main_variables(0);
for (int i=1; i<m_data->nb_component; ++i) totconc(i) = total_aqueous_concentration_component(i);
}
double EquilibriumState::pH() const
{
// search the information about "H[+]"
database::DatabaseModule namer(m_data);
double id = namer.component_label_to_id("H[+]");
if (id != database::DatabaseModule::no_species) return -m_main_variables(id);
else
{
id = namer.aqueous_label_to_id("H[+]");
assert(id != database::DatabaseModule::no_species);
return -std::log10(m_concentration_secondary(id));
}
}
double EquilibriumState::mass_mineral(int m) const
{
return m_data->molar_mass_mineral(m)*m_main_variables(m_data->nb_component+m);
}
double EquilibriumState::condensed_phase_volume() const
{
double volume = mass_water()/constants::water_density_25;
for (int m=0; m<m_data->nb_mineral; ++m)
{
volume += moles_mineral(m)*m_data->molar_volume_mineral(m);
}
return volume;
}
double EquilibriumState::gas_phase_volume() const
{
assert(is_fixed_volume());
return (get_volume() - condensed_phase_volume());
}
} // end namespace specmicp
Event Timeline
Log In to Comment