/* Get arbitrary planetary barycenter position. Get the velocity (in AU/YR) too, if desired. */ void bodycenter_ssbary(double jd, double *xyz, int body, double *vxyz) { double posn[3], vel[3]; static int init=0; int i; if (!init) { if (Initialize_Ephemeris()) exit(1); init = 1; } if (vxyz==NULL) { Interpolate_Position(jd, body, posn); } else { Interpolate_State(jd, body, posn, vel); } for (i=0; i<3; i++) { xyz[i] = posn[i] / R1.AU; } if (vxyz!=NULL) /* convert km/s to AU/YR: */ for (i=0; i<3; i++) { vxyz[i] = vel[i] * (86400. * 365.25) / R1.AU ; } return; }
int dele::detR(double *x, double *y, double *z, double Time, int nplanet, int proizv, int centr, int sk) { double xt, yt, zt; double Em; int npl = 0; stateData State; if((nplanet==GEOCENTR_NUM)) { npl = 1; nplanet = EARTH_NUM; } if(nplanet==MOON_NUM) { npl = 2; nplanet = EARTH_NUM; } Interpolate_State( Time , nplanet , &State ); if(proizv) { *x = State.Velocity[0]; *y = State.Velocity[1]; *z = State.Velocity[2]; *x = *x/H1.data.AU*86400.0; *y = *y/H1.data.AU*86400.0; *z = *z/H1.data.AU*86400.0; } else { *x = State.Position[0]; *y = State.Position[1]; *z = State.Position[2]; *x = *x/H1.data.AU; *y = *y/H1.data.AU; *z = *z/H1.data.AU; } if(npl) { xt = yt = zt = 0.0; Interpolate_State( Time , MOON_NUM , &State ); if(proizv) { xt = State.Velocity[0]; yt = State.Velocity[1]; zt = State.Velocity[2]; xt = xt/H1.data.AU*86400.0; yt = yt/H1.data.AU*86400.0; zt = zt/H1.data.AU*86400.0; } else { xt = State.Position[0]; yt = State.Position[1]; zt = State.Position[2]; xt = xt/H1.data.AU; yt = yt/H1.data.AU; zt = zt/H1.data.AU; } Em = H1.data.EMRAT; if(npl==1) { *x = *x - (1.0/(1.0+Em))*xt; *y = *y - (1.0/(1.0+Em))*yt; *z = *z - (1.0/(1.0+Em))*zt; } if(npl==2) { *x = *x + (Em/(1.0+Em))*xt; *y = *y + (Em/(1.0+Em))*yt; *z = *z + (Em/(1.0+Em))*zt; } } if(centr) { this->detR(&xt, &yt, &zt, Time, SUN_NUM, proizv, 0, 0); *x -= xt; *y -= yt; *z -= zt; } if(sk) { xt = *x; yt = *y; zt = *z; *y = cos(EKV)*yt + sin(EKV)*zt; *z = -sin(EKV)*yt + cos(EKV)*zt; } return 0; }
int dele::detState(double *x, double *y, double *z, double *vx, double *vy, double *vz, double Time, int nplanet, int centr, int sk) { double xt, yt, zt; double vxt, vyt, vzt; double Em; int npl = 0; stateData State; if((nplanet==GEOCENTR_NUM)) { npl = 1; nplanet = EARTH_NUM; } if(nplanet==MOON_NUM) { npl = 2; nplanet = EARTH_NUM; } Interpolate_State( Time , nplanet , &State ); *vx = State.Velocity[0]; *vy = State.Velocity[1]; *vz = State.Velocity[2]; *vx = *vx/H1.data.AU*86400.0; *vy = *vy/H1.data.AU*86400.0; *vz = *vz/H1.data.AU*86400.0; *x = State.Position[0]; *y = State.Position[1]; *z = State.Position[2]; *x = *x/H1.data.AU; *y = *y/H1.data.AU; *z = *z/H1.data.AU; if(npl) { xt = yt = zt = 0.0; vxt = vyt = vzt = 0.0; Interpolate_State( Time , MOON_NUM , &State ); vxt = State.Velocity[0]; vyt = State.Velocity[1]; vzt = State.Velocity[2]; vxt = vxt/H1.data.AU*86400.0; vyt = vyt/H1.data.AU*86400.0; vzt = vzt/H1.data.AU*86400.0; xt = State.Position[0]; yt = State.Position[1]; zt = State.Position[2]; xt = xt/H1.data.AU; yt = yt/H1.data.AU; zt = zt/H1.data.AU; Em = H1.data.EMRAT; if(npl==1) { *x = *x - (1.0/(1.0+Em))*xt; *y = *y - (1.0/(1.0+Em))*yt; *z = *z - (1.0/(1.0+Em))*zt; *vx = *vx - (1.0/(1.0+Em))*vxt; *vy = *vy - (1.0/(1.0+Em))*vyt; *vz = *vz - (1.0/(1.0+Em))*vzt; } if(npl==2) { *x = *x + (Em/(1.0+Em))*xt; *y = *y + (Em/(1.0+Em))*yt; *z = *z + (Em/(1.0+Em))*zt; *vx = *vx + (Em/(1.0+Em))*vxt; *vy = *vy + (Em/(1.0+Em))*vyt; *vz = *vz + (Em/(1.0+Em))*vzt; } } if(centr) { Interpolate_State( Time , SUN_NUM , &State ); *x -= State.Position[0]/H1.data.AU; *y -= State.Position[1]/H1.data.AU; *z -= State.Position[2]/H1.data.AU; *vx -= State.Velocity[0]/H1.data.AU*86400.0; *vy -= State.Velocity[1]/H1.data.AU*86400.0; *vz -= State.Velocity[2]/H1.data.AU*86400.0; } if(sk) { xt = *x; yt = *y; zt = *z; *y = cos(EKV)*yt + sin(EKV)*zt; *z = -sin(EKV)*yt + cos(EKV)*zt; xt = *vx; yt = *vy; zt = *vz; *vy = cos(EKV)*yt + sin(EKV)*zt; *vz = -sin(EKV)*yt + cos(EKV)*zt; } return 0; }