/* * FUNCTION * Name: entropy_of_state * Description: Calculate the Von Neumann entropy of state 'rho' * */ double entropy_of_state ( const gsl_vector* rho ) { double entr = 0 ; /* Finding the eigenvalues */ gsl_eigen_herm_workspace* rho_ei = gsl_eigen_herm_alloc(2); gsl_matrix_complex* dens = gsl_matrix_complex_calloc (2,2); gsl_matrix_complex_set (dens, 0, 0, gsl_complex_rect(1+VECTOR(rho, 3),0)); gsl_matrix_complex_set (dens,0,1,gsl_complex_rect(VECTOR(rho,1),-VECTOR(rho,2))); gsl_matrix_complex_set (dens,1,0,gsl_complex_rect(VECTOR(rho,1),VECTOR(rho,2))); gsl_matrix_complex_set (dens,1,1,gsl_complex_rect(1-VECTOR(rho,3),0)); gsl_matrix_complex_scale (dens, gsl_complex_rect(0.5,0)); gsl_vector* eigenvalues = gsl_vector_calloc(2) ; gsl_eigen_herm (dens, eigenvalues, rho_ei) ; /* Calculating entropy */ double norm = gsl_hypot3( VECTOR(rho,1), VECTOR(rho,2), VECTOR(rho,3) ) ; if ( gsl_fcmp(norm, 1, 1e-9) > 0 ) entr = 0 ; else entr = - (VECTOR(eigenvalues,0)*gsl_sf_log(VECTOR(eigenvalues,0)) + VECTOR(eigenvalues,1)*gsl_sf_log(VECTOR(eigenvalues,1))) ; return (entr); } /* ----- end of function entropy_of_state ----- */
static VALUE rb_gsl_hypot3(VALUE obj, VALUE x, VALUE y, VALUE z) { Need_Float(x); Need_Float(y); Need_Float(z); return rb_float_new(gsl_hypot3(NUM2DBL(x), NUM2DBL(y), NUM2DBL(z))); }
static size_t swarm_filter_asmvfm(const double thresh, satdata_mag *data) { size_t i; size_t nflag = 0; for (i = 0; i < data->n; ++i) { double F_asm = data->F[i]; double B[3], F_vfm; B[0] = SATDATA_VEC_X(data->B, i); B[1] = SATDATA_VEC_Y(data->B, i); B[2] = SATDATA_VEC_Z(data->B, i); F_vfm = gsl_hypot3(B[0], B[1], B[2]); if (fabs(F_asm - F_vfm) > thresh) { data->flags[i] |= SATDATA_FLG_INSTERR; ++nflag; } } return nflag; }
void Particle::NormalizeSpeed(void) { //long double scale = (long double) PARTICLE_SPEED/pow((long double)vx*vx + vy*vy + vz*vz, (long double) 0.5); long double scale = (long double) PARTICLE_SPEED/gsl_hypot3(vx, vy, vz); vx *= scale; vy *= scale; vz *= scale; }
int doplot(const satdata_mag *data, mfield_workspace *w) { size_t i; estist_workspace *est_p = estist_alloc(ESTIST_IDX_FILE); double rms_f = 0.0; double rms_z = 0.0; size_t n = 0; for (i = 0; i < data->n; ++i) { double B_ext[4], B_ext_pomme[4]; double r = data->altitude[i] + data->R; double theta = M_PI / 2.0 - data->latitude[i] * M_PI / 180.0; double phi = data->longitude[i] * M_PI / 180.0; double E_st, I_st; time_t unix_time = satdata_epoch2timet(data->t[i]); #if 0 estist_get(unix_time, &E_st, &I_st, est_p); mfield_eval_ext(data->t[i], r, theta, phi, E_st, I_st, B_ext, w); #endif B_ext_pomme[0] = SATDATA_VEC_X(data->B_ext, i); B_ext_pomme[1] = SATDATA_VEC_Y(data->B_ext, i); B_ext_pomme[2] = SATDATA_VEC_Z(data->B_ext, i); B_ext_pomme[3] = gsl_hypot3(B_ext_pomme[0], B_ext_pomme[1], B_ext_pomme[2]); rms_f += pow(B_ext[3] - B_ext_pomme[3], 2.0); rms_z += pow(B_ext[2] - B_ext_pomme[2], 2.0); ++n; #if 1 printf("%f %f %f %f %f %f %f\n", data->altitude[i], data->latitude[i], data->longitude[i], B_ext[3], B_ext_pomme[3], B_ext[2], B_ext_pomme[2]); #endif } rms_f = sqrt(rms_f / n); rms_z = sqrt(rms_z / n); fprintf(stderr, "RMS F = %f [nT]\n", rms_f); fprintf(stderr, "RMS Z = %f [nT]\n", rms_z); estist_free(est_p); return 0; }
/* * FUNCTION * Name: entropy_production * Description: * */ double entropy_production ( const gsl_vector* rho, const gsl_vector* rhoeq, const gsl_matrix* L ) { /* l1, l2, l3 */ double l[3] ; unsigned int i, j ; for ( i = 1 ; i < 3 ; i++ ) { l[i] = 0 ; for ( j = 0 ; j < 3 ; j++ ) l[i] += gsl_matrix_get(L,i,j)*VECTOR(rho,j) ; } /* L[rho] */ double Lr = 0 ; for ( i = 1 ; i < 3 ; i++ ) Lr += l[i]*VECTOR(rho,i) ; /* L[rhoeq] */ double Leq = 0 ; for ( i = 1 ; i < 3 ; i++ ) Leq += l[i]*VECTOR(rhoeq,i) ; /* r , req */ double r, req ; r = req = 0 ; r = gsl_hypot3(VECTOR(rho,1),VECTOR(rho,2),VECTOR(rho,3)) ; req = gsl_hypot3(VECTOR(rhoeq,1),VECTOR(rhoeq,2), VECTOR(rhoeq,3)) ; /* internal entropy s */ double s ; if ( r < 1 && req < 1 ) s = -(gsl_sf_log((1+r)/(1-r))*Lr/r -gsl_sf_log((1+req)/(1-req))*Leq/req); else if ( r < 1 && req >= 0 ) s = -gsl_sf_log((1+r)/(1-r))*Lr/r ; else s = 0 ; return s; } /* ----- end of function entropy_production ----- */
int main (void) { double y, y_expected; int e, e_expected; gsl_ieee_env_setup (); /* Test for expm1 */ y = gsl_expm1 (0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(0.0)"); y = gsl_expm1 (1e-10); y_expected = 1.000000000050000000002e-10; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(1e-10)"); y = gsl_expm1 (-1e-10); y_expected = -9.999999999500000000017e-11; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(-1e-10)"); y = gsl_expm1 (0.1); y_expected = 0.1051709180756476248117078264902; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(0.1)"); y = gsl_expm1 (-0.1); y_expected = -0.09516258196404042683575094055356; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(-0.1)"); y = gsl_expm1 (10.0); y_expected = 22025.465794806716516957900645284; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(10.0)"); y = gsl_expm1 (-10.0); y_expected = -0.99995460007023751514846440848444; gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(-10.0)"); /* Test for log1p */ y = gsl_log1p (0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(0.0)"); y = gsl_log1p (1e-10); y_expected = 9.9999999995000000000333333333308e-11; gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(1e-10)"); y = gsl_log1p (0.1); y_expected = 0.095310179804324860043952123280765; gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(0.1)"); y = gsl_log1p (10.0); y_expected = 2.3978952727983705440619435779651; gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(10.0)"); /* Test for gsl_hypot */ y = gsl_hypot (0.0, 0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(0.0, 0.0)"); y = gsl_hypot (1e-10, 1e-10); y_expected = 1.414213562373095048801688e-10; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e-10, 1e-10)"); y = gsl_hypot (1e-38, 1e-38); y_expected = 1.414213562373095048801688e-38; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e-38, 1e-38)"); y = gsl_hypot (1e-10, -1.0); y_expected = 1.000000000000000000005; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e-10, -1)"); y = gsl_hypot (-1.0, 1e-10); y_expected = 1.000000000000000000005; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(-1, 1e-10)"); y = gsl_hypot (1e307, 1e301); y_expected = 1.000000000000499999999999e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e307, 1e301)"); y = gsl_hypot (1e301, 1e307); y_expected = 1.000000000000499999999999e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e301, 1e307)"); y = gsl_hypot (1e307, 1e307); y_expected = 1.414213562373095048801688e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e307, 1e307)"); /* Test +-Inf, finite */ y = gsl_hypot (GSL_POSINF, 1.2); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_POSINF, 1.2)"); y = gsl_hypot (GSL_NEGINF, 1.2); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NEGINF, 1.2)"); y = gsl_hypot (1.2, GSL_POSINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1.2, GSL_POSINF)"); y = gsl_hypot (1.2, GSL_NEGINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1.2, GSL_NEGINF)"); /* Test NaN, finite */ y = gsl_hypot (GSL_NAN, 1.2); y_expected = GSL_NAN; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, 1.2)"); y = gsl_hypot (1.2, GSL_NAN); y_expected = GSL_NAN; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1.2, GSL_NAN)"); /* Test NaN, NaN */ y = gsl_hypot (GSL_NAN, GSL_NAN); y_expected = GSL_NAN; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, GSL_NAN)"); /* Test +Inf, NaN */ y = gsl_hypot (GSL_POSINF, GSL_NAN); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_POSINF, GSL_NAN)"); /* Test -Inf, NaN */ y = gsl_hypot (GSL_NEGINF, GSL_NAN); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NEGINF, GSL_NAN)"); /* Test NaN, +Inf */ y = gsl_hypot (GSL_NAN, GSL_POSINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, GSL_POSINF)"); /* Test NaN, -Inf */ y = gsl_hypot (GSL_NAN, GSL_NEGINF); y_expected = GSL_POSINF; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(GSL_NAN, GSL_NEGINF)"); /* Test for gsl_hypot3 */ y = gsl_hypot3 (0.0, 0.0, 0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(0.0, 0.0, 0.0)"); y = gsl_hypot3 (1e-10, 1e-10, 1e-10); y_expected = 1.732050807568877293527446e-10; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-10, 1e-10, 1e-10)"); y = gsl_hypot3 (1e-38, 1e-38, 1e-38); y_expected = 1.732050807568877293527446e-38; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-38, 1e-38, 1e-38)"); y = gsl_hypot3 (1e-10, 1e-10, -1.0); y_expected = 1.000000000000000000099; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-10, 1e-10, -1)"); y = gsl_hypot3 (1e-10, -1.0, 1e-10); y_expected = 1.000000000000000000099; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e-10, -1, 1e-10)"); y = gsl_hypot3 (-1.0, 1e-10, 1e-10); y_expected = 1.000000000000000000099; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(-1, 1e-10, 1e-10)"); y = gsl_hypot3 (1e307, 1e301, 1e301); y_expected = 1.0000000000009999999999995e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e307, 1e301, 1e301)"); y = gsl_hypot3 (1e307, 1e307, 1e307); y_expected = 1.732050807568877293527446e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e307, 1e307, 1e307)"); y = gsl_hypot3 (1e307, 1e-307, 1e-307); y_expected = 1.0e307; gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot3(1e307, 1e-307, 1e-307)"); /* Test for acosh */ y = gsl_acosh (1.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(1.0)"); y = gsl_acosh (1.1); y_expected = 4.435682543851151891329110663525e-1; gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(1.1)"); y = gsl_acosh (10.0); y_expected = 2.9932228461263808979126677137742e0; gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(10.0)"); y = gsl_acosh (1e10); y_expected = 2.3718998110500402149594646668302e1; gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(1e10)"); /* Test for asinh */ y = gsl_asinh (0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(0.0)"); y = gsl_asinh (1e-10); y_expected = 9.9999999999999999999833333333346e-11; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1e-10)"); y = gsl_asinh (-1e-10); y_expected = -9.9999999999999999999833333333346e-11; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1e-10)"); y = gsl_asinh (0.1); y_expected = 9.983407889920756332730312470477e-2; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(0.1)"); y = gsl_asinh (-0.1); y_expected = -9.983407889920756332730312470477e-2; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-0.1)"); y = gsl_asinh (1.0); y_expected = 8.8137358701954302523260932497979e-1; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1.0)"); y = gsl_asinh (-1.0); y_expected = -8.8137358701954302523260932497979e-1; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-1.0)"); y = gsl_asinh (10.0); y_expected = 2.9982229502979697388465955375965e0; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(10)"); y = gsl_asinh (-10.0); y_expected = -2.9982229502979697388465955375965e0; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-10)"); y = gsl_asinh (1e10); y_expected = 2.3718998110500402149599646668302e1; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1e10)"); y = gsl_asinh (-1e10); y_expected = -2.3718998110500402149599646668302e1; gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-1e10)"); /* Test for atanh */ y = gsl_atanh (0.0); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.0)"); y = gsl_atanh (1e-20); y_expected = 1e-20; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(1e-20)"); y = gsl_atanh (-1e-20); y_expected = -1e-20; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(-1e-20)"); y = gsl_atanh (0.1); y_expected = 1.0033534773107558063572655206004e-1; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.1)"); y = gsl_atanh (-0.1); y_expected = -1.0033534773107558063572655206004e-1; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(-0.1)"); y = gsl_atanh (0.9); y_expected = 1.4722194895832202300045137159439e0; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.9)"); y = gsl_atanh (-0.9); y_expected = -1.4722194895832202300045137159439e0; gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.9)"); /* Test for pow_int */ y = gsl_pow_2 (-3.14); y_expected = pow (-3.14, 2.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_2(-3.14)"); y = gsl_pow_3 (-3.14); y_expected = pow (-3.14, 3.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_3(-3.14)"); y = gsl_pow_4 (-3.14); y_expected = pow (-3.14, 4.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_4(-3.14)"); y = gsl_pow_5 (-3.14); y_expected = pow (-3.14, 5.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_5(-3.14)"); y = gsl_pow_6 (-3.14); y_expected = pow (-3.14, 6.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_6(-3.14)"); y = gsl_pow_7 (-3.14); y_expected = pow (-3.14, 7.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_7(-3.14)"); y = gsl_pow_8 (-3.14); y_expected = pow (-3.14, 8.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_8(-3.14)"); y = gsl_pow_9 (-3.14); y_expected = pow (-3.14, 9.0); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_9(-3.14)"); { int n; for (n = -9; n < 10; n++) { y = gsl_pow_int (-3.14, n); y_expected = pow (-3.14, n); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_int(-3.14,%d)", n); } } { unsigned int n; for (n = 0; n < 10; n++) { y = gsl_pow_uint (-3.14, n); y_expected = pow (-3.14, n); gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_uint(-3.14,%d)", n); } } /* Test case for n at INT_MAX, INT_MIN */ { double u = 1.0000001; int n = INT_MAX; y = gsl_pow_int (u, n); y_expected = pow (u, n); gsl_test_rel (y, y_expected, 1e-6, "gsl_pow_int(%.7f,%d)", u, n); n = INT_MIN; y = gsl_pow_int (u, n); y_expected = pow (u, n); gsl_test_rel (y, y_expected, 1e-6, "gsl_pow_int(%.7f,%d)", u, n); } /* Test for ldexp */ y = gsl_ldexp (M_PI, -2); y_expected = M_PI_4; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(pi,-2)"); y = gsl_ldexp (1.0, 2); y_expected = 4.000000; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(1.0,2)"); y = gsl_ldexp (0.0, 2); y_expected = 0.0; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(0.0,2)"); y = gsl_ldexp (9.999999999999998890e-01, 1024); y_expected = GSL_DBL_MAX; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp DBL_MAX"); y = gsl_ldexp (1e308, -2000); y_expected = 8.7098098162172166755761e-295; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(1e308,-2000)"); y = gsl_ldexp (GSL_DBL_MIN, 2000); y_expected = 2.554675596204441378334779940e294; gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(DBL_MIN,2000)"); /* Test subnormals */ { int i = 0; volatile double x = GSL_DBL_MIN; y_expected = 2.554675596204441378334779940e294; x /= 2; while (x > 0) { i++ ; y = gsl_ldexp (x, 2000 + i); gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(DBL_MIN/2**%d,%d)",i,2000+i); x /= 2; } } /* Test for frexp */ y = gsl_frexp (0.0, &e); y_expected = 0; e_expected = 0; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(0) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(0) exponent"); y = gsl_frexp (M_PI, &e); y_expected = M_PI_4; e_expected = 2; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(pi) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(pi) exponent"); y = gsl_frexp (2.0, &e); y_expected = 0.5; e_expected = 2; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(2.0) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(2.0) exponent"); y = gsl_frexp (1.0 / 4.0, &e); y_expected = 0.5; e_expected = -1; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(0.25) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(0.25) exponent"); y = gsl_frexp (1.0 / 4.0 - 4.0 * GSL_DBL_EPSILON, &e); y_expected = 0.999999999999996447; e_expected = -2; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(0.25-eps) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(0.25-eps) exponent"); y = gsl_frexp (GSL_DBL_MAX, &e); y_expected = 9.999999999999998890e-01; e_expected = 1024; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(DBL_MAX) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(DBL_MAX) exponent"); y = gsl_frexp (-GSL_DBL_MAX, &e); y_expected = -9.999999999999998890e-01; e_expected = 1024; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(-DBL_MAX) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(-DBL_MAX) exponent"); y = gsl_frexp (GSL_DBL_MIN, &e); y_expected = 0.5; e_expected = -1021; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(DBL_MIN) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(DBL_MIN) exponent"); y = gsl_frexp (-GSL_DBL_MIN, &e); y_expected = -0.5; e_expected = -1021; gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(-DBL_MIN) fraction"); gsl_test_int (e, e_expected, "gsl_frexp(-DBL_MIN) exponent"); /* Test subnormals */ { int i = 0; volatile double x = GSL_DBL_MIN; y_expected = 0.5; e_expected = -1021; x /= 2; while (x > 0) { e_expected--; i++ ; y = gsl_frexp (x, &e); gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(DBL_MIN/2**%d) fraction",i); gsl_test_int (e, e_expected, "gsl_frexp(DBL_MIN/2**%d) exponent", i); x /= 2; } } /* Test for approximate floating point comparison */ { double x, y; int i; x = M_PI; y = 22.0 / 7.0; /* test the basic function */ for (i = 0; i < 10; i++) { double tol = pow (10, -i); int res = gsl_fcmp (x, y, tol); gsl_test_int (res, -(i >= 4), "gsl_fcmp(%.5f,%.5f,%g)", x, y, tol); } for (i = 0; i < 10; i++) { double tol = pow (10, -i); int res = gsl_fcmp (y, x, tol); gsl_test_int (res, (i >= 4), "gsl_fcmp(%.5f,%.5f,%g)", y, x, tol); } } #if HAVE_IEEE_COMPARISONS /* Test for isinf, isnan, finite */ { double zero, one, inf, nan; int s; zero = 0.0; one = 1.0; inf = exp (1.0e10); nan = inf / inf; s = gsl_isinf (zero); gsl_test_int (s, 0, "gsl_isinf(0)"); s = gsl_isinf (one); gsl_test_int (s, 0, "gsl_isinf(1)"); s = gsl_isinf (inf); gsl_test_int (s, 1, "gsl_isinf(inf)"); s = gsl_isinf (-inf); gsl_test_int (s, -1, "gsl_isinf(-inf)"); s = gsl_isinf (nan); gsl_test_int (s, 0, "gsl_isinf(nan)"); s = gsl_isnan (zero); gsl_test_int (s, 0, "gsl_isnan(0)"); s = gsl_isnan (one); gsl_test_int (s, 0, "gsl_isnan(1)"); s = gsl_isnan (inf); gsl_test_int (s, 0, "gsl_isnan(inf)"); s = gsl_isnan (-inf); gsl_test_int (s, 0, "gsl_isnan(-inf)"); s = gsl_isnan (nan); gsl_test_int (s, 1, "gsl_isnan(nan)"); s = gsl_finite (zero); gsl_test_int (s, 1, "gsl_finite(0)"); s = gsl_finite (one); gsl_test_int (s, 1, "gsl_finite(1)"); s = gsl_finite (inf); gsl_test_int (s, 0, "gsl_finite(inf)"); s = gsl_finite (-inf); gsl_test_int (s, 0, "gsl_finite(-inf)"); s = gsl_finite (nan); gsl_test_int (s, 0, "gsl_finite(nan)"); } #endif { double x = gsl_fdiv (2.0, 3.0); gsl_test_rel (x, 2.0 / 3.0, 4 * GSL_DBL_EPSILON, "gsl_fdiv(2,3)"); } /* Test constants in gsl_math.h */ { double x = log(M_E); gsl_test_rel (x, 1.0, 4 * GSL_DBL_EPSILON, "ln(M_E)"); } { double x=pow(2.0,M_LOG2E); gsl_test_rel (x, exp(1.0), 4 * GSL_DBL_EPSILON, "2^M_LOG2E"); } { double x=pow(10.0,M_LOG10E); gsl_test_rel (x, exp(1.0), 4 * GSL_DBL_EPSILON, "10^M_LOG10E"); } { double x=pow(M_SQRT2, 2.0); gsl_test_rel (x, 2.0, 4 * GSL_DBL_EPSILON, "M_SQRT2^2"); } { double x=pow(M_SQRT1_2, 2.0); gsl_test_rel (x, 1.0/2.0, 4 * GSL_DBL_EPSILON, "M_SQRT1_2"); } { double x=pow(M_SQRT3, 2.0); gsl_test_rel (x, 3.0, 4 * GSL_DBL_EPSILON, "M_SQRT3^2"); } { double x = M_PI; gsl_test_rel (x, 3.1415926535897932384626433832795, 4 * GSL_DBL_EPSILON, "M_PI"); } { double x = 2 * M_PI_2; gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "2*M_PI_2"); } { double x = 4 * M_PI_4; gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "4*M_PI_4"); } { double x = pow(M_SQRTPI, 2.0); gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "M_SQRTPI^2"); } { double x = pow(M_2_SQRTPI, 2.0); gsl_test_rel (x, 4/M_PI, 4 * GSL_DBL_EPSILON, "M_SQRTPI^2"); } { double x = M_1_PI; gsl_test_rel (x, 1/M_PI, 4 * GSL_DBL_EPSILON, "M_1_SQRTPI"); } { double x = M_2_PI; gsl_test_rel (x, 2.0/M_PI, 4 * GSL_DBL_EPSILON, "M_2_PI"); } { double x = exp(M_LN10); gsl_test_rel (x, 10, 4 * GSL_DBL_EPSILON, "exp(M_LN10)"); } { double x = exp(M_LN2); gsl_test_rel (x, 2, 4 * GSL_DBL_EPSILON, "exp(M_LN2)"); } { double x = exp(M_LNPI); gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "exp(M_LNPI)"); } { double x = M_EULER; gsl_test_rel (x, 0.5772156649015328606065120900824, 4 * GSL_DBL_EPSILON, "M_EULER"); } exit (gsl_test_summary ()); }
/* * FUNCTION * Name: red_evol * Description: * */ int red_evol ( void* params, const double r[], double time_end, double step, const gsl_vector* req_red, gsl_matrix* red_m ) { struct f_params* pars = (struct f_params*) params ; unsigned int i ; /* counter for the for loops */ /* * * evolving the systems * */ double t = 0 ; /* setting the initial vector */ gsl_vector* init_red = gsl_vector_calloc(4) ; for ( i = 0 ; i < 4 ; i++ ) gsl_vector_set ( init_red, i, r[i] ) ; /* * * Initializing the system for Redfield dynamics * */ gsl_odeiv2_system red_sys = { generator, jac, 4, (void*) red_m } ; /* Choosing the step function type: Runge-Kutta-Fehlberg (4,5) */ /* gsl_odeiv2_step* s = gsl_odeiv2_step_alloc ( gsl_odeiv2_step_rkf45 , 4 ) ; */ /* Choosing the step function type: Runge-Kutta Cash-Karp (4,5) */ gsl_odeiv2_step* r_s = gsl_odeiv2_step_alloc ( gsl_odeiv2_step_rkck , 4 ) ; /* Setting the step control: abserr=1e-9, relerr=1e-3 */ gsl_odeiv2_control* r_c = gsl_odeiv2_control_standard_new ( 1e-9, 1e-3, 1, 1 ) ; /* Allocating the space for evolution function */ gsl_odeiv2_evolve* r_e = gsl_odeiv2_evolve_alloc ( 4 ) ; /* opening the files */ FILE* f_red = fopen ( "RED-EVOLUTION.dat", "w" ) ; FILE* g_red = fopen ( "RED-ENTROPY-PROD.dat", "w" ) ; FILE* h_red = fopen ( "RED-CURRENT.dat", "w" ) ; FILE* i_red = fopen ( "RED-ENTROPY.dat", "w" ) ; /* writing data */ while ( t < t_end ) { evol ( t, init_red, step, r_e, r_c, r_s, &red_sys ) ; fprintf ( f_red, "%.2f %.9f %.9f %.9f %.9f\n", t, VECTOR(init_red,1), VECTOR(init_red,2), VECTOR(init_red,3), gsl_hypot3(VECTOR(init_red,1),VECTOR(init_red,2), VECTOR(init_red,3)) ) ; fprintf ( g_red, "%.2f %.9f\n", t, entropy_production( init_red, req_red, red_m )) ; fprintf ( h_red, "%.2f %.9f\n", t, tot_current(init_red, pars) ) ; fprintf ( i_red, "%.2f %.9f\n", t, entropy_of_state(init_red) ) ; t += step ; } /* final entropy */ printf("Final entropy: %g\n", entropy_of_state(init_red) ) ; /* close the files */ fclose (f_red) ; fclose (g_red) ; fclose (h_red) ; fclose (i_red) ; /* free memory for evolution */ gsl_odeiv2_evolve_free (r_e) ; gsl_odeiv2_control_free (r_c) ; gsl_odeiv2_step_free (r_s) ; return 0; } /* ----- end of function red_evol ----- */
/** * C++ version of gsl_hypot3(). Avoids overflow. * @param x A real value. * @param y A real value. * @param z A real value. * @return \f$\sqrt{x^2+y^2+z^2}\f$. */ inline double hypot3( double const x, double const y, double const z ){ return gsl_hypot3( x, y, z ); }
int print_data(const int down_sample, const print_parameters *params, const satdata_mag *data) { int s = 0; size_t i, j; f107_workspace *f107_p = f107_alloc(F107_IDX_FILE); i = 1; printf("# Field %zu: time (UT)\n", i++); printf("# Field %zu: time (decimal year)\n", i++); printf("# Field %zu: UT (hours)\n", i++); printf("# Field %zu: local time (hours)\n", i++); printf("# Field %zu: season (day of year)\n", i++); printf("# Field %zu: EUVAC\n", i++); printf("# Field %zu: longitude (degrees)\n", i++); printf("# Field %zu: latitude (degrees)\n", i++); printf("# Field %zu: altitude (km)\n", i++); printf("# Field %zu: QD latitude (degrees)\n", i++); printf("# Field %zu: satellite direction\n", i++); printf("# Field %zu: electron density (cm^{-3})\n", i++); printf("# Field %zu: scalar field (nT)\n", i++); printf("# Field %zu: X field (nT)\n", i++); printf("# Field %zu: Y field (nT)\n", i++); printf("# Field %zu: Z field (nT)\n", i++); printf("# Field %zu: scalar residual (nT)\n", i++); printf("# Field %zu: X residual (nT)\n", i++); printf("# Field %zu: Y residual (nT)\n", i++); printf("# Field %zu: Z residual (nT)\n", i++); printf("# Field %zu: X main (nT)\n", i++); printf("# Field %zu: Y main (nT)\n", i++); printf("# Field %zu: Z main (nT)\n", i++); printf("# Field %zu: X crust (nT)\n", i++); printf("# Field %zu: Y crust (nT)\n", i++); printf("# Field %zu: Z crust (nT)\n", i++); printf("# Field %zu: X external (nT)\n", i++); printf("# Field %zu: Y external (nT)\n", i++); printf("# Field %zu: Z external (nT)\n", i++); for (i = 0; i < data->n; i += down_sample) { time_t unix_time; double phi = data->longitude[i] * M_PI / 180.0; double lt, ut, euvac; double qdlat = data->qdlat[i]; double B_obs[3], B_main[3], B_crust[3], B_ext[3], B_res[4], B_model[4]; if (data->flags[i]) continue; /* nan vector components */ if (qdlat < params->qd_min || qdlat > params->qd_max) continue; if (data->altitude[i] < params->alt_min || data->altitude[i] > params->alt_max) continue; unix_time = satdata_epoch2timet(data->t[i]); lt = get_localtime(unix_time, phi); if (lt < params->lt_min || lt > params->lt_max) continue; ut = get_ut(unix_time); if (ut < params->ut_min || ut > params->ut_max) continue; f107_get_euvac(unix_time, &euvac, f107_p); B_obs[0] = SATDATA_VEC_X(data->B, i); B_obs[1] = SATDATA_VEC_Y(data->B, i); B_obs[2] = SATDATA_VEC_Z(data->B, i); B_main[0] = SATDATA_VEC_X(data->B_main, i); B_main[1] = SATDATA_VEC_Y(data->B_main, i); B_main[2] = SATDATA_VEC_Z(data->B_main, i); B_crust[0] = SATDATA_VEC_X(data->B_crust, i); B_crust[1] = SATDATA_VEC_Y(data->B_crust, i); B_crust[2] = SATDATA_VEC_Z(data->B_crust, i); B_ext[0] = SATDATA_VEC_X(data->B_ext, i); B_ext[1] = SATDATA_VEC_Y(data->B_ext, i); B_ext[2] = SATDATA_VEC_Z(data->B_ext, i); for (j = 0; j < 3; ++j) { B_model[j] = B_main[j] + B_crust[j] + B_ext[j]; B_res[j] = B_obs[j] - B_model[j]; } /* compute scalar residual */ B_model[3] = gsl_hypot3(B_model[0], B_model[1], B_model[2]); B_res[3] = data->F[i] - B_model[3]; printf("%ld %.8f %.2f %.2f %6.2f %5.1f %10.4f %8.4f %10.4f %10.4f %d %10.4e %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f\n", unix_time, satdata_epoch2year(data->t[i]), get_ut(unix_time), lt, get_season(unix_time), euvac, data->longitude[i], data->latitude[i], data->altitude[i], qdlat, satdata_mag_satdir(i, data), data->ne[i], data->F[i], SATDATA_VEC_X(data->B, i), SATDATA_VEC_Y(data->B, i), SATDATA_VEC_Z(data->B, i), B_res[3], B_res[0], B_res[1], B_res[2], B_main[0], B_main[1], B_main[2], B_crust[0], B_crust[1], B_crust[2], B_ext[0], B_ext[1], B_ext[2]); } f107_free(f107_p); return s; }