Page MenuHomec4science

equilibrium_data.cpp
No OneTemporary

File Metadata

Created
Sun, Jul 7, 16:17

equilibrium_data.cpp

/*-------------------------------------------------------
- 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