Beispiel #1
0
static int region4_df(const gsl_vector *x, void *user_data, gsl_matrix *J){
#define D ((Solver2Data *)user_data)
	SteamState S = freesteam_region4_set_Tx(gsl_vector_get(x,0),gsl_vector_get(x,1));
	gsl_matrix_set(J, 0, 0, freesteam_region4_dAdTx(D->A,S));
	gsl_matrix_set(J, 0, 1, freesteam_region4_dAdxT(D->A,S));
	gsl_matrix_set(J, 1, 0, freesteam_region4_dAdTx(D->B,S));
	gsl_matrix_set(J, 1, 1, freesteam_region4_dAdxT(D->B,S));
	return GSL_SUCCESS;
#undef D
}
Beispiel #2
0
SteamState freesteam_set_pu(double p, double u){
	double lb, ub, tol, sol, err;
	SolvePUData D = {p, u, 0.};
	SteamState S;

	int region = freesteam_region_pu(p,u);
	switch(region){
		case 1:
			lb = IAPWS97_TMIN;
			ub = REGION1_TMAX;
			tol = 1e-9; /* ??? */
			zeroin_solve(&pu_region1_fn, &D, lb, ub, tol, &sol, &err);
			S = freesteam_region1_set_pT(p,sol);
			break;
		case 2:
			lb = IAPWS97_TMIN;
			ub = REGION2_TMAX;
			tol = 1e-9; /* ??? */
			zeroin_solve(&pu_region2_fn, &D, lb, ub, tol, &sol, &err);
			S = freesteam_region2_set_pT(p,sol);
			break;
		case 4:
			lb = 0.;
			ub = 1.;
			tol = 1e-9; /* ??? */
			D.T = freesteam_region4_Tsat_p(p);
			//fprintf(stderr,"%s: (%s:%d): p = %g\n",__func__,__FILE__,__LINE__,D.p);
			zeroin_solve(&pu_region4_fn, &D, lb, ub, tol, &sol, &err);
			S = freesteam_region4_set_Tx(D.T,sol);
			break;
		case 3:
		/* FIXME looks like a problem with the derivative routines here? */
			{
				int status;
				SteamState guess = freesteam_region3_set_rhoT(IAPWS97_RHOCRIT,IAPWS97_TCRIT);
				S = freesteam_solver2_region3('p','u', p, u, guess, &status);
				if(status){
					fprintf(stderr,"%s (%s:%d): Failed solve in region 3 for (p = %g MPa, u = %g kJ/kg\n"
						,__func__,__FILE__,__LINE__,p/1e6,u/1e3);
					//exit(1);
				}
			}
			break;
		default:
			fprintf(stderr,"%s (%s:%d): Region '%d' not implemented\n",__func__,__FILE__,__LINE__,region);
			exit(1);
	}
	return S;
}
Beispiel #3
0
SteamState freesteam_solver2_region4(FREESTEAM_CHAR A, FREESTEAM_CHAR B, double atarget, double btarget, SteamState guess, int *retstatus){
	const gsl_multiroot_fdfsolver_type *T;
	gsl_multiroot_fdfsolver *s;
	int status;
	size_t iter = 0;
	const size_t n = 2;

	Solver2Data D = {A,B,solver2_region4_propfn(A), solver2_region4_propfn(B), atarget,btarget};

	gsl_multiroot_function_fdf f = {&region4_f, &region4_df, &region4_fdf, n, &D};

	gsl_vector *x = gsl_vector_alloc(n);
	assert(guess.region==4);
	gsl_vector_set(x, 0, guess.R4.T);
	gsl_vector_set(x, 1, guess.R4.x);
	T = gsl_multiroot_fdfsolver_gnewton;
	s = gsl_multiroot_fdfsolver_alloc(T, n);
	gsl_multiroot_fdfsolver_set(s, &f, x);
	//region4_print_state(iter, s);

	do{
		iter++;
		status = gsl_multiroot_fdfsolver_iterate(s);
		//region4_print_state(iter, s);
		if(status){
			/* check if solver is stuck */
			break;
		}
		status = gsl_multiroot_test_residual(s->f, 1e-7);
	} while(status == GSL_CONTINUE && iter < 20);

	fprintf(stderr,"status = %s\n", gsl_strerror (status));
	SteamState S = freesteam_region4_set_Tx(gsl_vector_get(s->x,0), gsl_vector_get(s->x,1));
	gsl_multiroot_fdfsolver_free(s);

	gsl_vector_free(x);
	*retstatus = status;
	if(status)fprintf(stderr,"%s (%s:%d): %s: ",__func__,__FILE__,__LINE__,gsl_strerror(status));
	//freesteam_fprint(stderr,S);
	return S;
}