Exemplo n.º 1
0
//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);   
}
Exemplo n.º 2
0
/**
	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;
	}
}
Exemplo n.º 3
0
//CL: drhodh=(drho/dh)_p=const
Foam::scalar Foam::drhodh_ph(scalar p,scalar h)
{
    return drhodh(freesteam_set_ph(p,h));
} 
Exemplo n.º 4
0
//CL: psiH=(drho/dp)_h=const
Foam::scalar Foam::psiH_ph(scalar p,scalar h)
{
    return psiH(freesteam_set_ph(p,h));
} 
Exemplo n.º 5
0
//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));
}
Exemplo n.º 6
0
//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));
}
Exemplo n.º 7
0
//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));
}
Exemplo n.º 8
0
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;
}