void update_table_liststore( int column, int reset, TableData *data , SteamState *S) { if (reset) reset_table (data); gtk_tree_model_get_iter_first( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_p(*S) * 1e-5, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_T(*S) - 273.15, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_h(*S) * 1e-3, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_s(*S) * 1e-3, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_u(*S) * 1e-3, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_v(*S), -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_rho(*S), -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_cp(*S) * 1e-3, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_cv(*S) * 1e-3, -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_x(*S), -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_k(*S), -1); gtk_tree_model_iter_next( GTK_TREE_MODEL(data->list), data->iter ); gtk_list_store_set( data->list, data->iter, column, freesteam_mu(*S), -1); }
SteamState freesteam_solver2_region1(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; //fprintf(stderr,"region 1 solver...\n"); Solver2Data D = {A,B,solver2_region1_propfn(A), solver2_region1_propfn(B), atarget,btarget}; gsl_multiroot_function_fdf f = {®ion1_f, ®ion1_df, ®ion1_fdf, n, &D}; gsl_vector *x = gsl_vector_alloc(n); gsl_vector_set(x, 0, freesteam_rho(guess)); gsl_vector_set(x, 1, freesteam_T(guess)); T = gsl_multiroot_fdfsolver_gnewton; s = gsl_multiroot_fdfsolver_alloc(T, n); gsl_multiroot_fdfsolver_set(s, &f, x); //region1_print_state(iter, s); do{ iter++; status = gsl_multiroot_fdfsolver_iterate(s); //region1_print_state(iter, s); if(status){ /* check if solver is stuck */ break; } status = gsl_multiroot_test_residual(s->f, 1e-6); } while(status == GSL_CONTINUE && iter < 20); SteamState S = freesteam_region1_set_pT(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; }
/** 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; } }
//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)); }