cantera/src/equil/vcs_nondim.cpp
Ray Speth 7eb939dc5f [Equil] Eliminate SpeciesThermo and VPhaseList from VCS_SOLVE
This means that the VCS_SPECIES_THERMO and vcs_VolPhase classes no longer need
to be able to be copied.
2017-08-21 21:31:45 -04:00

130 lines
4.6 KiB
C++

/**
* @file vcs_nondim.cpp
* Nondimensionalization routines within VCSnonideal
*/
// This file is part of Cantera. See License.txt in the top-level directory or
// at http://www.cantera.org/license.txt for license and copyright information.
#include "cantera/equil/vcs_solve.h"
#include "cantera/equil/vcs_VolPhase.h"
#include "cantera/base/stringUtils.h"
#include "cantera/base/ctexceptions.h"
namespace Cantera
{
void VCS_SOLVE::vcs_nondim_TP()
{
if (m_unitsState == VCS_DIMENSIONAL_G) {
m_unitsState = VCS_NONDIMENSIONAL_G;
double tf = 1.0 / (GasConstant * m_temperature);
for (size_t i = 0; i < m_nsp; ++i) {
// Modify the standard state and total chemical potential data,
// FF(I), to make it dimensionless, i.e., mu / RT. Thus, we may
// divide it by the temperature.
m_SSfeSpecies[i] *= tf;
m_deltaGRxn_new[i] *= tf;
m_deltaGRxn_old[i] *= tf;
m_feSpecies_old[i] *= tf;
}
m_Faraday_dim = ElectronCharge * Avogadro / (m_temperature * GasConstant);
// Scale the total moles if necessary: First find out the total moles
double tmole_orig = vcs_tmoles();
// Then add in the total moles of elements that are goals. Either one or
// the other is specified here.
double esum = 0.0;
for (size_t i = 0; i < m_nelem; ++i) {
if (m_elType[i] == VCS_ELEM_TYPE_ABSPOS) {
esum += fabs(m_elemAbundancesGoal[i]);
}
}
tmole_orig += esum;
// Ok now test out the bounds on the total moles that this program can
// handle. These are a bit arbitrary. However, it would seem that any
// reasonable input would be between these two numbers below.
if (tmole_orig < 1.0E-200 || tmole_orig > 1.0E200) {
throw CanteraError("VCS_SOLVE::vcs_nondim_TP",
"Total input moles, {} is outside the range handled by vcs.\n",
tmole_orig);
}
// Determine the scale of the problem
if (tmole_orig > 1.0E4) {
m_totalMoleScale = tmole_orig / 1.0E4;
} else if (tmole_orig < 1.0E-4) {
m_totalMoleScale = tmole_orig / 1.0E-4;
} else {
m_totalMoleScale = 1.0;
}
if (m_totalMoleScale != 1.0) {
if (m_debug_print_lvl >= 2) {
plogf(" --- vcs_nondim_TP() called: USING A MOLE SCALE OF %g until further notice\n", m_totalMoleScale);
}
for (size_t i = 0; i < m_nsp; ++i) {
if (m_speciesUnknownType[i] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
m_molNumSpecies_old[i] *= (1.0 / m_totalMoleScale);
}
}
for (size_t i = 0; i < m_nelem; ++i) {
m_elemAbundancesGoal[i] *= (1.0 / m_totalMoleScale);
}
for (size_t iph = 0; iph < m_numPhases; iph++) {
TPhInertMoles[iph] *= (1.0 / m_totalMoleScale);
if (TPhInertMoles[iph] != 0.0) {
vcs_VolPhase* vphase = m_VolPhaseList[iph].get();
vphase->setTotalMolesInert(TPhInertMoles[iph]);
}
}
vcs_tmoles();
}
}
}
void VCS_SOLVE::vcs_redim_TP()
{
if (m_unitsState != VCS_DIMENSIONAL_G) {
m_unitsState = VCS_DIMENSIONAL_G;
double tf = m_temperature * GasConstant;
for (size_t i = 0; i < m_nsp; ++i) {
// Modify the standard state and total chemical potential data,
// FF(I), to make it have units, i.e. mu = RT * mu_star
m_SSfeSpecies[i] *= tf;
m_deltaGRxn_new[i] *= tf;
m_deltaGRxn_old[i] *= tf;
m_feSpecies_old[i] *= tf;
}
m_Faraday_dim *= tf;
}
if (m_totalMoleScale != 1.0) {
if (m_debug_print_lvl >= 2) {
plogf(" --- vcs_redim_TP() called: getting rid of mole scale of %g\n", m_totalMoleScale);
}
for (size_t i = 0; i < m_nsp; ++i) {
if (m_speciesUnknownType[i] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
m_molNumSpecies_old[i] *= m_totalMoleScale;
}
}
for (size_t i = 0; i < m_nelem; ++i) {
m_elemAbundancesGoal[i] *= m_totalMoleScale;
}
for (size_t iph = 0; iph < m_numPhases; iph++) {
TPhInertMoles[iph] *= m_totalMoleScale;
if (TPhInertMoles[iph] != 0.0) {
vcs_VolPhase* vphase = m_VolPhaseList[iph].get();
vphase->setTotalMolesInert(TPhInertMoles[iph]);
}
}
vcs_tmoles();
}
}
}