// Routine to do some common initializations at the start of using // this routine. void WaterTransport::initTP() { // The expectation is that we have a VPStandardStateTP derived object VPStandardStateTP* vpthermo = dynamic_cast<VPStandardStateTP*>(m_thermo); if (!vpthermo) { WaterSSTP* wsstp = dynamic_cast<WaterSSTP*>(m_thermo); if (!wsstp) { throw CanteraError("WaterTransport::initTP()", "Expectation is that ThermoPhase be a VPStandardStateTP"); } else { m_sub = wsstp->getWater(); AssertTrace(m_sub != 0); // Get a pointer to a changeable WaterProps object m_waterProps = wsstp->getWaterProps(); AssertTrace(m_waterProps != 0); } } else { m_waterPDSS = dynamic_cast<PDSS_Water*>(vpthermo->providePDSS(0)); if (!m_waterPDSS) { throw CanteraError("WaterTransport::initTP()", "Expectation is that first species be water with a PDSS_Water object"); } // Get a pointer to a changeable WaterPropsIAPWS object m_sub = m_waterPDSS->getWater(); AssertTrace(m_sub != 0); // Get a pointer to a changeable WaterProps object m_waterProps = m_waterPDSS->getWaterProps(); AssertTrace(m_waterProps != 0); } }
TEST(WaterSSTP, fromScratch) { WaterSSTP water; water.addSpecies(make_species("H2O", "H:2, O:1", h2o_nasa_coeffs)); water.initThermo(); water.setState_TP(298.15, 1e5); EXPECT_NEAR(water.enthalpy_mole() / 1e6, -285.83, 2e-2); }
int main() { #ifdef _MSC_VER _set_output_format(_TWO_DIGIT_EXPONENT); #endif double pres; try { WaterSSTP* w = new WaterSSTP("waterTPphase.xml",""); delete w; char iFile[80], file_ID[80]; strcpy(iFile, "waterTPphase.xml"); sprintf(file_ID,"%s#water", iFile); XML_Node* xm = get_XML_NameID("phase", file_ID, 0); w = new WaterSSTP(*xm); delete w; strcpy(iFile, "waterTPphase.xml"); sprintf(file_ID,"%s#water", iFile); xm = get_XML_NameID("phase", file_ID, 0); w = new WaterSSTP(); importPhase(*xm, w); /* * Print out the triple point conditions */ double temp = 273.16; pres = w->satPressure(temp); printf("psat(%g) = %g\n", temp, pres); double presLow = 1.0E-2; temp = 298.15; double oneBar = 1.0E5; double vol; printf("Comparisons to NIST: (see http://webbook.nist.gov):\n\n"); w->setDensity(1.0E-8); w->setState_TP(temp, presLow); double h = w->enthalpy_mole(); printf("H0(298.15) = %g J/kmol\n", h); double h298 = h; double s = w->entropy_mole(); s -= GasConstant * log(oneBar/presLow); printf("S0(298.15) = %g J/kmolK\n", s); double T[20]; T[0] = 298.15; T[1] = 500.; T[2] = 600.; T[3] = 1000.; double Cp0, delh0, delg0, g; double Cp0_ss; printf("\nIdeal Gas Standard State:\n"); printf(" T Cp0 S0 " " -(G0-H298)/T H0-H298\n"); printf(" (K) (J/molK) (J/molK) " " (J/molK) (kJ/mol)\n"); for (int i = 0; i < 4; i++) { temp = T[i]; w->setState_TP(temp, presLow); h = w->enthalpy_mole(); delh0 = tvalue(h - h298, 1.0E-6); g = w->gibbs_mole(); delg0 = (g - h298)/temp + GasConstant * log(oneBar/presLow); Cp0 = w->cp_mole(); { w->getCp_R(&Cp0_ss); Cp0_ss *= GasConstant; if (fabs(Cp0_ss - Cp0) > 1.0E-5) { printf("Inconsistency!\n"); exit(-1); } } s = w->entropy_mole(); s -= GasConstant * log(oneBar/presLow); printf("%10g %10g %13g %13g %13g\n", temp, Cp0*1.0E-3, s*1.0E-3, -delg0*1.0E-3, delh0*1.0E-6); } printf("\n\n"); temp = 298.15; w->setDensity(1000.); w->setState_TP(temp, oneBar); h = w->enthalpy_mole(); printf("H_liq(298.15, onebar) = %g J/kmol\n", h); double h298l = h; s = w->entropy_mole(); printf("S_liq(298.15, onebar) = %g J/kmolK\n", s); T[0] = 273.19; T[1] = 298.15; T[2] = 300.; T[3] = 373.15; T[4] = 400.; T[5] = 500.; printf("\nLiquid 1bar or psat Standard State\n"); printf(" T press psat Cp0 S0 " " -(G0-H298)/T H0-H298\n"); printf(" (K) (bar) (bar) (J/molK) (J/molK)" " (J/molK) (kJ/mol)\n"); for (int i = 0; i < 6; i++) { temp = T[i]; double psat = w->satPressure(temp); double press = oneBar; if (psat > press) { press = psat*1.002; } w->setState_TP(temp, press); h = w->enthalpy_mole(); delh0 = tvalue(h - h298l, 1.0E-6); g = w->gibbs_mole(); delg0 = (g - h298l)/temp; Cp0 = w->cp_mole(); s = w->entropy_mole(); printf("%10g %10g %12g %13g %13g %13g %13g\n", temp, press*1.0E-5, psat*1.0E-5, Cp0*1.0E-3, s*1.0E-3, -delg0*1.0E-3, delh0*1.0E-6); } printf("\nLiquid Densities:\n"); printf(" T press psat Density molarVol " "\n"); printf(" (K) (bar) (bar) (kg/m3) (m3/kmol)" "\n"); for (int i = 0; i < 6; i++) { temp = T[i]; double psat = w->satPressure(temp); double press = oneBar; if (psat > press) { press = psat*1.002; } w->setState_TP(temp, press); double d = w->density(); double mw = w->molecularWeight(0); double vbar = mw/d; // not implemented //w.getPartialMolarVolumes(&vbar); printf("%10g %10g %12g %13g %13g\n", temp, press*1.0E-5, psat*1.0E-5, d, vbar); } printf("\nLiquid 1bar or psat State: Partial Molar Quantities\n"); printf(" T press psat Cpbar Sbar " " -(G0-H298)/T H0-H298 Volume\n"); printf(" (K) (bar) (bar) (J/molK) (J/molK)" " (J/molK) (kJ/mol) m3/kmol\n"); for (int i = 0; i < 6; i++) { temp = T[i]; double psat = w->satPressure(temp); double press = oneBar; if (psat > press) { press = psat*1.002; } w->setState_TP(temp, press); w->getPartialMolarEnthalpies(&h); delh0 = tvalue(h - h298l, 1.0E-6); w->getChemPotentials(&g); delg0 = (g - h298l)/temp; w->getPartialMolarCp(&Cp0); w->getPartialMolarEntropies(&s); w->getPartialMolarVolumes(&vol); printf("%10g %10g %12g %13g %13g %13g %13g %13g\n", temp, press*1.0E-5, psat*1.0E-5, Cp0*1.0E-3, s*1.0E-3, -delg0*1.0E-3, delh0*1.0E-6, vol); } printf("\nLiquid 1bar or psat State: Standard State Quantities\n"); printf(" T press psat Cpbar Sbar " " -(G0-H298)/T H0-H298 Volume\n"); printf(" (K) (bar) (bar) (J/molK) (J/molK)" " (J/molK) (kJ/mol) m3/kmol\n"); for (int i = 0; i < 6; i++) { temp = T[i]; double psat = w->satPressure(temp); double press = oneBar; if (psat > press) { press = psat*1.002; } w->setState_TP(temp, press); w->getEnthalpy_RT(&h); h *= temp * GasConstant; delh0 = tvalue(h - h298l, 1.0E-6); w->getStandardChemPotentials(&g); delg0 = (g - h298l)/temp; w->getCp_R(&Cp0); Cp0 *= GasConstant; w->getEntropy_R(&s); s *= GasConstant; w->getStandardVolumes(&vol); printf("%10g %10g %12g %13g %13g %13g %13g %13g\n", temp, press*1.0E-5, psat*1.0E-5, Cp0*1.0E-3, s*1.0E-3, -delg0*1.0E-3, delh0*1.0E-6, vol); } printf("\nLiquid 1bar or psat State: Reference State Quantities (Always 1 atm no matter what system pressure is)\n"); printf(" T press psat Cpbar Sbar " " -(G0-H298)/T H0-H298 Volume\n"); printf(" (K) (bar) (bar) (J/molK) (J/molK)" " (J/molK) (kJ/mol) m3/kmol\n"); for (int i = 0; i < 6; i++) { temp = T[i]; double psat = w->satPressure(temp); double press = oneBar; if (psat > press) { press = psat*1.002; } w->setState_TP(temp, press); w->getEnthalpy_RT_ref(&h); h *= temp * GasConstant; delh0 = tvalue(h - h298l, 1.0E-6); w->getGibbs_ref(&g); delg0 = (g - h298l)/temp; w->getCp_R_ref(&Cp0); Cp0 *= GasConstant; w->getEntropy_R_ref(&s); s *= GasConstant; w->getStandardVolumes_ref(&vol); printf("%10g %10g %12g %13g %13g %13g %13g %13g\n", temp, press*1.0E-5, psat*1.0E-5, Cp0*1.0E-3, s*1.0E-3, -delg0*1.0E-3, delh0*1.0E-6, vol); } printf("\nLiquid 1 atm: Standard State Quantities - Should agree with table above\n"); printf(" T press psat Cpbar Sbar " " -(G0-H298)/T H0-H298 Volume\n"); printf(" (K) (bar) (bar) (J/molK) (J/molK)" " (J/molK) (kJ/mol) m3/kmol\n"); for (int i = 0; i < 6; i++) { temp = T[i]; double psat = w->satPressure(temp); double press = OneAtm; w->setState_TP(temp, press); w->getEnthalpy_RT(&h); h *= temp * GasConstant; delh0 = tvalue(h - h298l, 1.0E-6); w->getStandardChemPotentials(&g); delg0 = (g - h298l)/temp; w->getCp_R(&Cp0); Cp0 *= GasConstant; w->getEntropy_R(&s); s *= GasConstant; w->getStandardVolumes(&vol); printf("%10g %10g %12g %13g %13g %13g %13g %13g\n", temp, press*1.0E-5, psat*1.0E-5, Cp0*1.0E-3, s*1.0E-3, -delg0*1.0E-3, delh0*1.0E-6, vol); } printf("\n\nTable of increasing Enthalpy at 1 atm\n\n"); double dens; printf(" Enthalpy, Temperature, x_Vapor, Density, Entropy_mass, Gibbs_mass\n"); w->setState_TP(298., OneAtm); double Hset = w->enthalpy_mass(); double vapFrac = w->vaporFraction(); double Tcalc = w->temperature(); double Scalc = w->entropy_mass(); double Gcalc = w->gibbs_mass(); dens = w->density(); printf(" %10g, %10g, %10g, %11.5g, %11.5g, %11.5g\n", Hset , Tcalc, vapFrac, dens, Scalc, Gcalc); w->setState_HP(Hset, OneAtm); vapFrac = w->vaporFraction(); Tcalc = w->temperature(); dens = w->density(); Scalc = w->entropy_mass(); Gcalc = w->gibbs_mass(); printf(" %10g, %10g, %10g, %11.5g, %11.5g, %11.5g\n", Hset , Tcalc, vapFrac, dens, Scalc, Gcalc); double deltaH = 100000.; for (int i = 0; i < 40; i++) { Hset += deltaH; try { w->setState_HP(Hset, OneAtm); } catch (CanteraError& err) { err.save(); printf(" %10g, -> Failed to converge, beyond the spinodal probably \n\n", Hset); popError(); break; } vapFrac = w->vaporFraction(); Tcalc = w->temperature(); dens = w->density(); Scalc = w->entropy_mass(); Gcalc = w->gibbs_mass(); printf(" %10g, %10g, %10g, %11.5g, %11.5g, %11.5g\n", Hset , Tcalc, vapFrac, dens, Scalc, Gcalc); } printf("Critical Temp = %10.3g K\n", w->critTemperature()); printf("Critical Pressure = %10.3g atm\n", w->critPressure()/OneAtm); printf("Critical Dens = %10.3g kg/m3\n", w->critDensity()); delete w; } catch (CanteraError& err) { std::cout << err.what() << std::endl; Cantera::appdelete(); return -1; } return 0; }
int main() { try { double lambda; WaterSSTP* w = new WaterSSTP("waterTPphase.xml", ""); WaterTransport* wtTran = new WaterTransport(w, 3); printf("------------------------------------------------------------------------------------\n"); printf(" T(C) MPa Phase Visc Visc(paper) lambda lambda(paper)\n"); printf(" 10-6 kg/m/s 10-3 W/m/s \n"); printf("------------------------------------------------------------------------------------\n"); double T = 273.15 + 25.0; double pres = 1.0E5; w->setState_TP(T, pres); double visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g L %13.6g 890.5 %13.6g 607.2\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); T = 273.15 + 100.0; pres = 1.0E5; w->setState_TP(T, pres); visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g L %13.6g 281.9 %13.6g 679.1\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); T = 273.15 + 100.0; pres = 1.0E7; w->setState_TP(T, pres); visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g L %13.6g 284.5 %13.6g 684.5\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); T = 273.15 + 250.0; pres = 5.0E6; w->setState_TP(T, pres); visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g L %13.6g 106.4 %13.6g 622.7\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); T = 273.15 + 250.0; pres = 5.0E7; w->setState_TP(T, pres); visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g L %13.6g 117.5 %13.6g 672.1\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); T = 273.15 + 350.0; pres = 1.75E7; w->setState_TP(T, pres); visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g L %13.6g 67.0 %13.6g 452.3\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); T = 273.15 + 400.0; pres = 1.50E7; w->setState_TP(T, pres); visc = wtTran->viscosity(); lambda = wtTran->thermalConductivity(); printf("%8g %10.3g SC %13.6g 24.93 %13.6g 80.68\n", T - 273.15, pres * 1.0E-6, visc * 1.0E6, lambda * 1.0E3); printf("---------------------------------------------------------------------------------\n"); delete w; } catch (CanteraError& err) { std::cout << err.what() << std::endl; Cantera::appdelete(); return -1; } return 0; }