int main(){ V6 v6; v6 = v6init(SPHERICAL); v6SetR(v6, 1.0); v6SetAlpha(v6, M_PI/4.0); v6SetDelta(v6, M_PI/4.0); v6 = v6s2c(v6); v6SetXDot(v6, -0.034); v6SetYDot(v6, -0.12); v6SetZDot(v6, -0.9); v6 = ecl2equ(v6, d2r(23.7)); printf("X %.9f \tY %.9f \tZ %.9f \nXDOT %.9f \tYDOT %.9f \tZDOT %.9f\n", v6GetX(v6), v6GetY(v6), v6GetZ(v6), v6GetXDot(v6), v6GetYDot(v6), v6GetZDot(v6)); return 0; }
/* * calc_moon_internal: * @info: WeatherInfo containing time_t of interest. The * values moonphase, moonlatitude and moonValid are updated * on success. * * Returns: gboolean indicating success or failure. * moonphase is expressed as degrees where '0' is a new moon, * '90' is first quarter, etc. */ static gboolean calc_moon_internal (time_t update, gdouble *moonphase, gdouble *moonlatitude) { time_t t; gdouble ra_h; gdouble decl_r; gdouble ndays, sunMeanAnom_d; gdouble moonLong_d; gdouble moonMeanAnom_d, moonMeanAnom_r; gdouble sunEclipLong_r; gdouble ascNodeMeanLong_d; gdouble corrLong_d, eviction_d; gdouble sinSunMeanAnom; gdouble Ae, A3, Ec, A4, lN_r; gdouble lambda_r, beta_r; /* * The comments refer to the enumerated steps to calculate the * position of the moon (section 65 of above reference) */ t = update; ndays = EPOCH_TO_J2000(t) / 86400.; sunMeanAnom_d = fmod (MEAN_ECLIPTIC_LONGITUDE (ndays) - PERIGEE_LONGITUDE (ndays), 360.); sunEclipLong_r = sunEclipLongitude (t); moonLong_d = fmod (LUNAR_MEAN_LONGITUDE + (ndays * LUNAR_PROGRESSION), 360.); /* 5: moon's mean anomaly */ moonMeanAnom_d = fmod ((moonLong_d - (0.1114041 * ndays) - (LUNAR_PERIGEE_MEAN_LONG + LUNAR_NODE_MEAN_LONG)), 360.); /* 6: ascending node mean longitude */ ascNodeMeanLong_d = fmod (LUNAR_NODE_MEAN_LONG - (0.0529539 * ndays), 360.); eviction_d = 1.2739 /* 7: eviction */ * sin (DEGREES_TO_RADIANS (2.0 * (moonLong_d - RADIANS_TO_DEGREES (sunEclipLong_r)) - moonMeanAnom_d)); sinSunMeanAnom = sin (DEGREES_TO_RADIANS (sunMeanAnom_d)); Ae = 0.1858 * sinSunMeanAnom; A3 = 0.37 * sinSunMeanAnom; /* 8: annual equation */ moonMeanAnom_d += eviction_d - Ae - A3; /* 9: "third correction" */ moonMeanAnom_r = DEGREES_TO_RADIANS (moonMeanAnom_d); Ec = 6.2886 * sin (moonMeanAnom_r); /* 10: equation of center */ A4 = 0.214 * sin (2.0 * moonMeanAnom_r); /* 11: "yet another correction" */ /* Steps 12-14 give the true longitude after correcting for variation */ moonLong_d += eviction_d + Ec - Ae + A4 + (0.6583 * sin (2.0 * (moonMeanAnom_r - sunEclipLong_r))); /* 15: corrected longitude of node */ corrLong_d = ascNodeMeanLong_d - 0.16 * sinSunMeanAnom; /* * Calculate ecliptic latitude (16-19) and longitude (20) of the moon, * then convert to right ascension and declination. */ lN_r = DEGREES_TO_RADIANS (moonLong_d - corrLong_d); /* l''-N' */ lambda_r = DEGREES_TO_RADIANS(corrLong_d) + atan2 (sin (lN_r) * cos (LUNAR_INCLINATION), cos (lN_r)); beta_r = asin (sin (lN_r) * sin (LUNAR_INCLINATION)); ecl2equ (t, lambda_r, beta_r, &ra_h, &decl_r); /* * The phase is the angle from the sun's longitude to the moon's */ *moonphase = fmod (15.*ra_h - RADIANS_TO_DEGREES (sunEclipLongitude (update)), 360.); if (*moonphase < 0) *moonphase += 360; *moonlatitude = RADIANS_TO_DEGREES (decl_r); return TRUE; }
/// Implementation of the objective function. void tandem::objfun_impl(fitness_vector &f, const decision_vector &x) const { if (tof!=-1) { //constrained problem //Here we copy the chromosome into a new vector and we transform its time percentages into days copy_of_x = x; copy_of_x[4] = x[4]*365.25*tof; copy_of_x[5] = x[5]*(365.25*tof-copy_of_x[4]); copy_of_x[6] = x[6]*(365.25*tof-copy_of_x[4]-copy_of_x[5]); copy_of_x[7] = x[7]*(365.25*tof-copy_of_x[4]-copy_of_x[5]-copy_of_x[6]); MGA_DSM(copy_of_x, problem, f[0]); } else { //unconstrained problem MGA_DSM(x, problem, f[0]); } //evaluating the mass from the dvs double rE[3]; double vE[3]; Planet_Ephemerides_Analytical (x[0],3,rE,vE); double VINFE = x[1]; double udir = x[2]; double vdir = x[3]; double vtemp[3]; vtemp[0]= rE[1]*vE[2]-rE[2]*vE[1]; vtemp[1]= rE[2]*vE[0]-rE[0]*vE[2]; vtemp[2]= rE[0]*vE[1]-rE[1]*vE[0]; double iP1[3]; double normvE=sqrt(vE[0]*vE[0]+vE[1]*vE[1]+vE[2]*vE[2]); iP1[0]= vE[0]/normvE; iP1[1]= vE[1]/normvE; iP1[2]= vE[2]/normvE; double zP1[3]; double normvtemp=sqrt(vtemp[0]*vtemp[0]+vtemp[1]*vtemp[1]+vtemp[2]*vtemp[2]); zP1[0]= vtemp[0]/normvtemp; zP1[1]= vtemp[1]/normvtemp; zP1[2]= vtemp[2]/normvtemp; double jP1[3]; jP1[0]= zP1[1]*iP1[2]-zP1[2]*iP1[1]; jP1[1]= zP1[2]*iP1[0]-zP1[0]*iP1[2]; jP1[2]= zP1[0]*iP1[1]-zP1[1]*iP1[0]; double theta=2*M_PI*udir; //See Picking a Point on a Sphere double phi=acos(2*vdir-1)-M_PI/2; //In this way: -pi/2<phi<pi/2 so phi can be used as out-of-plane rotation double vinf[3]; vinf[0]=VINFE*(cos(theta)*cos(phi)*iP1[0]+sin(theta)*cos(phi)*jP1[0]+sin(phi)*zP1[0]); vinf[1]=VINFE*(cos(theta)*cos(phi)*iP1[1]+sin(theta)*cos(phi)*jP1[1]+sin(phi)*zP1[1]); vinf[2]=VINFE*(cos(theta)*cos(phi)*iP1[2]+sin(theta)*cos(phi)*jP1[2]+sin(phi)*zP1[2]); //We rotate it to the equatorial plane ecl2equ(vinf,vinf); //And we find the declination in degrees double normvinf=sqrt(vinf[0]*vinf[0]+vinf[1]*vinf[1]+vinf[2]*vinf[2]); double sindelta = vinf[2] / normvinf; double declination = asin(sindelta)/M_PI*180; //double m_initial = SoyuzFregat(VINFE,declination); double m_initial = Atlas501(VINFE,declination); //We evaluate the final mass double Isp = 312; double g0 = 9.80665; double sumDVvec=0; for(unsigned int i=1;i<=5;i++) { sumDVvec=sumDVvec+problem.DV[i]; } double m_final; sumDVvec=sumDVvec+0.165; //losses for 3 swgbys + insertion m_final = m_initial * exp(-sumDVvec/Isp/g0*1000); f[0] = -log(m_final); }