79 #include <uves_baryvel.h>
81 #include <uves_pfits.h>
82 #include <uves_utils.h>
83 #include <uves_error.h>
93 static void deg2dms(
double in_val,
98 static void deg2hms(
double in_val,
103 static void compxy(
double inputr[19],
char inputc[4],
105 double utr,
double mod_juldat);
107 static void barvel(
double DJE,
double DEQ,
108 double DVELH[4],
double DVELB[4]);
128 char inputc[] =
"X+++";
154 double ra_hour, ra_min, ra_sec;
155 double dec_deg, dec_min, dec_sec;
156 double lat_deg, lat_min, lat_sec;
157 double lon_deg, lon_min, lon_sec;
160 "Error getting object right ascension");
162 "Error getting object declination");
165 "Error getting telescope latitude");
167 "Error getting telescope longitude");
172 "Error reading UTC");
174 "Error julian date");
176 deg2hms(qc_ra, &ra_hour, &ra_min, &ra_sec);
177 deg2dms(qc_dec, &dec_deg, &dec_min, &dec_sec);
178 deg2dms(qc_geolat, &lat_deg, &lat_min, &lat_sec);
179 deg2dms(qc_geolon, &lon_deg, &lon_min, &lon_sec);
198 rneg = (inputr[7]*3600.)+(inputr[8]*60.)+inputr[9];
200 inputc[1] = (lon_deg >= 0) ?
'+' :
'-';
202 if (rneg < 0) inputc[1] =
'-';
205 inputr[10] = lat_deg;
206 inputr[11] = lat_min;
207 inputr[12] = lat_sec;
210 rneg = (inputr[10]*3600.)+(inputr[11]*60.)+inputr[12];
212 inputc[2] = (lat_deg >= 0) ?
'+' :
'-';
214 if (rneg < 0) inputc[2] =
'-';
217 inputr[13] = ra_hour;
222 inputr[16] = dec_deg;
223 inputr[17] = dec_min;
224 inputr[18] = dec_sec;
227 inputc[3] = (dec_deg >= 0) ?
'+' :
'-';
229 rneg = (inputr[16]*3600.)+(inputr[17]*60.)+inputr[18];
231 if (rneg < 0) inputc[3] =
'-';
244 compxy(inputr, inputc, outputr, utr, mod_juldat);
250 uves_msg_debug(
" Total barycentric RV correction: %f km/s", outputr[1]);
251 uves_msg_debug(
" Total heliocentric RV correction: %f km/s", outputr[2]);
252 uves_msg_debug(
" (incl. diurnal RV correction of %f km/s)", outputr[3]);
256 *bary_corr = outputr[1];
257 *helio_corr = outputr[2];
288 compxy(
double inputr[19],
char inputc[4],
290 double utr,
double mod_juldat)
300 double t0, dl, theta0, pe, st0hg, stg;
304 double dvelb[4], dvelh[4];
306 double alp, del, beov, berv, EDV;
308 double HAR, phi, heov, herv;
329 double *olong, *olat, *alpha, *delta;
332 char signs[] =
"+++";
337 inpsgn[1] = inputc[1];
338 inpsgn[2] = inputc[2];
339 inpsgn[3] = inputc[3];
344 olong = rbuf + 7 - 1;
346 olat = rbuf + 10 - 1;
347 alpha = rbuf + 13 - 1;
349 delta = rbuf + 16 - 1;
370 jd = mod_juldat + 2400000.5;
378 if (olong[1] < 0 || olong[2] < 0 ||
379 olong[3] < 0 || inpsgn[1] ==
'-') {
385 olong[1] = fabs(olong[1]);
386 olong[2] = fabs(olong[2]);
387 olong[3] = fabs(olong[3]);
392 dl = olong[1]+olong[2]/60. +olong[3]/3600.;
395 if (signs[1] ==
'-') dl = -dl;
402 if (olat[1] < 0 || olat[2] < 0 ||
403 olat[3] < 0 || inpsgn[2] ==
'-') {
410 olat[1] = fabs(olat[1]);
411 olat[2] = fabs(olat[2]);
412 olat[3] = fabs(olat[3]);
417 phi = olat[1]+olat[2]/60. +olat[3]/3600.;
420 if (signs[2] ==
'-') phi = -phi;
423 phi = phi*M_PI/180. ;
428 alp = (alpha[1]*3600. +alpha[2]*60. +alpha[3])*M_PI/(12. *3600. );
432 if (delta[1] < 0 || delta[2] < 0 ||
433 delta[3] < 0 || inpsgn[3] ==
'-') {
439 delta[1] = fabs(delta[1]);
440 delta[2] = fabs(delta[2]);
441 delta[3] = fabs(delta[3]);
447 del = (delta[1]*3600.0 + delta[2]*60. + delta[3])
448 * M_PI/(3600. *180. );
452 if (signs[3] ==
'-') del = - del;
460 barvel(jd, 0.0, dvelh, dvelb);
471 dvelb[1]*cos(alp)*cos(del)+
472 dvelb[2]*sin(alp)*cos(del)+
479 dvelh[1]*cos(alp)*cos(del)+
480 dvelh[2]*sin(alp)*cos(del)+
493 jd0h = jd - (utr/24.0);
496 t0 = (jd0h-2415020. )/36525. ;
499 theta0 = 0.276919398 +100.0021359 *t0+0.000001075 *t0*t0 ;
505 theta0 = theta0 - pe;
517 stg = st0hg+utr*1.00273790931 ;
520 if (stg < dl) stg = stg +24. ;
526 if (STR >= 24. ) STR = STR-24. ;
535 EDV = -0.4654 * sin(HAR)* cos(del)* cos(phi);
580 outputr[1] = rbuf[1];
581 outputr[2] = rbuf[2];
582 outputr[3] = rbuf[3];
588 #define DCFEL(x,y) dcfel[y][x]
589 #define DCFEPS(x,y) dcfeps[y][x]
590 #define CCSEL(x,y) ccsel[y][x]
591 #define DCARGS(x,y) dcargs[y][x]
592 #define CCAMPS(x,y) ccamps[y][x]
593 #define CCSEC(x,y) ccsec[y][x]
594 #define DCARGM(x,y) dcargm[y][x]
595 #define CCAMPM(x,y) ccampm[y][x]
596 #define DCEPS(x) dceps[x]
597 #define FORBEL(x) forbel[x]
598 #define SORBEL(x) sorbel[x]
600 #define SINLP(x) sinlp[x]
601 #define COSLP(x) coslp[x]
602 #define CCPAMV(x) ccpamv[x]
623 double DVELH[4],
double DVELB[4])
628 double DT,DTL,DTSQ,DLOCAL;
632 double DXBD,DYBD,DZBD,DZHD,DXHD,DYHD;
634 double DYAHD,DZAHD,DYABD,DZABD;
636 double DML,DEPS,PHI,PHID,PSID,DPARAM,PARAM;
638 double PLON,POMG,PECC;
640 double PERTL,PERTLD,PERTRD,PERTP,PERTR,PERTPD;
649 double A,B,F,SINF,COSF,T,TSQ,TWOE,TWOG;
652 double DPSI,D1PDRO,DSINLS;
654 double DCOSLS,DSINEP,DCOSEP;
656 double forbel[8], sorbel[18], sinlp[5], coslp[5];
658 double SINLM,COSLM,SIGMA;
668 double *E = sorbel + 1 - 1;
669 double *G = forbel + 1 - 1;
672 double DC2PI = 6.2831853071796E0;
673 double CC2PI = 6.283185;
677 double DCT0 = 2415020.0E0;
678 double DCJUL = 36525.0E0;
689 double dcfel[][4] = { {0, 0, 0, 0},
690 {0, 1.7400353E+00, 6.2833195099091E+02, 5.2796E-06},
691 {0, 6.2565836E+00, 6.2830194572674E+02,-2.6180E-06},
692 {0, 4.7199666E+00, 8.3997091449254E+03,-1.9780E-05},
693 {0, 1.9636505E-01, 8.4334662911720E+03,-5.6044E-05},
694 {0, 4.1547339E+00, 5.2993466764997E+01, 5.8845E-06},
695 {0, 4.6524223E+00, 2.1354275911213E+01, 5.6797E-06},
696 {0, 4.2620486E+00, 7.5025342197656E+00, 5.5317E-06},
697 {0, 1.4740694E+00, 3.8377331909193E+00, 5.6093E-06} };
701 double dceps[4] = {0, 4.093198E-01,-2.271110E-04,-2.860401E-08};
722 double ccsel[][4] = { {0, 0, 0, 0},
723 {0, 1.675104E-02, -4.179579E-05, -1.260516E-07},
724 {0, 2.220221E-01, 2.809917E-02, 1.852532E-05},
725 {0, 1.589963E+00, 3.418075E-02, 1.430200E-05},
726 {0, 2.994089E+00, 2.590824E-02, 4.155840E-06},
727 {0, 8.155457E-01, 2.486352E-02, 6.836840E-06},
728 {0, 1.735614E+00, 1.763719E-02, 6.370440E-06},
729 {0, 1.968564E+00, 1.524020E-02, -2.517152E-06},
730 {0, 1.282417E+00, 8.703393E-03, 2.289292E-05},
731 {0, 2.280820E+00, 1.918010E-02, 4.484520E-06},
732 {0, 4.833473E-02, 1.641773E-04, -4.654200E-07},
733 {0, 5.589232E-02, -3.455092E-04, -7.388560E-07},
734 {0, 4.634443E-02, -2.658234E-05, 7.757000E-08},
735 {0, 8.997041E-03, 6.329728E-06, -1.939256E-09},
736 {0, 2.284178E-02, -9.941590E-05, 6.787400E-08},
737 {0, 4.350267E-02, -6.839749E-05, -2.714956E-07},
738 {0, 1.348204E-02, 1.091504E-05, 6.903760E-07},
739 {0, 3.106570E-02, -1.665665E-04, -1.590188E-07} };
759 double dcargs[][3] = { {0, 0, 0},
760 {0, 5.0974222E+00, -7.8604195454652E+02},
761 {0, 3.9584962E+00, -5.7533848094674E+02},
762 {0, 1.6338070E+00, -1.1506769618935E+03},
763 {0, 2.5487111E+00, -3.9302097727326E+02},
764 {0, 4.9255514E+00, -5.8849265665348E+02},
765 {0, 1.3363463E+00, -5.5076098609303E+02},
766 {0, 1.6072053E+00, -5.2237501616674E+02},
767 {0, 1.3629480E+00, -1.1790629318198E+03},
768 {0, 5.5657014E+00, -1.0977134971135E+03},
769 {0, 5.0708205E+00, -1.5774000881978E+02},
770 {0, 3.9318944E+00, 5.2963464780000E+01},
771 {0, 4.8989497E+00, 3.9809289073258E+01},
772 {0, 1.3097446E+00, 7.7540959633708E+01},
773 {0, 3.5147141E+00, 7.9618578146517E+01},
774 {0, 3.5413158E+00, -5.4868336758022E+02} };
795 {0, -2.279594E-5, 1.407414E-5, 8.273188E-6, 1.340565E-5, -2.490817E-7},
796 {0, -3.494537E-5, 2.860401E-7, 1.289448E-7, 1.627237E-5, -1.823138E-7},
797 {0, 6.593466E-7, 1.322572E-5, 9.258695E-6, -4.674248E-7, -3.646275E-7},
798 {0, 1.140767E-5, -2.049792E-5, -4.747930E-6, -2.638763E-6, -1.245408E-7},
799 {0, 9.516893E-6, -2.748894E-6, -1.319381E-6, -4.549908E-6, -1.864821E-7},
800 {0, 7.310990E-6, -1.924710E-6, -8.772849E-7, -3.334143E-6, -1.745256E-7},
801 {0, -2.603449E-6, 7.359472E-6, 3.168357E-6, 1.119056E-6, -1.655307E-7},
802 {0, -3.228859E-6, 1.308997E-7, 1.013137E-7, 2.403899E-6, -3.736225E-7},
803 {0, 3.442177E-7, 2.671323E-6, 1.832858E-6, -2.394688E-7, -3.478444E-7},
804 {0, 8.702406E-6, -8.421214E-6, -1.372341E-6, -1.455234E-6, -4.998479E-8},
805 {0, -1.488378E-6, -1.251789E-5, 5.226868E-7, -2.049301E-7, 0.0E0},
806 {0, -8.043059E-6, -2.991300E-6, 1.473654E-7, -3.154542E-7, 0.0E0},
807 {0, 3.699128E-6, -3.316126E-6, 2.901257E-7, 3.407826E-7, 0.0E0},
808 {0, 2.550120E-6, -1.241123E-6, 9.901116E-8, 2.210482E-7, 0.0E0},
809 {0, -6.351059E-7, 2.341650E-6, 1.061492E-6, 2.878231E-7, 0.0E0}};
813 double CCSEC3 = -7.757020E-08;
820 double ccsec[][4] = { {0, 0, 0, 0},
821 {0, 1.289600E-06, 5.550147E-01, 2.076942E+00},
822 {0, 3.102810E-05, 4.035027E+00, 3.525565E-01},
823 {0, 9.124190E-06, 9.990265E-01, 2.622706E+00},
824 {0, 9.793240E-07, 5.508259E+00, 1.559103E+01}};
828 double DCSLD = 1.990987E-07, CCSGD = 1.990969E-07;
831 double CCKM = 3.122140E-05, CCMLD = 2.661699E-06, CCFDI = 2.399485E-07;
837 double dcargm[][3] = {{0, 0, 0},
838 {0, 5.1679830E+00, 8.3286911095275E+03},
839 {0, 5.4913150E+00, -7.2140632838100E+03},
840 {0, 5.9598530E+00, 1.5542754389685E+04}};
847 double ccampm[][5] = {{0, 0, 0, 0, 0},
848 {0, 1.097594E-01, 2.896773E-07, 5.450474E-02, 1.438491E-07},
849 {0, -2.223581E-02, 5.083103E-08, 1.002548E-02, -2.291823E-08},
850 {0, 1.148966E-02, 5.658888E-08, 8.249439E-03, 4.063015E-08} };
854 double ccpamv[] = {0, 8.326827E-11, 1.843484E-11, 1.988712E-12, 1.881276E-12};
856 double DC1MME = 0.99999696E0;
876 for (K = 1; K <= 8; K++) {
879 DLOCAL=fmod(DCFEL(1,K)+DT*DCFEL(2,K)+DTSQ*DCFEL(3,K),DC2PI);
882 if (K == 1) DML=DLOCAL;
885 if (K != 1) FORBEL(K-1)=DLOCAL;
890 DEPS=fmod(DCEPS(1)+DT*DCEPS(2)+DTSQ*DCEPS(3), DC2PI);
893 for (K = 1; K <= 17; K++) {
896 SORBEL(K)=fmod(CCSEL(1,K)+T*CCSEL(2,K)+TSQ*CCSEL(3,K),CC2PI);
902 for (K = 1; K <= 4; K++) {
905 A=fmod(CCSEC(2,K)+T*CCSEC(3,K),CC2PI);
915 PERTL = CCSEC(1,1) *SN(1) +CCSEC(1,2)*SN(2)
916 +(CCSEC(1,3)+T*CCSEC3)*SN(3) +CCSEC(1,4)*SN(4);
926 for (K = 1; K <= 15; K++) {
928 A=fmod(DCARGS(1,K)+DT*DCARGS(2,K), DC2PI);
937 PERTL =PERTL+CCAMPS(1,K)*COSA+CCAMPS(2,K)*SINA;
940 PERTR =PERTR+CCAMPS(3,K)*COSA+CCAMPS(4,K)*SINA;
946 PERTLD=PERTLD+(CCAMPS(2,K)*COSA-CCAMPS(1,K)*SINA)*CCAMPS(5,K);
949 PERTRD=PERTRD+(CCAMPS(4,K)*COSA-CCAMPS(3,K)*SINA)*CCAMPS(5,K);
972 PHI=TWOE*((1.0-ESQ*0.125 )*sin(G[1])+E[1]*0.625 *sin(TWOG)
973 +ESQ*0.5416667 *sin(G[1]+TWOG) ) ;
985 DPSI=DPARAM/(DC1+E[1]*COSF);
988 PHID=TWOE*CCSGD*((1.0+ESQ*1.5 )*COSF+E[1]*(1.25 -SINF*SINF*0.5 ));
991 PSID=CCSGD*E[1]*SINF/sqrt(PARAM);
997 DRD=D1PDRO*(PSID+DPSI*PERTRD);
1000 DRLD=D1PDRO*DPSI*(DCSLD+PHID+PERTLD);
1003 DTL=fmod(DML+PHI+PERTL, DC2PI);
1012 DXHD = DRD*DCOSLS-DRLD*DSINLS;
1015 DYHD = DRD*DSINLS+DRLD*DCOSLS;
1027 for (K = 1; K <= 3; K++) {
1029 A=fmod(DCARGM(1,K)+DT*DCARGM(2,K), DC2PI);
1038 PERTL =PERTL +CCAMPM(1,K)*SINA;
1041 PERTLD=PERTLD+CCAMPM(2,K)*COSA;
1044 PERTP =PERTP +CCAMPM(3,K)*COSA;
1047 PERTPD=PERTPD-CCAMPM(4,K)*SINA;
1062 SIGMA=CCKM/(1.0+PERTP);
1065 A=SIGMA*(CCMLD+PERTLD);
1071 DXHD=DXHD+A*SINLM+B*COSLM;
1074 DYHD=DYHD-A*COSLM+B*SINLM;
1077 DZHD= -SIGMA*CCFDI* cos(FORBEL(3));
1088 for (K = 1; K <= 4; K++) {
1100 TL=fmod(PLON+2.0*PECC* sin(PLON-POMG), CC2PI);
1109 DXBD=DXBD+CCPAMV(K)*(SINLP(K)+PECC*sin(POMG));
1112 DYBD=DYBD-CCPAMV(K)*(COSLP(K)+PECC*cos(POMG));
1115 DZBD=DZBD-CCPAMV(K)*SORBEL(K+13)*cos(PLON-SORBEL(K+5));
1125 DYAHD=DCOSEP*DYHD-DSINEP*DZHD;
1127 DZAHD=DSINEP*DYHD+DCOSEP*DZHD;
1129 DYABD=DCOSEP*DYBD-DSINEP*DZBD;
1131 DZABD=DSINEP*DYBD+DCOSEP*DZBD;
1147 for (N = 1; N <= 3; N++) {
1149 DVELH[N]=DVELH[N]*1.4959787E8;
1151 DVELB[N]=DVELB[N]*1.4959787E8;
1174 deg2hms(in_val*15, degs, minutes, seconds);
1219 in_val = fabs(in_val);
1233 *hours= uves_round_double(tmp);
1245 *minutes= uves_round_double(tmp);
1247 *minutes= (int) tmp;
1251 tmp = tmp - *minutes;
1259 if (sign ==
'-') *hours = -(*hours);
1299 juldat(
double *INDATE,
1340 DATE[1]=uves_round_double(INDATE[1]);
1346 DATE[2]=uves_round_double(INDATE[2]);
1348 DATE[3]=uves_round_double(INDATE[3]);
1351 if ((DATE[2] == 0) && (DATE[3] == 0)) {
1384 C = DATE[1] + DATE[2]*1.E-2 + DATE[3]*1.E-4 + UT*1.E-6;
1387 if (C > 1582.1015E0) {
1389 IA=(int) (YP/100.D0);
1393 IB=2-IA+((int)(A/4.D0));
1403 *JD = ((int) (365.25E0*YP)) + ((
int)(30.6001D0*(P+1.D0))) + DATE[3] + UT
1410 if (FRAC > 1.0E-6) {
1415 IF (C >= 1582.1015E0) {
1429 if (IC != 0) ND=365;
1438 if (fabs(FRAC*ND-uves_round_double(FRAC*ND)) > 0.3) {
1443 "integer number of days");
1448 *JD = *JD+uves_round_double(FRAC*ND);