33 for (
size_t k = 0; k <
m_kk; k++) {
48 for (
size_t k = 0; k <
m_kk; k++) {
65 for (
size_t k = 0; k <
m_kk; k++) {
73 for (
size_t k = 0; k <
m_kk; k++) {
82 for (
size_t k = 0; k <
m_kk; k++) {
98 for (
size_t k = 0; k <
m_kk; k++) {
103 for (
size_t k = 0; k <
m_kk; k++) {
112 for (
size_t iK = 0; iK <
m_kk; iK++) {
120 for (
const auto& item :
m_input[
"interactions"].asVector<
AnyMap>()) {
121 auto&
species = item[
"species"].asVector<
string>(2);
122 vector<double> h_excess = item.convertVector(
"excess-enthalpy",
"J/kmol");
123 vector<double> s_excess = item.convertVector(
"excess-entropy",
"J/kmol/K");
134 vector<AnyMap> interactions;
137 interaction[
"species"] = vector<string>{
141 while (h.size() > 1 && h.back() == 0) {
144 while (s.size() > 1 && s.back() == 0) {
147 interaction[
"excess-enthalpy"].setQuantity(std::move(h),
"J/kmol");
148 interaction[
"excess-entropy"].setQuantity(std::move(s),
"J/kmol/K");
149 interactions.push_back(std::move(interaction));
151 phaseNode[
"interactions"] = std::move(interactions);
168 for (
size_t i = 0; i <
m_HE_m_ij.size(); i++) {
173 double deltaX = XA - XB;
174 const vector<double>& he_vec =
m_HE_m_ij[i];
175 const vector<double>& se_vec =
m_SE_m_ij[i];
177 double polyMm1 = 1.0;
181 for (
size_t m = 0; m < he_vec.size(); m++) {
182 double A_ge = (he_vec[m] - T * se_vec[m]) / (
GasConstant * T);
184 sum2 += A_ge * (m + 1) * poly;
187 sumMm1 += (A_ge * polyMm1 * m);
191 double oneMXA = 1.0 - XA;
192 double oneMXB = 1.0 - XB;
193 for (
size_t k = 0; k <
m_kk; k++) {
196 }
else if (iB == k) {
211 for (
size_t i = 0; i <
m_HE_m_ij.size(); i++) {
216 double deltaX = XA - XB;
219 const vector<double>& he_vec =
m_HE_m_ij[i];
221 double polyMm1 = 1.0;
223 for (
size_t m = 0; m < he_vec.size(); m++) {
226 sum2 += h_e * (m + 1) * poly;
229 sumMm1 += (h_e * polyMm1 * m);
233 double oneMXA = 1.0 - XA;
234 double oneMXB = 1.0 - XB;
235 for (
size_t k = 0; k <
m_kk; k++) {
238 }
else if (iB == k) {
246 for (
size_t k = 0; k <
m_kk; k++) {
255 for (
size_t k = 0; k <
m_kk; k++) {
263 d2lnActCoeffdT2.size(),
m_kk);
265 for (
size_t k = 0; k <
m_kk; k++) {
275 for (
size_t i = 0; i <
m_HE_m_ij.size(); i++) {
280 double deltaX = XA - XB;
283 const vector<double>& he_vec =
m_HE_m_ij[i];
284 const vector<double>& se_vec =
m_SE_m_ij[i];
286 double polyMm1 = 1.0;
287 double polyMm2 = 1.0;
289 for (
size_t m = 0; m < he_vec.size(); m++) {
290 double A_ge = (he_vec[m] - T * se_vec[m]) / (
GasConstant * T);;
294 sumMm1 += (A_ge * polyMm1 * m);
298 sumMm2 += (A_ge * polyMm2 * m * (m - 1.0));
303 for (
size_t k = 0; k <
m_kk; k++) {
306 XA * (- (1-XA+XB) * sum + 2*(1.0 - XA) * XB * sumMm1
307 + sumMm1 * (XB * (1 - 2*XA + XB) - XA * (1 - XA + 2*XB))
308 + 2 * XA * XB * sumMm2 * (1.0 - XA + XB));
309 }
else if (iB == k) {
311 XB * (- (1-XB+XA) * sum - 2*(1.0 - XB) * XA * sumMm1
312 + sumMm1 * (XA * (2*XB - XA - 1) - XB * (-2*XA + XB - 1))
313 - 2 * XA * XB * sumMm2 * (-XA - 1 + XB));
324 for (
size_t i = 0; i <
m_HE_m_ij.size(); i++) {
329 double deltaX = XA - XB;
332 const vector<double>& he_vec =
m_HE_m_ij[i];
333 const vector<double>& se_vec =
m_SE_m_ij[i];
335 double polyMm1 = 1.0;
336 double polyMm2 = 1.0;
338 double sum2Mm1 = 0.0;
340 for (
size_t m = 0; m < he_vec.size(); m++) {
341 double A_ge = he_vec[m] - T * se_vec[m];
343 sum2 += A_ge * (m + 1) * poly;
346 sumMm1 += (A_ge * polyMm1 * m);
347 sum2Mm1 += (A_ge * polyMm1 * m * (1.0 + m));
351 sumMm2 += (A_ge * polyMm2 * m * (m - 1.0));
356 for (
size_t k = 0; k <
m_kk; k++) {
359 + XB * sumMm1 * (1.0 - 2.0 * XA + XB)
360 + XA * XB * sumMm2 * (1.0 - XA + XB));
363 + XA * sumMm1 * (1.0 + 2.0 * XB - XA)
364 - XA * XB * sumMm2 * (1.0 - XA + XB));
365 }
else if (iB == k) {
367 + XB * sumMm1 * (1.0 - 2.0 * XA + XB)
368 + XA * XB * sumMm2 * (1.0 - XA + XB));
371 + XA * sumMm1 * (XB - XA - (1.0 - XB))
372 - XA * XB * sumMm2 * (-XA - (1.0 - XB)));
382 span<double> dlnActCoeffds)
const
388 for (
size_t k = 0; k <
m_kk; k++) {
390 for (
size_t j = 0; j <
m_kk; j++) {
399 dlnActCoeffdlnN_diag.size(),
m_kk);
401 for (
size_t j = 0; j <
m_kk; j++) {
403 for (
size_t k = 0; k <
m_kk; k++) {
412 dlnActCoeffdlnX_diag.size(),
m_kk);
414 for (
size_t k = 0; k <
m_kk; k++) {
422 dlnActCoeffdlnN.size(), ld *
m_kk);
425 for (
size_t k = 0; k <
m_kk; k++) {
426 for (
size_t m = 0; m <
m_kk; m++) {
427 dlnActCoeffdlnN[ld * k + m] = data[
m_kk * k + m];
433 const string& speciesA,
const string& speciesB,
434 span<const double> excess_enthalpy, span<const double> excess_entropy)
439 throw CanteraError(
"RedlichKisterVPSSTP::addBinaryInteraction",
440 "Species '{}' should be neutral", speciesA);
441 }
else if (
charge(kB) != 0) {
442 throw CanteraError(
"RedlichKisterVPSSTP::addBinaryInteraction",
443 "Species '{}' should be neutral", speciesB);
448 m_HE_m_ij.emplace_back(excess_enthalpy.begin(), excess_enthalpy.end());
449 m_SE_m_ij.emplace_back(excess_entropy.begin(), excess_entropy.end());
450 size_t N = max(excess_enthalpy.size(), excess_entropy.size());
(see Thermodynamic Properties and class RedlichKisterVPSSTP).
Headers for the factory class that can create known ThermoPhase objects (see Thermodynamic Properties...
A map of string keys to values whose type can vary at runtime.
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
void zero()
Set all of the entries to zero.
virtual void resize(size_t n, size_t m, double v=0.0)
Resize the array, and fill the new entries with 'v'.
Base class for exceptions thrown by Cantera classes.
vector< double > d2lnActCoeffdT2_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
Array2D dlnActCoeffdlnN_
Storage for the current derivative values of the gradients with respect to logarithm of the species m...
vector< double > lnActCoeff_Scaled_
Storage for the current values of the activity coefficients of the species.
vector< double > dlnActCoeffdlnX_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
vector< double > moleFractions_
Storage for the current values of the mole fractions of the species.
vector< double > dlnActCoeffdT_Scaled_
Storage for the current derivative values of the gradients with respect to temperature of the log of ...
size_t m_kk
Number of species in the phase.
size_t speciesIndex(const string &name, bool raise=true) const
Returns the index of a species named 'name' within the Phase object.
double temperature() const
Temperature (K).
string speciesName(size_t k) const
Name of the species with index k.
shared_ptr< Species > species(const string &name) const
Return the Species object for the named species.
double charge(size_t k) const
Dimensionless electrical charge of a single molecule of species k The charge is normalized by the the...
void getLnActivityCoefficients(span< double > lnac) const override
Get the array of non-dimensional molar-based ln activity coefficients at the current solution tempera...
void s_update_dlnActCoeff_dX_() const
Internal routine that calculates the derivative of the activity coefficients wrt the mole fractions.
Array2D dlnActCoeff_dX_
Two dimensional array of derivatives of activity coefficients wrt mole fractions.
vector< vector< double > > m_SE_m_ij
Entropy term for the binary mole fraction interaction of the excess Gibbs free energy expression.
void getPartialMolarEnthalpies(span< double > hbar) const override
Returns an array of partial molar enthalpies for the species in the mixture.
void getdlnActCoeffdlnN_diag(span< double > dlnActCoeffdlnN_diag) const override
Get the array of log species mole number derivatives of the log activity coefficients.
void getPartialMolarCp(span< double > cpbar) const override
Returns an array of partial molar heat capacities for the species in the mixture.
void getd2lnActCoeffdT2(span< double > d2lnActCoeffdT2) const
Get the array of temperature second derivatives of the log activity coefficients.
void getParameters(AnyMap &phaseNode) const override
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
void initThermo() override
Initialize the ThermoPhase object after all species have been set up.
void getdlnActCoeffdlnX_diag(span< double > dlnActCoeffdlnX_diag) const override
Get the array of ln mole fraction derivatives of the log activity coefficients - diagonal component o...
void getdlnActCoeffdlnN(const size_t ld, span< double > const dlnActCoeffdlnN) override
Get the array of derivatives of the log activity coefficients with respect to the log of the species ...
vector< size_t > m_pSpecies_A_ij
vector of species indices representing species A in the interaction
double cv_mole() const override
Molar heat capacity at constant volume and composition [J/kmol/K].
void s_update_dlnActCoeff_dT() const
Update the derivative of the log of the activity coefficients wrt T.
vector< size_t > m_pSpecies_B_ij
vector of species indices representing species B in the interaction
vector< vector< double > > m_HE_m_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression.
void addBinaryInteraction(const string &speciesA, const string &speciesB, span< const double > excess_enthalpy, span< const double > excess_entropy)
Add a binary species interaction with the specified parameters.
void getdlnActCoeffds(const double dTds, span< const double > dXds, span< double > dlnActCoeffds) const override
Get the change in activity coefficients wrt changes in state (temp, mole fraction,...
void getPartialMolarVolumes(span< double > vbar) const override
Return an array of partial molar volumes for the species in the mixture.
void initLengths()
Initialize lengths of local variables after all species have been identified.
void getPartialMolarEntropies(span< double > sbar) const override
Returns an array of partial molar entropies for the species in the mixture.
void s_update_dlnActCoeff_dlnX_diag() const
Internal routine that calculates the total derivative of the activity coefficients with respect to th...
void s_update_lnActCoeff() const
Update the activity coefficients.
void getdlnActCoeffdT(span< double > dlnActCoeffdT) const override
Get the array of temperature derivatives of the log activity coefficients.
RedlichKisterVPSSTP(const string &inputFile="", const string &id="")
Construct a RedlichKisterVPSSTP object from an input file.
void getChemPotentials(span< double > mu) const override
Get the species chemical potentials. Units: J/kmol.
virtual double cp_mole() const
Molar heat capacity at constant pressure and composition [J/kmol/K].
virtual void getParameters(AnyMap &phaseNode) const
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
double RT() const
Return the Gas Constant multiplied by the current temperature.
virtual void initThermo()
Initialize the ThermoPhase object after all species have been set up.
void initThermoFile(const string &inputFile, const string &id)
Initialize a ThermoPhase object using an input file.
AnyMap m_input
Data supplied via setParameters.
void getCp_R(span< double > cpr) const override
Get the nondimensional Heat Capacities at constant pressure for the species standard states at the cu...
void getStandardChemPotentials(span< double > mu) const override
Get the array of chemical potentials at unit activity for the species at their standard states at the...
void getEnthalpy_RT(span< double > hrt) const override
Get the nondimensional Enthalpy functions for the species at their standard states at the current T a...
void getEntropy_R(span< double > sr) const override
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
void getStandardVolumes(span< double > vol) const override
Get the molar volumes of the species standard states at the current T and P of the solution.
const double GasConstant
Universal Gas Constant [J/kmol/K].
Namespace for the Cantera kernel.
const double SmallNumber
smallest number to compare to zero.
void checkArraySize(const char *procedure, size_t available, size_t required)
Wrapper for throwing ArraySizeError.
Contains declarations for string manipulation functions within Cantera.