source: Sophya/trunk/SophyaLib/NTools/datime.c@ 1400

Last change on this file since 1400 was 682, checked in by ansari, 26 years ago

Compilation Mac pour CodeWarrior PRO 5

File size: 34.0 KB
Line 
1#include "machdefs.h"
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5#include <ctype.h>
6#include <math.h>
7#ifdef __MWERKS__
8#include "unixmac.h"
9#endif
10
11#define DATIMEPRIVEE
12#include "strutil.h"
13#include "nbconst.h"
14#include "datime.h"
15
16
17/* Fonctions de calcule de date et temps (Heure) */
18/*
19++
20 Module Dates (C)
21 Lib LibsUtil
22 include datime.h
23
24 Ce groupe de fonctions permettent de manipuler des dates et heures.
25 En particulier, il est possible de calculer l'ecart (en nombre de jours
26 ou de secondes separant deux dates, ou le temps sideral correspondant
27 a une date et heure legale. Deux structures simples sont definies
28 afin de faciliter le passage des arguments entre differentes fonctions:
29 - *JMA* : Jour, Mois, Annee
30 - *HMS* : Heure, Minutes, Secondes
31
32--
33*/
34/*
35++
36 Links Voir aussi:
37 Temps Sideral, Universel (C)
38--
39*/
40/*
41++
42Titre Quelques Macros
43--
44*/
45
46/*
47++
48 StrgtoJMA(strg, jma)
49 Decodage d'une chaine de caracteres "strg" sous forme de "12/3/97" en structure
50 JMA "jma".
51 JMAtoStrg(jma, strg)
52 Ecrit le contenu de la structure JMA "jma" sous forme de "jj/mm/aaaa" dans la chaine
53 de caracteres "strg"
54 JMAtoStrgLong(jma, strg)
55 Ecriture de date en format long , par ex : "Jeudi , 19 Juin 1997"
56 StrgtoHMS(strg, hms)
57 Decodage d'une chaine de caracteres "strg" sous forme de "hh:mm:ss 10:43:60.5"
58 en structure HMS "hms".
59 HMStoStrg(hms, strg)
60 Ecrit le contenu de la structure HMS "hms" sous forme de "hh:mm:ss" dans la chaine
61 de caracteres "strg"
62 StrtoHMS(strg, hms)
63 Decodage d'une chaine de caracteres "strg" sous forme de "hh:mm:ss 10:43:60.5"
64 en structure HMS "hms" avec gestion des signes (decodage correcte de -44:30:05.23)
65 HMStoStr(hms, strg)
66 Ecrit le contenu de la structure HMS "hms" sous forme de "hh:mm:ss" dans la chaine
67 de caracteres "strg" avec gestion des signes
68--
69*/
70
71void StrtoHMS(char *s,HMS* h)
72/* On ne peut pas ecrire 1:-05:-45 pas gere et debile! (mn et sec >=0.) cmv 12/8/97 */
73{
74int imoins, i2pt;
75h->Heures = h->Minutes = 0; h->Secondes = 0.;
76/* decodage de la chaine de characteres */
77sscanf(s,"%d:%d:%lf", &(h->Heures),&(h->Minutes),&(h->Secondes));
78/* cas du type 5:34:45.5 */
79if( h->Heures > 0 ) return;
80/* cas du type -5:34:45.5 */
81if( h->Heures < 0 ) {
82 h->Minutes *= -1; h->Secondes *= -1.;
83 return;
84}
85/* Ici les Heures sont donc nulles "0:..." ou "-0:..." */
86/* on n'a donne que l'heure nulle cas "0" ou "-0" sans ":" (idiot mais bon!) */
87i2pt = posc(s,':');
88if( i2pt < 0 ) return;
89/* Ici on a au moins un ou 2 ":" */
90/* cas du type 0:34:45.5 ou 0:0:45.5 sans signe - */
91imoins = posc(s,'-');
92if( imoins < 0 ) return;
93/* cas du type -0:34:45.5 ou -0:0:45.5, le signe - n'est pas decode par sscanf */
94if( imoins < i2pt ) { /* on a donne -0:34 ou -0:34:45.5 */
95 h->Minutes *= -1; h->Secondes *= -1.;
96 return;
97}
98/* Ici il reste les cas mal codes ou le signe "-" est n'importe ou! */
99/* On laisse le decodage par sscanf */
100return;
101}
102
103
104void HMStoStr(HMS h,char *s)
105/* L'ecriture est forcee a h:mn:sec avec mn et sec >=0 cmv 12/8/97 */
106{
107double v;
108v = HMStoH(h);
109h = DoubletoHMS(v);
110if( v < 0. ) {
111 h.Heures *= -1; h.Minutes *= -1; h.Secondes *= -1.;
112 sprintf(s,"-%02d:%02d:%04.1f", h.Heures,h.Minutes,h.Secondes);
113} else {
114 sprintf(s,"%02d:%02d:%04.1f", h.Heures,h.Minutes,h.Secondes);
115}
116}
117
118/* Nouvelle-Fonction */
119int NbJourMois(int a, int m)
120/* Retourne le nombre de jours dans le mois m, annee a */
121{
122if(a<100) a+=1900;
123if( m<1 || m>12 ) return(-1);
124m--;
125if(m!=1) return(NbJoMois[m]);
126/* traitement du mois de fevrier bissextile ou non */
127if( ((a%4==0) && (a%100!=0))
128 || (a%400==0) ) return(NbJoMois[m]+1);
129else return(NbJoMois[m]);
130}
131
132/* Nouvelle-Fonction */
133long JMAtoJ(JMA jma)
134/* Calcule le Nb. de jours ecoules depuis 0 Jan 1901 */
135/* Si annee < 100 On considere annee = annee+1900 (1900-1999) */
136
137{
138long rc,nban;
139int i;
140
141/* Protection */
142if ( (jma.Mois < 1) || (jma.Mois > 12) ) jma.Mois = 1;
143if ( (jma.Jour < 1) || (jma.Jour > 31) ) jma.Jour = 1;
144
145if (jma.Annee < 100) jma.Annee+=1900;
146nban = jma.Annee - 1901;
147
148/* Annee Normale = 365 Jours - Bissextile = 366 Jours */
149/* 366 Jours : Divisible par 4 et non divisible par 100 (1972,1976) */
150/* : Divisible par 400 (1900 Non-Biss. et 2000 Biss.) */
151
152if (nban >= 0)
153 rc = nban*365 + (nban/4) - (nban/100) + ((nban+300)/400);
154else
155 rc = nban*365 + (nban/4) - (nban/100) + ((nban-300)/400);
156
157/* Comptabilisation du nb. des jours des mois ecoule */
158for (i=1; i<jma.Mois; i++) rc += NbJourMois(jma.Annee, i);
159rc += jma.Jour;
160
161return(rc);
162}
163
164/* Nouvelle-Fonction */
165JMA JtoJMA(long j)
166/* retourne la date correspondant a j jours ecoules depuis le 0/1/1901 */
167{
168long i;
169int inc,m;
170JMA buf;
171
172inc = (j>=0) ? 1 : -1;
173buf.Jour = buf.Mois = 1; buf.Annee = 1901;
174
175/* recherche de l'annee */
176for(;;) {
177 i = j-JMAtoJ(buf);
178 if( i==0 ) return(buf);
179 if( inc*i<0 ) {
180 /* printf("...annee j=%ld scan=%ld test=%ld\n"
181 ,j,JMAtoJ(buf),inc*i); */
182 break;
183 }
184 buf.Annee += inc;
185}
186if(inc>0) buf.Annee--;
187/* printf("Annee trouvee: %d\n",buf.Annee); */
188
189/* recherche du mois */
190for(m=1;m<=12;m++) {
191 buf.Mois=m;
192 i = j-JMAtoJ(buf);
193 if( i==0 ) return(buf);
194 if(i<0) {
195 /* printf("...mois j=%ld scan=%ld test=%ld\n"
196 ,j,JMAtoJ(buf),i); */
197 buf.Mois--;
198 break;
199 }
200}
201/* printf("Mois trouve: %d\n",buf.Mois); */
202
203/* recherche du jour */
204for(m=1;m<=31;m++) {
205 buf.Jour=m;
206 i = j-JMAtoJ(buf);
207 if( i==0 ) return(buf);
208}
209/* printf("Jour trouve: %d\n",buf.Jour); */
210
211/* on a pas trouve !!! normallement impossible! */
212printf("**** JtoJMA_Erreur: date non trouvee j=%ld ****\n",j);
213buf.Jour = buf.Mois = 1; buf.Annee = 0;
214return(buf);
215}
216
217/* Nouvelle-Fonction */
218int NumJour(JMA jma)
219/* Cette fonction calcule le numero de jour de la semaine */
220/* (Lundi=1 .. Dimanche=7) */
221
222{
223int l;
224
225/* On appelle JMAtoJ() pour avoir le nb de jours ecoule depuis 1/01/1901 */
226/* Le premier janvier 1901 etait un Mardi (JMAtoJ = 1 , NumJour = 2) */
227l = JMAtoJ(jma)%7 ;
228if (l >= 0) return(l+1);
229else return(l+8);
230}
231
232/* Nouvelle-Fonction */
233JMA JsmmaatoJMA(int nj, int mm, int aa)
234
235/* Pour "nj=kj*10+jj", calcule la date correspondant au "kj" eme
236 jour "jj" (1 .. 7 - Lundi .. Dimanche) du mois mm , annee aa
237 Si "nj" est negatif -> Dernier jour "jj". Si "kj=0", premier jour "jj".
238 Si "kj" ne peut etre atteint -> Dernier jour "jj".
239 Si annee "aa" <= 99 -> annee de 1901 - 1999 */
240
241{
242JMA jma;
243int i,k;
244int jj, kj;
245
246kj = nj/10;
247jj = nj%10;
248if (kj < 0) kj = 0;
249
250if (mm > 12) mm = 12;
251if (mm < 1 ) mm = 1;
252if (aa < 100) aa += 1900;
253jma.Mois = mm;
254jma.Annee = aa;
255
256if (kj == 0) {
257 if (jj >= 0) { /* Premier jour du mois */
258 if (jj > 7) jj = 7;
259 if (jj < 1) jj = 1;
260 jma.Jour = 1;
261 i = NumJour(jma);
262 if (i > jj) jma.Jour = (7-i)+jj+1;
263 else jma.Jour = 1+(jj-i);
264 }
265 else { /* Dernier jour du mois */
266 jj = -jj;
267 if (jj > 7) jj = 7;
268 if (jj < 1) jj = 1;
269 jma.Jour = NbJourMois(aa,mm);
270 i = NumJour(jma);
271 if (i >= jj) jma.Jour -= (i-jj);
272 else jma.Jour -= (7+i-jj);
273 }
274}
275else { /* On demande le kj eme jour jj du mois */
276 if (jj > 7) jj = 7;
277 if (jj < 1) jj = 1;
278 k = 0;
279 for(i=1; i<=NbJourMois(aa,mm); i++) {
280 jma.Jour = i;
281 if (NumJour(jma) == jj) k++;
282 if (k == kj) break;
283 }
284/* On n'a pas kj jour jj ds ce mois, on renvoie le dernier jj */
285 if (k<kj) return(JsmmaatoJMA(-jj, mm, aa));
286}
287
288return(jma);
289}
290
291JMA JApmmaatoJMA(int nj, int mm, int aa)
292/* Pour "nj=dd*10+jj", calcule la date correspondant au jour
293 "jj" (1 .. 7 - Lundi .. Dimanche) du mois "mm" , annee "aa"
294 se trouvant apres (ou egal a) la date "dd/mm/aa" .
295 Si annee "aa" <= 99 -> annee de 1901 - 1999 */
296{
297int i, dd, jj;
298JMA jma;
299
300if (nj < 0) nj = -nj;
301if (nj < 1) nj = 1;
302dd = nj/10;
303jj = nj%10;
304for(i=1; i<=6; i++) {
305 jma = JsmmaatoJMA(jj+10*i, mm, aa);
306 if(jma.Jour >= dd) return(jma);
307}
308printf("JApmmaatoJMA(%d...) Erreur / Pas de jour %d >= %d/%d/%d\n", nj, jj,dd, mm, aa);
309jma.Jour = jma.Mois = jma.Annee = 0;
310return(jma);
311}
312
313/* Nouvelle-Fonction */
314double HMStoH(HMS hms)
315
316/* Cette fonction calcule le nb d'heures en decimales pour hms */
317/* Heures/Minutes/Secondes peuvent etre +/- avec toutes les combi possibles */
318{
319return ((double)hms.Heures + ((double)hms.Minutes)/60. + hms.Secondes/3600.);
320}
321
322
323
324/* Nouvelle-Fonction */
325double HMStoSec(HMS hms)
326/* Calcul du nb de secondes pour hms */
327/* Heures/Minutes/Secondes peuvent etre +/- avec toutes les combi possibles */
328{
329return ((double)hms.Heures*3600. + (double)hms.Minutes*60. + hms.Secondes);
330}
331
332/* Nouvelle-Fonction */
333long DatetoSec(char const* date, char const* heure)
334/* Calcul du nombre de secondes correspondant a date/heure */
335/* a partir de l'origine 1er Janv 1990 0H00 */
336/* Date entre 1930 - 2050 */
337{
338JMA jma,jma0;
339HMS hms;
340long dj;
341
342StrgtoJMA(date,jma); StrgtoHMS(heure,hms);
343StrgtoJMA("01/01/1990",jma0);
344dj = JMAtoJ(jma) - JMAtoJ(jma0);
345if (dj < -24000) return(-0x7FFFFFFF);
346if (dj > 24000) return(0x7FFFFFFF);
347return( dj*3600*24 + (int)(HMStoSec(hms)) );
348}
349
350/* Nouvelle-Fonction */
351long DatetoSecOff(char const* date, char const* heure)
352{
353JMA jma,jma0;
354HMS hms, hms0;
355long dj,tdec;
356
357StrgtoJMA(date,jma); StrgtoHMS(heure,hms);
358StrgtoJMA("01/01/1990",jma0); StrgtoHMS("00:00:00",hms0);
359dj = JMAtoJ(jma) - JMAtoJ(jma0);
360if (dj < -24000) return(-0x7FFFFFFF);
361if (dj > 24000) return(0x7FFFFFFF);
362
363/* H_vrai+TOff=H_leg : H_vrai-H_vrai0 = (H_leg-TOff)-(H_leg0-TOff0) */
364tdec = 3600*(TLegOffset(jma, hms)-TLegOffset(jma0, hms0));
365
366dj = dj*3600*24 + (int)(HMStoSec(hms)) - tdec;
367return(dj);
368}
369
370/* Nouvelle-Fonction */
371HMS HtoHMS(double h)
372/* Heures decimales en H , M , Sec Il y a un modulo 24 */
373/* la sortie est telle que 0 <= heures < 24 */
374{
375HMS hms;
376
377while (h < 0.) h += 24.;
378
379hms.Heures = (int) h;
380h = (h-hms.Heures)*60.;
381hms.Minutes = (int) h;
382hms.Secondes = (h-hms.Minutes)*60.;
383hms.Heures = hms.Heures % 24;
384
385return(hms);
386}
387
388/* Nouvelle-Fonction */
389HMS DtoDMS(double h)
390/* Degres decimaux en D , M , Sec Il y a un modulo 360 */
391/* la sortie est telle que -180 < deg <= 180. */
392{
393HMS hms;
394int sgn = 1;
395
396while (h > 180.) h -= 360.;
397while (h <= -180.) h += 360.;
398if( h < 0. ) {h *= -1.; sgn = -1;}
399
400hms.Heures = (int) h;
401h = (h-hms.Heures)*60.;
402hms.Minutes = (int) h;
403hms.Secondes = (h-hms.Minutes)*60.;
404hms.Heures = hms.Heures % 360;
405
406if( sgn<0 ) {hms.Heures *= -1; hms.Minutes *= -1; hms.Secondes *= -1.;}
407return(hms);
408}
409
410/* Nouvelle-Fonction */
411HMS DoubletoHMS(double h)
412/* Degres/Heures decimaux en D/H , M , Sec SANS modulo 360/24 */
413{
414HMS hms;
415
416int sgn = 1;
417if( h < 0. ) {h *= -1.; sgn = -1;}
418
419hms.Heures = (int) h;
420h = (h-hms.Heures)*60.;
421hms.Minutes = (int) h;
422hms.Secondes = (h-hms.Minutes)*60.;
423hms.Heures = hms.Heures;
424
425if( sgn<0 ) {hms.Heures *= -1; hms.Minutes *= -1; hms.Secondes *= -1.;}
426return(hms);
427}
428
429/*
430++
431 Titre Calcule sur dates et heures
432--
433*/
434
435/*
436++
437int NbJourMois(int a, int m)
438 Retourne le nombre de jours dans le mois "m", annee "a".
439long JMAtoJ(JMA jma)
440 Calcule le Nb. de jours ecoules depuis 0 Jan 1901,
441 Si annee < 100 On considere annee = annee+1900 (1900-1999)
442JMA JtoJMA(long j)
443 Retourne la date correspondant a un nombre de jours "j"
444 ecoules depuis le 0 Jan 1901.
445int NumJour(JMA jma)
446 Calcule le numero du jour de la semaine correspondant a la date indiquee
447 par la structure JMA "jma". (Lundi=1 .. Dimanche=7)
448JMA JsmmaatoJMA(int nj, int mm, int aa)
449 Pour "nj=kj*10+jj", calcule la date correspondant au "kj" eme
450 jour "jj" (1 .. 7 - Lundi .. Dimanche) du mois mm , annee aa
451 Si "nj" est negatif -> Dernier jour "jj". Si "kj=0", premier jour "jj".
452 Si "kj" ne peut etre atteint -> Dernier jour "jj".
453 Si annee "aa" <= 99 -> annee de 1901 - 1999
454JMA JApmmaatoJMA(int nj, int mm, int aa)
455 Pour "nj=dd*10+jj", calcule la date correspondant au jour
456 "jj" (1 .. 7 - Lundi .. Dimanche) du mois "mm" , annee "aa"
457 se trouvant apres (ou egal a) la date "dd/mm/aa" .
458 Si annee "aa" <= 99 -> annee de 1901 - 1999
459double HMStoH(HMS hms)
460 Conversion en heures decimales de la structure "hms"
461double HMStoSec(HMS hms)
462 Conversion en secondes de la structure HMS "hms"
463HMS HtoHMS(double h)
464 Conversion heures en decimales en structure HMS
465HMS DtoDMS(double h)
466 Conversion degres decimaux en structure HMS (deg,min,sec)
467HMS DoubletoHMS(double h)
468 Conversion degres/heures decimaux en structure HMS (deg/heure,min,sec)
469 SANS modulo 360/24
470long DatetoSec(char const* date, char const* heure)
471 Calcule le nombre de secondes correspondant a "date,heure"
472 a partir de l'origine 1er Janv 1990 0H00 ( Date entre 1930 - 2050 )
473long DatetoSecOff(char const* date, char const* heure)
474 Calcule le nombre de secondes correspondant a "date,heure"
475 a partir de l'origine 1er Janv 1990 0H00 ( Date entre 1930 - 2050 )
476 en tenant compte des decalages des heures legales.
477--
478*/
479
480
481
482/* Variables contenant les informations pour conversion */
483/* Temps Legal <> TU <> Temps solaire moyen */
484
485static double TSolMOff = 0.; /* TSol.Moyen - TU (en heures) */
486static char SiteName[128]; /* Nom de site */
487
488static struct
489 {
490 char fg; /* Flag (=A ou B) Type de specification */
491 int jj[2]; /* Numero ou date du jour */
492 int mm[2]; /* Mois */
493 int Off[3]; /* Decalage = TLegal - TU */
494 } TLegInfo = {'\0',{0,0},{0,0},{0,0,0}} ;
495
496static HMS HChgH = {0,0,0.} ; /* Heure de changement d'heure */
497
498/*
499++
500 Module Temps Sideral, Universel (C)
501 Lib LibsUtil
502 include datime.h
503
504 Ce groupe de fonctions permet convertir differentes heures:
505 les temps local, le temps universel (TU), le temps legal (TLeg). Il est
506 aussi possible de calculer le temps sideral (TS).
507--
508*/
509/*
510++
511 Links Voir aussi:
512 Dates (C)
513--
514*/
515/*
516++
517 Titre T-Legal, TU
518 Conversion entre l'heure legale, le temps universel (TU) et le temps solaire
519 moyen
520--
521*/
522
523/*
524++
525SetTSolMOff(double tsmoff, char *name)
526 Definit pour un site donne, le decalage T Sol. Moyen - TU (en heures) "tmsoff"
527 et le nom du site
528PrtTSolMOff()
529 Imprime les infos definis par "SetTSolMOff()"
530--
531*/
532
533/* Nouvelle-Fonction */
534void SetTSolMOff(double tsmoff, char *name)
535
536/* Offset T Sol. Moyen - TU (en hh:mm:ss) , Nom de site name */
537{
538TSolMOff = tsmoff;
539strcpy(SiteName,name);
540return;
541}
542
543
544/* Nouvelle-Fonction */
545void PrtTSolMOff(void)
546{
547printf(" **Site : %s , T Sol.Moy.-TU %g (heures) \n",SiteName,TSolMOff);
548return;
549}
550
551/*
552++
553int SetTLegOff(char* dtz, char* dhz)
554 Initialise la structure TLegInfo. L'argument *dtz peut etre
555 sous 2 forme differentes et permet de definir 3 plages
556 de temps avec 3 decalages horaires (nb entier).
557 Les dates pivots sont les jours de changement d'heure a
558 l'heure indiquee par dhz ("hh:mm:ss"), si "dhz==NULL ou
559 chaine vide, alors changement a 0 heure.
560| 1) dtz = "A Off1 j1/m1 Off2 j2/m2 Off3"
561| jx/mx Jour/Mois - Offx : Decalage TLeg - TU
562| pour 01/01 <= jj/mm < j1/m1 -> Off1
563| j1/m1 <= jj/mm < j2/m2 -> Off2
564| j2/m2 <= jj/mm <= 31/12 -> off3
565| 2) dtz = "B off1 Js1/m1 Off2 Js2/m2 Off3"
566| Jsx/mx Numero du jour de la semaine (Js) et numero du mois
567| Js = 1 .. 7 (Lundi .. Dimanche) : 1er Jour Js du mois
568| = -1 .. -7 Dernier jour Js du mois
569| = k1 .. k7 k eme jour Js du mois
570| 3) dtz = "C off1 Js1/m1 Off2 Js2/m2 Off3"
571| Jsx/mx Numero du jour de la semaine (Js) et numero du mois avec une
572| precision d'une date butee inferieurs
573| Js = ddj .. (j=1..7 Lundi .. Dimanche) : 1er Jour j du mois
574| apres (ou egal a) la date dd/mm
575 Retour : 0 si Ok -1 Sinon
576void PrtTLegInfo(int aa)
577 Imprime les informations de decalage TLeg , TU - Annee "aa"
578int TLegOffset(JMA date, HMS heure)
579 Indique le decalage (en nombre d'heures) TLeg-TU
580--
581*/
582
583/* Nouvelle-Fonction */
584int SetTLegOff(char* dtz, char* dhz)
585
586
587{
588int is;
589
590HChgH.Heures = HChgH.Minutes = 0;
591HChgH.Secondes = 0.;
592
593if (dhz) StrgtoHMS(dhz, HChgH);
594if ( (HChgH.Heures < 0) || (HChgH.Heures > 23) )
595 { HChgH.Heures = HChgH.Minutes = 0; HChgH.Secondes = 0.; }
596
597is = sscanf(dtz,"%c %d %d/%d %d %d/%d %d", &(TLegInfo.fg), &(TLegInfo.Off[0]), &(TLegInfo.jj[0]), &(TLegInfo.mm[0]), &(TLegInfo.Off[1]), &(TLegInfo.jj[1]), &(TLegInfo.mm[1]), &(TLegInfo.Off[2]) );
598
599if ( (TLegInfo.fg != 'A') && (TLegInfo.fg != 'B')
600 && (TLegInfo.fg != 'C') ) TLegInfo.fg = '\0';
601if (is != 8) TLegInfo.fg = '\0';
602if (TLegInfo.fg != '\0') return(0);
603else { printf("SetTLegOff()/Erreur %s \n", dtz); return(-1); }
604}
605
606/* Nouvelle-Fonction */
607void PrtTLegInfo(int aa)
608
609/* Cette fonction print les infos de TLegInfo */
610{
611int i,k,j;
612char ForL[2][128];
613JMA jma;
614
615if (TLegInfo.fg == '\0') printf (" !!! TlegInfo not set or Error \n");
616
617
618HMStoStrg(HChgH, ForL[0]);
619printf(" ==== TLegInfo : Changement d'heure a %s \n", ForL[0]);
620ForL[0][0] = '\0';
621if (TLegInfo.fg == 'A')
622 {
623 printf(" ---- TLegInfo : Selection par date (Flag = A) ---- \n");
624 printf(" -> 01 Janvier - %d %s : %d heures \n",TLegInfo.jj[0], NomMo[TLegInfo.mm[0]-1], TLegInfo.Off[0]);
625 printf(" -> %d %s - %d %s : %d heures \n",TLegInfo.jj[0], NomMo[TLegInfo.mm[0]-1],TLegInfo.jj[1], NomMo[TLegInfo.mm[1]-1],TLegInfo.Off[1]);
626 printf(" -> %d %s - 31 Decembre : %d heures \n",TLegInfo.jj[1], NomMo[TLegInfo.mm[1]-1], TLegInfo.Off[2]);
627 }
628
629if (TLegInfo.fg == 'B')
630 {
631 printf(" --- TLegInfo : Selection par Jour de semaine et mois (Flag = B) --- \n");
632 for (i=0;i<2;i++) {
633 k = TLegInfo.jj[i]/10;
634 if (k < 1) k = 1;
635 j = TLegInfo.jj[i]%10;
636 if (j < 0) j = -j;
637 if (j < 1) j = 1;
638 if (j > 7) j = 7;
639 if (TLegInfo.jj[i] < 0) sprintf(ForL[i]," Dernier %s de %s (KJ=%d)", NomJo[j-1],
640 NomMo[TLegInfo.mm[i]-1], TLegInfo.jj[i]);
641 else sprintf(ForL[i]," %d eme %s de %s (KJ=%d)", k, NomJo[j-1],
642 NomMo[TLegInfo.mm[i]-1], TLegInfo.jj[i]);
643 }
644 printf(" Butees: %s - %s \n", ForL[0], ForL[1]);
645 for (i=0;i<2;i++) {
646 jma = JsmmaatoJMA(TLegInfo.jj[i], TLegInfo.mm[i], aa);
647 JMAtoStrg(jma, ForL[i]);
648 }
649 printf(" -> 01 Janvier %d - %s : %d heures \n",aa, ForL[0], TLegInfo.Off[0]);
650 printf(" -> %s - %s : %d heures \n",ForL[0], ForL[1], TLegInfo.Off[1]);
651 printf(" -> %s - 31 Decembre %d : %d heures \n",ForL[1], aa, TLegInfo.Off[2]);
652 }
653
654if (TLegInfo.fg == 'C')
655 {
656 printf(" --- TLegInfo : Selection par Jour de semaine >= dd et mois (Flag = C) --- \n");
657 for (i=0;i<2;i++) {
658 k = TLegInfo.jj[i]/10;
659 j = TLegInfo.jj[i]%10;
660 if (j < 0) j = -j;
661 if (j < 1) j = 1;
662 if (j > 7) j = 7;
663 sprintf(ForL[i],"1er %s apres le %d %s ", NomJo[j-1], k, NomMo[TLegInfo.mm[i]-1]);
664 }
665 printf(" Butees: %s - %s \n", ForL[0], ForL[1]);
666 for (i=0;i<2;i++) {
667 jma = JApmmaatoJMA(TLegInfo.jj[i], TLegInfo.mm[i], aa);
668 JMAtoStrg(jma, ForL[i]);
669 }
670 printf(" -> 01 Janvier %d - %s : %d heures \n",aa, ForL[0], TLegInfo.Off[0]);
671 printf(" -> %s - %s : %d heures \n",ForL[0], ForL[1], TLegInfo.Off[1]);
672 printf(" -> %s - 31 Decembre %d : %d heures \n",ForL[1], aa, TLegInfo.Off[2]);
673 }
674
675return;
676}
677
678
679/* Nouvelle-Fonction */
680int TLegOffset(JMA date, HMS heure)
681
682/* Cette fonction calcule l'offset TLeg - TU pour la date donnee date */
683{
684JMA jma1,jma2;
685long nbj1,nbj2,nbj;
686double decj1, decj2, decj;
687int Off;
688
689/* On recherche l'offset correspondant a la date */
690jma1.Annee = jma2.Annee = date.Annee;
691if (TLegInfo.fg == 'A')
692/* Periode defini par des dates ds les mois */
693 {
694 jma1.Mois = TLegInfo.mm[0];
695 jma1.Jour = TLegInfo.jj[0];
696 jma2.Mois = TLegInfo.mm[1];
697 jma2.Jour = TLegInfo.jj[1];
698 }
699if (TLegInfo.fg == 'B')
700/* Periodes definies par jour de semaine et mois */
701 {
702 jma1 = JsmmaatoJMA(TLegInfo.jj[0],TLegInfo.mm[0],date.Annee);
703 jma2 = JsmmaatoJMA(TLegInfo.jj[1],TLegInfo.mm[1],date.Annee);
704 }
705
706if (TLegInfo.fg == 'C')
707/* Periodes definies par jour de semaine et mois avec date inferieure */
708 {
709 jma1 = JApmmaatoJMA(TLegInfo.jj[0],TLegInfo.mm[0],date.Annee);
710 jma2 = JApmmaatoJMA(TLegInfo.jj[1],TLegInfo.mm[1],date.Annee);
711 }
712
713nbj = JMAtoJ(date);
714nbj1 = JMAtoJ(jma1);
715nbj2 = JMAtoJ(jma2);
716
717/* Les dates pivots sont les jours de changement d'heure a Heure= HChgH */
718decj = (double)nbj + HMStoH(heure)/24.;
719decj1 = (double)nbj1 + HMStoH(HChgH)/24.;
720decj2 = (double)nbj2 + HMStoH(HChgH)/24.;
721
722if ( decj < decj1 ) Off = TLegInfo.Off[0];
723else if (decj < decj2) Off = TLegInfo.Off[1];
724 else Off = TLegInfo.Off[2];
725
726/* Impression de debugging */
727/*Debug-- printf (" @@@ Debug_TLegOffset (date= %d/%d/%d) : %d H. \n",date.Jour,date.Mois,date.Annee,Off);
728printf(" @-1 %s , %d %s %d \n", NomJo[NumJour(jma1)-1], jma1.Jour, NomMo[jma1.Mois-1], jma1.Annee) ;
729printf(" @-2 %s , %d %s %d \n", NomJo[NumJour(jma2)-1], jma2.Jour, NomMo[jma2.Mois-1], jma2.Annee) ; --*/
730
731
732return (Off);
733}
734
735/*
736++
737HMS TLegtoTU(JMA date, HMS TLeg)
738 Conversion TLegal en TU pour une date donnée
739HMS TUtoTLeg(JMA date, HMS TLeg)
740 Conversion TU en TLegal pour une date donnée. L'heure légale calculée
741 peut être erronnée autour des dates de changement d'heure.
742HMS TUtoTSolM(HMS TU)
743 Conversion TU en temps solaire moyen
744--
745*/
746
747/* Nouvelle-Fonction */
748HMS TLegtoTU(JMA date, HMS hmsz)
749
750/* Cette fonction transforme le temps legal en temps universel */
751{
752HMS TU;
753int Off;
754
755Off = TLegOffset(date, hmsz);
756TU = hmsz;
757TU.Heures -= Off;
758if (TU.Heures >= 24) TU.Heures -= 24;
759if (TU.Heures < 0) TU.Heures += 24;
760return(TU);
761}
762
763
764
765/* Nouvelle-Fonction */
766HMS TUtoTLeg(JMA date, HMS hms)
767
768/* Cette fonction transforme le temps universel en temps legal */
769{
770HMS TLeg;
771int Off;
772
773Off = TLegOffset(date, hms); /* $CHECK$ */
774TLeg = hms;
775TLeg.Heures += Off;
776TLeg.Heures = TLeg.Heures%24;
777if (TLeg.Heures < 0) TLeg.Heures += 24;
778return(TLeg);
779}
780
781
782/* Nouvelle-Fonction */
783HMS TUtoTSolM(HMS TU)
784
785/* Passage TU -> Temps local */
786{
787double t;
788t = HMStoH(TU) + TSolMOff;
789return(HtoHMS(t));
790}
791
792/*
793++
794 Titre Temps Sideral
795| Jour Sideral = 86400 Sec. Sid. ( = 24 H Sid. )
796| Annee Solaire = 365 J 5H 48' 46" =~ 365.2422 J
797| Annee Solaire = 365.2422 Jours Solaire Moyen = 366.2422 Jours Sideraux
798| Jour Sol. Moyem = 24 H Sol. = 24 H Sid. * (366.2422 / 365.2422)
799| Jour Solaire Moyen = 86636.555359 Sec. Sid. = 24 H 3' 56.555359"
800| Heure Solaire Moyen = 3609.85647 Sec. Sid.
801| Sec. Sol. = 1.0027379 Sec. Sid.
802| Le 1er Janvier 1989 0H TU Il etait 6H 42' 30" GMT_Sideral
803--
804*/
805
806/*
807++
808HMS TLegtoTSid(JMA date, HMS TZ)
809 Cette fonction calcule le temps sideral a partir du temps
810 legal et de la date
811GMST_at_0h_UT(JMA date)
812 Cette fonction calcule le temps sideral moyen a greenwich a 0h UT
813--
814*/
815
816/* Nouvelle-Fonction */
817HMS TLegtoTSid(JMA date, HMS TZ)
818
819/* Cette fonction donne le temps sideral a partir du temps legal */
820/* et la date */
821{
822HMS Orgh,TU,TSid;
823JMA Orgd;
824int off;
825long lj;
826double ts,ratio;
827
828/* Le 1er Janvier 1989 0H TU Il etait 6H 42' 30" GMT_Sideral */
829StrgtoJMA("1/1/1989",Orgd);
830StrgtoHMS("6:42:30",Orgh);
831
832
833
834/* Nb de jours / Date Origine */
835lj = JMAtoJ(date) - JMAtoJ(Orgd);
836
837/* On calcule l'heure TU et on tient compte du decalage eventuel de + ou - 1 jour */
838off = TLegOffset(date, TZ);
839TU = TZ;
840TU.Heures -= off;
841if (TU.Heures < 0)
842 {
843 lj -= 1;
844 TU.Heures += 24;
845 }
846if (TU.Heures >= 24)
847 {
848 lj += 1;
849 TU.Heures -= 24;
850 }
851
852
853
854ratio = ((365.*24.) + 5. + (48. / 60.) + (46. / 3600.)) / 24.;
855ratio = (ratio+1) / ratio ;
856
857/* Calcul du decalage en heures du temps Sideral par rapport a */
858/* l'origine choisie : ts */
859
860ts = lj * (24. * (ratio - 1) );
861ts += ( TU.Heures * ratio );
862ts += ( ( TU.Minutes / 60. ) * ratio );
863ts += ( (TU.Secondes / 3600. ) * ratio );
864
865ts += HMStoH(Orgh);
866
867/* On tient compte de l'offset du temps solaire moyen */
868ts += TSolMOff;
869
870TSid = HtoHMS(ts);
871TSid.Heures = TSid.Heures % 24;
872if (TSid.Heures < 0) TSid.Heures += 24;
873
874return(TSid);
875}
876
877
878/* Nouvelle-Fonction */
879HMS GMST_at_0h_UT (JMA date)
880
881/* Cette fonction donne le temps sideral moyen a greenwich a 0h UT */
882/* CMV 5/11/93 */
883{
884HMS Orgh, TSid;
885JMA Orgd;
886long lj, ejs;
887double js, hs, hs0;
888
889/* J H ' " sont les vraies valeurs indiscutables (cf metre etalon etc..) */
890/* Annee Solaire = 365 J 5H 48' 45.2" =~ 365.2421898148 J */
891/* Annee Siderale = 365 J 6H 9' 9.8" =~ 365.2563634259 J */
892/* Le 1er Janvier 1994 0H TU Il sera 6h 41' 40.4305" GMT_Sideral */
893StrgtoJMA("1/1/1994",Orgd);
894StrgtoHMS("6:41:40.4305",Orgh);
895hs0 = HMStoH(Orgh);
896
897/* Nb de jours ecoules depuis la Date Origine */
898lj = JMAtoJ(date) - JMAtoJ(Orgd);
899/* printf("nombre de jours ecoules depuis 1/1/94 %d\n",lj); */
900
901/* Nb de jours sideraux depuis la Date Origine */
902js = (double) lj * 366.2421898148 / 365.2421898148;
903/* Nb d'heures siderales depuis Date Origine (modulo un jour) */
904ejs = (int) js;
905hs = js - (double) ejs;
906hs *= 24.;
907hs += hs0;
908
909TSid = HtoHMS(hs);
910/* printf("nombre d'heures siderales depuis la reference (modulo un jour) %d %d %f\n"
911 ,TSid.Heures,TSid.Minutes,TSid.Secondes); */
912
913return(TSid);
914}
915
916/*
917++
918HMS TUtoTSid(JMA date, HMS TU)
919 Cette fonction calcule le temps sideral GMT a partir du temps
920 universel et de la date GMT.
921int TSidtoTU(JMA date, HMS TS, HMS *TU1, HMS *TU2)
922 Cette fonction calcule les temps universels a partir du temps
923 sideral GMT et de la date GMT. Selon la valeur du TS, il peut y avoir
924 une ou deux possibilites pour le TU (return code).
925--
926*/
927
928/* Nouvelle-Fonction */
929HMS TUtoTSid(JMA date, HMS TU)
930
931/* Cette fonction donne le temps sideral GMT a partir du temps universel */
932/* et la date GMT */
933{
934HMS Orgh,TSid;
935JMA Orgd;
936long lj;
937double ts,ratio;
938
939/* Le 1er Janvier 1989 0H TU Il etait 6H 42' 30" GMT_Sideral */
940StrgtoJMA("1/1/1989",Orgd);
941StrgtoHMS("6:42:30",Orgh);
942
943/* Nb de jours / Date Origine */
944lj = JMAtoJ(date) - JMAtoJ(Orgd);
945
946ratio = ((365.*24.) + 5. + (48. / 60.) + (46. / 3600.)) / 24.;
947ratio = (ratio+1) / ratio ;
948
949/* Calcul du decalage en heures du temps Sideral par rapport a */
950/* l'origine choisie : ts */
951
952ts = lj * (24. * (ratio - 1) );
953ts += ( TU.Heures * ratio );
954ts += ( ( TU.Minutes / 60. ) * ratio );
955ts += ( (TU.Secondes / 3600. ) * ratio );
956
957ts += HMStoH(Orgh);
958
959TSid = HtoHMS(ts);
960TSid.Heures = TSid.Heures % 24;
961if (TSid.Heures < 0) TSid.Heures += 24;
962
963return(TSid);
964}
965
966/* Nouvelle-Fonction */
967int TSidtoTU(JMA date, HMS TS, HMS *TU1, HMS *TU2)
968
969/* Cette fonction donne les temps universels a partir du temps sideral GMT */
970/* et la date GMT */
971{
972int rc = 0;
973HMS Orgh,T0;
974double ratio,delt,deltt,jsecsid;
975char strd[16],strh[16];
976/* char strh1[16]; */
977
978TU1->Heures = TU2->Heures = -1;
979TU1->Minutes = TU2->Minutes = 0;
980TU1->Secondes = TU2->Secondes = 0.;
981
982ratio = ((365.*24.) + 5. + (48. / 60.) + (46. / 3600.)) / 24.;
983ratio = (ratio / (ratio+1));
984jsecsid = 86400./ratio;
985
986/* temps sideral pour la date a 0h TU */
987StrgtoHMS("00:00:00",T0);
988Orgh = TUtoTSid(date,T0);
989/* JMAtoStrg(date,strd); HMStoStrg(T0,strh); HMStoStrg(Orgh,strh1);
990printf("... date=%s tu=%s -> org_ts=%s\n",strd,strh,strh1); */
991
992/* difference de temps sideral / a 0h TU */
993delt = HMStoSec(TS) - HMStoSec(Orgh);
994/* printf("... ts=%f org_ts=%f en sec -> delt=%f (jsecsid=%g)\n"
995 ,HMStoSec(TS),HMStoSec(Orgh),delt,jsecsid); */
996
997if(fabs(delt)<1.e-10) delt=0.;
998if(delt<0.) delt += 86400.;
999if( fabs(delt-86400.)<1.e-10 ) delt = 86400. - 1.e-10;
1000if(delt<0. || delt>=86400.+1.e-10) {
1001 HMStoStrg(TS,strh);
1002 JMAtoStrg(date,strd);
1003 printf("*** BUG *** TSidtoTU_erreur: delt=%g<0. (d=%s,ts=%s) *******\n"
1004 ,delt,strd,strh);
1005 return(0);
1006}
1007
1008/* difference de temps / a 0h TU 1ere solution */
1009/* printf("... delt=%f en sec sid",delt); */
1010deltt = delt*ratio;
1011*TU1 = SectoHMS(deltt);
1012*TU2 = *TU1;
1013rc++;
1014/* HMStoStrg((*TU1),strh1);
1015printf("... deltt=%f en sec -> TU1=%s\n",deltt,strh1); */
1016
1017/* Y a t-il une seconde solution ? */
1018if(delt>=jsecsid-86400.-1.e-10) return(rc);
1019delt += 86400.;
1020deltt = delt*ratio;
1021*TU2 = SectoHMS(deltt);
1022/* HMStoStrg((*TU2),strh1);
1023printf("... deltt=%f en sec -> TU2=%s\n",deltt,strh1); */
1024rc++;
1025
1026return (rc);
1027}
1028
1029/*
1030++
1031void TSidSetupLaSilla()
1032 Fonction d'initialisation de conversion de temps sideral et legal
1033 pour la ESO-Silla "SetTSolMOff() , SetTLegOff()".
1034| Longitude = 70 deg 43.8 min ouest
1035| Latitude = 29 deg 15.4 min Sud
1036| T Sol. Moyen - TU = -4.715333 Heures
1037| TLegal-TU : -4 Heures de Mars a Octobre, -3 Heures sinon
1038| Changement le 1er dimanche >= 8/03 8/10 a midi (12:00:00)
1039--
1040*/
1041
1042/* Fonction d'initialisation de calcul de temps sideral pour la Silla */
1043void TSidSetupLaSilla()
1044{
1045SetTSolMOff((double)(-4.715333),"La Silla (Chili)");
1046if (SetTLegOff("C -3 87/3 -4 87/10 -3","12:00:00") != 0)
1047 printf(" TSidSetupLaSilla / Erreur SetTLegOff \n");
1048/* Position de l'observatoire */
1049/* SetObsPos("La Silla (Chili)","O 70:43:48","S 29:15:24",2347); */
1050return;
1051}
1052
1053
1054
1055/*
1056++
1057double ToJulianDay(JMA dateTU, HMS hmsTU);
1058 Calcul du jour Julien pour une date TU.
1059 Uniquement valable a partir du 15/10/1582 00:00:00.
1060--
1061*/
1062
1063double ToJulianDay(JMA dateTU, HMS hmsTU)
1064/* Cf Fundamental astronomie, Springer Verlag 2sd ed. cmv 4/12/98 */
1065{
1066double j_dat_0_ut;
1067long int f,g,a;
1068f = (dateTU.Mois>=3) ? dateTU.Annee: dateTU.Annee-1;
1069g = (dateTU.Mois>=3) ? dateTU.Mois: dateTU.Mois+12;
1070a = 2 - (int)((double)f/100.) + (int)((double)f/400.);
1071/* Julian date at 0h UT */
1072j_dat_0_ut = (int)(365.25*(double)f)+(int)(30.6001*(double)(g+1))+dateTU.Jour+a+1720994.5;
1073return j_dat_0_ut + HMStoH(hmsTU)/24.;
1074}
1075
1076/*
1077++
1078int FromJulianDay(double JD,JMA* dateTU, HMS* hmsTU);
1079 Calcul de la date date et l'heure TU a partir d'un jour Julien.
1080 Retourne 0 si succes.
1081--
1082*/
1083
1084int FromJulianDay(double JD,JMA* dateTU, HMS* hmsTU)
1085/* Cf Fundamental astronomie, Springer Verlag 2sd ed. cmv 4/12/98 */
1086{
1087double jd,i,f,a,x,b,c,d,e,h;
1088if(JD<0.) return 1;
1089
1090i = JD - (int)(JD);
1091if(i<0.5) jd = (int)(JD)-0.5; else jd = (int)(JD)+0.5;
1092
1093i = (int)(jd+0.5);
1094f = jd+0.5 - i;
1095if(i<2299161.0) a = i;
1096else {x = (int)((i-1867216.25)/36524.25); a = i+1.+x-(int)(x/4.);}
1097b = a+1524.;
1098c = (int)((b-122.1)/365.25);
1099d = (int)(365.25*c);
1100e = (int)((b-d)/30.6001);
1101
1102x = b-d-(int)(30.6001*e)+f;
1103dateTU->Jour = (int)(x);
1104
1105if(e<13.5) dateTU->Mois = (int)(e-1.); else dateTU->Mois = (int)(e-13.);
1106
1107if(dateTU->Mois>2.5) dateTU->Annee = (int)(c-4716.); else dateTU->Annee = (int)(c-4715.);
1108
1109hmsTU->Heures = hmsTU->Minutes = 0; hmsTU->Secondes = 0.;
1110h = (JD-ToJulianDay(*dateTU,*hmsTU)) * 24.;
1111*hmsTU = HtoHMS(h);
1112
1113return 0;
1114}
1115
1116
1117/*
1118++
1119double StrgtoDegDec(char *strg)
1120 Cette fonction renvoie la valeur decimale en heures
1121 d'un angle specifie sous forme de [-][+]dd:mm:ss.
1122--
1123*/
1124
1125double StrgtoDegDec(char *strg)
1126/* cmv 4/12/98 */
1127{
1128int dd,mm;
1129float ss;
1130char sgn;
1131double deg;
1132
1133dd = mm = 0;
1134ss = 0.;
1135sgn = *strg;
1136if (isdigit(sgn))
1137 sscanf(strg,"%d:%d:%f",&dd,&mm,&ss);
1138else
1139 sscanf(strg+1,"%d:%d:%f",&dd,&mm,&ss);
1140deg = (double)(dd) + (double)(mm)/60. + (double)(ss)/3600.;
1141if (sgn == '-') deg = (-deg);
1142return(deg);
1143}
1144
1145/*
1146++
1147char * DegDectoStrg(double deg, char *strg)
1148 Cette fonction ecrit une valeur en degre decimal sous
1149 forme de [-]dd:mm:ss.
1150--
1151*/
1152
1153char * DegDectoStrg(double deg, char *strg)
1154/* cmv 4/12/98 */
1155{
1156int dd,mm;
1157float ss;
1158char sgn;
1159
1160if (deg < (double)(0.))
1161 { deg = (-deg) ; sgn = '-' ; }
1162else sgn = '+';
1163dd = (int)deg;
1164deg = (deg-(double)(dd)) * (double)60.;
1165mm = (int)deg;
1166ss = (deg-(double)(mm)) * (double)60.;
1167if (sgn == '-')
1168 sprintf(strg,"-%d:%d:%f",dd,mm,ss);
1169else
1170 sprintf(strg,"%d:%d:%f",dd,mm,ss);
1171return(strg);
1172}
1173
1174/*
1175++
1176double EccEarth(JMA dateTU)
1177 Valeur de l'eccentricite de l'orbite terrestre
1178 a la date TU ``dateTU''.
1179--
1180*/
1181double EccEarth(JMA dateTU)
1182/* Cf Fundamental astronomie, Springer Verlag 2sd ed p477 table E10. cmv 9/12/98 */
1183{
1184double JD,T;
1185HMS hmsTU;
1186hmsTU.Heures = 12; hmsTU.Minutes = 0; hmsTU.Secondes = 0.;
1187JD = ToJulianDay(dateTU,hmsTU);
1188/* T en siecles juliens depuis 31/12/1899 a 12h TU --> JD=2415020. */
1189T = (JD-2415020.)/36525;
1190return(0.0167498 - 0.00004258*T - 0.000000137*T*T);
1191}
1192
1193/*
1194++
1195double ObliqEarth(JMA dateTU)
1196 Valeur de l'obliquite de l'orbite terrestre
1197 a la date TU ``dateTU'' (en degres decimaux).
1198--
1199*/
1200double ObliqEarth(JMA dateTU)
1201/* Cf Fundamental astronomie, Springer Verlag 2sd ed. cmv 9/12/98 */
1202/* le 1/1/1900 a 0h00 TU --> jd = 2415020.5 */
1203{
1204double jd;
1205HMS hmsTU;
1206hmsTU.Heures = hmsTU.Minutes = 0; hmsTU.Secondes = 0.;
1207jd = ToJulianDay(dateTU,hmsTU) - 2415020.5;
1208return(23.452294 - 0.00013 *jd/365.25);
1209}
1210
1211/*
1212++
1213double LongEcPerihelie(JMA dateTU)
1214 Retourne la Longitude Ecliptique du perihelie de
1215 l'orbite terrestre a la date TU ``dateTU'' (en degres decimaux).
1216--
1217*/
1218double LongEcPerihelie(JMA dateTU)
1219/* Cf Fundamental astronomie, Springer Verlag 2sd ed p477 table E10. cmv 9/12/98 */
1220{
1221double JD,T;
1222HMS hmsTU;
1223hmsTU.Heures = 12; hmsTU.Minutes = 0; hmsTU.Secondes = 0.;
1224JD = ToJulianDay(dateTU,hmsTU);
1225/* T en siecles juliens depuis 31/12/1899 a 12h TU --> JD=2415020. */
1226T = (JD-2415020.)/36525;
1227/* l = 101d 13' 07.15" + 6171.77" *T + 1.823" *T^2 */
1228return(101.218652778 + 1.71438055556*T + 0.000506388889*T*T);
1229}
1230
1231/*
1232++
1233void EquatToEclip(double a,double d,double* l,double *b,JMA dateTU);
1234 Renvoie les coordonnees ecliptiques ``l,b'' a partir de
1235 coordonnees equatoriales ``a,d'' a la date TU ``dateTU''.
1236 La date permet de corriger la variation annuelle
1237 de l'obliquite terrestre.
1238--
1239*/
1240void EquatToEclip(double a,double d,double* l,double *b,JMA dateTU)
1241/* Cf Fundamental astronomie, Springer Verlag 2sd ed p477 table E10. cmv 9/12/98 */
1242/* l=[0,360[, b=[-90,90] */
1243{
1244double e,sinb,cosb,sinl,cosl;
1245
1246e = ObliqEarth(dateTU)*DegenRad;
1247a *= DegenRad; d *= DegenRad;
1248
1249sinb = sin(d)*cos(e)-cos(d)*sin(e)*sin(a);
1250if(sinb>1.) sinb=1.; if(sinb<-1.) sinb=-1.;
1251*b = asin(sinb);
1252cosb = cos(*b);
1253
1254*l = 0.;
1255if(cosb!=0.) {
1256 sinl = (sin(d)*sin(e)+cos(d)*cos(e)*sin(a))/cosb;
1257 cosl = cos(d)*cos(a)/cosb;
1258 if(cosl>1.) cosl=1.; if(cosl<-1.) cosl=-1.;
1259 *l = acos(cosl);
1260 if(sinl<0.) *l += M_PI;
1261 if(*l>2.*M_PI) *l -= 2.*M_PI;
1262}
1263
1264*b /= DegenRad;
1265*l /= DegenRad;
1266}
Note: See TracBrowser for help on using the repository browser.