mirror of
https://github.com/CoolProp/CoolProp.git
synced 2026-01-22 20:38:01 -05:00
162
doc/notebooks/Check critical point derivative matrices.ipynb
Normal file
162
doc/notebooks/Check critical point derivative matrices.ipynb
Normal file
@@ -0,0 +1,162 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:a09a62c5ca301d3f63e20ae1ddea45013e338af6b73280fca44334e814ae310d"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
"worksheets": [
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from __future__ import division\n",
|
||||
"from sympy import *\n",
|
||||
"from IPython.display import display, Math, Latex\n",
|
||||
"from IPython.core.display import display_html\n",
|
||||
"init_session(quiet=True, use_latex='mathjax')\n",
|
||||
"init_printing()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"stream": "stdout",
|
||||
"text": [
|
||||
"IPython console for SymPy 0.7.6 (Python 2.7.6-32-bit) (ground types: python)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 1
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"x1,x2,tau,delta = symbols('x1,x2,tau,delta')\n",
|
||||
"L11 = symbols('L11', cls=Function)(x1,x2,tau,delta)\n",
|
||||
"L12 = symbols('L12', cls=Function)(x1,x2,tau,delta)\n",
|
||||
"L21 = symbols('L21', cls=Function)(x1,x2,tau,delta)\n",
|
||||
"L22 = symbols('L22', cls=Function)(x1,x2,tau,delta)"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 2
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"Lstar = Matrix([[L11,L12],[L21,L22]])\n",
|
||||
"L1star = Lstar.det()\n",
|
||||
"deriv1 = L1star.diff(t)\n",
|
||||
"deriv2 = (Lstar.adjugate()*Lstar.diff(t)).trace()\n",
|
||||
"\n",
|
||||
"Mstar = Matrix([[L11,L12],[Lstar.det().diff(x1),Lstar.det().diff(x2)]])\n",
|
||||
"\n",
|
||||
"deriv1 = Mstar.det().diff(tau)\n",
|
||||
"deriv2 = (Mstar.adjugate()*Mstar.diff(tau)).trace()\n",
|
||||
"simplify(deriv1-deriv2)"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"latex": [
|
||||
"$$0$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJdjLNVN0iZu+7\nq0QgoRR7AAAAVklEQVQIHWNgEDJRZWBgSGeQmMDAtYGBOYGB5wID+0cG/gsMfN8Z5BUY+L4wzDdg\nYP0MJeUNQCL8Cgzs3xk4DjBwfWRg2cDAlMDA0M4gHcDAIOxylQEA9FISlFfRJtkAAAAASUVORK5C\nYII=\n",
|
||||
"prompt_number": 3,
|
||||
"text": [
|
||||
"0"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 3
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"Mstar = Matrix([[0.00112865, 8.76232e-006],[9.57021e-007, 7.42578e-009]])\n",
|
||||
"dMstar_dTau = Matrix([[-0.000245724,-0.00118232],[3.20921e-006, -7.171e-008]])\n",
|
||||
"adjM = Matrix([[7.42578e-009,-9.57021e-007],[-8.76232e-006, 0.00112865]])\n",
|
||||
"(adjM*dMstar_dTau).trace()\n",
|
||||
"print Mstar.adjugate()\n",
|
||||
"print adjM"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"stream": "stdout",
|
||||
"text": [
|
||||
"Matrix([[7.42578000000000e-9, -8.76232000000000e-6], [-9.57021000000000e-7, 0.00112865000000000]])\n",
|
||||
"Matrix([[7.42578000000000e-9, -9.57021000000000e-7], [-8.76232000000000e-6, 0.00112865000000000]])\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 7
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"a,b,c,d = symbols('a,b,c,d')\n",
|
||||
"M = Matrix([[a,b],[c,d]])\n",
|
||||
"display(M)\n",
|
||||
"M.adjugate()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"latex": [
|
||||
"$$\\left[\\begin{matrix}a & b\\\\c & d\\end{matrix}\\right]$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAAyBAMAAAAKOF7GAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhAiq3bdRLtm\nmc0lg57xAAABSUlEQVQ4Ee3UPUsDMRwG8OdSr9DT1oIuouANDgoO9w0qWPdzFrlu7rp0cOhQEARB\nEHHVT2D9AIqjo4Pgpi7iVBGlDlI4E/LSZ7hmdjDLJfnxz11yD8Fi/omiJvK8jpnmRpEhbK7XMVtI\nanKiGLfmPIg3H355MBp4UBwTlne7p2poW619lLivvWhNflhQz+wV3xbDBVR7jI0U8tj0PqsDVDqM\nTwgdBj1ka4x9RHIzujKL0UBKOoRczGKCm1KL8AebtxZrnakzQYZ9XMuhXjZsL+0cMm4fyEKDPE99\nXUkT3P1HeRpjDyG6uh+PmE48eJl6cMXzTvRHKJa7/LNkyF3AUD7BO6MMuQsYghh7hCrkL27ZZ84l\nVC4rscN5KpPdQIb83KLKPjcTcnN8Q6BEmumQG3xE+EBoQm5QrN6RwYTcIMuo/xfRe6X6LuNfjWlM\nFpMM9N8AAAAASUVORK5CYII=\n",
|
||||
"text": [
|
||||
"\u23a1a b\u23a4\n",
|
||||
"\u23a2 \u23a5\n",
|
||||
"\u23a3c d\u23a6"
|
||||
]
|
||||
},
|
||||
{
|
||||
"latex": [
|
||||
"$$\\left[\\begin{matrix}d & - b\\\\- c & a\\end{matrix}\\right]$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAFMAAAAyBAMAAADSNPrMAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhBEu5ndzSKr\ndmb+gm2XAAABbElEQVRIDWOQ//+JgTBg+v9fgEHYxZWwSgZWF2cBBhEiFIKUsCArTZfArou1cAK6\nUobP2JUycB1AV8r2FYdSfgN0pUwge7CB/ACgKIpbuRqwqQOKaYLEkZTu0fUH2YMNrLnbjKyUTZqh\nHmQPFsD6K4B/A5KpgQ8YurAoAwkxf2XgV0BS2h/AMAlNKevKmUAwy4FjAUM8slJxBtZvaEphXKB3\n8w0QprJ+YmD+wAqTRKX5HzAA7YSHAOtnBvYF1qhKYDz+BFY55BBYy/DygAJMEpXmecDegKw05pL3\n2QRUJTAea+85IBPuAJgwbnpU6WgIDLoQULrrgJZi9+h6QooHNLfuNOBagKoUVJJARNCUCjHwoBVG\nwJKkHVkpvGzALDWBuXouslKYnYwFMBacBpYkX7ApBRY3aACpJEF1K7AYYUB1K1JJgqqU4wBDhAOq\nuYiSBFUpg9K7C6gqGRAlCZpSNHUo3OGrlIRKnvimAwCJ/VUvfMvpJAAAAABJRU5ErkJggg==\n",
|
||||
"prompt_number": 11,
|
||||
"text": [
|
||||
"\u23a1d -b\u23a4\n",
|
||||
"\u23a2 \u23a5\n",
|
||||
"\u23a3-c a \u23a6"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 11
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
}
|
||||
],
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -908,7 +908,7 @@ static Eigen::MatrixXd adjugate(const Eigen::MatrixBase<Derived>& A)
|
||||
for (std::size_t i = 0; i < N; ++i){
|
||||
for (std::size_t j = 0; j < N; ++j){
|
||||
int negative_1_to_the_i_plus_j = ((i+j)%2==0) ? 1 : -1;
|
||||
Aadj(i, j) = negative_1_to_the_i_plus_j*minor_matrix(A, i, j).determinant();
|
||||
Aadj(i, j) = negative_1_to_the_i_plus_j*minor_matrix(A, j, i).determinant();
|
||||
}
|
||||
}
|
||||
return Aadj;
|
||||
|
||||
@@ -2932,34 +2932,46 @@ void HelmholtzEOSMixtureBackend::calc_critical_point(double rho0, double T0)
|
||||
};
|
||||
std::vector<std::vector<double> > Jacobian(const std::vector<double> &x)
|
||||
{
|
||||
double epsilon;
|
||||
std::size_t N = x.size();
|
||||
std::vector<double> r, xp;
|
||||
std::vector<std::vector<double> > J(N, std::vector<double>(N, 0));
|
||||
Eigen::MatrixXd J0(N, N), adjL = adjugate(MixtureDerivatives::Lstar(HEOS, XN_INDEPENDENT)),
|
||||
dLdTau = MixtureDerivatives::dLstar_dX(HEOS, XN_INDEPENDENT, iTau),
|
||||
dLdDelta = MixtureDerivatives::dLstar_dX(HEOS, XN_INDEPENDENT, iDelta),
|
||||
adjM = adjugate(MixtureDerivatives::Mstar(HEOS, XN_INDEPENDENT)),
|
||||
dMdTau = dLdTau, dMdDelta = dLdDelta;
|
||||
Eigen::MatrixXd adjL = adjugate(MixtureDerivatives::Lstar(HEOS, XN_INDEPENDENT)),
|
||||
adjM = adjugate(MixtureDerivatives::Mstar(HEOS, XN_INDEPENDENT)),
|
||||
dLdTau = MixtureDerivatives::dLstar_dX(HEOS, XN_INDEPENDENT, iTau),
|
||||
dLdDelta = MixtureDerivatives::dLstar_dX(HEOS, XN_INDEPENDENT, iDelta),
|
||||
dMdTau = MixtureDerivatives::dMstar_dX(HEOS, XN_INDEPENDENT, iTau),
|
||||
dMdDelta = MixtureDerivatives::dMstar_dX(HEOS, XN_INDEPENDENT, iDelta);
|
||||
|
||||
J0(0,0) = (adjL*dLdTau).trace();
|
||||
J0(0,1) = (adjL*dLdDelta).trace();
|
||||
//std::cout << J0 << std::endl;
|
||||
std::vector<double> r0 = call(x);
|
||||
J[0][0] = (adjL*dLdTau).trace();
|
||||
J[0][1] = (adjL*dLdDelta).trace();
|
||||
J[1][0] = (adjM*dMdTau).trace();
|
||||
J[1][1] = (adjM*dMdDelta).trace();
|
||||
return J;
|
||||
}
|
||||
/// Not used, for testing purposes
|
||||
std::vector<std::vector<double> > numerical_Jacobian(const std::vector<double> &x)
|
||||
{
|
||||
std::size_t N = x.size();
|
||||
std::vector<double> rplus, rminus, xp;
|
||||
std::vector<std::vector<double> > J(N, std::vector<double>(N, 0));
|
||||
|
||||
double epsilon = 0.0001;
|
||||
|
||||
// Build the Jacobian by column
|
||||
for (std::size_t i = 0; i < N; ++i)
|
||||
{
|
||||
xp = x;
|
||||
epsilon = 0.00001;
|
||||
xp[i] += epsilon;
|
||||
r = call(xp);
|
||||
rplus = call(xp);
|
||||
xp[i] -= 2*epsilon;
|
||||
rminus = call(xp);
|
||||
|
||||
for (std::size_t j = 0; j < N; ++j)
|
||||
{
|
||||
J[j][i] = (r[j]-r0[j])/epsilon;
|
||||
J[j][i] = (rplus[j]-rminus[j])/(2*epsilon);
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << J[0][0] << " " << J[0][1] << std::endl;
|
||||
std::cout << J[1][0] << " " << J[1][1] << std::endl;
|
||||
return J;
|
||||
};
|
||||
};
|
||||
@@ -2987,13 +2999,11 @@ public:
|
||||
return L1;
|
||||
}
|
||||
double deriv(double tau){
|
||||
std::size_t N = HEOS.get_mole_fractions().size();
|
||||
Eigen::MatrixXd adjL = adjugate(MixtureDerivatives::Lstar(HEOS, XN_INDEPENDENT)),
|
||||
dLdTau = MixtureDerivatives::dLstar_dX(HEOS, XN_INDEPENDENT, iTau);
|
||||
return (adjL*dLdTau).trace();
|
||||
};
|
||||
double second_deriv(double tau){
|
||||
std::size_t N = HEOS.get_mole_fractions().size();
|
||||
Eigen::MatrixXd Lstar = MixtureDerivatives::Lstar(HEOS, XN_INDEPENDENT),
|
||||
dLstardTau = MixtureDerivatives::dLstar_dX(HEOS, XN_INDEPENDENT, iTau),
|
||||
d2LstardTau2 = MixtureDerivatives::d2Lstar_dX2(HEOS, XN_INDEPENDENT, iTau, iTau),
|
||||
@@ -3050,7 +3060,6 @@ public:
|
||||
@param theta The angle
|
||||
*/
|
||||
double deriv(double theta){
|
||||
std::size_t N = HEOS.get_mole_fractions().size();
|
||||
double dL1_dtau = (adjLstar*dLstardTau).trace(), dL1_ddelta = (adjLstar*dLstardDelta).trace();
|
||||
return -R_tau*sin(theta)*dL1_dtau + R_delta*cos(theta)*dL1_ddelta;
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -71,7 +71,6 @@ class MixtureDerivatives{
|
||||
static CoolPropDbl d4alphar_dxi_dxj_dDelta2(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d4alphar_dxi_dxj_dDelta_dTau(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d4alphar_dxi_dxj_dTau2(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d4alphardxidxjdxk(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
|
||||
/** \brief GERG 2004 Monograph equation 7.63
|
||||
@@ -162,9 +161,14 @@ class MixtureDerivatives{
|
||||
static CoolPropDbl ndln_fugacity_i_dnj__constT_V_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d_ndln_fugacity_i_dnj_dtau__constdelta_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_ndln_fugacity_i_dnj_dtau2__constdelta_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_ndln_fugacity_i_dnj_ddelta_dtau__constx(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_ndln_fugacity_i_dnj_ddelta2__consttau_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d_ndln_fugacity_i_dnj_ddelta__consttau_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d_ndln_fugacity_i_dnj_ddxk__consttau_delta(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl d2_ndln_fugacity_i_dnj_dxk_dTau__constdelta(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_ndln_fugacity_i_dnj_dxk_dDelta__consttau(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl nd_ndln_fugacity_i_dnj_dnk__constT_V_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl nAij(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag){
|
||||
@@ -175,6 +179,51 @@ class MixtureDerivatives{
|
||||
CoolPropDbl RT = HEOS.gas_constant()*HEOS.T();
|
||||
return 1/RT*nd_ndln_fugacity_i_dnj_dnk__constT_V_xi(HEOS, i, j, k, xN_flag) - nAij(HEOS, i, j, xN_flag);
|
||||
}
|
||||
static CoolPropDbl d_nAij_dX(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag, parameters WRT)
|
||||
{
|
||||
if (WRT == iTau){
|
||||
return 1/(HEOS.gas_constant()*HEOS.T_reducing())*MixtureDerivatives::ndln_fugacity_i_dnj__constT_V_xi(HEOS, i, j, xN_flag)
|
||||
+ 1/(HEOS.gas_constant()*HEOS.T())*MixtureDerivatives::d_ndln_fugacity_i_dnj_dtau__constdelta_x(HEOS, i, j, xN_flag);
|
||||
}
|
||||
else if (WRT == iDelta){
|
||||
return 1/(HEOS.gas_constant()*HEOS.T())*MixtureDerivatives::d_ndln_fugacity_i_dnj_ddelta__consttau_x(HEOS, i, j, xN_flag);
|
||||
}
|
||||
else{
|
||||
throw ValueError(format("wrong WRT"));
|
||||
}
|
||||
}
|
||||
static CoolPropDbl d_n2Aijk_dX(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag, parameters WRT){
|
||||
CoolPropDbl RT = HEOS.gas_constant()*HEOS.T();
|
||||
if (WRT == iTau){
|
||||
double summer = 0;
|
||||
summer += d2_ndln_fugacity_i_dnj_dtau2__constdelta_x(HEOS, i, j, xN_flag)*ndtaudni__constT_V_nj(HEOS, k, xN_flag);
|
||||
summer += d_ndln_fugacity_i_dnj_dtau__constdelta_x(HEOS, i, j, xN_flag)*d_ndtaudni_dTau(HEOS, k, xN_flag);
|
||||
summer += d2_ndln_fugacity_i_dnj_ddelta_dtau__constx(HEOS, i, j, xN_flag)*nddeltadni__constT_V_nj(HEOS, k, xN_flag);
|
||||
summer += d2_ndln_fugacity_i_dnj_dxk_dTau__constdelta(HEOS, i, j, k, xN_flag);
|
||||
std::size_t mmax = HEOS.mole_fractions.size();
|
||||
if (xN_flag == XN_DEPENDENT){ mmax--; }
|
||||
for (std::size_t m = 0; m < mmax; ++m){
|
||||
summer -= HEOS.mole_fractions[m]*d2_ndln_fugacity_i_dnj_dxk_dTau__constdelta(HEOS, i, j, m, xN_flag);
|
||||
}
|
||||
return 1/RT*summer + 1/(HEOS.gas_constant()*HEOS.T_reducing())*nd_ndln_fugacity_i_dnj_dnk__constT_V_xi(HEOS,i,j,k,xN_flag) - d_nAij_dX(HEOS, i, j, xN_flag, WRT);
|
||||
}
|
||||
else if (WRT== iDelta){
|
||||
double summer = 0;
|
||||
summer += d2_ndln_fugacity_i_dnj_ddelta_dtau__constx(HEOS, i, j, xN_flag)*ndtaudni__constT_V_nj(HEOS, k, xN_flag);
|
||||
summer += d2_ndln_fugacity_i_dnj_ddelta2__consttau_x(HEOS, i, j, xN_flag)*nddeltadni__constT_V_nj(HEOS, k, xN_flag);
|
||||
summer += d_ndln_fugacity_i_dnj_ddelta__consttau_x(HEOS, i, j, xN_flag)*d_nddeltadni_dDelta(HEOS, k, xN_flag);
|
||||
summer += d2_ndln_fugacity_i_dnj_dxk_dDelta__consttau(HEOS, i, j, k, xN_flag);
|
||||
std::size_t mmax = HEOS.mole_fractions.size();
|
||||
if (xN_flag == XN_DEPENDENT){ mmax--; }
|
||||
for (std::size_t m = 0; m < mmax; ++m){
|
||||
summer -= HEOS.mole_fractions[m]*d2_ndln_fugacity_i_dnj_dxk_dDelta__consttau(HEOS, i, j, m, xN_flag);
|
||||
}
|
||||
return 1/RT*summer - d_nAij_dX(HEOS, i, j, xN_flag, iDelta);
|
||||
}
|
||||
else{
|
||||
return _HUGE;
|
||||
}
|
||||
}
|
||||
static Eigen::MatrixXd Lstar(HelmholtzEOSMixtureBackend &HEOS, x_N_dependency_flag xN_flag){
|
||||
std::size_t N = HEOS.mole_fractions.size();
|
||||
Eigen::MatrixXd L;
|
||||
@@ -198,16 +247,7 @@ class MixtureDerivatives{
|
||||
Eigen::MatrixXd dLstar_dX(N, N);
|
||||
for (std::size_t i = 0; i < N; ++i){
|
||||
for (std::size_t j = i; j < N; ++j){
|
||||
if (WRT == iTau){
|
||||
dLstar_dX(i, j) = 1/(HEOS.gas_constant()*HEOS.T_reducing())*MixtureDerivatives::ndln_fugacity_i_dnj__constT_V_xi(HEOS, i, j, xN_flag)
|
||||
+ 1/(HEOS.gas_constant()*HEOS.T())*MixtureDerivatives::d_ndln_fugacity_i_dnj_dtau__constdelta_x(HEOS, i, j, xN_flag);
|
||||
}
|
||||
else if (WRT == iDelta){
|
||||
dLstar_dX(i, j) = 1/(HEOS.gas_constant()*HEOS.T())*MixtureDerivatives::d_ndln_fugacity_i_dnj_ddelta__consttau_x(HEOS, i, j, xN_flag);
|
||||
}
|
||||
else{
|
||||
throw ValueError(format("dLstar_dX invalid WRT"));
|
||||
}
|
||||
dLstar_dX(i, j) = d_nAij_dX(HEOS, i, j, xN_flag, WRT);
|
||||
}
|
||||
}
|
||||
// Fill in the symmetric elements
|
||||
@@ -244,7 +284,9 @@ class MixtureDerivatives{
|
||||
static Eigen::MatrixXd Mstar(HelmholtzEOSMixtureBackend &HEOS, x_N_dependency_flag xN_flag){
|
||||
|
||||
std::size_t N = HEOS.mole_fractions.size();
|
||||
Eigen::MatrixXd L = Lstar(HEOS, xN_flag), M = L;
|
||||
Eigen::MatrixXd L = Lstar(HEOS, xN_flag),
|
||||
M = L,
|
||||
adjL = adjugate(L);
|
||||
|
||||
// Last row
|
||||
for (std::size_t i = 0; i < N; ++i){
|
||||
@@ -252,18 +294,39 @@ class MixtureDerivatives{
|
||||
for (std::size_t j = 0; j < N; ++j){
|
||||
for (std::size_t k = j; k < N; ++k){
|
||||
n2dLdni(j, k) = n2Aijk(HEOS, j, k, i, xN_flag);
|
||||
// Fill in the symmetric elements
|
||||
n2dLdni(k, j) = n2dLdni(j, k);
|
||||
}
|
||||
}
|
||||
// Fill in the symmetric elements
|
||||
for (std::size_t j = 0; j < N; ++j){
|
||||
for (std::size_t k = 0; k < j; ++k){
|
||||
n2dLdni(j, k) = n2dLdni(k, j);
|
||||
}
|
||||
}
|
||||
M(N-1, i) = (adjugate(L)*n2dLdni).trace();
|
||||
M(N-1, i) = (adjL*n2dLdni).trace();
|
||||
}
|
||||
return M;
|
||||
}
|
||||
static Eigen::MatrixXd dMstar_dX(HelmholtzEOSMixtureBackend &HEOS, x_N_dependency_flag xN_flag, parameters WRT){
|
||||
|
||||
std::size_t N = HEOS.mole_fractions.size();
|
||||
Eigen::MatrixXd L = Lstar(HEOS, xN_flag),
|
||||
dL_dX = dLstar_dX(HEOS, xN_flag, WRT),
|
||||
dMstar = dL_dX,
|
||||
adjL = adjugate(L),
|
||||
d_adjL_dX = adjugate_derivative(L, dL_dX);
|
||||
|
||||
// Last row in the d(Mstar)/d(X) requires derivatives of
|
||||
for (std::size_t i = 0; i < N; ++i){
|
||||
Eigen::MatrixXd n2dLdni(N, N), d_n2dLdni_dX(N, N);
|
||||
for (std::size_t j = 0; j < N; ++j){
|
||||
for (std::size_t k = j; k < N; ++k){
|
||||
n2dLdni(j, k) = n2Aijk(HEOS, j, k, i, xN_flag);
|
||||
d_n2dLdni_dX(j, k) = d_n2Aijk_dX(HEOS, j, k, i, xN_flag, WRT);
|
||||
// Fill in the symmetric elements
|
||||
n2dLdni(k, j) = n2dLdni(j, k);
|
||||
d_n2dLdni_dX(k, j) = d_n2dLdni_dX(j, k);
|
||||
}
|
||||
}
|
||||
dMstar(N-1, i) = (n2dLdni*d_adjL_dX + adjL*d_n2dLdni_dX).trace();
|
||||
}
|
||||
return dMstar;
|
||||
}
|
||||
|
||||
/** \brief Table B4, Kunz, JCED, 2012 for the original term and the subsequent substitutions
|
||||
*
|
||||
@@ -497,6 +560,8 @@ class MixtureDerivatives{
|
||||
*/
|
||||
static CoolPropDbl d2_ndalphardni_dxj_dTau__constdelta_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d3_ndalphardni_dxj_dTau2__constdelta_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d3_ndalphardni_dxj_dDelta2__consttau_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d3_ndalphardni_dxj_dDelta_dTau__constxi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
|
||||
/** \brief GERG 2004 Monograph equation 7.41
|
||||
*
|
||||
@@ -540,6 +605,8 @@ class MixtureDerivatives{
|
||||
*/
|
||||
static CoolPropDbl d_nd_ndalphardni_dnj_dTau__constdelta_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_nd_ndalphardni_dnj_dTau2__constdelta_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_nd_ndalphardni_dnj_dDelta2__consttau_x(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_nd_ndalphardni_dnj_dDelta_dTau__constx(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
|
||||
/* \brief \f$\delta\f$ derivative of GERG 2004 7.47
|
||||
*
|
||||
@@ -550,6 +617,9 @@ class MixtureDerivatives{
|
||||
*
|
||||
*/
|
||||
static CoolPropDbl d_nd_ndalphardni_dnj_dxk__consttau_delta(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl d2_nd_ndalphardni_dnj_dxk_dTau__constdelta(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d2_nd_ndalphardni_dnj_dxk_dDelta__consttau(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
/** \brief GERG 2004 Monograph equation 7.48
|
||||
*
|
||||
@@ -567,6 +637,8 @@ class MixtureDerivatives{
|
||||
|
||||
static CoolPropDbl d_nddeltadni_dxj__constdelta_tau(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl d2_nddeltadni_dxj_dDelta__consttau(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
|
||||
/** \brief GERG 2004 Monograph equation 7.49
|
||||
*
|
||||
* The derivative term
|
||||
@@ -583,6 +655,8 @@ class MixtureDerivatives{
|
||||
|
||||
static CoolPropDbl d_ndtaudni_dxj__constdelta_tau(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl d2_ndtaudni_dxj_dTau__constdelta(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag);
|
||||
|
||||
/** \brief GERG 2004 Monograph equation 7.52
|
||||
*
|
||||
* The derivative term
|
||||
@@ -605,6 +679,9 @@ class MixtureDerivatives{
|
||||
*/
|
||||
static CoolPropDbl d2_ndalphardni_dxj_dxk__constdelta_tau_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
static CoolPropDbl d3_ndalphardni_dxj_dxk_dTau__constdelta_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
static CoolPropDbl d3_ndalphardni_dxj_dxk_dDelta__consttau_xi(HelmholtzEOSMixtureBackend &HEOS, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag);
|
||||
|
||||
}; /* class MixtureDerivatives */
|
||||
|
||||
} /* namepsace CoolProp*/
|
||||
|
||||
Reference in New Issue
Block a user