17 for (std::size_t i = 1; i < x.size(); ++i) {
26 return std::abs(i) > std::abs(j);
146 CoolPropDbl log_tau = log(tau), log_delta = log(delta), ndteu = NAN, one_over_delta = 1 / delta,
147 one_over_tau = 1 / tau;
152 for (std::size_t i = 0; i <
N; ++i) {
172 const CoolPropDbl d2u_ddelta2_increment = (
l_double - 1) * du_ddelta_increment * one_over_delta;
173 const CoolPropDbl d3u_ddelta3_increment = (
l_double - 2) * d2u_ddelta2_increment * one_over_delta;
174 const CoolPropDbl d4u_ddelta4_increment = (
l_double - 3) * d3u_ddelta3_increment * one_over_delta;
176 du_ddelta += du_ddelta_increment;
177 d2u_ddelta2 += d2u_ddelta2_increment;
178 d3u_ddelta3 += d3u_ddelta3_increment;
179 d4u_ddelta4 += d4u_ddelta4_increment;
188 const CoolPropDbl d3u_dtau3_increment = (
m_double - 2) * d2u_dtau2_increment * one_over_tau;
189 const CoolPropDbl d4u_dtau4_increment = (
m_double - 3) * d3u_dtau3_increment * one_over_tau;
191 du_dtau += du_dtau_increment;
192 d2u_dtau2 += d2u_dtau2_increment;
193 d3u_dtau3 += d3u_dtau3_increment;
194 d4u_dtau4 += d4u_dtau4_increment;
209 d2u_ddelta2 += -2 *
eta2;
224 d2u_dtau2 += -2 *
beta2;
228 ndteu = ni * exp(ti * log_tau + di * log_delta + u);
230 const CoolPropDbl dB_delta_ddelta = delta * d2u_ddelta2 + du_ddelta;
231 const CoolPropDbl d2B_delta_ddelta2 = delta * d3u_ddelta3 + 2 * d2u_ddelta2;
232 const CoolPropDbl d3B_delta_ddelta3 = delta * d4u_ddelta4 + 3 * d3u_ddelta3;
234 const CoolPropDbl B_delta = (delta * du_ddelta + di);
235 const CoolPropDbl B_delta2 = delta * dB_delta_ddelta + (B_delta - 1) * B_delta;
236 const CoolPropDbl dB_delta2_ddelta = delta * d2B_delta_ddelta2 + 2 * B_delta * dB_delta_ddelta;
237 const CoolPropDbl B_delta3 = delta * dB_delta2_ddelta + (B_delta - 2) * B_delta2;
238 const CoolPropDbl dB_delta3_ddelta = delta * delta * d3B_delta_ddelta3 + 3 * delta * B_delta * d2B_delta_ddelta2
239 + 3 * delta *
POW2(dB_delta_ddelta) + 3 * B_delta * (B_delta - 1) * dB_delta_ddelta;
240 const CoolPropDbl B_delta4 = delta * dB_delta3_ddelta + (B_delta - 3) * B_delta3;
242 const CoolPropDbl dB_tau_dtau = tau * d2u_dtau2 + du_dtau;
243 const CoolPropDbl d2B_tau_dtau2 = tau * d3u_dtau3 + 2 * d2u_dtau2;
244 const CoolPropDbl d3B_tau_dtau3 = tau * d4u_dtau4 + 3 * d3u_dtau3;
247 const CoolPropDbl B_tau2 = tau * dB_tau_dtau + (B_tau - 1) * B_tau;
248 const CoolPropDbl dB_tau2_dtau = tau * d2B_tau_dtau2 + 2 * B_tau * dB_tau_dtau;
249 const CoolPropDbl B_tau3 = tau * dB_tau2_dtau + (B_tau - 2) * B_tau2;
251 tau * tau * d3B_tau_dtau3 + 3 * tau * B_tau * d2B_tau_dtau2 + 3 * tau *
POW2(dB_tau_dtau) + 3 * B_tau * (B_tau - 1) * dB_tau_dtau;
252 const CoolPropDbl B_tau4 = tau * dB_tau3_dtau + (B_tau - 3) * B_tau3;
254 derivs.alphar += ndteu;
256 derivs.dalphar_ddelta += ndteu * B_delta;
257 derivs.dalphar_dtau += ndteu * B_tau;
259 derivs.d2alphar_ddelta2 += ndteu * B_delta2;
260 derivs.d2alphar_ddelta_dtau += ndteu * B_delta * B_tau;
261 derivs.d2alphar_dtau2 += ndteu * B_tau2;
263 derivs.d3alphar_ddelta3 += ndteu * B_delta3;
264 derivs.d3alphar_ddelta2_dtau += ndteu * B_delta2 * B_tau;
265 derivs.d3alphar_ddelta_dtau2 += ndteu * B_delta * B_tau2;
266 derivs.d3alphar_dtau3 += ndteu * B_tau3;
268 derivs.d4alphar_ddelta4 += ndteu * B_delta4;
269 derivs.d4alphar_ddelta3_dtau += ndteu * B_delta3 * B_tau;
270 derivs.d4alphar_ddelta2_dtau2 += ndteu * B_delta2 * B_tau2;
271 derivs.d4alphar_ddelta_dtau3 += ndteu * B_delta * B_tau3;
272 derivs.d4alphar_dtau4 += ndteu * B_tau4;
274 derivs.dalphar_ddelta *= one_over_delta;
275 derivs.dalphar_dtau *= one_over_tau;
276 derivs.d2alphar_ddelta2 *=
POW2(one_over_delta);
277 derivs.d2alphar_dtau2 *=
POW2(one_over_tau);
278 derivs.d2alphar_ddelta_dtau *= one_over_delta * one_over_tau;
280 derivs.d3alphar_ddelta3 *=
POW3(one_over_delta);
281 derivs.d3alphar_dtau3 *=
POW3(one_over_tau);
282 derivs.d3alphar_ddelta2_dtau *=
POW2(one_over_delta) * one_over_tau;
283 derivs.d3alphar_ddelta_dtau2 *= one_over_delta *
POW2(one_over_tau);
285 derivs.d4alphar_ddelta4 *=
POW4(one_over_delta);
286 derivs.d4alphar_dtau4 *=
POW4(one_over_tau);
287 derivs.d4alphar_ddelta3_dtau *=
POW3(one_over_delta) * one_over_tau;
288 derivs.d4alphar_ddelta2_dtau2 *=
POW2(one_over_delta) *
POW2(one_over_tau);
289 derivs.d4alphar_ddelta_dtau3 *= one_over_delta *
POW3(one_over_tau);
295mcx::MultiComplex<double> ResidualHelmholtzGeneralizedExponential::one_mcx(
const mcx::MultiComplex<double>& tau,
296 const mcx::MultiComplex<double>& delta)
const {
298 mcx::MultiComplex<double> sum00 = 0.0 * tau * delta;
299 auto ln_tau = log(tau);
300 auto ln_delta = log(delta);
302 for (std::size_t i = 0; i <
N; ++i) {
305 mcx::MultiComplex<double> u = 0.0 * tau * delta;
309 const auto u_increment = -ci * pow(delta,
l_double);
316 const auto u_increment = -omegai * pow(tau,
m_double);
344 sum00 += el.
n * exp(el.
t * ln_tau + el.
d * ln_delta + u);
365 for (
unsigned int i = 0; i <
N; ++i) {
372 const CoolPropDbl theta = (1.0 - tau) + Ai * pow(
POW2(delta - 1.0), 1.0 / (2.0 * betai));
374 const CoolPropDbl dtheta_dDelta = Ai / (betai)*pow(
POW2(delta - 1), 1 / (2 * betai) - 1) * (delta - 1);
376 const CoolPropDbl d2theta_dDelta2 = Ai / betai * (1 / betai - 1) * pow(
POW2(delta - 1), 1 / (2 * betai) - 1);
377 const CoolPropDbl d3theta_dDelta3 = Ai / betai * (2 - 3 / betai + 1 /
POW2(betai)) * pow(
POW2(delta - 1), 1 / (2 * betai)) /
POW3(delta - 1);
379 Ai / betai * (-6 + 11 / betai - 6 /
POW2(betai) + 1 /
POW3(betai)) * pow(
POW2(delta - 1), 1 / (2 * betai) - 2);
383 const CoolPropDbl dPSI_dDelta_over_PSI = -2.0 * Ci * (delta - 1.0);
384 const CoolPropDbl dPSI_dDelta = dPSI_dDelta_over_PSI * PSI;
385 const CoolPropDbl dPSI_dTau_over_PSI = -2.0 * Di * (tau - 1.0);
386 const CoolPropDbl dPSI_dTau = dPSI_dTau_over_PSI * PSI;
387 const CoolPropDbl d2PSI_dDelta2_over_PSI = (2.0 * Ci *
POW2(delta - 1.0) - 1.0) * 2.0 * Ci;
388 const CoolPropDbl d2PSI_dDelta2 = d2PSI_dDelta2_over_PSI * PSI;
389 const CoolPropDbl d3PSI_dDelta3 = 2 * Ci * PSI * (-4 * Ci * Ci *
POW3(delta - 1) + 6 * Ci * (delta - 1));
390 const CoolPropDbl d4PSI_dDelta4 = 4 * Ci * Ci * PSI * (4 * Ci * Ci *
POW4(delta - 1) - 12 * Ci *
POW2(delta - 1) + 3);
391 const CoolPropDbl d2PSI_dTau2 = (2.0 * Di *
POW2(tau - 1.0) - 1.0) * 2.0 * Di * PSI;
392 const CoolPropDbl d3PSI_dTau3 = 2.0 * Di * PSI * (-4 * Di * Di *
POW3(tau - 1) + 6 * Di * (tau - 1));
393 const CoolPropDbl d4PSI_dTau4 = 4 * Di * Di * PSI * (4 * Di * Di *
POW4(tau - 1) - 12 * Di *
POW2(tau - 1) + 3);
394 const CoolPropDbl d2PSI_dDelta_dTau = dPSI_dDelta * dPSI_dTau_over_PSI;
395 const CoolPropDbl d3PSI_dDelta2_dTau = d2PSI_dDelta2 * dPSI_dTau_over_PSI;
396 const CoolPropDbl d3PSI_dDelta_dTau2 = d2PSI_dTau2 * dPSI_dDelta_over_PSI;
397 const CoolPropDbl d4PSI_dDelta_dTau3 = d3PSI_dTau3 * dPSI_dDelta_over_PSI;
398 const CoolPropDbl d4PSI_dDelta2_dTau2 = d2PSI_dTau2 * d2PSI_dDelta2_over_PSI;
399 const CoolPropDbl d4PSI_dDelta3_dTau = d3PSI_dDelta3 * dPSI_dTau_over_PSI;
403 const CoolPropDbl dDELTA_dTau = 2 * theta * dtheta_dTau;
404 const CoolPropDbl dDELTA_dDelta = 2 * theta * dtheta_dDelta + 2 * Bi * ai * pow(
POW2(delta - 1.0), ai - 1.0) * (delta - 1);
406 const CoolPropDbl d2DELTA_dDelta_dTau = 2 * dtheta_dTau * dtheta_dDelta;
408 2 * (theta * d2theta_dDelta2 +
POW2(dtheta_dDelta) + Bi * (2 * ai * ai - ai) * pow(
POW2(delta - 1.0), ai - 1.0));
411 const CoolPropDbl d3DELTA_dDelta2_dTau = 2 * dtheta_dTau * d2theta_dDelta2;
413 * (theta * d3theta_dDelta3 + 3 * dtheta_dDelta * d2theta_dDelta2
414 + 2 * Bi * ai * (2 * ai * ai - 3 * ai + 1) * pow(
POW2(delta - 1.0), ai - 1.0) / (delta - 1));
419 const CoolPropDbl d4DELTA_dDelta3_dTau = 2 * dtheta_dTau * d3theta_dDelta3;
421 * (theta * d4theta_dDelta4 + 4 * dtheta_dDelta * d3theta_dDelta3 + 3 *
POW2(d2theta_dDelta2)
422 + 2 * Bi * ai * (4 * ai * ai * ai - 12 * ai * ai + 11 * ai - 3) * pow(
POW2(delta - 1.0), ai - 2.0));
424 const CoolPropDbl dDELTAbi_dDelta = bi * pow(DELTA, bi - 1.0) * dDELTA_dDelta;
425 const CoolPropDbl dDELTAbi_dTau = -2.0 * theta * bi * pow(DELTA, bi - 1.0);
426 const CoolPropDbl d2DELTAbi_dDelta2 = bi * (pow(DELTA, bi - 1) * d2DELTA_dDelta2 + (bi - 1.0) * pow(DELTA, bi - 2.0) * pow(dDELTA_dDelta, 2));
429 * (pow(DELTA, bi - 1) * d3DELTA_dDelta3 + d2DELTA_dDelta2 * (bi - 1) * pow(DELTA, bi - 2) * dDELTA_dDelta
431 * (pow(DELTA, bi - 2) * 2 * dDELTA_dDelta * d2DELTA_dDelta2
432 + pow(dDELTA_dDelta, 2) * (bi - 2) * pow(DELTA, bi - 3) * dDELTA_dDelta));
434 -Ai * bi * 2.0 / betai * pow(DELTA, bi - 1.0) * (delta - 1.0) * pow(pow(delta - 1.0, 2), 1.0 / (2.0 * betai) - 1.0)
435 - 2.0 * theta * bi * (bi - 1.0) * pow(DELTA, bi - 2.0) * dDELTA_dDelta;
436 const CoolPropDbl d2DELTAbi_dTau2 = 2.0 * bi * pow(DELTA, bi - 1.0) + 4.0 * pow(theta, 2) * bi * (bi - 1.0) * pow(DELTA, bi - 2.0);
438 -12.0 * theta * bi * (bi - 1.0) * pow(DELTA, bi - 2) - 8 * pow(theta, 3) * bi * (bi - 1) * (bi - 2) * pow(DELTA, bi - 3);
439 const CoolPropDbl d3DELTAbi_dDelta_dTau2 = 2 * bi * (bi - 1) * pow(DELTA, bi - 2) * dDELTA_dDelta
440 + 4 * pow(theta, 2) * bi * (bi - 1) * (bi - 2) * pow(DELTA, bi - 3) * dDELTA_dDelta
441 + 8 * theta * bi * (bi - 1) * pow(DELTA, bi - 2) * dtheta_dDelta;
444 * ((bi - 1) * pow(DELTA, bi - 2) * dDELTA_dTau * d2DELTA_dDelta2 + pow(DELTA, bi - 1) * d3DELTA_dDelta2_dTau
446 * ((bi - 2) * pow(DELTA, bi - 3) * dDELTA_dTau * pow(dDELTA_dDelta, 2)
447 + pow(DELTA, bi - 2) * 2 * dDELTA_dDelta * d2DELTA_dDelta_dTau));
452 bi * DELTA_bi / DELTA
453 * ((
POW3(bi) - 6 *
POW2(bi) + 11 * bi - 6) *
POW4(dDELTA_dTau) /
POW3(DELTA)
454 + 6 * (bi * bi - 3 * bi + 2) *
POW2(dDELTA_dTau / DELTA) * d2DELTA_dTau2 + 4 * (bi - 1) * dDELTA_dTau / DELTA * d3DELTA_dTau3
455 + 3 * (bi - 1) *
POW2(d2DELTA_dTau2) / DELTA + d4DELTA_dTau4);
457 bi * DELTA_bi / DELTA
458 * ((
POW3(bi) - 6 *
POW2(bi) + 11 * bi - 6) *
POW4(dDELTA_dDelta) /
POW3(DELTA)
459 + 6 * (bi * bi - 3 * bi + 2) *
POW2(dDELTA_dDelta / DELTA) * d2DELTA_dDelta2 + 4 * (bi - 1) * dDELTA_dDelta / DELTA * d3DELTA_dDelta3
460 + 3 * (bi - 1) *
POW2(d2DELTA_dDelta2) / DELTA + d4DELTA_dDelta4);
462 bi * (bi - 1) * DELTA_bi /
POW2(DELTA) * dDELTA_dDelta
463 * ((bi - 1) * (bi - 2) *
POW3(dDELTA_dTau) /
POW2(DELTA) + 3 * (bi - 1) * dDELTA_dTau / DELTA * d2DELTA_dTau2 + d3DELTA_dTau3)
464 + bi * DELTA_bi / DELTA
465 * ((bi - 1) * (bi - 2)
466 * (3 *
POW2(dDELTA_dTau) /
POW2(DELTA) * d2DELTA_dDelta_dTau - 2 *
POW3(dDELTA_dTau) /
POW3(DELTA) * dDELTA_dDelta)
468 * (dDELTA_dTau / DELTA * d3DELTA_dDelta_dTau2 + d2DELTA_dTau2 / DELTA * d2DELTA_dDelta_dTau
469 - dDELTA_dDelta /
POW2(DELTA) * dDELTA_dTau * d2DELTA_dTau2)
470 + d4DELTA_dDelta_dTau3);
472 bi * (bi - 1) * DELTA_bi /
POW2(DELTA) * dDELTA_dTau
473 * ((bi - 1) * (bi - 2) *
POW3(dDELTA_dDelta) /
POW2(DELTA) + 3 * (bi - 1) * dDELTA_dDelta / DELTA * d2DELTA_dDelta2 + d3DELTA_dDelta3)
474 + bi * DELTA_bi / DELTA
475 * ((bi - 1) * (bi - 2)
476 * (3 *
POW2(dDELTA_dDelta) /
POW2(DELTA) * d2DELTA_dDelta_dTau - 2 *
POW3(dDELTA_dDelta) /
POW3(DELTA) * dDELTA_dTau)
478 * (dDELTA_dDelta / DELTA * d3DELTA_dDelta2_dTau + d2DELTA_dDelta2 / DELTA * d2DELTA_dDelta_dTau
479 - dDELTA_dTau /
POW2(DELTA) * dDELTA_dDelta * d2DELTA_dDelta2)
480 + d4DELTA_dDelta3_dTau);
481 const CoolPropDbl d4DELTAbi_dDelta2_dTau2 = bi * DELTA_bi /
POW4(DELTA)
482 * ((
POW3(bi) - 6 * bi * bi + 11 * bi - 6) *
POW2(dDELTA_dDelta) *
POW2(dDELTA_dTau)
483 + (bi - 1) * (bi - 2) * DELTA *
POW2(dDELTA_dDelta) * d2DELTA_dTau2
484 + (bi - 1) * (bi - 2) * DELTA *
POW2(dDELTA_dTau) * d2DELTA_dDelta2
485 + 4 * (bi - 1) * (bi - 2) * DELTA * dDELTA_dDelta * dDELTA_dTau * d2DELTA_dDelta_dTau
486 + 2 * (bi - 1) *
POW2(DELTA * d2DELTA_dDelta_dTau)
487 + 2 * (bi - 1) *
POW2(DELTA) * dDELTA_dTau * d3DELTA_dDelta2_dTau
488 + 2 * (bi - 1) *
POW2(DELTA) * dDELTA_dDelta * d3DELTA_dDelta_dTau2
489 + (bi - 1) *
POW2(DELTA) * d2DELTA_dDelta2 * d2DELTA_dTau2
490 +
POW3(DELTA) * d4DELTA_dDelta2_dTau2);
492 derivs.alphar += delta * ni * DELTA_bi * PSI;
495 derivs.dalphar_dtau += ni * delta * (DELTA_bi * dPSI_dTau + dDELTAbi_dTau * PSI);
496 derivs.dalphar_ddelta += ni * (DELTA_bi * (PSI + delta * dPSI_dDelta) + dDELTAbi_dDelta * delta * PSI);
499 derivs.d2alphar_dtau2 += ni * delta * (d2DELTAbi_dTau2 * PSI + 2 * dDELTAbi_dTau * dPSI_dTau + DELTA_bi * d2PSI_dTau2);
500 derivs.d2alphar_ddelta_dtau += ni
501 * (DELTA_bi * (dPSI_dTau + delta * d2PSI_dDelta_dTau) + delta * dDELTAbi_dDelta * dPSI_dTau
502 + dDELTAbi_dTau * (PSI + delta * dPSI_dDelta) + d2DELTAbi_dDelta_dTau * delta * PSI);
503 derivs.d2alphar_ddelta2 += ni
504 * (DELTA_bi * (2.0 * dPSI_dDelta + delta * d2PSI_dDelta2) + 2.0 * dDELTAbi_dDelta * (PSI + delta * dPSI_dDelta)
505 + d2DELTAbi_dDelta2 * delta * PSI);
508 derivs.d3alphar_dtau3 +=
509 ni * delta * (d3DELTAbi_dTau3 * PSI + 3 * d2DELTAbi_dTau2 * dPSI_dTau + 3 * dDELTAbi_dTau * d2PSI_dTau2 + DELTA_bi * d3PSI_dTau3);
510 derivs.d3alphar_ddelta_dtau2 +=
512 * (d2DELTAbi_dTau2 * dPSI_dDelta + d3DELTAbi_dDelta_dTau2 * PSI + 2 * dDELTAbi_dTau * d2PSI_dDelta_dTau
513 + 2.0 * d2DELTAbi_dDelta_dTau * dPSI_dTau + DELTA_bi * d3PSI_dDelta_dTau2 + dDELTAbi_dDelta * d2PSI_dTau2)
514 + ni * (d2DELTAbi_dTau2 * PSI + 2.0 * dDELTAbi_dTau * dPSI_dTau + DELTA_bi * d2PSI_dTau2);
515 derivs.d3alphar_ddelta3 +=
517 * (DELTA_bi * (3 * d2PSI_dDelta2 + delta * d3PSI_dDelta3) + 3 * dDELTAbi_dDelta * (2 * dPSI_dDelta + delta * d2PSI_dDelta2)
518 + 3 * d2DELTAbi_dDelta2 * (PSI + delta * dPSI_dDelta) + d3DELTAbi_dDelta3 * PSI * delta);
520 DELTA_bi * (2 * d2PSI_dDelta_dTau + delta * d3PSI_dDelta2_dTau) + dDELTAbi_dTau * (2 * dPSI_dDelta + delta * d2PSI_dDelta2);
521 CoolPropDbl Line2 = 2 * dDELTAbi_dDelta * (dPSI_dTau + delta * d2PSI_dDelta_dTau) + 2 * d2DELTAbi_dDelta_dTau * (PSI + delta * dPSI_dDelta);
522 CoolPropDbl Line3 = d2DELTAbi_dDelta2 * delta * dPSI_dTau + d3DELTAbi_dDelta2_dTau * delta * PSI;
523 derivs.d3alphar_ddelta2_dtau += ni * (Line1 + Line2 + Line3);
526 derivs.d4alphar_dtau4 += ni * delta
527 * (DELTA_bi * d4PSI_dTau4 + 4 * dDELTAbi_dTau * d3PSI_dTau3 + 6 * d2DELTAbi_dTau2 * d2PSI_dTau2
528 + 4 * d3DELTAbi_dTau3 * dPSI_dTau + PSI * d4DELTAbi_dTau4);
529 derivs.d4alphar_ddelta4 +=
531 * (delta * DELTA_bi * d4PSI_dDelta4 + delta * PSI * d4DELTAbi_dDelta4 + 4 * delta * dDELTAbi_dDelta * d3PSI_dDelta3
532 + 4 * delta * dPSI_dDelta * d3DELTAbi_dDelta3 + 6 * delta * d2DELTAbi_dDelta2 * d2PSI_dDelta2 + 4 * DELTA_bi * d3PSI_dDelta3
533 + 4 * PSI * d3DELTAbi_dDelta3 + 12 * dDELTAbi_dDelta * d2PSI_dDelta2 + 12 * dPSI_dDelta * d2DELTAbi_dDelta2);
535 derivs.d4alphar_ddelta_dtau3 +=
537 * (delta * DELTA_bi * d4PSI_dDelta_dTau3 + delta * PSI * d4DELTAbi_dDelta_dTau3 + delta * dDELTAbi_dDelta * d3PSI_dTau3
538 + 3 * delta * dDELTAbi_dTau * d3PSI_dDelta_dTau2 + delta * dPSI_dDelta * d3DELTAbi_dTau3 + 3 * delta * dPSI_dTau * d3DELTAbi_dDelta_dTau2
539 + 3 * delta * d2DELTAbi_dDelta_dTau * d2PSI_dTau2 + 3 * delta * d2DELTAbi_dTau2 * d2PSI_dDelta_dTau + DELTA_bi * d3PSI_dTau3
540 + PSI * d3DELTAbi_dTau3 + 3 * dDELTAbi_dTau * d2PSI_dTau2 + 3 * dPSI_dTau * d2DELTAbi_dTau2);
541 derivs.d4alphar_ddelta3_dtau +=
543 * (delta * DELTA_bi * d4PSI_dDelta3_dTau + delta * PSI * d4DELTAbi_dDelta3_dTau + 3 * delta * dDELTAbi_dDelta * d3PSI_dDelta2_dTau
544 + delta * dDELTAbi_dTau * d3PSI_dDelta3 + 3 * delta * dPSI_dDelta * d3DELTAbi_dDelta2_dTau + delta * dPSI_dTau * d3DELTAbi_dDelta3
545 + 3 * delta * d2DELTAbi_dDelta2 * d2PSI_dDelta_dTau + 3 * delta * d2DELTAbi_dDelta_dTau * d2PSI_dDelta2
546 + 3 * DELTA_bi * d3PSI_dDelta2_dTau + 3 * PSI * d3DELTAbi_dDelta2_dTau + 6 * dDELTAbi_dDelta * d2PSI_dDelta_dTau
547 + 3 * dDELTAbi_dTau * d2PSI_dDelta2 + 6 * dPSI_dDelta * d2DELTAbi_dDelta_dTau + 3 * dPSI_dTau * d2DELTAbi_dDelta2);
548 derivs.d4alphar_ddelta2_dtau2 +=
550 * (delta * DELTA_bi * d4PSI_dDelta2_dTau2 + delta * PSI * d4DELTAbi_dDelta2_dTau2 + 2 * delta * dDELTAbi_dDelta * d3PSI_dDelta_dTau2
551 + 2 * delta * dDELTAbi_dTau * d3PSI_dDelta2_dTau + 2 * delta * dPSI_dDelta * d3DELTAbi_dDelta_dTau2
552 + 2 * delta * dPSI_dTau * d3DELTAbi_dDelta2_dTau + delta * d2DELTAbi_dDelta2 * d2PSI_dTau2
553 + 4 * delta * d2DELTAbi_dDelta_dTau * d2PSI_dDelta_dTau + delta * d2DELTAbi_dTau2 * d2PSI_dDelta2 + 2 * DELTA_bi * d3PSI_dDelta_dTau2
554 + 2 * PSI * d3DELTAbi_dDelta_dTau2 + 2 * dDELTAbi_dDelta * d2PSI_dTau2 + 4 * dDELTAbi_dTau * d2PSI_dDelta_dTau
555 + 2 * dPSI_dDelta * d2DELTAbi_dTau2 + 4 * dPSI_dTau * d2DELTAbi_dDelta_dTau);
560mcx::MultiComplex<double> ResidualHelmholtzNonAnalytic::one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
562 mcx::MultiComplex<double> sum00 = 0.0 * tau * delta;
563 for (
unsigned int i = 0; i <
N; ++i) {
568 const auto theta = (1.0 - tau) + Ai * pow(
POW2(delta - 1.0), 1.0 / (2.0 * betai));
569 const auto PSI = exp(-Ci *
POW2(delta - 1.0) - Di *
POW2(tau - 1.0));
570 const auto DELTA =
POW2(theta) + Bi * pow(
POW2(delta - 1.0), ai);
571 const auto DELTA_bi = pow(DELTA, bi);
573 sum00 += delta * ni * DELTA_bi * PSI;
584 derivs.alphar += m_abstractcubic->alphar(tau, delta, z, 0, 0);
586 derivs.dalphar_ddelta += m_abstractcubic->alphar(tau, delta, z, 0, 1);
587 derivs.dalphar_dtau += m_abstractcubic->alphar(tau, delta, z, 1, 0);
589 derivs.d2alphar_ddelta2 += m_abstractcubic->alphar(tau, delta, z, 0, 2);
590 derivs.d2alphar_ddelta_dtau += m_abstractcubic->alphar(tau, delta, z, 1, 1);
591 derivs.d2alphar_dtau2 += m_abstractcubic->alphar(tau, delta, z, 2, 0);
593 derivs.d3alphar_ddelta3 += m_abstractcubic->alphar(tau, delta, z, 0, 3);
594 derivs.d3alphar_ddelta2_dtau += m_abstractcubic->alphar(tau, delta, z, 1, 2);
595 derivs.d3alphar_ddelta_dtau2 += m_abstractcubic->alphar(tau, delta, z, 2, 1);
596 derivs.d3alphar_dtau3 += m_abstractcubic->alphar(tau, delta, z, 3, 0);
598 derivs.d4alphar_ddelta4 += m_abstractcubic->alphar(tau, delta, z, 0, 4);
599 derivs.d4alphar_ddelta3_dtau += m_abstractcubic->alphar(tau, delta, z, 1, 3);
600 derivs.d4alphar_ddelta2_dtau2 += m_abstractcubic->alphar(tau, delta, z, 2, 2);
601 derivs.d4alphar_ddelta_dtau3 += m_abstractcubic->alphar(tau, delta, z, 3, 1);
602 derivs.d4alphar_dtau4 += m_abstractcubic->alphar(tau, delta, z, 4, 0);
634 CoolPropDbl Ftau = 0, Fdelta = 0, taudFtaudtau = 0, tau2d2Ftaudtau2 = 0, tau3d3Ftaudtau3 = 0, tau4d4Ftaudtau4 = 0, deltadFdeltaddelta = 0,
635 delta2d2Fdeltaddelta2 = 0, delta3d3Fdeltaddelta3 = 0, delta4d4Fdeltaddelta4 = 0;
637 for (
int i = 0; i < static_cast<int>(
n.size()); ++i) {
639 const CoolPropDbl n = this->n[i],
t = this->t[i],
d = this->d[i],
eta = this->eta[i],
beta = this->beta[i],
gamma = this->gamma[i],
640 epsilon = this->epsilon[i],
b = this->b[i];
642 Ftau = pow(tau,
t) * exp(1.0 / (
b +
beta * pow(-
gamma + tau, 2)));
643 Fdelta = pow(delta,
d) * exp(
eta * pow(delta -
epsilon, 2));
644 taudFtaudtau = (2 *
beta * pow(tau,
t + 1) * (
gamma - tau) +
t * pow(tau,
t) * pow(
b +
beta * pow(
gamma - tau, 2), 2))
646 tau2d2Ftaudtau2 = pow(tau,
t)
648 + 2 *
beta * pow(tau, 2)
655 * (4 * pow(
beta, 2) * pow(tau, 3) * (
gamma - tau)
662 +
t * pow(
b +
beta * pow(
gamma - tau, 2), 6) * (pow(
t, 2) - 3 *
t + 2))
669 + pow(
beta, 2) * pow(tau, 4)
674 + 12 *
beta *
t * pow(tau, 2) * pow(
b +
beta * pow(
gamma - tau, 2), 4) * (
t - 1)
678 +
t * pow(
b +
beta * pow(
gamma - tau, 2), 8) * (pow(
t, 3) - 6 * pow(
t, 2) + 11 *
t - 6))
680 deltadFdeltaddelta = (
d * pow(delta,
d) + 2 * pow(delta,
d + 1) *
eta * (delta -
epsilon)) * exp(
eta * pow(delta -
epsilon, 2));
681 delta2d2Fdeltaddelta2 =
682 pow(delta,
d) * (4 *
d * delta *
eta * (delta -
epsilon) +
d * (
d - 1) + 2 * pow(delta, 2) *
eta * (2 *
eta * pow(delta -
epsilon, 2) + 1))
684 delta3d3Fdeltaddelta3 =
687 +
d * (pow(
d, 2) - 3 *
d + 2) + 4 * pow(delta, 3) * pow(
eta, 2) * (delta -
epsilon) * (2 *
eta * pow(delta -
epsilon, 2) + 3))
689 delta4d4Fdeltaddelta4 =
691 * (16 *
d * pow(delta, 3) * pow(
eta, 2) * (delta -
epsilon) * (2 *
eta * pow(delta -
epsilon, 2) + 3)
692 + 12 *
d * pow(delta, 2) *
eta * (
d - 1) * (2 *
eta * pow(delta -
epsilon, 2) + 1)
693 + 8 *
d * delta *
eta * (delta -
epsilon) * (pow(
d, 2) - 3 *
d + 2) +
d * (pow(
d, 3) - 6 * pow(
d, 2) + 11 *
d - 6)
694 + pow(delta, 4) * pow(
eta, 2) * (16 * pow(
eta, 2) * pow(delta -
epsilon, 4) + 48 *
eta * pow(delta -
epsilon, 2) + 12))
697 derivs.alphar +=
n * Ftau * Fdelta;
699 derivs.dalphar_ddelta +=
n * Ftau * deltadFdeltaddelta / delta;
700 derivs.dalphar_dtau +=
n * Fdelta * taudFtaudtau / tau;
702 derivs.d2alphar_ddelta2 +=
n * Ftau * delta2d2Fdeltaddelta2 /
POW2(delta);
703 derivs.d2alphar_ddelta_dtau +=
n * taudFtaudtau * deltadFdeltaddelta / tau / delta;
704 derivs.d2alphar_dtau2 +=
n * Fdelta * tau2d2Ftaudtau2 /
POW2(tau);
706 derivs.d3alphar_ddelta3 +=
n * Ftau * delta3d3Fdeltaddelta3 /
POW3(delta);
707 derivs.d3alphar_ddelta2_dtau +=
n * taudFtaudtau * delta2d2Fdeltaddelta2 /
POW2(delta) / tau;
708 derivs.d3alphar_ddelta_dtau2 +=
n * tau2d2Ftaudtau2 * deltadFdeltaddelta /
POW2(tau) / delta;
709 derivs.d3alphar_dtau3 +=
n * Fdelta * tau3d3Ftaudtau3 /
POW3(tau);
711 derivs.d4alphar_ddelta4 +=
n * Ftau * delta4d4Fdeltaddelta4 /
POW4(delta);
712 derivs.d4alphar_ddelta3_dtau +=
n * taudFtaudtau * delta3d3Fdeltaddelta3 /
POW3(delta) / tau;
713 derivs.d4alphar_ddelta2_dtau2 +=
n * tau2d2Ftaudtau2 * delta2d2Fdeltaddelta2 /
POW2(delta) /
POW2(tau);
714 derivs.d4alphar_ddelta_dtau3 +=
n * tau3d3Ftaudtau3 * deltadFdeltaddelta /
POW3(tau) / delta;
715 derivs.d4alphar_dtau4 +=
n * Fdelta * tau4d4Ftaudtau4 /
POW4(tau);
720mcx::MultiComplex<double> ResidualHelmholtzGaoB::one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
721 mcx::MultiComplex<double> sum00 = 0.0;
722 for (std::size_t i = 0; i < static_cast<int>(
n.size()); ++i) {
724 auto Ftau = pow(tau,
t[i]) * exp(1.0 / u);
725 auto Fdelta = pow(delta,
d[i]) * exp(
eta[i] * pow(delta -
epsilon[i], 2));
726 sum00 +=
n[i] * Ftau * Fdelta;
734 : enabled(true), Tc(Tc), pc(pc), rhomolarc(rhomolarc), acentric(acentric), R(R) {
739 double _d[] = {1, 1, 1, 2, 3, 7, 1, 1, 2, 5, 1, 1, 4, 2};
740 std::vector<CoolPropDbl> d(_d, _d +
sizeof(_d) /
sizeof(
double));
741 double _t[] = {0.25, 1.25, 1.5, 1.375, 0.25, 0.875, 0, 2.375, 2, 2.125, 3.5, 6.5, 4.75, 12.5};
742 std::vector<CoolPropDbl> t(_t, _t +
sizeof(_t) /
sizeof(
double));
743 double _l[] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3};
744 std::vector<CoolPropDbl> l(_l, _l +
sizeof(_l) /
sizeof(
double));
745 double _g[] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
746 std::vector<CoolPropDbl> g(_g, _g +
sizeof(_g) /
sizeof(
double));
747 double _a0[] = {8.5740489E-01, -3.2863233E+00, 1.6480939E+00, -5.4524817E-02, 6.1623592E-02, 2.7389266E-04, -6.0655087E-02,
748 -3.1811852E-02, -1.1550422E-01, -1.8610466E-02, -1.8348671E-01, 5.5071325E-03, -1.2268039E-02, -5.0433436E-03};
749 std::vector<CoolPropDbl> a0(_a0, _a0 +
sizeof(_a0) /
sizeof(
double));
750 double _a1[] = {5.6200117E-01, 3.2439544E+00, -4.9628768E+00, -2.2132851E-01, 9.3388356E-02, 2.4940171E-05, -1.7519204E-01,
751 8.9325660E-01, 2.9886613E+00, 1.0881387E-01, -6.7166746E-01, 1.4477326E-01, -2.8716809E-01, -1.1478402E-01};
752 std::vector<CoolPropDbl> a1(_a1, _a1 +
sizeof(_a1) /
sizeof(
double));
753 double _a2[] = {-8.1680511E+01, 4.6384732E+02, -2.7970850E+02, 2.9317364E+01, -2.2324825E+01, -5.0932691E-02, -7.2836590E+00,
754 -2.2063100E+02, -3.0435126E+02, 5.8514719E+00, 1.7995451E+02, -1.0178400E+02, 4.0848053E+01, 1.2411984E+01};
755 std::vector<CoolPropDbl> a2(_a2, _a2 +
sizeof(_a2) /
sizeof(
double));
775 derivs = derivs + derivs0 + derivs1 *
acentric + derivs2 *
theta;
778mcx::MultiComplex<double> ResidualHelmholtzXiangDeiters::one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
816 return 2 / (sqrt(1 + 4 *
Deltabar * delta) + 1);
820 return -delta *
X *
X / (2 *
Deltabar * delta *
X + 1);
844 return d_dXdtau_dX * dX_dDeltabar * beta + d_dXdtau_dDeltabar * beta + d_dXdtau_dbeta * dbeta_dtau;
852 CoolPropDbl d_dXddelta_dDeltabar =
X *
X * (2 * delta * delta *
X * alpha - 1) / pow(2 *
Deltabar * delta *
X + 1, 2);
856 return d_dXddelta_dX * dX_dDeltabar * beta + d_dXddelta_dDeltabar * beta + d_dXddelta_dalpha * dalpha_dtau;
866 CoolPropDbl d_dXddelta_dDeltabar =
X *
X * (2 * delta * delta *
X * alpha - 1) / pow(2 *
Deltabar * delta *
X + 1, 2);
872 CoolPropDbl val = (dX_ddelta_constall + d_dXddelta_dX *
dX_ddelta + d_dXddelta_dX * dX_dDeltabar * alpha + d_dXddelta_dDeltabar * alpha
873 + d_dXddelta_dalpha * dalpha_ddelta);
884 * (-6 * Delta * pow(Delta_t, 2) * pow(
X, 2) * pow(delta, 2) * (Delta *
X * delta + 1)
885 + 3 * pow(Delta_t, 2) *
X * delta * (2 * Delta *
X * delta + 1) - Delta_tt * pow(2 * Delta *
X * delta + 1, 3)
886 +
X * delta * (Delta * Delta_tt + 3 * pow(Delta_t, 2)) * pow(2 * Delta *
X * delta + 1, 2))
887 / pow(2 * Delta *
X * delta + 1, 4);
889 * (-6 * pow(Delta_t, 2) *
X * delta * (Delta *
X * delta + 1)
890 - 3 * pow(Delta_t, 2) *
X * delta * (2 * Delta *
X * delta + 1) + Delta_tt * pow(2 * Delta *
X * delta + 1, 2))
891 / pow(2 * Delta *
X * delta + 1, 4);
892 CoolPropDbl dXtt_dDelta_t = 4 * Delta_t * pow(
X, 3) * pow(delta, 2) * (3 * Delta *
X * delta + 2) / pow(2 * Delta *
X * delta + 1, 3);
893 CoolPropDbl dXtt_dDelta_tt = -pow(
X, 2) * delta / (2 * Delta *
X * delta + 1);
894 return dXtt_dX * dX_dDelta * Delta_t + dXtt_dDelta * Delta_t + dXtt_dDelta_t * Delta_tt + dXtt_dDelta_tt * Delta_ttt;
908 * (-12 * Delta * pow(Delta_t, 2) * pow(
X, 2) * pow(delta, 2) * (Delta *
X * delta + 1)
909 + 2 * pow(Delta_t, 2) *
X * delta * (-Delta *
X * delta + 2) * (2 * Delta *
X * delta + 1) - Delta_tt * pow(2 * Delta *
X * delta + 1, 3)
910 + 2 *
X * delta * (Delta * Delta_tt + 2 * pow(Delta_t, 2)) * pow(2 * Delta *
X * delta + 1, 2))
911 / pow(2 * Delta *
X * delta + 1, 4);
913 * (-6 * Delta * pow(Delta_t, 2) * pow(
X, 2) * pow(delta, 2) * (Delta *
X * delta + 1)
914 + 3 * pow(Delta_t, 2) *
X * delta * (2 * Delta *
X * delta + 1) - Delta_tt * pow(2 * Delta *
X * delta + 1, 3)
915 +
X * delta * (Delta * Delta_tt + 3 * pow(Delta_t, 2)) * pow(2 * Delta *
X * delta + 1, 2))
916 / pow(2 * Delta *
X * delta + 1, 4);
918 * (-6 * pow(Delta_t, 2) *
X * delta * (Delta *
X * delta + 1)
919 - 3 * pow(Delta_t, 2) *
X * delta * (2 * Delta *
X * delta + 1) + Delta_tt * pow(2 * Delta *
X * delta + 1, 2))
920 / pow(2 * Delta *
X * delta + 1, 4);
921 CoolPropDbl dXtt_dDelta_t = 4 * Delta_t * pow(
X, 3) * pow(delta, 2) * (3 * Delta *
X * delta + 2) / pow(2 * Delta *
X * delta + 1, 3);
922 CoolPropDbl dXtt_dDelta_tt = -pow(
X, 2) * delta / (2 * Delta *
X * delta + 1);
923 return dXtt_ddelta + dXtt_dX *
dX_ddelta + dXtt_dX * dX_dDelta * Delta_d + dXtt_dDelta * Delta_d + dXtt_dDelta_t * Delta_dt
924 + dXtt_dDelta_tt * Delta_dtt;
938 * (-6 * Delta * pow(
X, 2) * delta * pow(Delta + Delta_d * delta, 2) * (Delta *
X * delta + 1)
939 - Delta_dd * delta * pow(2 * Delta *
X * delta + 1, 3)
940 + 2 *
X * (2 * Delta *
X * delta + 1)
941 * (-Delta * Delta_d * delta * (2 * Delta_d *
X * pow(delta, 2) - 1) - Delta * delta * (2 * pow(Delta, 2) *
X - Delta_d)
942 + Delta * (Delta + Delta_d * delta) * (Delta *
X * delta + 1) + Delta_d * delta * (Delta + Delta_d * delta) * (Delta *
X * delta + 1))
943 + pow(2 * Delta *
X * delta + 1, 2)
944 * (3 * pow(Delta, 2) *
X + Delta * Delta_dd *
X * pow(delta, 2) + Delta *
X * (Delta + Delta_d * delta)
945 + pow(Delta_d, 2) *
X * pow(delta, 2) + Delta_d *
X * delta * (Delta + Delta_d * delta)
946 + Delta_d * (2 * Delta_d *
X * pow(delta, 2) - 1) - Delta_d))
947 / pow(2 * Delta *
X * delta + 1, 4);
949 * (-8 * pow(Delta, 2) * Delta_d * pow(
X, 2) * pow(delta, 3) + 8 * pow(Delta, 2) * Delta_dd * pow(
X, 2) * pow(delta, 4)
950 + 10 * pow(Delta, 2) *
X * delta - 24 * Delta * pow(Delta_d, 2) * pow(
X, 2) * pow(delta, 4)
951 + 8 * Delta * Delta_d *
X * pow(delta, 2) + 8 * Delta * Delta_dd *
X * pow(delta, 3) + 8 * Delta
952 - 18 * pow(Delta_d, 2) *
X * pow(delta, 3) + 12 * Delta_d * delta + 2 * Delta_dd * pow(delta, 2))
953 / (16 * pow(Delta, 4) * pow(
X, 4) * pow(delta, 4) + 32 * pow(Delta, 3) * pow(
X, 3) * pow(delta, 3)
954 + 24 * pow(Delta, 2) * pow(
X, 2) * pow(delta, 2) + 8 * Delta *
X * delta + 1);
957 * (2 *
X * delta * (Delta + Delta_d * delta) * (Delta *
X * delta + 1) + (2 * Delta *
X * delta + 1) * (2 * Delta_d *
X * pow(delta, 2) - 1))
958 / pow(2 * Delta *
X * delta + 1, 3);
959 CoolPropDbl dXdd_dDelta_dd = -pow(
X, 2) * delta / (2 * Delta *
X * delta + 1);
961 return dXdd_dX * dX_dDelta * Delta_t + dXdd_dDelta * Delta_t + dXdd_dDelta_d * Delta_dt + dXdd_dDelta_dd * Delta_ddt;
964double Xdd(
double X,
double delta,
double Delta,
double Delta_d,
double Delta_dd) {
965 return Delta * pow(
X, 2) * (2 * Delta + 2 * Delta_d * delta) * (Delta * pow(
X, 2) * delta +
X) / pow(2 * Delta *
X * delta + 1, 3)
966 + Delta_d * pow(
X, 2) * delta * (2 * Delta + 2 * Delta_d * delta) * (Delta * pow(
X, 2) * delta +
X) / pow(2 * Delta *
X * delta + 1, 3)
967 + Delta_d * pow(
X, 2) * (2 * Delta_d *
X * pow(delta, 2) - 1) / pow(2 * Delta *
X * delta + 1, 2)
968 - Delta_dd * pow(
X, 2) * delta / (2 * Delta *
X * delta + 1)
969 + pow(
X, 2) * (2 * pow(Delta, 2) *
X - Delta_d) / pow(2 * Delta *
X * delta + 1, 2);
983 * (-6 * Delta * pow(
X, 2) * delta * pow(Delta + Delta_d * delta, 2) * (Delta *
X * delta + 1)
984 - Delta_dd * delta * pow(2 * Delta *
X * delta + 1, 3)
985 + 2 *
X * (2 * Delta *
X * delta + 1)
986 * (-Delta * Delta_d * delta * (2 * Delta_d *
X * pow(delta, 2) - 1) - Delta * delta * (2 * pow(Delta, 2) *
X - Delta_d)
987 + Delta * (Delta + Delta_d * delta) * (Delta *
X * delta + 1) + Delta_d * delta * (Delta + Delta_d * delta) * (Delta *
X * delta + 1))
988 + pow(2 * Delta *
X * delta + 1, 2)
989 * (3 * pow(Delta, 2) *
X + Delta * Delta_dd *
X * pow(delta, 2) + Delta *
X * (Delta + Delta_d * delta)
990 + pow(Delta_d, 2) *
X * pow(delta, 2) + Delta_d *
X * delta * (Delta + Delta_d * delta)
991 + Delta_d * (2 * Delta_d *
X * pow(delta, 2) - 1) - Delta_d))
992 / pow(2 * Delta *
X * delta + 1, 4);
994 * (-24 * pow(Delta, 4) * pow(
X, 3) * delta - 8 * pow(Delta, 3) * Delta_d * pow(
X, 3) * pow(delta, 2)
995 - 18 * pow(Delta, 3) * pow(
X, 2) + 8 * pow(Delta, 2) * Delta_d * pow(
X, 2) * delta
996 - 4 * pow(Delta, 2) * Delta_dd * pow(
X, 2) * pow(delta, 2) + 10 * Delta * pow(Delta_d, 2) * pow(
X, 2) * pow(delta, 2)
997 + 12 * Delta * Delta_d *
X - 4 * Delta * Delta_dd *
X * delta + 8 * pow(Delta_d, 2) *
X * delta - Delta_dd)
998 / (16 * pow(Delta, 4) * pow(
X, 4) * pow(delta, 4) + 32 * pow(Delta, 3) * pow(
X, 3) * pow(delta, 3)
999 + 24 * pow(Delta, 2) * pow(
X, 2) * pow(delta, 2) + 8 * Delta *
X * delta + 1);
1001 * (-8 * pow(Delta, 2) * Delta_d * pow(
X, 2) * pow(delta, 3) + 8 * pow(Delta, 2) * Delta_dd * pow(
X, 2) * pow(delta, 4)
1002 + 10 * pow(Delta, 2) *
X * delta - 24 * Delta * pow(Delta_d, 2) * pow(
X, 2) * pow(delta, 4)
1003 + 8 * Delta * Delta_d *
X * pow(delta, 2) + 8 * Delta * Delta_dd *
X * pow(delta, 3) + 8 * Delta
1004 - 18 * pow(Delta_d, 2) *
X * pow(delta, 3) + 12 * Delta_d * delta + 2 * Delta_dd * pow(delta, 2))
1005 / (16 * pow(Delta, 4) * pow(
X, 4) * pow(delta, 4) + 32 * pow(Delta, 3) * pow(
X, 3) * pow(delta, 3)
1006 + 24 * pow(Delta, 2) * pow(
X, 2) * pow(delta, 2) + 8 * Delta *
X * delta + 1);
1009 * (2 *
X * delta * (Delta + Delta_d * delta) * (Delta *
X * delta + 1) + (2 * Delta *
X * delta + 1) * (2 * Delta_d *
X * pow(delta, 2) - 1))
1010 / pow(2 * Delta *
X * delta + 1, 3);
1011 CoolPropDbl dXdd_dDelta_dd = -pow(
X, 2) * delta / (2 * Delta *
X * delta + 1);
1013 return dXdd_ddelta + dXdd_dX * (
dX_ddelta + dX_dDelta * Delta_d) + dXdd_dDelta * Delta_d + dXdd_dDelta_d * Delta_dd + dXdd_dDelta_dd * Delta_ddd;
1016 return 0.5 * (2 -
eta) / pow(1 -
eta, (
int)3);
1019 return 0.5 * (5 - 2 *
eta) / pow(1 -
eta, (
int)4);
1022 return 3 * (3 -
eta) / pow(1 -
eta, (
int)5);
1025 return 6 * (7 - 2 *
eta) / pow(1 -
eta, (
int)6);
1028 return this->
vbarn * delta;
1040 CoolPropDbl X_dt = this->d2X_ddeltadtau(tau, delta);
1042 CoolPropDbl X_dtt = this->d3X_ddeltadtau2(tau, delta);
1043 CoolPropDbl X_ddt = this->d3X_ddelta2dtau(tau, delta);
1044 CoolPropDbl X_ddd = this->d3X_ddelta3(tau, delta);
1046 deriv.alphar += this->m * this->a * ((log(
X) -
X / 2.0 + 0.5));
1047 deriv.dalphar_ddelta += this->m * this->a * (1 /
X - 0.5) * this->dX_ddelta(tau, delta);
1048 deriv.dalphar_dtau += this->m * this->a * (1 /
X - 0.5) * this->dX_dtau(tau, delta);
1049 deriv.d2alphar_dtau2 += this->m * this->a * ((1 /
X - 0.5) * X_tt - pow(X_t /
X, 2));
1050 deriv.d2alphar_ddelta2 += this->m * this->a * ((1 /
X - 0.5) * X_dd - pow(X_d /
X, 2));
1051 deriv.d2alphar_ddelta_dtau += this->m * this->a * ((-X_t /
X /
X) * X_d + X_dt * (1 /
X - 0.5));
1052 deriv.d3alphar_dtau3 += this->m * this->a
1053 * ((1 /
X - 1.0 / 2.0) * X_ttt + (-X_t / pow(
X, (
int)2)) * X_tt
1054 - 2 * (pow(
X, (
int)2) * (X_t * X_tt) - pow(X_t, (
int)2) * (
X * X_t)) / pow(
X, (
int)4));
1055 deriv.d3alphar_ddelta_dtau2 += this->m * this->a
1056 * ((1 /
X - 1.0 / 2.0) * X_dtt - X_d / pow(
X, (
int)2) * X_tt
1057 - 2 * (pow(
X, (
int)2) * (X_t * X_dt) - pow(X_t, (
int)2) * (
X * X_d)) / pow(
X, (
int)4));
1058 deriv.d3alphar_ddelta2_dtau += this->m * this->a
1059 * ((1 /
X - 1.0 / 2.0) * X_ddt - X_t / pow(
X, (
int)2) * X_dd
1060 - 2 * (pow(
X, (
int)2) * (X_d * X_dt) - pow(X_d, (
int)2) * (
X * X_t)) / pow(
X, (
int)4));
1061 deriv.d3alphar_ddelta3 += this->m * this->a
1062 * ((1 /
X - 1.0 / 2.0) * X_ddd - X_d / pow(
X, (
int)2) * X_dd
1063 - 2 * (pow(
X, (
int)2) * (X_d * X_dd) - pow(X_d, (
int)2) * (
X * X_d)) / pow(
X, (
int)4));
1067mcx::MultiComplex<double> IdealHelmholtzCP0PolyT::one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
1068 mcx::MultiComplex<double> sum = 0.0;
1069 for (std::size_t i = 0; i < N; ++i) {
1071 sum += c[i] - c[i] * tau / tau0 + c[i] * log(tau / tau0);
1072 }
else if (std::abs(t[i] + 1) < 10 *
DBL_EPSILON) {
1073 sum += c[i] * tau / Tc * log(tau0 / tau) + c[i] / Tc * (tau - tau0);
1075 sum += -c[i] * pow(Tc, t[i]) * pow(tau, -t[i]) / (t[i] * (t[i] + 1)) - c[i] * pow(T0, t[i] + 1) * tau / (Tc * (t[i] + 1))
1076 + c[i] * pow(T0, t[i]) / t[i];
1087 derivs.alphar += log(delta) + a1 + a2 * tau;
1088 derivs.dalphar_ddelta += 1.0 / delta;
1089 derivs.dalphar_dtau += a2;
1090 derivs.d2alphar_ddelta2 += -1.0 / delta / delta;
1091 derivs.d3alphar_ddelta3 += 2 / delta / delta / delta;
1092 derivs.d4alphar_ddelta4 += -6 /
POW4(delta);
1098 derivs.alphar += a1 + a2 * tau;
1099 derivs.dalphar_dtau += a2;
1106 derivs.alphar += a1 * log(tau);
1107 derivs.dalphar_dtau += a1 / tau;
1108 derivs.d2alphar_dtau2 += -a1 / tau / tau;
1109 derivs.d3alphar_dtau3 += 2 * a1 / tau / tau / tau;
1110 derivs.d4alphar_dtau4 += -6 * a1 /
POW4(tau);
1118 for (std::size_t i = 0; i < N; ++i) {
1119 s += n[i] * pow(tau, t[i]);
1125 for (std::size_t i = 0; i < N; ++i) {
1126 s += n[i] * t[i] * pow(tau, t[i] - 1);
1128 derivs.dalphar_dtau += s;
1132 for (std::size_t i = 0; i < N; ++i) {
1133 s += n[i] * t[i] * (t[i] - 1) * pow(tau, t[i] - 2);
1135 derivs.d2alphar_dtau2 += s;
1139 for (std::size_t i = 0; i < N; ++i) {
1140 s += n[i] * t[i] * (t[i] - 1) * (t[i] - 2) * pow(tau, t[i] - 3);
1142 derivs.d3alphar_dtau3 += s;
1146 for (std::size_t i = 0; i < N; ++i) {
1147 s += n[i] * t[i] * (t[i] - 1) * (t[i] - 2) * (t[i] - 3) * pow(tau, t[i] - 4);
1149 derivs.d4alphar_dtau4 += s;
1158 CoolPropDbl s00 = 0, s01 = 0, s02 = 0, s03 = 0, s04 = 0;
1160 for (std::size_t i = 0; i < N; ++i) {
1161 const CoolPropDbl expthetataui = exp(theta[i] * tau);
1162 const CoolPropDbl para = c[i] + d[i] * expthetataui;
1164 s00 += n[i] * log(para);
1165 s01 += n[i] * theta[i] * d[i] * expthetataui / para;
1166 s02 += n[i] *
POW2(theta[i]) * c[i] * d[i] * expthetataui /
POW2(para);
1167 s03 += n[i] *
POW3(theta[i]) * c[i] * d[i] * (c[i] - d[i] * expthetataui) * expthetataui /
POW3(para);
1169 6 *
POW3(d[i]) *
POW3(expthetataui) - 12 * d[i] * d[i] * para *
POW2(expthetataui) + 7 * d[i] *
POW2(para) * expthetataui -
POW3(para);
1170 s04 += -n[i] * d[i] *
POW4(theta[i]) * bracket * expthetataui /
POW4(para);
1172 derivs.alphar += s00;
1173 derivs.dalphar_dtau += s01;
1174 derivs.d2alphar_dtau2 += s02;
1175 derivs.d3alphar_dtau3 += s03;
1176 derivs.d4alphar_dtau4 += s04;
1182 derivs.alphar += cp_over_R - cp_over_R * tau / tau0 + cp_over_R * log(tau / tau0);
1183 derivs.dalphar_dtau += cp_over_R / tau - cp_over_R / tau0;
1184 derivs.d2alphar_dtau2 += -cp_over_R / (tau * tau);
1185 derivs.d3alphar_dtau3 += 2 * cp_over_R / (tau * tau * tau);
1186 derivs.d4alphar_dtau4 += -6 * cp_over_R /
POW4(tau);
1194 for (std::size_t i = 0; i < N; ++i) {
1196 sum += c[i] - c[i] * tau / tau0 + c[i] * log(tau / tau0);
1197 }
else if (std::abs(t[i] + 1) < 10 *
DBL_EPSILON) {
1198 sum += c[i] * tau / Tc * log(tau0 / tau) + c[i] / Tc * (tau - tau0);
1200 sum += -c[i] * pow(Tc, t[i]) * pow(tau, -t[i]) / (t[i] * (t[i] + 1)) - c[i] * pow(T0, t[i] + 1) * tau / (Tc * (t[i] + 1))
1201 + c[i] * pow(T0, t[i]) / t[i];
1204 derivs.alphar += sum;
1208 for (std::size_t i = 0; i < N; ++i) {
1210 sum += c[i] / tau - c[i] / tau0;
1211 }
else if (std::abs(t[i] + 1) < 10 *
DBL_EPSILON) {
1212 sum += c[i] / Tc * log(tau0 / tau);
1214 sum += c[i] * pow(Tc, t[i]) * pow(tau, -t[i] - 1) / (t[i] + 1) - c[i] * pow(Tc, t[i]) / (pow(tau0, t[i] + 1) * (t[i] + 1));
1217 derivs.dalphar_dtau += sum;
1221 for (std::size_t i = 0; i < N; ++i) {
1223 sum += -c[i] / (tau * tau);
1224 }
else if (std::abs(t[i] + 1) < 10 *
DBL_EPSILON) {
1225 sum += -c[i] / (tau * Tc);
1227 sum += -c[i] * pow(Tc / tau, t[i]) / (tau * tau);
1230 derivs.d2alphar_dtau2 += sum;
1234 for (std::size_t i = 0; i < N; ++i) {
1236 sum += 2 * c[i] / (tau * tau * tau);
1237 }
else if (std::abs(t[i] + 1) < 10 *
DBL_EPSILON) {
1238 sum += c[i] / (tau * tau * Tc);
1240 sum += c[i] * pow(Tc / tau, t[i]) * (t[i] + 2) / (tau * tau * tau);
1243 derivs.d3alphar_dtau3 += sum;
1247 for (std::size_t i = 0; i < N; ++i) {
1249 sum += -6 * c[i] /
POW4(tau);
1250 }
else if (std::abs(t[i] + 1) < 10 *
DBL_EPSILON) {
1251 sum += -3 * c[i] / (
POW3(tau) * Tc);
1253 sum += -c[i] * (t[i] + 2) * (t[i] + 3) * pow(Tc / tau, t[i]) / (tau * tau * tau * tau);
1256 derivs.d4alphar_dtau4 += sum;
1269 T_red = derivs.
T_red;
1271 throw ValueError(
"T_red needs to be stored somewhere for GERG2004Sinh");
1275 double sum00 = 0, sum10 = 0, sum20 = 0, sum30 = 0, sum40 = 0;
1276 for (std::size_t i = 0; i < N; ++i) {
1278 sum00 += n[i] * log(std::abs(sinh(t * tau)));
1279 sum10 += n[i] * t / tanh(t * tau);
1280 sum20 += -n[i] *
POW2(t) /
POW2(sinh(t * tau));
1281 sum30 += -2 * n[i] *
POW3(t) * (1 / tanh(t * tau) - 1 /
POW3(tanh(t * tau)));
1282 sum40 += -2 * n[i] *
POW4(t) * (1 - 4 /
POW2(tanh(t * tau)) + 3 /
POW4(tanh(t * tau)));
1284 derivs.alphar += sum00;
1285 derivs.dalphar_dtau += sum10;
1286 derivs.d2alphar_dtau2 += sum20;
1287 derivs.d3alphar_dtau3 += sum30;
1288 derivs.d4alphar_dtau4 += sum40;
1292mcx::MultiComplex<double> IdealHelmholtzGERG2004Sinh::one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
1298 throw ValueError(
"T_red needs to be stored somewhere for GERG2004Cosh");
1300 auto Tci_over_Tr = Tc / T_red;
1301 auto diff_abs = [](
const mcx::MultiComplex<double>& x) {
return sqrt(x * x); };
1303 mcx::MultiComplex<double> sum00 = 0.0;
1304 for (std::size_t i = 0; i < N; ++i) {
1305 auto t = theta[i] * Tci_over_Tr;
1306 sum00 += n[i] * log(diff_abs(sinh(t * tau)));
1321 T_red = derivs.
T_red;
1323 throw ValueError(
"T_red needs to be stored somewhere for GERG2004Cosh");
1327 double sum00 = 0, sum10 = 0, sum20 = 0, sum30 = 0, sum40 = 0;
1328 for (std::size_t i = 0; i < N; ++i) {
1330 sum00 += -n[i] * log(std::abs(cosh(t * tau)));
1331 sum10 += -n[i] * t * tanh(t * tau);
1332 sum20 += -n[i] *
POW2(t) /
POW2(cosh(t * tau));
1333 sum30 += -2 * n[i] *
POW3(t) * (
POW3(tanh(t * tau)) - tanh(t * tau));
1334 sum40 += 2 * n[i] *
POW4(t) * (3 *
POW4(tanh(t * tau)) - 4 *
POW2(tanh(t * tau)) + 1);
1336 derivs.alphar += sum00;
1337 derivs.dalphar_dtau += sum10;
1338 derivs.d2alphar_dtau2 += sum20;
1339 derivs.d3alphar_dtau3 += sum30;
1340 derivs.d4alphar_dtau4 += sum40;
1344mcx::MultiComplex<double> IdealHelmholtzGERG2004Cosh::one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
1350 throw ValueError(
"T_red needs to be stored somewhere for GERG2004Cosh");
1352 auto Tci_over_Tr = Tc / T_red;
1353 auto diff_abs = [](
const mcx::MultiComplex<double>& x) {
return sqrt(x * x); };
1355 mcx::MultiComplex<double> sum00 = 0.0;
1356 for (std::size_t i = 0; i < N; ++i) {
1357 auto t = theta[i] * Tci_over_Tr;
1358 sum00 += -n[i] * log(diff_abs(cosh(t * tau)));
1404# include <catch2/catch_all.hpp>
1406using std::shared_ptr;
1408class HelmholtzConsistencyFixture
1413 shared_ptr<CoolProp::BaseHelmholtzTerm> PlanckEinstein, Lead, LogTau, IGPower, CP0Constant, CP0PolyT, SAFT, NonAnalytic, Soave, PR, XiangDeiters,
1414 GaoB, GERG2004Cosh, GERG2004Sinh;
1415 shared_ptr<CoolProp::ResidualHelmholtzGeneralizedExponential> Gaussian, Lemmon2005, Exponential, GERG2008, Power;
1417 HelmholtzConsistencyFixture() {
1422 auto _SRK_derived = std::make_shared<SRK>(300, 4e6, 0.3, 8.314461);
1423 _SRK_derived->set_Tr(300);
1424 _SRK_derived->set_rhor(4000);
1425 shared_ptr<AbstractCubic> _SRK = _SRK_derived;
1426 Soave = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedCubic>(_SRK);
1428 auto _PR_derived = std::make_shared<PengRobinson>(300, 4e6, 0.3, 8.314461);
1429 _PR_derived->set_Tr(300);
1430 _PR_derived->set_rhor(4000);
1431 shared_ptr<AbstractCubic> _PR = _PR_derived;
1432 PR = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedCubic>(_PR);
1436 std::vector<CoolPropDbl> beta = {0.3696, 0.2962}, epsilon = {0.4478, 0.44689}, eta = {-2.8452, -2.8342}, gamma = {1.108, 1.313},
1437 n = {-1.6909858, 0.93739074}, t = {4.3315, 4.015}, d = {1, 1}, b = {1.244, 0.6826};
1438 GaoB = std::make_shared<CoolProp::ResidualHelmholtzGaoB>(n, t, d, eta, beta, gamma, epsilon, b);
1441 XiangDeiters = std::make_shared<CoolProp::ResidualHelmholtzXiangDeiters>(300, 4e6, 4000, 0.3, 8.3144621);
1443 Lead = std::make_shared<CoolProp::IdealHelmholtzLead>(1, 3);
1444 LogTau = std::make_shared<CoolProp::IdealHelmholtzLogTau>(1.5);
1446 std::vector<CoolPropDbl> n(4, 0), t(4, 1);
1452 IGPower = std::make_shared<CoolProp::IdealHelmholtzPower>(n, t);
1455 std::vector<CoolPropDbl> n(4, 0), t(4, 1), c(4, 1), d(4, -1);
1462 PlanckEinstein = std::make_shared<CoolProp::IdealHelmholtzPlanckEinsteinGeneralized>(n, t, c, d);
1465 std::vector<CoolPropDbl> c(3, 1), t(3, 0);
1471 CP0PolyT = std::make_shared<CoolProp::IdealHelmholtzCP0PolyT>(c, t, Tc, T0);
1473 CP0Constant = std::make_shared<CoolProp::IdealHelmholtzCP0Constant>(4 / 8.314472, 300, 250);
1476 std::vector<CoolPropDbl> n(2, 0.0);
1479 std::vector<CoolPropDbl> theta(2, 0.0);
1480 theta[0] = 5.251822620;
1481 theta[1] = 13.788988208;
1482 CoolPropDbl rhomolar_crit = 11183.900000, T_crit = 126.192000000;
1483 GERG2004Cosh = std::make_shared<CoolProp::IdealHelmholtzGERG2004Cosh>(n, theta, T_crit);
1488 std::vector<CoolPropDbl> n(1, 0.0);
1489 n[0] = -0.146600000;
1490 std::vector<CoolPropDbl> theta(1, 0.0);
1491 theta[0] = -5.393067706;
1492 CoolPropDbl rhomolar_crit = 11183.900000, T_crit = 126.192000000;
1493 GERG2004Sinh = std::make_shared<CoolProp::IdealHelmholtzGERG2004Sinh>(n, theta, T_crit);
1498 CoolPropDbl beta[] = {1.24, 0.821, 15.45, 2.21, 437, 0.743}, d[] = {1, 1, 2, 2, 3, 3},
1499 epsilon[] = {0.6734, 0.9239, 0.8636, 1.0507, 0.8482, 0.7522}, eta[] = {0.9667, 1.5154, 1.0591, 1.6642, 12.4856, 0.9662},
1500 gamma[] = {1.2827, 0.4317, 1.1217, 1.1871, 1.1243, 0.4203},
1501 n[] = {1.2198, -0.4883, -0.0033293, -0.0035387, -0.51172, -0.16882}, t[] = {1, 2.124, 0.4, 3.5, 0.5, 2.7};
1502 Gaussian = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedExponential>();
1503 Gaussian->add_Gaussian(
1504 std::vector<CoolPropDbl>(n, n +
sizeof(n) /
sizeof(n[0])), std::vector<CoolPropDbl>(d, d +
sizeof(d) /
sizeof(d[0])),
1505 std::vector<CoolPropDbl>(t, t +
sizeof(t) /
sizeof(t[0])), std::vector<CoolPropDbl>(eta, eta +
sizeof(eta) /
sizeof(eta[0])),
1506 std::vector<CoolPropDbl>(epsilon, epsilon +
sizeof(epsilon) /
sizeof(epsilon[0])),
1507 std::vector<CoolPropDbl>(beta, beta +
sizeof(beta) /
sizeof(beta[0])),
1508 std::vector<CoolPropDbl>(gamma, gamma +
sizeof(gamma) /
sizeof(gamma[0])));
1511 CoolPropDbl d[] = {1, 1, 1, 2, 4, 1, 1, 2, 2, 3, 4, 5, 1, 5, 1, 2, 3, 5}, l[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 3, 3},
1512 m[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.7, 7, 6},
1513 n[] = {5.28076, -8.67658, 0.7501127, 0.7590023, 0.01451899, 4.777189, -3.330988, 3.775673, -2.290919,
1514 0.8888268, -0.6234864, -0.04127263, -0.08455389, -0.1308752, 0.008344962, -1.532005, -0.05883649, 0.02296658},
1515 t[] = {0.669, 1.05, 2.75, 0.956, 1, 2, 2.75, 2.38, 3.37, 3.47, 2.63, 3.45, 0.72, 4.23, 0.2, 4.5, 29, 24};
1516 Lemmon2005 = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedExponential>();
1517 Lemmon2005->add_Lemmon2005(
1518 std::vector<CoolPropDbl>(n, n +
sizeof(n) /
sizeof(n[0])), std::vector<CoolPropDbl>(d, d +
sizeof(d) /
sizeof(d[0])),
1519 std::vector<CoolPropDbl>(t, t +
sizeof(t) /
sizeof(t[0])), std::vector<CoolPropDbl>(l, l +
sizeof(l) /
sizeof(l[0])),
1520 std::vector<CoolPropDbl>(m, m +
sizeof(m) /
sizeof(m[0])));
1523 CoolPropDbl d[] = {1, 1, 1, 3, 7, 1, 2, 5, 1, 1, 4, 2}, l[] = {0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3},
1524 n[] = {1.0038, -2.7662, 0.42921, 0.081363, 0.00024174, 0.48246, 0.75542, -0.00743, -0.4146, -0.016558, -0.10644, -0.021704},
1525 t[] = {0.25, 1.25, 1.5, 0.25, 0.875, 2.375, 2, 2.125, 3.5, 6.5, 4.75, 12.5};
1526 Power = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedExponential>();
1527 Power->add_Power(std::vector<CoolPropDbl>(n, n +
sizeof(n) /
sizeof(n[0])), std::vector<CoolPropDbl>(d, d +
sizeof(d) /
sizeof(d[0])),
1528 std::vector<CoolPropDbl>(t, t +
sizeof(t) /
sizeof(t[0])), std::vector<CoolPropDbl>(l, l +
sizeof(l) /
sizeof(l[0])));
1532 CoolPropDbl a = 1, epsilonbar = 12.2735737, kappabar = 1.09117041e-05, m = 1.01871348, vbarn = 0.0444215309;
1533 SAFT = std::make_shared<CoolProp::ResidualHelmholtzSAFTAssociating>(a, m, epsilonbar, vbarn, kappabar);
1536 CoolPropDbl n[] = {-0.666422765408, 0.726086323499, 0.0550686686128}, A[] = {0.7, 0.7, 0.7}, B[] = {0.3, 0.3, 1}, C[] = {10, 10, 12.5},
1537 D[] = {275, 275, 275}, a[] = {3.5, 3.5, 3}, b[] = {0.875, 0.925, 0.875}, beta[] = {0.3, 0.3, 0.3};
1538 NonAnalytic = std::make_shared<CoolProp::ResidualHelmholtzNonAnalytic>(
1539 std::vector<CoolPropDbl>(n, n +
sizeof(n) /
sizeof(n[0])), std::vector<CoolPropDbl>(a, a +
sizeof(a) /
sizeof(a[0])),
1540 std::vector<CoolPropDbl>(b, b +
sizeof(b) /
sizeof(b[0])), std::vector<CoolPropDbl>(beta, beta +
sizeof(beta) /
sizeof(beta[0])),
1541 std::vector<CoolPropDbl>(A, A +
sizeof(A) /
sizeof(A[0])), std::vector<CoolPropDbl>(B, B +
sizeof(B) /
sizeof(B[0])),
1542 std::vector<CoolPropDbl>(C, C +
sizeof(C) /
sizeof(C[0])), std::vector<CoolPropDbl>(D, D +
sizeof(D) /
sizeof(D[0])));
1545 CoolPropDbl d[] = {2, 2, 2, 0, 0, 0}, g[] = {1.65533788, 1.65533788, 1.65533788, 1.65533788, 1.65533788, 1.65533788},
1546 l[] = {2, 2, 2, 2, 2, 2},
1547 n[] = {-3.821884669859, 8.30345065618981, -4.4832307260286, -1.02590136933231, 2.20786016506394, -1.07889905203761},
1548 t[] = {3, 4, 5, 3, 4, 5};
1549 Exponential = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedExponential>();
1550 Exponential->add_Exponential(
1551 std::vector<CoolPropDbl>(n, n +
sizeof(n) /
sizeof(n[0])), std::vector<CoolPropDbl>(d, d +
sizeof(d) /
sizeof(n[0])),
1552 std::vector<CoolPropDbl>(t, t +
sizeof(t) /
sizeof(d[0])), std::vector<CoolPropDbl>(g, g +
sizeof(g) /
sizeof(t[0])),
1553 std::vector<CoolPropDbl>(l, l +
sizeof(l) /
sizeof(l[0])));
1556 CoolPropDbl d[] = {1, 4, 1, 2, 2, 2, 2, 2, 3}, t[] = {0.0, 1.85, 7.85, 5.4, 0.0, 0.75, 2.8, 4.45, 4.25},
1557 n[] = {-0.0098038985517335, 0.00042487270143005, -0.034800214576142, -0.13333813013896, -0.011993694974627,
1558 0.069243379775168, -0.31022508148249, 0.24495491753226, 0.22369816716981},
1559 eta[] = {0.0, 0.0, 1.0, 1.0, 0.25, 0.0, 0.0, 0.0, 0.0}, epsilon[] = {0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5},
1560 beta[] = {0.0, 0.0, 1.0, 1.0, 2.5, 3.0, 3.0, 3.0, 3.0}, gamma[] = {0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};
1561 GERG2008 = std::make_shared<CoolProp::ResidualHelmholtzGeneralizedExponential>();
1562 GERG2008->add_GERG2008Gaussian(
1563 std::vector<CoolPropDbl>(n, n +
sizeof(n) /
sizeof(n[0])), std::vector<CoolPropDbl>(d, d +
sizeof(d) /
sizeof(n[0])),
1564 std::vector<CoolPropDbl>(t, t +
sizeof(t) /
sizeof(d[0])), std::vector<CoolPropDbl>(eta, eta +
sizeof(eta) /
sizeof(eta[0])),
1565 std::vector<CoolPropDbl>(epsilon, epsilon +
sizeof(epsilon) /
sizeof(epsilon[0])),
1566 std::vector<CoolPropDbl>(beta, beta +
sizeof(beta) /
sizeof(beta[0])),
1567 std::vector<CoolPropDbl>(gamma, gamma +
sizeof(gamma) /
sizeof(gamma[0])));
1571 if (!d.compare(
"dTau")) {
1572 return dTau(term, tau, delta, ddelta);
1573 }
else if (!d.compare(
"dTau2")) {
1574 return dTau2(term, tau, delta, ddelta);
1575 }
else if (!d.compare(
"dTau3")) {
1576 return dTau3(term, tau, delta, ddelta);
1577 }
else if (!d.compare(
"dTau4")) {
1578 return dTau4(term, tau, delta, ddelta);
1579 }
else if (!d.compare(
"dDelta")) {
1580 return dDelta(term, tau, delta, ddelta);
1581 }
else if (!d.compare(
"dDelta2")) {
1582 return dDelta2(term, tau, delta, ddelta);
1583 }
else if (!d.compare(
"dDelta3")) {
1584 return dDelta3(term, tau, delta, ddelta);
1585 }
else if (!d.compare(
"dDelta4")) {
1586 return dDelta4(term, tau, delta, ddelta);
1587 }
else if (!d.compare(
"dDelta_dTau")) {
1588 return dDelta_dTau(term, tau, delta, ddelta);
1589 }
else if (!d.compare(
"dDelta_dTau2")) {
1590 return dDelta_dTau2(term, tau, delta, ddelta);
1591 }
else if (!d.compare(
"dDelta2_dTau")) {
1592 return dDelta2_dTau(term, tau, delta, ddelta);
1593 }
else if (!d.compare(
"dDelta3_dTau")) {
1594 return dDelta3_dTau(term, tau, delta, ddelta);
1595 }
else if (!d.compare(
"dDelta2_dTau2")) {
1596 return dDelta2_dTau2(term, tau, delta, ddelta);
1597 }
else if (!d.compare(
"dDelta_dTau3")) {
1598 return dDelta_dTau3(term, tau, delta, ddelta);
1603 shared_ptr<CoolProp::BaseHelmholtzTerm> get(
const std::string& t) {
1604 if (!t.compare(
"Lead")) {
1606 }
else if (!t.compare(
"LogTau")) {
1608 }
else if (!t.compare(
"IGPower")) {
1610 }
else if (!t.compare(
"PlanckEinstein")) {
1611 return PlanckEinstein;
1612 }
else if (!t.compare(
"CP0Constant")) {
1614 }
else if (!t.compare(
"CP0PolyT")) {
1616 }
else if (!t.compare(
"GERG2004Cosh")) {
1617 return GERG2004Cosh;
1618 }
else if (!t.compare(
"GERG2004Sinh")) {
1619 return GERG2004Sinh;
1620 }
else if (!t.compare(
"SRK")) {
1622 }
else if (!t.compare(
"PengRobinson")) {
1624 }
else if (!t.compare(
"XiangDeiters")) {
1625 return XiangDeiters;
1626 }
else if (!t.compare(
"GaoB")) {
1630 else if (!t.compare(
"Gaussian")) {
1632 }
else if (!t.compare(
"Lemmon2005")) {
1634 }
else if (!t.compare(
"Power")) {
1636 }
else if (!t.compare(
"SAFT")) {
1638 }
else if (!t.compare(
"NonAnalytic")) {
1640 }
else if (!t.compare(
"Exponential")) {
1642 }
else if (!t.compare(
"GERG2008")) {
1649 CoolPropDbl term_plus = term->base(tau + dtau, delta);
1650 CoolPropDbl term_minus = term->base(tau - dtau, delta);
1651 numerical = (term_plus - term_minus) / (2 * dtau);
1652 analytic = term->dTau(tau, delta);
1655 CoolPropDbl term_plus = term->dTau(tau + dtau, delta);
1656 CoolPropDbl term_minus = term->dTau(tau - dtau, delta);
1657 numerical = (term_plus - term_minus) / (2 * dtau);
1658 analytic = term->dTau2(tau, delta);
1661 CoolPropDbl term_plus = term->dTau2(tau + dtau, delta);
1662 CoolPropDbl term_minus = term->dTau2(tau - dtau, delta);
1663 numerical = (term_plus - term_minus) / (2 * dtau);
1664 analytic = term->dTau3(tau, delta);
1667 CoolPropDbl term_plus = term->dTau3(tau + dtau, delta);
1668 CoolPropDbl term_minus = term->dTau3(tau - dtau, delta);
1669 numerical = (term_plus - term_minus) / (2 * dtau);
1670 analytic = term->dTau4(tau, delta);
1673 CoolPropDbl term_plus = term->base(tau, delta + ddelta);
1674 CoolPropDbl term_minus = term->base(tau, delta - ddelta);
1675 numerical = (term_plus - term_minus) / (2 * ddelta);
1676 analytic = term->dDelta(tau, delta);
1679 CoolPropDbl term_plus = term->dDelta(tau, delta + ddelta);
1680 CoolPropDbl term_minus = term->dDelta(tau, delta - ddelta);
1681 numerical = (term_plus - term_minus) / (2 * ddelta);
1682 analytic = term->dDelta2(tau, delta);
1685 CoolPropDbl term_plus = term->dDelta2(tau, delta + ddelta);
1686 CoolPropDbl term_minus = term->dDelta2(tau, delta - ddelta);
1687 numerical = (term_plus - term_minus) / (2 * ddelta);
1688 analytic = term->dDelta3(tau, delta);
1691 CoolPropDbl term_plus = term->dDelta3(tau, delta + ddelta);
1692 CoolPropDbl term_minus = term->dDelta3(tau, delta - ddelta);
1693 numerical = (term_plus - term_minus) / (2 * ddelta);
1694 analytic = term->dDelta4(tau, delta);
1697 CoolPropDbl term_plus = term->dTau(tau, delta + ddelta);
1698 CoolPropDbl term_minus = term->dTau(tau, delta - ddelta);
1699 numerical = (term_plus - term_minus) / (2 * ddelta);
1700 analytic = term->dDelta_dTau(tau, delta);
1703 CoolPropDbl term_plus = term->dTau2(tau, delta + ddelta);
1704 CoolPropDbl term_minus = term->dTau2(tau, delta - ddelta);
1705 numerical = (term_plus - term_minus) / (2 * ddelta);
1706 analytic = term->dDelta_dTau2(tau, delta);
1709 CoolPropDbl term_plus = term->dDelta_dTau(tau, delta + ddelta);
1710 CoolPropDbl term_minus = term->dDelta_dTau(tau, delta - ddelta);
1711 numerical = (term_plus - term_minus) / (2 * ddelta);
1712 analytic = term->dDelta2_dTau(tau, delta);
1715 CoolPropDbl term_plus = term->dDelta2_dTau(tau, delta + ddelta);
1716 CoolPropDbl term_minus = term->dDelta2_dTau(tau, delta - ddelta);
1717 numerical = (term_plus - term_minus) / (2 * ddelta);
1718 analytic = term->dDelta3_dTau(tau, delta);
1721 CoolPropDbl term_plus = term->dDelta_dTau2(tau, delta + ddelta);
1722 CoolPropDbl term_minus = term->dDelta_dTau2(tau, delta - ddelta);
1723 numerical = (term_plus - term_minus) / (2 * ddelta);
1724 analytic = term->dDelta2_dTau2(tau, delta);
1727 CoolPropDbl term_plus = term->dTau3(tau, delta + ddelta);
1728 CoolPropDbl term_minus = term->dTau3(tau, delta - ddelta);
1729 numerical = (term_plus - term_minus) / (2 * ddelta);
1730 analytic = term->dDelta_dTau3(tau, delta);
1732 double get_analytic_mcx(shared_ptr<CoolProp::BaseHelmholtzTerm> term,
CoolPropDbl tau,
CoolPropDbl delta,
int ntau,
int ndelta) {
1734 using fcn_t = std::function<mcx::MultiComplex<double>(
const std::vector<mcx::MultiComplex<double>>&)>;
1735 fcn_t f = [&term](
const std::vector<mcx::MultiComplex<double>>& x) {
return term->one_mcx(x[0], x[1]); };
1736 return mcx::diff_mcxN(f, std::vector<double>{tau, delta}, std::vector<int>{ntau, ndelta});
1741 double err(
double v1,
double v2) {
1742 if (std::abs(v2) > 1e-15) {
1743 return std::abs((v1 - v2) / v2);
1745 return std::abs(v1 - v2);
1750std::string terms[] = {
"Lead",
"LogTau",
"IGPower",
"PlanckEinstein",
"CP0Constant",
"CP0PolyT",
"Gaussian",
1751 "Lemmon2005",
"Power",
"SAFT",
"NonAnalytic",
"Exponential",
"GERG2008",
"SRK",
1752 "PengRobinson",
"XiangDeiters",
"GaoB",
"GERG2004Cosh",
"GERG2004Sinh"};
1753const std::vector<std::string> derivs = {
"dTau",
"dTau2",
"dTau3",
"dDelta",
"dDelta2",
"dDelta3",
"dDelta_dTau",
1754 "dDelta_dTau2",
"dDelta2_dTau",
"dTau4",
"dDelta_dTau3",
"dDelta2_dTau2",
"dDelta3_dTau",
"dDelta4"};
1755std::map<std::string, std::tuple<int, int>> counts = {
1756 {
"dTau", {1, 0}}, {
"dTau2", {2, 0}}, {
"dTau3", {3, 0}}, {
"dTau4", {4, 0}}, {
"dDelta", {0, 1}},
1757 {
"dDelta2", {0, 2}}, {
"dDelta3", {0, 3}}, {
"dDelta4", {0, 4}}, {
"dDelta_dTau", {1, 1}}, {
"dDelta_dTau2", {2, 1}},
1758 {
"dDelta2_dTau", {1, 2}}, {
"dDelta_dTau3", {3, 1}}, {
"dDelta2_dTau2", {2, 2}}, {
"dDelta3_dTau", {1, 3}},
1761TEST_CASE_METHOD(HelmholtzConsistencyFixture,
"Helmholtz energy derivatives",
"[helmholtz]") {
1762 shared_ptr<CoolProp::BaseHelmholtzTerm> term;
1763 std::size_t n =
sizeof(terms) /
sizeof(terms[0]);
1764 for (std::size_t i = 0; i < n; ++i) {
1765 term = get(terms[i]);
1766 for (
const auto& deriv : derivs) {
1767 if (terms[i] ==
"SAFT"
1768 && (deriv ==
"dTau4" || deriv ==
"dDelta_dTau3" || deriv ==
"dDelta2_dTau2" || deriv ==
"dDelta3_dTau" || deriv ==
"dDelta4")) {
1771 double tau = 1.3, delta = 0.9;
1772 call(deriv, term, tau, delta, 1e-5);
1773 double alphar = term->base(tau, delta);
1776 auto [ntau, ndelta] = counts.at(deriv);
1777 double numerical_mcx = _HUGE;
1778 double alphar_mcx = _HUGE;
1780 numerical_mcx = get_analytic_mcx(term, tau, delta, ntau, ndelta);
1781 alphar_mcx = term->one_mcx(tau, delta).real();
1782 }
catch (std::exception& ) {
1788 CAPTURE(alphar_mcx);
1789 CAPTURE(numerical_mcx);
1793 double numerical_finitediff = numerical;
1794 CAPTURE(numerical_finitediff);
1797 double deriv_tolerance = 1e-9;
1798 if (terms[i] ==
"GERG2004Cosh" || terms[i] ==
"GERG2004Sinh" || terms[i] ==
"CP0PolyT") {
1799 deriv_tolerance = 1e-7;
1801 double val_tolerance = 1e-14;
1802 if (terms[i] ==
"CP0PolyT") {
1803 val_tolerance = 1e-10;
1805 if (terms[i] ==
"GaoB") {
1806 val_tolerance = 1e-12;
1809 if (std::isfinite(numerical_mcx)) {
1810 CHECK(err(analytic, numerical_mcx) < deriv_tolerance);
1811 CHECK(err(alphar, alphar_mcx) < val_tolerance);
1813 CHECK(err(analytic, numerical_finitediff) < deriv_tolerance);