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

Last change on this file since 3002 was 2808, checked in by ansari, 20 years ago

MAJ documentation - Reza 14/6/2005

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