20 const doublereal
T_c = 647.096;
22 static const doublereal
P_c = 22.064E6;
26 static const doublereal
M_water = 18.015268;
35 static const doublereal
Rgas = 8.314371E3;
79 int phase, doublereal rhoguess)
87 doublereal deltaGuess = 0.0;
88 if (rhoguess == -1.0) {
93 if (phase == WATER_GAS || phase == WATER_SUPERCRIT) {
95 }
else if (phase == WATER_LIQUID) {
99 }
else if (phase == WATER_UNSTABLELIQUID || phase == WATER_UNSTABLEGAS) {
101 "Unstable Branch finder is untested");
104 "unknown state: {}", phase);
114 deltaGuess = rhoguess /
Rho_c;
117 if (delta_retn <= 0) {
122 doublereal density_retn;
123 if (delta_retn > 0.0) {
127 density_retn = delta_retn *
Rho_c;
139 int phase, doublereal rhoguess)
const
142 doublereal deltaGuess = 0.0;
143 doublereal deltaSave =
delta;
144 if (rhoguess == -1.0) {
149 if (phase == WATER_GAS || phase == WATER_SUPERCRIT) {
151 }
else if (phase == WATER_LIQUID) {
155 }
else if (phase == WATER_UNSTABLELIQUID || phase == WATER_UNSTABLEGAS) {
157 "Unstable Branch finder is untested");
160 "unknown state: {}", phase);
170 deltaGuess = rhoguess /
Rho_c;
176 doublereal density_retn;
177 if (delta_retn > 0.0) {
181 density_retn = delta_retn *
Rho_c;
208 static const doublereal A[8] = {
220 doublereal pl = 6.3573118E0 - 8858.843E0 /
temperature
225 doublereal w = fabs(1.0-v);
227 for (
int i = 0; i < 8; i++) {
228 doublereal z = i + 1;
229 b += A[i] * pow(w, ((z+1.0)/2.0));
231 doublereal q = b / v;
242 doublereal dpdrho_val =
dpdrho();
244 return 1.0 / (dens * dpdrho_val);
275 doublereal& densLiq, doublereal& densGas, doublereal& delGRT)
278 if (densLiq <= 0.0) {
280 "Error occurred trying to find liquid density at (T,P) = {} {}",
287 if (densGas <= 0.0) {
289 "Error occurred trying to find gas density at (T,P) = {} {}",
295 delGRT = gibbsLiqRT - gibbsGasRT;
299 doublereal& densLiq, doublereal& densGas, doublereal& pcorr)
302 if (densLiq <= 0.0) {
304 "Error occurred trying to find liquid density at (T,P) = {} {}",
311 if (densGas <= 0.0) {
313 "Error occurred trying to find gas density at (T,P) = {} {}",
318 doublereal rhs = (prL - prG) + log(densLiq/densGas);
319 rhs /= (1.0/densGas - 1.0/densLiq);
325 static int method = 1;
326 doublereal densLiq = -1.0, densGas = -1.0, delGRT = 0.0;
327 doublereal dp, pcorr;
334 for (
int i = 0; i < 30; i++) {
337 doublereal delV =
M_water * (1.0/densLiq - 1.0/densGas);
345 if ((method == 1) && delGRT < 1.0E-8) {
348 if (fabs(dp/p) < 1.0E-9) {
354 if (waterState == WATER_LIQUID) {
356 }
else if (waterState == WATER_GAS) {
360 "unknown water state input: {}", waterState);
374 doublereal rhoMid =
Rho_c + (T -
T_c) * (
Rho_c - rhoMidAtm) / (
T_c - 373.15);
375 int iStateGuess = WATER_LIQUID;
377 iStateGuess = WATER_GAS;
384 doublereal rhoDel = rho * 1.000001;
385 doublereal deltaSave =
delta;
386 doublereal deltaDel = rhoDel /
Rho_c;
391 doublereal d2rhodp2 = (rhoDel * kappaDel - rho * kappa) / (rhoDel - rho);
392 if (d2rhodp2 > 0.0) {
393 iState = WATER_UNSTABLELIQUID;
395 iState = WATER_UNSTABLEGAS;
408 doublereal delta_save =
delta;
416 doublereal rho_low = 0.0;
417 doublereal rho_high = 1000;
419 doublereal dens_old = densSatLiq;
422 doublereal dpdrho_old =
dpdrho();
423 if (dpdrho_old > 0.0) {
424 rho_high = std::min(dens_old, rho_high);
426 rho_low = std::max(rho_low, dens_old);
428 doublereal dens_new = densSatLiq* (1.0001);
431 doublereal dpdrho_new =
dpdrho();
432 if (dpdrho_new > 0.0) {
433 rho_high = std::min(dens_new, rho_high);
435 rho_low = std::max(rho_low, dens_new);
439 for (
int it = 0; it < 50; it++) {
440 doublereal slope = (dpdrho_new - dpdrho_old)/(dens_new - dens_old);
442 slope = std::max(slope, dpdrho_new *5.0/ dens_new);
447 doublereal delta_rho = - dpdrho_new / slope;
448 if (delta_rho > 0.0) {
449 delta_rho = std::min(delta_rho, dens_new * 0.1);
451 delta_rho = std::max(delta_rho, - dens_new * 0.1);
453 doublereal dens_est = dens_new + delta_rho;
454 if (dens_est < rho_low) {
455 dens_est = 0.5 * (rho_low + dens_new);
457 if (dens_est > rho_high) {
458 dens_est = 0.5 * (rho_high + dens_new);
462 dpdrho_old = dpdrho_new;
468 if (dpdrho_new > 0.0) {
469 rho_high = std::min(dens_new, rho_high);
470 }
else if (dpdrho_new < 0.0) {
471 rho_low = std::max(rho_low, dens_new);
477 if (fabs(dpdrho_new) < 1.0E-5) {
484 throw CanteraError(
"WaterPropsIAPWS::densSpinodalWater",
485 "convergence failure");
496 doublereal delta_save =
delta;
504 doublereal rho_low = 0.0;
505 doublereal rho_high = 1000;
507 doublereal dens_old = densSatGas;
510 doublereal dpdrho_old =
dpdrho();
511 if (dpdrho_old < 0.0) {
512 rho_high = std::min(dens_old, rho_high);
514 rho_low = std::max(rho_low, dens_old);
516 doublereal dens_new = densSatGas * (0.99);
519 doublereal dpdrho_new =
dpdrho();
520 if (dpdrho_new < 0.0) {
521 rho_high = std::min(dens_new, rho_high);
523 rho_low = std::max(rho_low, dens_new);
526 for (
int it = 0; it < 50; it++) {
527 doublereal slope = (dpdrho_new - dpdrho_old)/(dens_new - dens_old);
532 slope = std::min(slope, dpdrho_new *5.0 / dens_new);
535 doublereal delta_rho = - dpdrho_new / slope;
536 if (delta_rho > 0.0) {
537 delta_rho = std::min(delta_rho, dens_new * 0.1);
539 delta_rho = std::max(delta_rho, - dens_new * 0.1);
541 doublereal dens_est = dens_new + delta_rho;
542 if (dens_est < rho_low) {
543 dens_est = 0.5 * (rho_low + dens_new);
545 if (dens_est > rho_high) {
546 dens_est = 0.5 * (rho_high + dens_new);
550 dpdrho_old = dpdrho_new;
555 if (dpdrho_new < 0.0) {
556 rho_high = std::min(dens_new, rho_high);
557 }
else if (dpdrho_new > 0.0) {
558 rho_low = std::max(rho_low, dens_new);
564 if (fabs(dpdrho_new) < 1.0E-5) {
571 throw CanteraError(
"WaterPropsIAPWS::densSpinodalSteam",
572 "convergence failure");