//CL: calculated all (minimal) needed properties for a given pressure and enthalpy void Foam::calculateProperties_ph ( scalar &p, scalar &h, scalar &T, scalar &rho, scalar &psi, scalar &drhodh, scalar &mu, scalar &alpha ) { SteamState S; // CL: vapor mass fraction is also calculated in calculateProperties_h // CL: in this fuction, x is a dummy variable and x is not return to IAPWSThermo.C scalar x; S=freesteam_set_ph(p,h); calculateProperties_h(S,p,h,T,rho,psi,drhodh,mu,alpha,x); }
/** ASCEND external evaluation function Outputs: T Inputs: p, h @return 0 on success */ int Tvsx_ph_calc(struct BBoxInterp *bbox, int ninputs, int noutputs, double *inputs, double *outputs, double *jacobian ){ (void)bbox; (void)jacobian; // not used (void)ninputs; (void)noutputs; // not used currently #if 0 ASC_ASSERT(ninputs==2); ASSERT(noutputs==2); #endif // convert inputs to freesteam dimensionful values double p = inputs[0]; /* ASCEND uses SI units, so no conversion needed */ double h = inputs[1]; /* ASCEND uses SI units, so no conversion needed */ #ifdef BBOX_DEBUG ERROR_REPORTER_HERE(ASC_USER_NOTE, "Evaluating with p = %f bar, h = %f kJ/kg" ,p,h ); #endif SteamState S; S = freesteam_set_ph(p,h); double T, dTdh_p, dTdp_h; double v, dvdh_p, dvdp_h; double s, dsdh_p, dsdp_h; double x, dxdh_p, dxdp_h; switch(bbox->task){ case bb_func_eval: T = freesteam_T(S); v = freesteam_v(S); s = freesteam_s(S); if(S.region==3){ /* nonsense value */ x = 0.5; }else{ x = freesteam_x(S); } #ifdef BBOX_DEBUG ERROR_REPORTER_HERE(ASC_USER_NOTE, "Got result T = %f K" ,T ); #endif outputs[0] = T; outputs[1] = v; outputs[2] = s; outputs[3] = x; /* TODO add error checks here, surely? */ return 0; case bb_deriv_eval: /*fprintf(stderr,"derivative evaluation, region %d\n",S.region);*/ dTdp_h = freesteam_deriv(S,"Tph"); dTdh_p = freesteam_deriv(S,"Thp"); dvdp_h = freesteam_deriv(S,"vph"); dvdh_p = freesteam_deriv(S,"vhp"); dsdp_h = freesteam_deriv(S,"sph"); dsdh_p = freesteam_deriv(S,"shp"); switch(S.region){ case 4: dxdp_h = freesteam_deriv(S,"xph"); dxdh_p = freesteam_deriv(S,"xhp"); break; default: /* try to 'slope' the solver into the saturation region */ dxdp_h = 0; dxdh_p = 0.001; break; } #ifdef BBOX_DEBUG ERROR_REPORTER_HERE(ASC_USER_NOTE, "Got result (dT/dp)h = %g, (dT/dh)p = %g K/Pa",dTdp_h,dTdh_p ); ERROR_REPORTER_HERE(ASC_USER_NOTE, "Got result (dv/dp)h = %g, (dv/dh)p = %g K/Pa",dvdp_h,dvdh_p ); #endif jacobian[0] = dTdp_h; jacobian[1] = dTdh_p; jacobian[2] = dvdp_h; jacobian[3] = dvdh_p; jacobian[4] = dsdp_h; jacobian[5] = dsdh_p; jacobian[6] = dxdp_h; jacobian[7] = dxdh_p; return 0; default: ERROR_REPORTER_HERE(ASC_PROG_ERR,"Invalid call, unknown bbox->task"); return 1; } }
//CL: drhodh=(drho/dh)_p=const Foam::scalar Foam::drhodh_ph(scalar p,scalar h) { return drhodh(freesteam_set_ph(p,h)); }
//CL: psiH=(drho/dp)_h=const Foam::scalar Foam::psiH_ph(scalar p,scalar h) { return psiH(freesteam_set_ph(p,h)); }
//CL: returns temperature for given pressure and enthalpy Foam::scalar Foam::T_ph(scalar p,scalar h) { return freesteam_T(freesteam_set_ph(p,h)); }
//CL: returns Cv (heat capacity @ contant volume) for given pressure and enthalpy Foam::scalar Foam::cv_ph(scalar p,scalar h) { return freesteam_cv(freesteam_set_ph(p,h)); }
//CL: returns density for given pressure and enthalpy Foam::scalar Foam::rho_ph(scalar p,scalar h) { return 1/freesteam_v(freesteam_set_ph(p,h)); }
int eval_state (TableData *data) { double var1, var2; int active_sol_class; int active_sol; /* read input without units conversion */ var1 = atof (gtk_entry_get_text (data->indep_var1_entry) ); var2 = atof (gtk_entry_get_text (data->indep_var2_entry) ); active_sol_class = gtk_combo_box_get_active (data->SolverClassCombo); active_sol = gtk_combo_box_get_active (data->IndVariablesCombo); /* single phase state */ /**********************/ if( active_sol_class == SINGLE_PHASE_SOLVER ) { switch (active_sol) { case SOLVER_PT: if (1) data->S = freesteam_set_pT (var1*1e+5, var2+273.15); else return DOMAIN_ERROR; break; case SOLVER_PH: if (!freesteam_bounds_ph (var1*1e+5, var2*1e+3, VERBOSE)) { data->S = freesteam_set_ph (var1 * 1e+5, var2 * 1e+3); if (data->S.region == REGION_4) { var1 = freesteam_region4_Tsat_p (var1 * 1e+5); /* T in K */ data->SLiq = freesteam_set_Tx (var1, 0.0); data->SVap = freesteam_set_Tx (var1, 1.0); data->SMix = data->S; } } else return DOMAIN_ERROR; break; case SOLVER_PS: if (!freesteam_bounds_ps (var1*1e+5, var2*1e+3, VERBOSE)) { data->S = freesteam_set_ps (var1 * 1e+5, var2 * 1e+3); } else return DOMAIN_ERROR; break; case SOLVER_PU: data->S = freesteam_set_pu (var1 * 1e+5, var2 * 1e+3); break; case SOLVER_PV: if (freesteam_bounds_pv (var1 * 1e+5, var2, VERBOSE)) { data->S = freesteam_set_pv (var1 * 1e+5, var2); } else return DOMAIN_ERROR; break; case SOLVER_TS: if (!freesteam_bounds_Ts (var1+273.15, var2*1e+3, VERBOSE)) { data->S = freesteam_set_Ts( var1 + 273.15, var2 * 1e+3); } else return DOMAIN_ERROR; } /* switch */ } /* saturation state */ /********************/ else if (active_sol_class == SATURATION_SOLVER) { data->S.region = REGION_4; switch (active_sol) { case SAT_SOLVER_TX: if (!freesteam_bounds_Tx (var1 + 273.15, var2, 1)) { data->SLiq = freesteam_set_Tx (var1 + 273.15, 0.0); data->SVap = freesteam_set_Tx (var1 + 273.15, 1.0); data->SMix = freesteam_set_Tx (var1 + 273.15, var2); } else return DOMAIN_ERROR; break; case SAT_SOLVER_PX: if (1) { var1 = freesteam_region4_Tsat_p (var1 * 1e+5); /* T in K */ data->SLiq = freesteam_set_Tx (var1, 0.0); data->SVap = freesteam_set_Tx (var1, 1.0); data->SMix = freesteam_set_Tx (var1, var2); } else return DOMAIN_ERROR; break; } } /* solution found for new state */ switch (data->S.region) { case REGION_1: update_table_liststore( COL_LIQUID, 1, data, &data->S ); break; case REGION_2: update_table_liststore( COL_VAPOUR, 1, data, &data->S ); break; case REGION_3: update_table_liststore( COL_LIQUID, 1, data, &data->S ); break; case REGION_4: update_table_liststore (COL_VAPOUR, 0, data, &data->SVap); update_table_liststore (COL_LIQUID, 0, data, &data->SLiq); update_table_liststore (COL_MIXED , 0, data, &data->SMix); break; case REGION_5: update_table_liststore( COL_VAPOUR, 1, data, &data->S ); break; } return 0; }