33 #define MINR_IN_1EM8 0 // minimum radius
34 #define MINDENOM 1e-8 // mininum denominator
35 #define SIGN(a) ((a) < 0 ? -1 : 1)
44 if (fabs(y)<1e-4)
return 1.0/2.0*(1.0 - y/12.0*(1.0 - y/30.0*(1.0 - y/56.0)));
45 double u = sqrt(fabs(y));
46 if (y>0.0)
return (1.0- cos(u))/ y;
47 else return (cosh(u)-1.0)/-y;
53 if (fabs(y)<1e-4)
return 1.0/6.0*(1.0 - y/20.0*(1.0 - y/42.0*(1.0 - y/72.0)));
54 double u = sqrt(fabs(y));
56 if (y>0.0)
return (u - sin(u))/u3;
57 else return (sinh(u) - u)/u3;
65 S = (1.0/6.0)*(1.0 - y*(1.0/20.0)*(1.0 - y*(1.0/42.0)*(1.0 - y*(1.0/72.0))));
66 C = (1.0/2.0)*(1.0 - y*(1.0/12.0)*(1.0 - y*(1.0/30.0)*(1.0 - y*(1.0/56.0))));
72 double u = sqrt(absy);
94 S = (1.0/6.0)*(1.0 - y*(1.0/20.0)*(1.0 - y*(1.0/42.0)*(1.0 - y*(1.0/72.0))));
95 C = (1.0/2.0)*(1.0 - y*(1.0/12.0)*(1.0 - y*(1.0/30.0)*(1.0 - y*(1.0/56.0))));
101 float u = sqrtf(absy);
112 S = (sinhf(u) - u)/u3;
113 C = (coshf(u)-1.0)/-y;
120 GPUAPI
double solvex(
double r0dotv0,
double alpha,
121 double sqrtM1,
double r0,
double dt)
123 const double _N_LAG = 5.0;
126 double foo = 1.0 - r0*alpha;
127 double sig0 = r0dotv0/smu;
128 double x = sqrtM1*sqrtM1*dt*dt/r0;
132 for(
int i=0;(i<7)&&!((i>2)&&(x+u==x));i++){
134 double x2,x3,alx2,Cp,Sp,F,dF,ddF,z;
146 F = sig0*x2*Cp + foo*x3*Sp + r0*x - smu*dt;
147 dF = sig0*x*(1.0 - alx2*Sp) + foo*x2*Cp + r0;
148 ddF = sig0*(1.0-alx2*Cp) + foo*x*(1.0 - alx2*Sp);
149 z = fabs((_N_LAG - 1.0)*((_N_LAG - 1.0)*dF*dF - _N_LAG*F*ddF));
151 double denom = (dF + SIGN(dF)*z);
152 if (denom ==0.0) denom = MINDENOM;
175 GPUAPI
void drift_kepler(
double& x_old,
double& y_old,
double& z_old,
double& vx_old,
double& vy_old,
double& vz_old,
const double sqrtGM,
const double deltaTime)
177 double x = x_old, y = y_old, z = z_old, vx = vx_old, vy = vy_old, vz = vz_old;
180 double r0 = sqrt(x*x + y*y + z*z + MINR_IN_1EM8*MINR_IN_1EM8*1.e-16);
182 double r0 = sqrt(x*x + y*y + z*z );
185 double v2 = (vx*vx + vy*vy + vz*vz);
186 double r0dotv0 = (x*vx + y*vy + z*vz);
187 double GM = sqrtGM*sqrtGM;
188 double alpha = (2.0/r0 - v2/GM);
190 double x_p =
solvex(r0dotv0, alpha, sqrtGM, r0, deltaTime);
194 double foo = 1.0 - r0*alpha;
195 double sig0 = r0dotv0/smu;
198 double alx2 = alpha*x2;
203 double r = sig0*x_p*(1.0 - alx2*Sp) + foo*x2*Cp + r0;
207 if (r < MINR_IN_1EM8*1.e-8) r=MINR_IN_1EM8*1.e-8;
214 double f_p= 1.0 - (x2/r0)*Cp;
215 double g_p= deltaTime - (x3/smu)*Sp;
218 double dgdt = 1.0 - (x2/r)*Cp;
219 if (fabs(g_p) > MINDENOM)
221 dfdt = (f_p*dgdt - 1.0)/g_p;
224 dfdt = x_p*smu/(r*r0)*(alx2*Sp - 1.0);
226 x = f_p*x_old + g_p*vx_old;
227 y = f_p*y_old + g_p*vy_old;
228 z = f_p*z_old + g_p*vz_old;
229 vx = dfdt*x_old + dgdt*vx_old;
230 vy = dfdt*y_old + dgdt*vy_old;
231 vz = dfdt*z_old + dgdt*vz_old;
234 x_old =
x; y_old = y; z_old = z;
235 vx_old = vx; vy_old = vy; vz_old = vz;