double pv_region3_fn(double T, void *user_data){ return D->p - freesteam_region3_p_rhoT(D->rho, T); }
//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; }
static double pT_region3_fn(double rho, void *user_data){ #define D ((SteamPTData *)user_data) return D->p - freesteam_region3_p_rhoT(rho, D->T); #undef D }