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 }
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; }
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 = {®ion4_f, ®ion4_df, ®ion4_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; }