96 double *alpha,
double *Drr,
97 const double EPS_ABS,
const double EPS_REL,
const int ode_method) {
99 double ug = 100.0 /
SperA;
100 double DrrRg, xx, xA, nu, aa, rr, myalf, step;
101 const gsl_odeiv_step_type* T;
104 gsl_odeiv_control* c;
106 gsl_odeiv_system sys = {
funcM_ode_G, NULL, 1, NULL};
110 }
else if (r <=
Rg/4.0) {
114 }
else if (r <=
Rg) {
121 nu = DrrRg * xA / ug;
122 aa = ug / pow(xA, nu);
124 *alpha = aa * pow(xx, nu);
125 *Drr = aa * nu * pow(xx, nu - 1);
127 }
else if (r >=
Rc + 1.0) {
134 switch (ode_method) {
136 T = gsl_odeiv_step_rkck;
139 T = gsl_odeiv_step_rk2;
142 T = gsl_odeiv_step_rk4;
145 T = gsl_odeiv_step_rk8pd;
148 printf(
"INVALID ode_method in exactM(): must be 1,2,3,4\n");
151 s = gsl_odeiv_step_alloc(T, (
size_t)1);
152 c = gsl_odeiv_control_y_new(EPS_ABS,EPS_REL);
153 e = gsl_odeiv_evolve_alloc((
size_t)1);
162 step =
MIN(r-rr,20.0e3);
163 status = gsl_odeiv_evolve_apply(e, c, s, &sys, &rr, r, &step, &myalf);
164 if (status != GSL_SUCCESS)
break;
168 gsl_odeiv_evolve_free(e);
169 gsl_odeiv_control_free(c);
170 gsl_odeiv_step_free(s);
int exactM_old(double r, double *alpha, double *Drr, const double EPS_ABS, const double EPS_REL, const int ode_method)