Exemple #1
0
//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;
} 
Exemple #2
0
//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;
    }
}
Exemple #3
0
//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;
}