Exemplo n.º 1
0
int freesteam_region_pu(double p, double u){
	double p13 = freesteam_region4_psat_T(REGION1_TMAX);
	if(p < p13){
		double Tsat = freesteam_region4_Tsat_p(p);
		double uf = freesteam_region1_u_pT(p,Tsat);
		if(u < uf)return 1;
		double ug = freesteam_region2_u_pT(p,Tsat);
		if(u > ug)return 2;
		return 4;
	}
	double u13 = freesteam_region1_u_pT(p,REGION1_TMAX);
	if(u < u13){
		return 1;
	}
	double T23 = freesteam_b23_T_p(p);
	double u23 = freesteam_region2_u_pT(p,T23);
	if(u > u23){
		return 2;
	}

	if(p > IAPWS97_PCRIT)return 3;

	/* FIXME what we really need here is a psat(u) function! The current method
	is singular. */
	
	double Tsat = freesteam_region4_Tsat_p(p);
	double rhof = freesteam_region4_rhof_T(Tsat);
	double uf = freesteam_region3_u_rhoT(rhof,Tsat);
	if(u<uf) return 3;
	double rhog = freesteam_region4_rhog_T(Tsat);
	double ug = freesteam_region3_u_rhoT(rhog,Tsat);
	if(u>ug)return 3;
	return 4;
}
Exemplo n.º 2
0
int freesteam_region_pv(double p, double v){

	double p13 = freesteam_region4_psat_T(REGION1_TMAX);

	if(p > p13){
		double v13 = freesteam_region1_v_pT(p, REGION1_TMAX);
		if(v < v13) return 1;

		/* region 2-3 */
		double T23 = freesteam_b23_T_p(p);
		double v23 = freesteam_region2_v_pT(p,T23);
		if(v > v23) return 2;

		/* region 3? or high-pressure part of region 4? */
		if(p >= IAPWS97_PCRIT) return 3;

		double Tsat = freesteam_region4_Tsat_p(p);
		double vf = 1./ freesteam_region4_rhof_T(Tsat);
		if(v < vf) return 3;
		double vg = 1./ freesteam_region4_rhog_T(Tsat);
		if(v > vg) return 3;

		return 4;
	}else{
		double Tsat = freesteam_region4_Tsat_p(p);
		double vf = freesteam_region1_v_pT(p,Tsat);
		if(v < vf) return 1;

		double vg = freesteam_region2_v_pT(p,Tsat);
		if(v > vg) return 2;

		return 4;
	}
}
Exemplo n.º 3
0
/**
	This function will never return region 4, because it's not possible
	to 'sit on the knife' of saturation. If you need to set saturated states,
	you should use another function such as freesteam_region1_set_Tx.
*/
SteamState freesteam_set_pT(double p, double T){
	SteamState S;
	if(T < REGION1_TMAX){
		if(p > freesteam_region4_psat_T(T)){
			S.region = 1;
			S.R1.T = T;
			S.R1.p = p;
		}else{
			S.region = 2;
			S.R2.T = T;
			S.R2.p = p;
		}
	}else{
		//fprintf(stderr,"%s: T = %g >= REGION1_TMAX = %g\n",__func__,T,REGION1_TMAX);
		/* FIXME some optimisation possiblxe here with test for lower pressures */
		double T23 = freesteam_b23_T_p(p);
		double p23min = freesteam_b23_p_T(REGION1_TMAX);
		if(p < p23min || T > T23){
			//fprintf(stderr,"%s: T = %g > T23 =  %g\n",__func__,T,T23);
			S.region = 2;
			S.R2.T = T;
			S.R2.p = p;
		}else{
			/* FIXME the limit values are all wrong here! */
			//fprintf(stderr,"%s: region 3\n",__func__);
			SteamPTData D = {p,T};
			double ub = 1./freesteam_region1_v_pT(IAPWS97_PMAX,REGION1_TMAX);
			double lb = 1./freesteam_region2_v_pT(freesteam_b23_p_T(T),T);
			/* if we're in the little wee area around the critical pt... */
			if(T < IAPWS97_TCRIT){
				double psat = freesteam_region4_psat_T(T);
				if(p < psat){
					ub = freesteam_region4_rhog_T(T);
					assert(lb<ub);
				}else{
					lb = freesteam_region4_rhof_T(T);
					//fprintf(stderr,"lb = %g, ub = %g\n",lb,ub);
					assert(lb<ub);
				}
			}
			double tol = 1e-7;
			double sol, err = 0;
			if(zeroin_solve(&pT_region3_fn, &D, lb, ub, tol, &sol, &err)){
				fprintf(stderr,"%s (%s:%d): failed to solve for rho\n",__func__,__FILE__,__LINE__);
				exit(1);
			}
			S.region = 3;
			S.R3.T = T;
			S.R3.rho = sol;
			//assert(fabs((freesteam_p(S) - p)/p) < tol);
		}
	}
	//fprintf(stderr,"%s: region %d\n",__func__,S.region);
	return S;
}