Esempio n. 1
0
/* 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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
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;
}