/* ⎰ ∂z ⎱ = ⎰∂z_f⎱ (1 - x) + ⎰∂z_f⎱ x ⎱ ∂T ⎰x ⎱ ∂T ⎰ ⎱ ∂T ⎰ */ double freesteam_region4_dAdTx(FREESTEAM_CHAR z, SteamState S){ double res; #define T S.R4.T switch(z){ case 'p': res = freesteam_region4_dpsatdT_T(T); return res; case 'T': res = 1; return res; case 'x': res = 0; return res; } //fprintf(stderr,"%s: T = %g\n",__func__,T); assert(!isnan(T)); double dzfdT, dzgdT; if(T < REGION1_TMAX){ //fprintf(stderr,"%s: below REGION1_TMAX\n",__func__); double psat = freesteam_region4_psat_T(T); SteamState Sf = freesteam_region1_set_pT(psat,T); SteamState Sg = freesteam_region2_set_pT(psat,T); double dpsatdT = freesteam_region4_dpsatdT_T(T); dzfdT = PT1(z,Sf)*dpsatdT + TP1(z,Sf); dzgdT = PT2(z,Sg)*dpsatdT + TP2(z,Sg); }else{ double rhof = freesteam_region4_rhof_T(T); double rhog = freesteam_region4_rhog_T(T); assert(rhof!=0); assert(rhog!=0); SteamState Sf = freesteam_region3_set_rhoT(rhof,T); SteamState Sg = freesteam_region3_set_rhoT(rhog,T); double dvfdT = -1./SQ(rhof) * freesteam_drhofdT_T(T); assert(!isnan(dvfdT)); double dvgdT = -1./SQ(rhog) * freesteam_drhogdT_T(T); assert(!isnan(dvgdT)); dzfdT = VT3(z,Sf)*dvfdT + TV3(z,Sf); dzgdT = VT3(z,Sg)*dvgdT + TV3(z,Sg); } assert(!isnan(dzfdT)); assert(!isnan(dzgdT)); #define x S.R4.x res = dzfdT*(1-x) + dzgdT*x; //fprintf(stderr,"(∂%c/∂T)x = %g\n",z,res); return res; #undef T #undef x }
double freesteam_drhogdT_T(double T){ double dpsatdT = freesteam_region4_dpsatdT_T(T); double rhog = freesteam_region4_rhog_T(T); if(T < REGION1_TMAX){ double psat = freesteam_region4_psat_T(T); SteamState Sg = freesteam_region2_set_pT(psat,T); double vf = freesteam_v(Sg); return -1./SQ(vf) * (PT2('v',Sg) * dpsatdT + TP2('v',Sg)); }else{ SteamState Sg = freesteam_region3_set_rhoT(rhog,T); double dpdT = TV3('p',Sg); double dpdrho = -1./SQ(rhog) * VT3('p',Sg); return (dpsatdT - dpdT)/dpdrho; } }
double freesteam_drhofdT_T(double T){ double dpsatdT = freesteam_region4_dpsatdT_T(T); if(T < REGION1_TMAX){ double psat = freesteam_region4_psat_T(T); SteamState Sf = freesteam_region1_set_pT(psat,T); double vf = freesteam_v(Sf); return -1./SQ(vf) * (PT1('v',Sf) * dpsatdT + TP1('v',Sf)); }else{ /* FIXME: add iterative refinement of value of rhof */ double rhof = freesteam_region4_rhof_T(T); SteamState Sf = freesteam_region3_set_rhoT(rhof,T); double dpdT = TV3('p',Sf); double dpdrho = -1./SQ(rhof) * VT3('p',Sf); return (dpsatdT - dpdT)/dpdrho; } }
//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; }
//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; } }