vcs_VolPhase: incremental update to make more member data private.

This commit is contained in:
Harry Moffat 2008-06-23 23:40:20 +00:00
parent 2057b2007a
commit ba49020585
6 changed files with 100 additions and 61 deletions

View file

@ -1005,7 +1005,7 @@ namespace VCSnonideal {
VolPhase->FormulaMatrix.resize(ne, ns, 0.0);
VolPhase->SpeciesUnknownType.resize(ns, VCS_SPECIES_TYPE_MOLNUM);
VolPhase->m_speciesUnknownType.resize(ns, VCS_SPECIES_TYPE_MOLNUM);
VolPhase->ElGlobalIndex.resize(ne, -1);
@ -1055,7 +1055,7 @@ namespace VCSnonideal {
*/
if (ns == 1) {
if (tPhase->charge(0) != 0.0) {
VolPhase->SpeciesUnknownType[0] = VCS_SPECIES_TYPE_INTERFACIALVOLTAGE;
VolPhase->m_speciesUnknownType[0] = VCS_SPECIES_TYPE_INTERFACIALVOLTAGE;
VolPhase->m_phiVarIndex = 0;
}
}
@ -1161,7 +1161,7 @@ namespace VCSnonideal {
* Query the ThermoPhase object to find out what convention
* it uses for the specification of activity and Standard State.
*/
VolPhase->ActivityConvention = tPhase->activityConvention();
VolPhase->m_activityConvention = tPhase->activityConvention();
/*
* Assign the value of eqn of state
* -> Handle conflicts here.
@ -1266,7 +1266,7 @@ namespace VCSnonideal {
/*
* Transfer the type of unknown
*/
vprob->SpeciesUnknownType[kT] = VolPhase->SpeciesUnknownType[k];
vprob->SpeciesUnknownType[kT] = VolPhase->m_speciesUnknownType[k];
/*
* Transfer the species information from the
* volPhase structure to the VPROB structure

View file

@ -42,12 +42,12 @@ namespace VCSnonideal {
NVolSpecies(0),
TMolesInert(0.0),
m_molarVolInert(1000.),
ActivityConvention(0),
m_activityConvention(0),
m_isIdealSoln(false),
Existence(0),
m_MFStartIndex(0),
IndexSpecialSpecies(-1),
Activity_Coeff_Model(VCS_AC_CONSTANT),
Activity_Coeff_Params(0),
IndSpecies(0),
IndSpeciesContig(true),
m_VCS_UnitsFormat(VCS_UNITS_MKS),
@ -104,12 +104,12 @@ namespace VCSnonideal {
ChargeNeutralityElement(b.ChargeNeutralityElement),
NVolSpecies(b.NVolSpecies),
TMolesInert(b.TMolesInert),
ActivityConvention(b.ActivityConvention),
m_activityConvention(b.m_activityConvention),
m_isIdealSoln(b.m_isIdealSoln),
Existence(b.Existence),
m_MFStartIndex(b.m_MFStartIndex),
IndexSpecialSpecies(b.IndexSpecialSpecies),
Activity_Coeff_Model(b.Activity_Coeff_Model),
Activity_Coeff_Params(b.Activity_Coeff_Params),
IndSpeciesContig(b.IndSpeciesContig),
m_VCS_UnitsFormat(b.m_VCS_UnitsFormat),
m_useCanteraCalls(b.m_useCanteraCalls),
@ -176,21 +176,21 @@ namespace VCSnonideal {
}
}
SpeciesUnknownType = b.SpeciesUnknownType;
m_speciesUnknownType = b.m_speciesUnknownType;
ElGlobalIndex = b.ElGlobalIndex;
NVolSpecies = b.NVolSpecies;
PhaseName = b.PhaseName;
TMolesInert = b.TMolesInert;
ActivityConvention = b.ActivityConvention;
m_activityConvention = b.m_activityConvention;
m_isIdealSoln = b.m_isIdealSoln;
Existence = b.Existence;
m_MFStartIndex = b.m_MFStartIndex;
IndexSpecialSpecies = b.IndexSpecialSpecies;
Activity_Coeff_Model = b.Activity_Coeff_Model;
/*
* Do a shallow copy because we haven' figured this out.
*/
Activity_Coeff_Params = b.Activity_Coeff_Params;
IndSpecies = b.IndSpecies;
IndSpeciesContig = b.IndSpeciesContig;
@ -325,7 +325,7 @@ namespace VCSnonideal {
dLnActCoeffdMolNumber.resize(nspecies, nspecies, 0.0);
SpeciesUnknownType.resize(nspecies, VCS_SPECIES_TYPE_MOLNUM);
m_speciesUnknownType.resize(nspecies, VCS_SPECIES_TYPE_MOLNUM);
m_UpToDate = false;
m_vcsStateStatus = VCS_STATECALC_OLD;
m_UpToDate_AC = false;
@ -339,6 +339,8 @@ namespace VCSnonideal {
/*!
* We carry out a calculation whenever UpTODate_AC is false. Specifically
* whenever a phase goes zero, we do not carry out calculations on it.
*
* (private)
*/
void vcs_VolPhase::_updateActCoeff() const {
if (m_isIdealSoln) {
@ -372,7 +374,7 @@ namespace VCSnonideal {
* one.
*/
double vcs_VolPhase::AC_calc_one(int kspec) const {
if (! m_UpToDate_AC) {
if (! m_UpToDate_AC) {
_updateActCoeff();
}
return(ActCoeff[kspec]);
@ -490,7 +492,7 @@ namespace VCSnonideal {
m_UpToDate = false;
m_vcsStateStatus = VCS_STATECALC_TMP;
}
/***********************************************************************/
/****************************************************************************/
// Updates the mole fractions in subobjects
/*
@ -500,7 +502,7 @@ namespace VCSnonideal {
void vcs_VolPhase::_updateMoleFractionDependencies() {
if (m_useCanteraCalls) {
if (TP_ptr) {
TP_ptr->setState_PX(Pres, VCS_DATA_PTR(Xmol));
TP_ptr->setState_PX(Pres, &(Xmol[m_MFStartIndex]));
}
}
if (!m_isIdealSoln) {
@ -508,13 +510,13 @@ namespace VCSnonideal {
m_UpToDate_VolPM = false;
}
}
/************************************************************************/
/****************************************************************************/
// Return a const reference to the mole fraction vector in the phase
const std::vector<double> & vcs_VolPhase::moleFractions() const {
return Xmol;
}
/***********************************************************************/
/****************************************************************************/
// Set the moles within the phase
/*
@ -573,14 +575,14 @@ namespace VCSnonideal {
#endif
for (int k = 0; k < NVolSpecies; k++) {
if (SpeciesUnknownType[k] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
if (m_speciesUnknownType[k] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
kglob = IndSpecies[k];
v_totalMoles += MAX(0.0, molesSpeciesVCS[kglob]);
}
}
if (v_totalMoles > 0.0) {
for (int k = 0; k < NVolSpecies; k++) {
if (SpeciesUnknownType[k] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
if (m_speciesUnknownType[k] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
kglob = IndSpecies[k];
tmp = MAX(0.0, molesSpeciesVCS[kglob]);
Xmol[k] = tmp / v_totalMoles;
@ -624,7 +626,7 @@ namespace VCSnonideal {
m_vcsStateStatus = stateCalc;
}
/**************************************************************************/
/******************************************************************************/
// Set the moles within the phase
/*
@ -657,7 +659,7 @@ namespace VCSnonideal {
}
}
}
/**************************************************************************/
/******************************************************************************/
// Update the moles within the phase, if necessary
/*
@ -716,7 +718,7 @@ namespace VCSnonideal {
* in all of the phases in a VCS problem. Only the
* entries for the current phase are filled in.
*/
double vcs_VolPhase::sendToVCS_VolPM(double * const VolPM) const {
double vcs_VolPhase::sendToVCS_VolPM(double * const VolPM) const {
if (!m_UpToDate_VolPM) {
(void) _updateVolPM();
}
@ -752,7 +754,7 @@ namespace VCSnonideal {
/****************************************************************************/
void vcs_VolPhase::setElectricPotential(double phi) {
void vcs_VolPhase::setElectricPotential(const double phi) {
m_phi = phi;
if (m_useCanteraCalls) {
TP_ptr->setElectricPotential(m_phi);
@ -1080,6 +1082,30 @@ namespace VCSnonideal {
}
/************************************************************************************/
// Sets the mole flag within the object to out of date
/*
* This will trigger the object to go get the current mole numbers
* when it needs it.
*/
void vcs_VolPhase::setMolesOutOfDate(int stateCalc) {
m_UpToDate = false;
if (stateCalc != -1) {
m_vcsStateStatus = stateCalc;
}
}
/************************************************************************************/
// Sets the mole flag within the object to be current
/*
*
*/
void vcs_VolPhase::setMolesCurrent(int stateCalc) {
m_UpToDate = true;
m_vcsStateStatus = stateCalc;
}
/************************************************************************************/
// Return a string representing the equation of state
/*
* The string is no more than 16 characters.

View file

@ -223,7 +223,7 @@ namespace VCSnonideal {
/*!
* @param phi electric potential (volts)
*/
void setElectricPotential(double phi);
void setElectricPotential(const double phi);
//! Returns the electric field of the phase
/*!
@ -368,6 +368,19 @@ namespace VCSnonideal {
*/
void setTotalMoles(double totalMols);
//! Sets the mole flag within the object to out of date
/*!
* This will trigger the object to go get the current mole numbers
* when it needs it.
*/
void setMolesOutOfDate(int stateCalc = -1);
//! Sets the mole flag within the object to be current
/*!
*
*/
void setMolesCurrent(int stateCalc);
//! Set the mole fractions from a conventional mole fraction vector
/*!
*
@ -546,7 +559,7 @@ namespace VCSnonideal {
* metal electron -> VCS_SPECIES_INTERFACIALVOLTAGE
* ( unknown is the interfacial voltage (volts)
*/
std::vector<int> SpeciesUnknownType;
std::vector<int> m_speciesUnknownType;
//! Index of the element number in the global list of elements
//! storred in VCS_PROB or VCS_SOLVE
@ -574,7 +587,7 @@ namespace VCSnonideal {
* mu = mu_0 + ln a_molality
* standard state is based on unity molality
*/
int ActivityConvention;
int m_activityConvention;
//! Boolean indicating whether the phase is an ideal solution
//! and therefore it's molar-based activity coefficients are
@ -589,8 +602,20 @@ namespace VCSnonideal {
* inerts which can't exist in any other
* phase
*/
int Existence;
int Existence;
private:
// Index of the first MF species in the list of unknowns for this phase
/*!
* This is always equal to zero.
* Am anticipating the case where the phase potential is species # 0,
* for multiphase phases. Right now we have the phase potential equal
* to 0 for single species phases, where we set by hand the mole fraction
* of species 0 to one.
*/
int m_MFStartIndex;
public:
//! Index of the species which is special in
//! with respect to the thermo treatment.
/*!
@ -606,11 +631,6 @@ namespace VCSnonideal {
*/
int Activity_Coeff_Model;
//! General pointer for hanging stuff off of
/*!
* Currently, not implemented very well
*/
void *Activity_Coeff_Params;
//! Index into the species vectors
/*!
@ -728,6 +748,7 @@ namespace VCSnonideal {
*/
mutable std::vector<double> ActCoeff;
private:
//! Vector of the derivatives of the ln activity coefficient wrt to the
//! current mole number
/*!
@ -737,7 +758,6 @@ namespace VCSnonideal {
*/
mutable DoubleStarStar dLnActCoeffdMolNumber;
//! Status
/*!
* valid values are
@ -746,17 +766,14 @@ namespace VCSnonideal {
*/
int m_vcsStateStatus;
private:
//! Value of the potential for the phase (Volts)
double m_phi;
public:
//! Boolean indicating whether the object has an uptodate mole number vector
//! and potential with respect to the current vcs state calc status
bool m_UpToDate;
private:
//! Boolean indicating whether activity coefficients are uptodate.
/*!
* Activity coefficients and volume calculations are lagged. They are only

View file

@ -735,8 +735,8 @@ namespace VCSnonideal {
*/
for (iph = 0; iph < nph; iph++) {
Vphase = m_VolPhaseList[iph];
m_phaseActConvention[iph] = Vphase->ActivityConvention;
if (Vphase->ActivityConvention != 0) {
m_phaseActConvention[iph] = Vphase->m_activityConvention;
if (Vphase->m_activityConvention != 0) {
/*
* We assume here that species 0 is the solvent.
* The solvent isn't on a unity activity basis
@ -750,7 +750,7 @@ namespace VCSnonideal {
double mnaught = m_wtSpecies[iSolvent] / 1000.;
for (int k = 1; k < Vphase->NVolSpecies; k++) {
int kspec = Vphase->IndSpecies[k];
m_actConventionSpecies[kspec] = Vphase->ActivityConvention;
m_actConventionSpecies[kspec] = Vphase->m_activityConvention;
m_lnMnaughtSpecies[kspec] = log(mnaught);
}
}
@ -985,13 +985,12 @@ namespace VCSnonideal {
}
}
if (! vcs_doubleEqual( pub->mf[kT], vPhase->molefraction(k))) {
plogf("We have an inconsistency in mole fraction, %g, %g\n",
pub->mf[kT], vPhase->molefraction(k));
exit(-1);
}
if (pubPhase->SpeciesUnknownType[k] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
if (pubPhase->m_speciesUnknownType[k] != VCS_SPECIES_TYPE_INTERFACIALVOLTAGE) {
sumMoles += pub->w[kT];
}
}

View file

@ -1031,7 +1031,7 @@ private:
* 1: succeeded
* 0: failed.
*/
int zero_species(const int kspec);
int vcs_zero_species(const int kspec);
//! Change a single species from active to inactive status
/*!
@ -1047,7 +1047,7 @@ private:
* noncomponent species is equal to zero. A recheck of deleted species
* is carried out in the main code.
*/
int delete_species(const int kspec);
int vcs_delete_species(const int kspec);
//! This routine handles the bookkeepking involved with the
//! deletion of multiphase phases from the problem.

View file

@ -733,7 +733,7 @@ namespace VCSnonideal {
* branch to the code where we reevaluate the deletion
* of all species.
*/
lnospec = delete_species(kspec);
lnospec = vcs_delete_species(kspec);
if (lnospec) goto L_RECHECK_DELETED;
/*
* Go back to consider the next species in the list.
@ -2218,7 +2218,7 @@ namespace VCSnonideal {
* 1: succeeded
* 0: failed.
*/
int VCS_SOLVE::zero_species(const int kspec) {
int VCS_SOLVE::vcs_zero_species(const int kspec) {
int retn = 1;
/*
* Calculate a delta that will eliminate the species.
@ -2230,7 +2230,7 @@ namespace VCSnonideal {
#ifdef DEBUG_MODE
if (!retn) {
if (m_debug_print_lvl >= 1) {
plogf("zero_species: Couldn't zero the species %d, "
plogf("vcs_zero_species: Couldn't zero the species %d, "
"did delta of %g. orig conc of %g",
kspec, dx, m_molNumSpecies_old[kspec] + dx);
plogendl();
@ -2257,7 +2257,7 @@ namespace VCSnonideal {
* noncomponent species is equal to zero. A recheck of deleted species
* is carried out in the main code.
*/
int VCS_SOLVE::delete_species(const int kspec) {
int VCS_SOLVE::vcs_delete_species(const int kspec) {
const int klast = m_numSpeciesRdc - 1;
const int iph = m_phaseID[kspec];
vcs_VolPhase * const Vphase = m_VolPhaseList[iph];
@ -2266,7 +2266,7 @@ namespace VCSnonideal {
* Zero the concentration of the species.
* -> This zeroes w[kspec] and modifies m_tPhaseMoles_old[]
*/
const int retn = zero_species(kspec);
const int retn = vcs_zero_species(kspec);
#ifdef DEBUG_MODE
if (! retn) {
plogf("Failed to delete a species!");
@ -4693,12 +4693,12 @@ namespace VCSnonideal {
/*
* Calculate activity coefficients for all phases that are
* not current
* not current. Here we also trigger an update check for each
* VolPhase to see if its mole numbers are current with vcs
*/
for (iphase = 0; iphase < m_numPhases; iphase++) {
Vphase = m_VolPhaseList[iphase];
if (!Vphase->SingleSpecies) {
// Vphase->setMolesFromVCS(stateCalc, molNum);
Vphase->sendToVCS_ActCoeff(stateCalc, VCS_DATA_PTR(actCoeff_ptr));
}
m_phasePhi[iphase] = Vphase->electricPotential();
@ -5386,14 +5386,13 @@ namespace VCSnonideal {
vcs_VolPhase *Vphase;
if (!upToDate) {
for (iph = 0; iph < m_numPhases; iph++) {
Vphase = m_VolPhaseList[iph];
Vphase->m_UpToDate = false;
Vphase = m_VolPhaseList[iph];
Vphase->setMolesOutOfDate(stateCalc);
}
} else {
for (iph = 0; iph < m_numPhases; iph++) {
Vphase = m_VolPhaseList[iph];
Vphase->m_UpToDate = true;
Vphase->m_vcsStateStatus = stateCalc;
Vphase = m_VolPhaseList[iph];
Vphase->setMolesCurrent(stateCalc);
}
}
}
@ -5401,14 +5400,11 @@ namespace VCSnonideal {
void VCS_SOLVE::vcs_setFlagsVolPhase(const int iph, const bool upToDate,
const int stateCalc) {
vcs_VolPhase *Vphase;
vcs_VolPhase *Vphase = m_VolPhaseList[iph];
if (!upToDate) {
Vphase = m_VolPhaseList[iph];
Vphase->m_UpToDate = false;
Vphase->setMolesOutOfDate(stateCalc);
} else {
Vphase = m_VolPhaseList[iph];
Vphase->m_UpToDate = true;
Vphase->m_vcsStateStatus = stateCalc;
Vphase->setMolesCurrent(stateCalc);
}
}
/*******************************************************************************/
@ -5421,5 +5417,6 @@ namespace VCSnonideal {
Vphase->updateFromVCS_MoleNumbers(stateCalc);
}
}
/*******************************************************************************/
}