Cantera  4.0.0a1
Loading...
Searching...
No Matches
MargulesVPSSTP.cpp
Go to the documentation of this file.
1/**
2 * @file MargulesVPSSTP.cpp
3 * Definitions for ThermoPhase object for phases which
4 * employ excess Gibbs free energy formulations related to Margules
5 * expansions (see @ref thermoprops
6 * and class @link Cantera::MargulesVPSSTP MargulesVPSSTP@endlink).
7 */
8
9// This file is part of Cantera. See License.txt in the top-level directory or
10// at https://cantera.org/license.txt for license and copyright information.
11
13#include "cantera/thermo/PDSS.h"
16
17namespace Cantera
18{
19MargulesVPSSTP::MargulesVPSSTP(const string& inputFile, const string& id_)
20{
21 initThermoFile(inputFile, id_);
22}
23
24// -- Activities, Standard States, Activity Concentrations -----------
25
26void MargulesVPSSTP::getLnActivityCoefficients(span<double> lnac) const
27{
28 checkArraySize("MargulesVPSSTP::getLnActivityCoefficients", lnac.size(), m_kk);
29 // Update the activity coefficients
31
32 // take the exp of the internally stored coefficients.
33 for (size_t k = 0; k < m_kk; k++) {
34 lnac[k] = lnActCoeff_Scaled_[k];
35 }
36}
37
38// ------------ Partial Molar Properties of the Solution ------------
39
40void MargulesVPSSTP::getChemPotentials(span<double> mu) const
41{
42 // First get the standard chemical potentials in molar form. This requires
43 // updates of standard state as a function of T and P
45
46 // Update the activity coefficients
48 for (size_t k = 0; k < m_kk; k++) {
49 double xx = std::max(moleFractions_[k], SmallNumber);
50 mu[k] += RT() * (log(xx) + lnActCoeff_Scaled_[k]);
51 }
52}
53
55{
56 double kappa_T = isothermalCompressibility();
57 if (kappa_T == 0.0) {
58 return cp_mole();
59 }
60 double beta = thermalExpansionCoeff();
61 return cp_mole() - temperature() * molarVolume() * beta * beta / kappa_T;
62}
63
65{
66 // V^E has no pressure dependence in this model, so only the standard
67 // state PDSS derivatives contribute to kappa_T.
68 double sum_xk_dVkdP = 0.0;
69 for (size_t k = 0; k < m_kk; k++) {
70 sum_xk_dVkdP += moleFractions_[k] * providePDSS(k)->dVdP();
71 }
72 return -sum_xk_dVkdP / molarVolume();
73}
74
76{
77 // Standard state contribution
78 double dVdT = 0.0;
79 for (size_t k = 0; k < m_kk; k++) {
80 dVdT += moleFractions_[k] * providePDSS(k)->dVdT();
81 }
82 // Excess volume contribution: d/dT [XA*XB*(g0 + g1*XB)]
83 // where g0 = VHE_b - T*VSE_b, g1 = VHE_c - T*VSE_c
84 // => dg0/dT = -VSE_b, dg1/dT = -VSE_c
85 for (size_t i = 0; i < numBinaryInteractions_; i++) {
86 double XA = moleFractions_[m_pSpecies_A_ij[i]];
87 double XB = moleFractions_[m_pSpecies_B_ij[i]];
88 dVdT -= XA * XB * (m_VSE_b_ij[i] + m_VSE_c_ij[i] * XB);
89 }
90 return dVdT / molarVolume();
91}
92
93void MargulesVPSSTP::getPartialMolarEnthalpies(span<double> hbar) const
94{
95 // Get the nondimensional standard state enthalpies
96 getEnthalpy_RT(hbar);
97
98 // dimensionalize it.
99 for (size_t k = 0; k < m_kk; k++) {
100 hbar[k] *= RT();
101 }
102
103 // Update the activity coefficients, This also update the internally stored
104 // molalities.
107 for (size_t k = 0; k < m_kk; k++) {
108 hbar[k] -= RT() * temperature() * dlnActCoeffdT_Scaled_[k];
109 }
110}
111
112void MargulesVPSSTP::getPartialMolarCp(span<double> cpbar) const
113{
114 // Get the nondimensional standard state entropies
115 getCp_R(cpbar);
116 double T = temperature();
117
118 // Update the activity coefficients, This also update the internally stored
119 // molalities.
122
123 for (size_t k = 0; k < m_kk; k++) {
124 cpbar[k] -= 2 * T * dlnActCoeffdT_Scaled_[k] + T * T * d2lnActCoeffdT2_Scaled_[k];
125 }
126 // dimensionalize it.
127 for (size_t k = 0; k < m_kk; k++) {
128 cpbar[k] *= GasConstant;
129 }
130}
131
132void MargulesVPSSTP::getPartialMolarEntropies(span<double> sbar) const
133{
134 // Get the nondimensional standard state entropies
135 getEntropy_R(sbar);
136 double T = temperature();
137
138 // Update the activity coefficients, This also update the internally stored
139 // molalities.
142
143 for (size_t k = 0; k < m_kk; k++) {
144 double xx = std::max(moleFractions_[k], SmallNumber);
145 sbar[k] += - lnActCoeff_Scaled_[k] -log(xx) - T * dlnActCoeffdT_Scaled_[k];
146 }
147
148 // dimensionalize it.
149 for (size_t k = 0; k < m_kk; k++) {
150 sbar[k] *= GasConstant;
151 }
152}
153
154void MargulesVPSSTP::getPartialMolarVolumes(span<double> vbar) const
155{
156 double T = temperature();
157
158 // Get the standard state values in m^3 kmol-1
159 getStandardVolumes(vbar);
160
161 for (size_t i = 0; i < numBinaryInteractions_; i++) {
162 size_t iA = m_pSpecies_A_ij[i];
163 size_t iB = m_pSpecies_B_ij[i];
164 double XA = moleFractions_[iA];
165 double XB = moleFractions_[iB];
166 double g0 = (m_VHE_b_ij[i] - T * m_VSE_b_ij[i]);
167 double g1 = (m_VHE_c_ij[i] - T * m_VSE_c_ij[i]);
168 const double temp1 = g0 + g1 * XB;
169 const double all = -1.0*XA*XB*temp1 - XA*XB*XB*g1;
170
171 for (size_t iK = 0; iK < m_kk; iK++) {
172 vbar[iK] += all;
173 }
174 vbar[iA] += XB * temp1;
175 vbar[iB] += XA * temp1 + XA*XB*g1;
176 }
177}
178
180{
181 initLengths();
182 if (m_input.hasKey("interactions")) {
183 for (auto& item : m_input["interactions"].asVector<AnyMap>()) {
184 auto& species = item["species"].asVector<string>(2);
185 vector<double> h(2), s(2), vh(2), vs(2);
186 if (item.hasKey("excess-enthalpy")) {
187 h = item.convertVector("excess-enthalpy", "J/kmol", 2);
188 }
189 if (item.hasKey("excess-entropy")) {
190 s = item.convertVector("excess-entropy", "J/kmol/K", 2);
191 }
192 if (item.hasKey("excess-volume-enthalpy")) {
193 vh = item.convertVector("excess-volume-enthalpy", "m^3/kmol", 2);
194 }
195 if (item.hasKey("excess-volume-entropy")) {
196 vs = item.convertVector("excess-volume-entropy", "m^3/kmol/K", 2);
197 }
199 h[0], h[1], s[0], s[1], vh[0], vh[1], vs[0], vs[1]);
200 }
201 }
203}
204
206{
208 vector<AnyMap> interactions;
209 for (size_t n = 0; n < m_pSpecies_A_ij.size(); n++) {
210 AnyMap interaction;
211 interaction["species"] = vector<string>{
213 if (m_HE_b_ij[n] != 0 || m_HE_c_ij[n] != 0) {
214 interaction["excess-enthalpy"].setQuantity(
215 {m_HE_b_ij[n], m_HE_c_ij[n]}, "J/kmol");
216 }
217 if (m_SE_b_ij[n] != 0 || m_SE_c_ij[n] != 0) {
218 interaction["excess-entropy"].setQuantity(
219 {m_SE_b_ij[n], m_SE_c_ij[n]}, "J/kmol/K");
220 }
221 if (m_VHE_b_ij[n] != 0 || m_VHE_c_ij[n] != 0) {
222 interaction["excess-volume-enthalpy"].setQuantity(
223 {m_VHE_b_ij[n], m_VHE_c_ij[n]}, "m^3/kmol");
224 }
225 if (m_VSE_b_ij[n] != 0 || m_VSE_c_ij[n] != 0) {
226 interaction["excess-volume-entropy"].setQuantity(
227 {m_VSE_b_ij[n], m_VSE_c_ij[n]}, "m^3/kmol/K");
228 }
229 interactions.push_back(std::move(interaction));
230 }
231 phaseNode["interactions"] = std::move(interactions);
232}
233
235{
237}
238
239void MargulesVPSSTP::addBinaryInteraction(const string& speciesA,
240 const string& speciesB, double h0, double h1, double s0, double s1,
241 double vh0, double vh1, double vs0, double vs1)
242{
243 size_t kA = speciesIndex(speciesA, false);
244 size_t kB = speciesIndex(speciesB, false);
245 // The interaction is silently ignored if either species is not defined in
246 // the current phase.
247 if (kA == npos || kB == npos) {
248 return;
249 }
250 m_pSpecies_A_ij.push_back(kA);
251 m_pSpecies_B_ij.push_back(kB);
252
253 m_HE_b_ij.push_back(h0);
254 m_HE_c_ij.push_back(h1);
255 m_SE_b_ij.push_back(s0);
256 m_SE_c_ij.push_back(s1);
257 m_VHE_b_ij.push_back(vh0);
258 m_VHE_c_ij.push_back(vh1);
259 m_VSE_b_ij.push_back(vs0);
260 m_VSE_c_ij.push_back(vs1);
262}
263
264
266{
267 double T = temperature();
268 double deltaP_RT = (pressure() - OneAtm) / RT();
269 lnActCoeff_Scaled_.assign(m_kk, 0.0);
270 for (size_t i = 0; i < numBinaryInteractions_; i++) {
271 size_t iA = m_pSpecies_A_ij[i];
272 size_t iB = m_pSpecies_B_ij[i];
273 double g0 = (m_HE_b_ij[i] - T * m_SE_b_ij[i]) / RT()
274 + deltaP_RT * (m_VHE_b_ij[i] - T * m_VSE_b_ij[i]);
275 double g1 = (m_HE_c_ij[i] - T * m_SE_c_ij[i]) / RT()
276 + deltaP_RT * (m_VHE_c_ij[i] - T * m_VSE_c_ij[i]);
277 double XA = moleFractions_[iA];
278 double XB = moleFractions_[iB];
279 const double XAXB = XA * XB;
280 const double g0g1XB = (g0 + g1 * XB);
281 const double all = -1.0 * XAXB * g0g1XB - XAXB * XB * g1;
282 for (size_t iK = 0; iK < m_kk; iK++) {
283 lnActCoeff_Scaled_[iK] += all;
284 }
285 lnActCoeff_Scaled_[iA] += XB * g0g1XB;
286 lnActCoeff_Scaled_[iB] += XA * g0g1XB + XAXB * g1;
287 }
288}
289
291{
292 double invT = 1.0 / temperature();
293 double invRTT = 1.0 / GasConstant*invT*invT;
294 double deltaP = pressure() - OneAtm;
295 dlnActCoeffdT_Scaled_.assign(m_kk, 0.0);
296 d2lnActCoeffdT2_Scaled_.assign(m_kk, 0.0);
297 for (size_t i = 0; i < numBinaryInteractions_; i++) {
298 size_t iA = m_pSpecies_A_ij[i];
299 size_t iB = m_pSpecies_B_ij[i];
300 double XA = moleFractions_[iA];
301 double XB = moleFractions_[iB];
302 double g0 = -(m_HE_b_ij[i] + deltaP * m_VHE_b_ij[i]) * invRTT;
303 double g1 = -(m_HE_c_ij[i] + deltaP * m_VHE_c_ij[i]) * invRTT;
304 const double XAXB = XA * XB;
305 const double g0g1XB = (g0 + g1 * XB);
306 const double all = -1.0 * XAXB * g0g1XB - XAXB * XB * g1;
307 const double mult = 2.0 * invT;
308 const double dT2all = mult * all;
309 for (size_t iK = 0; iK < m_kk; iK++) {
310 dlnActCoeffdT_Scaled_[iK] += all;
311 d2lnActCoeffdT2_Scaled_[iK] -= dT2all;
312 }
313 dlnActCoeffdT_Scaled_[iA] += XB * g0g1XB;
314 dlnActCoeffdT_Scaled_[iB] += XA * g0g1XB + XAXB * g1;
315 d2lnActCoeffdT2_Scaled_[iA] -= mult * XB * g0g1XB;
316 d2lnActCoeffdT2_Scaled_[iB] -= mult * (XA * g0g1XB + XAXB * g1);
317 }
318}
319
320void MargulesVPSSTP::getdlnActCoeffdT(span<double> dlnActCoeffdT) const
321{
322 checkArraySize("MargulesVPSSTP::getdlnActCoeffdT", dlnActCoeffdT.size(), m_kk);
324 for (size_t k = 0; k < m_kk; k++) {
325 dlnActCoeffdT[k] = dlnActCoeffdT_Scaled_[k];
326 }
327}
328
329void MargulesVPSSTP::getd2lnActCoeffdT2(span<double> d2lnActCoeffdT2) const
330{
331 checkArraySize("MargulesVPSSTP::getd2lnActCoeffdT2", d2lnActCoeffdT2.size(), m_kk);
333 for (size_t k = 0; k < m_kk; k++) {
334 d2lnActCoeffdT2[k] = d2lnActCoeffdT2_Scaled_[k];
335 }
336}
337
338void MargulesVPSSTP::getdlnActCoeffds(const double dTds, span<const double> const dXds,
339 span<double> dlnActCoeffds) const
340{
341 checkArraySize("MargulesVPSSTP::getdlnActCoeffds", dlnActCoeffds.size(), m_kk);
342 checkArraySize("MargulesVPSSTP::getdlnActCoeffds", dXds.size(), m_kk);
343 double T = temperature();
344 double deltaP_RT = (pressure() - OneAtm) / RT();
346 for (size_t iK = 0; iK < m_kk; iK++) {
347 dlnActCoeffds[iK] = 0.0;
348 }
349
350 for (size_t i = 0; i < numBinaryInteractions_; i++) {
351 size_t iA = m_pSpecies_A_ij[i];
352 size_t iB = m_pSpecies_B_ij[i];
353 double XA = moleFractions_[iA];
354 double XB = moleFractions_[iB];
355 double dXA = dXds[iA];
356 double dXB = dXds[iB];
357 double g0 = (m_HE_b_ij[i] - T * m_SE_b_ij[i]) / RT()
358 + deltaP_RT * (m_VHE_b_ij[i] - T * m_VSE_b_ij[i]);
359 double g1 = (m_HE_c_ij[i] - T * m_SE_c_ij[i]) / RT()
360 + deltaP_RT * (m_VHE_c_ij[i] - T * m_VSE_c_ij[i]);
361 const double g02g1XB = g0 + 2*g1*XB;
362 const double g2XAdXB = 2*g1*XA*dXB;
363 const double all = (-XB * dXA - XA *dXB) * g02g1XB - XB *g2XAdXB;
364 for (size_t iK = 0; iK < m_kk; iK++) {
365 dlnActCoeffds[iK] += all + dlnActCoeffdT_Scaled_[iK]*dTds;
366 }
367 dlnActCoeffds[iA] += dXB * g02g1XB;
368 dlnActCoeffds[iB] += dXA * g02g1XB + g2XAdXB;
369 }
370}
371
373{
374 double T = temperature();
375 double deltaP_RT = (pressure() - OneAtm) / RT();
376 dlnActCoeffdlnN_diag_.assign(m_kk, 0.0);
377
378 for (size_t iK = 0; iK < m_kk; iK++) {
379 double XK = moleFractions_[iK];
380
381 for (size_t i = 0; i < numBinaryInteractions_; i++) {
382 size_t iA = m_pSpecies_A_ij[i];
383 size_t iB = m_pSpecies_B_ij[i];
384 size_t delAK = 0;
385 size_t delBK = 0;
386
387 if (iA==iK) {
388 delAK = 1;
389 } else if (iB==iK) {
390 delBK = 1;
391 }
392
393 double XA = moleFractions_[iA];
394 double XB = moleFractions_[iB];
395
396 double g0 = (m_HE_b_ij[i] - T * m_SE_b_ij[i]) / RT()
397 + deltaP_RT * (m_VHE_b_ij[i] - T * m_VSE_b_ij[i]);
398 double g1 = (m_HE_c_ij[i] - T * m_SE_c_ij[i]) / RT()
399 + deltaP_RT * (m_VHE_c_ij[i] - T * m_VSE_c_ij[i]);
400
401 dlnActCoeffdlnN_diag_[iK] += 2*(delBK-XB)*(g0*(delAK-XA)+g1*(2*(delAK-XA)*XB+XA*(delBK-XB)));
402 }
404 }
405}
406
408{
409 double T = temperature();
410 double deltaP_RT = (pressure() - OneAtm) / RT();
412
413 // Loop over the activity coefficient gamma_k
414 for (size_t iK = 0; iK < m_kk; iK++) {
415 for (size_t iM = 0; iM < m_kk; iM++) {
416 double XM = moleFractions_[iM];
417 for (size_t i = 0; i < numBinaryInteractions_; i++) {
418 size_t iA = m_pSpecies_A_ij[i];
419 size_t iB = m_pSpecies_B_ij[i];
420 double delAK = 0.0;
421 double delBK = 0.0;
422 double delAM = 0.0;
423 double delBM = 0.0;
424 if (iA==iK) {
425 delAK = 1.0;
426 } else if (iB==iK) {
427 delBK = 1.0;
428 }
429 if (iA==iM) {
430 delAM = 1.0;
431 } else if (iB==iM) {
432 delBM = 1.0;
433 }
434
435 double XA = moleFractions_[iA];
436 double XB = moleFractions_[iB];
437 double g0 = (m_HE_b_ij[i] - T * m_SE_b_ij[i]) / RT()
438 + deltaP_RT * (m_VHE_b_ij[i] - T * m_VSE_b_ij[i]);
439 double g1 = (m_HE_c_ij[i] - T * m_SE_c_ij[i]) / RT()
440 + deltaP_RT * (m_VHE_c_ij[i] - T * m_VSE_c_ij[i]);
441 dlnActCoeffdlnN_(iK,iM) += g0*((delAM-XA)*(delBK-XB)+(delAK-XA)*(delBM-XB));
442 dlnActCoeffdlnN_(iK,iM) += 2*g1*((delAM-XA)*(delBK-XB)*XB+(delAK-XA)*(delBM-XB)*XB+(delBM-XB)*(delBK-XB)*XA);
443 }
444 dlnActCoeffdlnN_(iK,iM) = XM*dlnActCoeffdlnN_(iK,iM);
445 }
446 }
447}
448
450{
451 double T = temperature();
452 double deltaP_RT = (pressure() - OneAtm) / RT();
453 dlnActCoeffdlnX_diag_.assign(m_kk, 0.0);
454
455 for (size_t i = 0; i < numBinaryInteractions_; i++) {
456 size_t iA = m_pSpecies_A_ij[i];
457 size_t iB = m_pSpecies_B_ij[i];
458
459 double XA = moleFractions_[iA];
460 double XB = moleFractions_[iB];
461
462 double g0 = (m_HE_b_ij[i] - T * m_SE_b_ij[i]) / RT()
463 + deltaP_RT * (m_VHE_b_ij[i] - T * m_VSE_b_ij[i]);
464 double g1 = (m_HE_c_ij[i] - T * m_SE_c_ij[i]) / RT()
465 + deltaP_RT * (m_VHE_c_ij[i] - T * m_VSE_c_ij[i]);
466
467 dlnActCoeffdlnX_diag_[iA] += XA*XB*(2*g1*-2*g0-6*g1*XB);
468 dlnActCoeffdlnX_diag_[iB] += XA*XB*(2*g1*-2*g0-6*g1*XB);
469 }
470}
471
472void MargulesVPSSTP::getdlnActCoeffdlnN_diag(span<double> dlnActCoeffdlnN_diag) const
473{
475 for (size_t k = 0; k < m_kk; k++) {
476 dlnActCoeffdlnN_diag[k] = dlnActCoeffdlnN_diag_[k];
477 }
478}
479
480void MargulesVPSSTP::getdlnActCoeffdlnX_diag(span<double> dlnActCoeffdlnX_diag) const
481{
483 for (size_t k = 0; k < m_kk; k++) {
484 dlnActCoeffdlnX_diag[k] = dlnActCoeffdlnX_diag_[k];
485 }
486}
487
488void MargulesVPSSTP::getdlnActCoeffdlnN(const size_t ld, span<double> dlnActCoeffdlnN)
489{
491 double* data = & dlnActCoeffdlnN_(0,0);
492 for (size_t k = 0; k < m_kk; k++) {
493 for (size_t m = 0; m < m_kk; m++) {
494 dlnActCoeffdlnN[ld * k + m] = data[m_kk * k + m];
495 }
496 }
497}
498
499}
(see Thermodynamic Properties and class MargulesVPSSTP).
Declarations for the virtual base class PDSS (pressure dependent standard state) which handles calcul...
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.
Definition AnyMap.h:431
bool hasKey(const string &key) const
Returns true if the map contains an item named key.
Definition AnyMap.cpp:1477
void zero()
Set all of the entries to zero.
Definition Array.h:118
virtual void resize(size_t n, size_t m, double v=0.0)
Resize the array, and fill the new entries with 'v'.
Definition Array.cpp:52
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 ...
vector< double > dlnActCoeffdlnN_diag_
Storage for the current derivative values of the gradients with respect to logarithm of the mole frac...
void getLnActivityCoefficients(span< double > lnac) const override
Get the array of non-dimensional molar-based ln activity coefficients at the current solution tempera...
double thermalExpansionCoeff() const override
Thermal expansion coefficient of the mixture.
void getPartialMolarEnthalpies(span< double > hbar) const override
Returns an array of partial molar enthalpies for the species in the mixture.
vector< double > m_VHE_c_ij
Enthalpy term for the ternary mole fraction interaction of the excess Gibbs free energy expression.
vector< double > m_SE_b_ij
Entropy term for the binary mole fraction interaction of the excess Gibbs free energy expression.
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 entropies for the species in the mixture.
size_t numBinaryInteractions_
number of binary interaction expressions
void getd2lnActCoeffdT2(span< double > d2lnActCoeffdT2) const
Get the array of temperature second derivatives of the log activity coefficients.
vector< double > m_SE_c_ij
Entropy term for the ternary mole fraction interaction of the excess Gibbs free energy expression.
void s_update_dlnActCoeff_dlnN_diag() const
Update the derivative of the log of the activity coefficients wrt log(moles) - diagonal only.
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.
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< double > m_VSE_c_ij
Entropy term for the ternary mole fraction interaction of the excess Gibbs free energy expression.
void s_update_dlnActCoeff_dlnN() const
Update the derivative of the log of the activity coefficients wrt log(moles_m)
double isothermalCompressibility() const override
Isothermal compressibility of the mixture.
vector< double > m_HE_b_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression.
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,...
vector< double > m_VSE_b_ij
Entropy term for the binary mole fraction interaction of the excess Gibbs free energy expression.
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
Update the derivative of the log of the activity coefficients wrt log(mole fraction)
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.
vector< double > m_VHE_b_ij
Enthalpy term for the binary mole fraction interaction of the excess Gibbs free energy expression.
void addBinaryInteraction(const string &speciesA, const string &speciesB, double h0, double h1, double s0, double s1, double vh0, double vh1, double vs0, double vs1)
Add a binary species interaction with the specified parameters.
MargulesVPSSTP(const string &inputFile="", const string &id="")
Construct a MargulesVPSSTP object from an input file.
void getChemPotentials(span< double > mu) const override
Get the species chemical potentials. Units: J/kmol.
vector< double > m_HE_c_ij
Enthalpy term for the ternary mole fraction interaction of the excess Gibbs free energy expression.
virtual double dVdT() const
Return the temperature derivative of the standard state molar volume at constant pressure [m³/kmol/K]...
Definition PDSS.cpp:73
virtual double dVdP() const
Return the pressure derivative of the standard state molar volume at constant temperature [m³/kmol/Pa...
Definition PDSS.cpp:78
size_t m_kk
Number of species in the phase.
Definition Phase.h:882
size_t speciesIndex(const string &name, bool raise=true) const
Returns the index of a species named 'name' within the Phase object.
Definition Phase.cpp:127
double temperature() const
Temperature (K).
Definition Phase.h:586
string speciesName(size_t k) const
Name of the species with index k.
Definition Phase.cpp:143
shared_ptr< Species > species(const string &name) const
Return the Species object for the named species.
Definition Phase.cpp:943
virtual double molarVolume() const
Molar volume (m^3/kmol).
Definition Phase.cpp:602
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...
double pressure() const override
Returns the current pressure of the phase.
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 OneAtm
One atmosphere [Pa].
Definition ct_defs.h:99
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition ct_defs.h:123
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595
const size_t npos
index returned by functions to indicate "no position"
Definition ct_defs.h:183
const double SmallNumber
smallest number to compare to zero.
Definition ct_defs.h:161
void checkArraySize(const char *procedure, size_t available, size_t required)
Wrapper for throwing ArraySizeError.
Contains declarations for string manipulation functions within Cantera.