//CL: drhodh=(drho/dh)_p=const Foam::scalar Foam::drhodh(SteamState S) { label region; scalar cp,beta,drhodh,rho; region=freesteam_region(S); if (region==1) { rho=1/freesteam_region1_v_pT(S.R1.p,S.R1.T); //Cl: note: in FreeStream, beta=1/V*(dV/dP)_P=const is called alphaV (in this region) beta=freesteam_region1_alphav_pT(S.R1.p,S.R1.T); cp=freesteam_region1_cp_pT(S.R1.p,S.R1.T); //CL: getting derivatives using Bridgmans table //CL: drhodh=(drho/dh)_p=const drhodh=-rho*beta/cp; } else if (region==2) { rho=1/freesteam_region2_v_pT(S.R2.p,S.R2.T); //Cl: note: in FreeStream, beta=1/V*(dV/dP)_P=const is called alphaV (in this region) //Cl: note: in FreeStream, kappa=1/V*(dV/dP)_T=const is called kappaT (in this region) beta=freesteam_region2_alphav_pT(S.R2.p,S.R2.T); cp=freesteam_region2_cp_pT(S.R2.p,S.R2.T); //CL: getting derivatives using Bridgmans table //CL: drhodh=(drho/dh)_p=const drhodh=-rho*beta/cp; } else if (region==3) { scalar gamma,cv,p; p=freesteam_region3_p_rhoT(S.R3.rho,S.R3.T); //Cl: note: beta=1/V*(dV/dP)_P=const //Cl: note: in FreeStream, gamma=1/p*(dp/dT)_v=const is called alphap (in this region gamma=freesteam_region3_alphap_rhoT(S.R3.rho,S.R3.T); cp=freesteam_region3_cp_rhoT(S.R3.rho,S.R3.T); cv=freesteam_region3_cv_rhoT(S.R3.rho,S.R3.T); beta=(cp-cv)/(S.R3.T/S.R3.rho*p*gamma); //CL: getting derivatives using Bridgmans table //CL: drhodh=(drho/dh)_p=const drhodh=-S.R3.rho*beta/cp; } else if (region==4) { scalar vv,vl,hl,hv,p; SteamState Sl,Sv; rho=1/freesteam_region4_v_Tx(S.R4.T,S.R4.x); p=freesteam_region4_psat_T(S.R4.T); //CL: Getting density on the vapour and liquid lines vv=1/freesteam_region4_rhog_T(S.R4.T); vl=1/freesteam_region4_rhof_T(S.R4.T); // getting the states outside the vapour dome Sl=freesteam_set_pv(p,vl-0.0000001); //inside region 1 Sv=freesteam_set_pv(p,vv+0.0000001); //inside region 2 hl=freesteam_region1_h_pT(Sl.R1.p,Sl.R1.T); hv=freesteam_region2_h_pT(Sv.R2.p,Sv.R2.T); //CL: drhodh=(drho/dh)_p=const drhodh=-rho*rho*(vv-vl)/(hv-hl); } else { Info<<"IAPWS-IF97.C error, outside the regions 1-4"<<endl; } return drhodh; }
//CL: calculated the properties --> this function is called by the functions above //CL: does not calulated the internal energy, if this is needed e.g. for sonicFoam //CL: the function has to be changed a little bit void Foam::calculateProperties_h ( SteamState S, scalar &p, scalar &h, scalar &T, scalar &rho, scalar &psi, scalar &drhodh, scalar &mu, scalar &alpha, scalar &x ) { label region; scalar kappa,lambda,cp,beta; region=freesteam_region(S); if (region==1) { p=S.R1.p; T=S.R1.T; rho=1/freesteam_region1_v_pT(S.R1.p,S.R1.T); h=freesteam_region1_h_pT(S.R1.p,S.R1.T); x=0; //Cl: note: in FreeStream, beta=1/V*(dV/dP)_P=const is called alphaV (in this region) //Cl: note: in FreeStream, kappa=1/V*(dV/dP)_T=const is called kappaT (in this region) kappa=freesteam_region1_kappaT_pT(S.R1.p,S.R1.T); beta=freesteam_region1_alphav_pT(S.R1.p,S.R1.T); cp=freesteam_region1_cp_pT(S.R1.p,S.R1.T); //CL: getting derivatives using Bridgmans table //CL: psi=(drho/dp)_h=const //CL: drhodh=(drho/dh)_p=const psi=-((T*beta*beta-beta)/cp-kappa*rho); drhodh=-rho*beta/cp; //CL: getting transport properties mu=freesteam_mu_rhoT(rho, T); lambda=freesteam_k_rhoT(rho,T); alpha=lambda/cp; //Cl: Important info -->alpha= thermal diffusivity time density } else if (region==2) { p=S.R2.p; T=S.R2.T; rho=1/freesteam_region2_v_pT(S.R2.p,S.R2.T); h=freesteam_region2_h_pT(S.R2.p,S.R2.T); x=1; //Cl: note: in FreeStream, beta=1/V*(dV/dP)_P=const is called alphaV (in this region) //Cl: note: in FreeStream, kappa=1/V*(dV/dP)_T=const is called kappaT (in this region) kappa=freesteam_region2_kappaT_pT(S.R2.p,S.R2.T); beta=freesteam_region2_alphav_pT(S.R2.p,S.R2.T); cp=freesteam_region2_cp_pT(S.R2.p,S.R2.T); //CL: getting derivatives using Bridgmans table //CL: psi=(drho/dp)_h=const //CL: drhodh=(drho/dh)_p=const psi=-((T*beta*beta-beta)/cp-kappa*rho); drhodh=-rho*beta/cp; //CL: getting transport properties mu=freesteam_mu_rhoT(rho, T); lambda=freesteam_k_rhoT(rho,T); alpha=lambda/cp; //Cl: Important info -->alpha= thermal diffusivity time density } else if (region==3) { scalar gamma,cv; rho=S.R3.rho; T=S.R3.T; p=freesteam_region3_p_rhoT(S.R3.rho,S.R3.T); h=freesteam_region3_h_rhoT(S.R3.rho,S.R3.T); //CL= when h<h @ critical point -->x=0 else x=1 if (h<2084256.263) { x=0; } else { x=1; } //Cl: note: beta=1/V*(dV/dP)_P=const //Cl: note: kappa=1/V*(dV/dP)_T=const //Cl: note: in FreeStream, gamma=1/p*(dp/dT)_v=const is called alphap (in this region) gamma=freesteam_region3_alphap_rhoT(S.R3.rho,S.R3.T); cp=freesteam_region3_cp_rhoT(S.R3.rho,S.R3.T); cv=freesteam_region3_cv_rhoT(S.R3.rho,S.R3.T); beta=(cp-cv)/(S.R3.T/S.R3.rho*p*gamma); kappa=(cp-cv)/(S.R3.T/S.R3.rho*p*p*gamma*gamma); //CL: getting derivatives using Bridgmans table //CL: psi=(drho/dp)_h=const //CL: drhodh=(drho/dh)_p=const psi=-((T*beta*beta-beta)/cp-kappa*rho); drhodh=-rho*beta/cp; //CL: getting transport properties mu=freesteam_mu_rhoT(rho, T); lambda=freesteam_k_rhoT(rho,T); alpha=lambda/cp; //Cl: Important info -->alpha= thermal diffusivity time density } else if (region==4) { scalar rhov,rhol,betav,betal,kappav,kappal,vv,vl,cpl,cpv,hl,hv,cp; scalar dvldp,dvvdp,dhldp,dhvdp; scalar dpdT,dvdh,dvdp,dxdp; SteamState Sl,Sv; x=S.R4.x; T=S.R4.T; rho=1/freesteam_region4_v_Tx(S.R4.T,S.R4.x); h=freesteam_region4_h_Tx(S.R4.T,S.R4.x); p=freesteam_region4_psat_T(S.R4.T); cp=freesteam_region4_cp_Tx(S.R4.T,S.R4.x); //CL: Getting density on the vapour and liquid lines rhov=freesteam_region4_rhog_T(S.R4.T); rhol=freesteam_region4_rhof_T(S.R4.T); vv=1/rhov; vl=1/rhol; //CL: getting derivatives --> this is a bit tricky inside the vapor dome dpdT=freesteam_region4_dpsatdT_T(S.R4.T); // getting the states outside the vapour dome Sl=freesteam_set_pv(p,vl-0.0000001); //inside region 1 Sv=freesteam_set_pv(p,vv+0.0000001); //inside region 2 kappal=freesteam_region1_kappaT_pT(Sl.R1.p,Sl.R1.T); kappav=freesteam_region2_kappaT_pT(Sv.R2.p,Sv.R2.T); betal=freesteam_region1_alphav_pT(Sl.R1.p,Sl.R1.T); betav=freesteam_region2_alphav_pT(Sv.R2.p,Sv.R2.T); cpl=freesteam_region1_cp_pT(Sl.R1.p,Sl.R1.T); cpv=freesteam_region2_cp_pT(Sv.R2.p,Sv.R2.T); hl=freesteam_region1_h_pT(Sl.R1.p,Sl.R1.T); hv=freesteam_region2_h_pT(Sv.R2.p,Sv.R2.T); //calculation derviatives on liquid and vapour line dvldp=betal*vl/dpdT-kappal*vl; dvvdp=betav*vv/dpdT-kappav*vv; dhldp=vl*(1-betal*Sl.R1.T)+cpl/dpdT; dhvdp=vv*(1-betav*Sv.R2.T)+cpl/dpdT; dxdp=-dhldp/(hv-hl) +(h-hl)/((hv-hl)*(hv-hl)) *(dhvdp-dhldp); //CL: psi=(drho/dp)_h=const dvdp=dvldp+(dvvdp-dvldp)*x+(vv-vl)*dxdp; psi=-rho*rho*dvdp; //CL: drhodh=(drho/dh)_p=const dvdh=(vv-vl)/(hv-hl); drhodh=-rho*rho*dvdh; //CL: getting transport properties mu=freesteam_mu_rhoT(rho, T); lambda=freesteam_k_rhoT(rho,T); alpha=lambda/cp; //Cl: Important info -->alpha= thermal diffusivity time density } else { std::cout<<"IAPWS-IF97 error, outside the regions 1-4"<<std::endl; } }
//CL: psiH=(drho/dp)_h=const Foam::scalar Foam::psiH(SteamState S) { label region; scalar kappa,cp,beta,psiH,rho; region=freesteam_region(S); if (region==1) { //Cl: note: in FreeStream, beta=1/V*(dV/dP)_P=const is called alphaV (in this region) //Cl: note: in FreeStream, kappa=1/V*(dV/dP)_T=const is called kappaT (in this region) kappa=freesteam_region1_kappaT_pT(S.R1.p,S.R1.T); beta=freesteam_region1_alphav_pT(S.R1.p,S.R1.T); cp=freesteam_region1_cp_pT(S.R1.p,S.R1.T); rho=1/freesteam_region1_v_pT(S.R1.p,S.R1.T); //CL: getting derivatives using Bridgmans table //CL: psiH=(drho/dp)_h=const psiH=-((S.R1.T*beta*beta-beta)/cp-kappa*rho); } else if (region==2) { //Cl: note: in FreeStream, beta=1/V*(dV/dP)_P=const is called alphaV (in this region) //Cl: note: in FreeStream, kappa=1/V*(dV/dP)_T=const is called kappaT (in this region) kappa=freesteam_region2_kappaT_pT(S.R2.p,S.R2.T); beta=freesteam_region2_alphav_pT(S.R2.p,S.R2.T); cp=freesteam_region2_cp_pT(S.R2.p,S.R2.T); rho=1/freesteam_region2_v_pT(S.R2.p,S.R2.T); //CL: getting derivatives using Bridgmans table //CL: psiH=(drho/dp)_h=const psiH=-((S.R2.T*beta*beta-beta)/cp-kappa*rho); } else if (region==3) { scalar gamma,cv,p; rho=S.R3.rho; p=freesteam_region3_p_rhoT(S.R3.rho,S.R3.T); //Cl: note: beta=1/V*(dV/dP)_P=const //Cl: note: kappa=1/V*(dV/dP)_T=const //Cl: note: in FreeStream, gamma=1/p*(dp/dT)_v=const is called alphap (in this region gamma=freesteam_region3_alphap_rhoT(S.R3.rho,S.R3.T); cp=freesteam_region3_cp_rhoT(S.R3.rho,S.R3.T); cv=freesteam_region3_cv_rhoT(S.R3.rho,S.R3.T); beta=(cp-cv)/(S.R3.T/S.R3.rho*p*gamma); kappa=(cp-cv)/(S.R3.T/S.R3.rho*p*p*gamma*gamma); //CL: getting derivatives using Bridgmans table //CL: psiH=(drho/dp)_h=const psiH=-((S.R3.T*beta*beta-beta)/cp-kappa*rho); } else if (region==4) { scalar rhov,rhol,betav,betal,kappav,kappal,vv,vl,cpl,cpv,hl,hv,h,p; scalar dvldp,dvvdp,dhldp,dhvdp; scalar dpdT,dvdp,dxdp; SteamState Sl,Sv; rho=1/freesteam_region4_v_Tx(S.R4.T,S.R4.x); h=freesteam_region4_h_Tx(S.R4.T,S.R4.x); p=freesteam_region4_psat_T(S.R4.T); //CL: Getting density on the vapour and liquid lines rhov=freesteam_region4_rhog_T(S.R4.T); rhol=freesteam_region4_rhof_T(S.R4.T); vv=1/rhov; vl=1/rhol; //CL: getting derivatives --> this is a bit tricky in the vapor dome dpdT=freesteam_region4_dpsatdT_T(S.R4.T); // getting the states outside the vapour dome Sl=freesteam_set_pv(p,vl-0.0000001); //inside region 1 Sv=freesteam_set_pv(p,vv+0.0000001); //inside region 2 kappal=freesteam_region1_kappaT_pT(Sl.R1.p,Sl.R1.T); kappav=freesteam_region2_kappaT_pT(Sv.R2.p,Sv.R2.T); betal=freesteam_region1_alphav_pT(Sl.R1.p,Sl.R1.T); betav=freesteam_region2_alphav_pT(Sv.R2.p,Sv.R2.T); cpl=freesteam_region1_cp_pT(Sl.R1.p,Sl.R1.T); cpv=freesteam_region2_cp_pT(Sv.R2.p,Sv.R2.T); hl=freesteam_region1_h_pT(Sl.R1.p,Sl.R1.T); hv=freesteam_region2_h_pT(Sv.R2.p,Sv.R2.T); //calculation derviatives on liquid and vapour line dvldp=betal*vl/dpdT-kappal*vl; dvvdp=betav*vv/dpdT-kappav*vv; dhldp=vl*(1-betal*Sl.R1.T)+cpl/dpdT; dhvdp=vv*(1-betav*Sv.R2.T)+cpl/dpdT; dxdp=-dhldp/(hv-hl) +(h-hl)/((hv-hl)*(hv-hl)) *(dhvdp-dhldp); //CL: psiH=(drho/dp)_h=const dvdp=dvldp+(dvvdp-dvldp)*S.R4.x+(vv-vl)*dxdp; psiH=-rho*rho*dvdp; } else { Info<<"IAPWS-IF97.C error, outside the regions 1-4"<<endl; } return psiH; }
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; }