File indexing completed on 2018-03-02 18:40:06 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
a456aa407c Andr*0001 #include "FIZHI_OPTIONS.h"
813eb1e07a Jean*0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
17e5b05fae Jean*0019
0020
0021
0022
813eb1e07a Jean*0023
0024
0025
0026
0027
660d83f1cd Andr*0028 subroutine set_alarm (tag,datein,timein,freq)
0889f02121 Jean*0029
0030
0031
d1fef4a45f Andr*0032
0033
0889f02121 Jean*0034
0035
d1fef4a45f Andr*0036
0037
0038
0039
0040
0889f02121 Jean*0041
d1fef4a45f Andr*0042
0043 implicit none
53135ac441 Jean*0044 #include "EEPARAMS.h"
0045 #include "chronos.h"
0046
d1fef4a45f Andr*0047 character*(*) tag
660d83f1cd Andr*0048 integer freq,datein,timein
d1fef4a45f Andr*0049
53135ac441 Jean*0050
0051 INTEGER ILNBLNK
0052 EXTERNAL ILNBLNK
d1fef4a45f Andr*0053
53135ac441 Jean*0054
ed0b0d8f16 Andr*0055 integer myid
175684e43e Andr*0056 logical first,set
d1fef4a45f Andr*0057 data first /.true./
53135ac441 Jean*0058 integer n, iL
d1fef4a45f Andr*0059
813eb1e07a Jean*0060 myid = 1
d1fef4a45f Andr*0061 if(first) then
0062 ntags = 1
0063 tags(1) = tag
0064 freqs(1) = freq
660d83f1cd Andr*0065 dates(1) = datein
0066 times(1) = timein
53135ac441 Jean*0067 iL = ILNBLNK(tag)
0068 WRITE(standardMessageUnit,'(A,I8,A,I6.6,A,I10,2A)')
0069 & ' Set Alarm for: ', datein, ' ', timein,
0070 & ', with frequency: ', freq, ', and Tag: ',tag(1:iL)
d1fef4a45f Andr*0071 else
0072
0073 set = .false.
0074 do n=1,ntags
ed0b0d8f16 Andr*0075 if(tag.eq.tags(n)) then
0076 if( myid.eq.1 ) then
0077 print *, 'Warning! Alarm has already been set for Tag: ',tag
0078 print *, 'Changing Alarm Information:'
0079 print *, 'Frequency: ',freqs(n),' (Old) ',freq,' (New)'
660d83f1cd Andr*0080 print *, ' Date0: ',dates(n),' (Old) ',datein,' (New)'
0081 print *, ' Time0: ',times(n),' (Old) ',timein,' (New)'
ed0b0d8f16 Andr*0082 endif
0083 freqs(n) = freq
660d83f1cd Andr*0084 dates(n) = datein
0085 times(n) = timein
ed0b0d8f16 Andr*0086 set = .true.
0087 endif
d1fef4a45f Andr*0088 enddo
0089 if(.not.set) then
0090 ntags = ntags+1
0091 if(ntags.gt.maxtag ) then
3811d190df Andr*0092 if( myid.eq.1 ) then
d1fef4a45f Andr*0093 print *, 'Too many Alarms are Set!!'
0094 print *, 'Maximum Number of Alarms = ',maxtag
0095 endif
0096 call my_finalize
0097 call my_exit (101)
0098 endif
0099 tags(ntags) = tag
0100 freqs(ntags) = freq
660d83f1cd Andr*0101 dates(ntags) = datein
0102 times(ntags) = timein
53135ac441 Jean*0103 iL = ILNBLNK(tag)
0104 WRITE(standardMessageUnit,'(A,I8,A,I6.6,A,I10,2A)')
0105 & ' Set Alarm for: ', datein, ' ', timein,
0106 & ', with frequency: ', freq, ', and Tag: ',tag(1:iL)
d1fef4a45f Andr*0107 endif
0108 endif
0109
0110 first = .false.
0111 return
0112 end
0113
660d83f1cd Andr*0114 subroutine get_alarm (tag,datein,timein,freq,tleft)
0889f02121 Jean*0115
0116
0117
d1fef4a45f Andr*0118
0119
0120
0121
0122
0123
0124
0125
660d83f1cd Andr*0126
0127
0128
0129
d1fef4a45f Andr*0130
0889f02121 Jean*0131
d1fef4a45f Andr*0132
0133 implicit none
0134 character*(*) tag
660d83f1cd Andr*0135 integer freq,datein,timein,tleft
d1fef4a45f Andr*0136
0137 #include "chronos.h"
0138
0139 logical set,alarm
2a3ae9099b Andr*0140 external alarm
ed0b0d8f16 Andr*0141 integer myid,n,nalarm,nsecf
d1fef4a45f Andr*0142
3811d190df Andr*0143 myid = 1
d1fef4a45f Andr*0144 set = .false.
0145 do n=1,ntags
813eb1e07a Jean*0146 if (tag.eq.tags(n)) then
0147 freq = freqs(n)
0148 datein = dates(n)
0149 timein = times(n)
0150
0151 if ( alarm(tag) ) then
0152 tleft = 0
0153 else
0154 call get_time (nymd,nhms)
0155 tleft = nsecf(freq) - nalarm(freq,nymd,nhms,datein,timein )
0156 endif
d1fef4a45f Andr*0157
813eb1e07a Jean*0158 set = .true.
0159 endif
d1fef4a45f Andr*0160 enddo
0161
0162 if(.not.set) then
3811d190df Andr*0163 if( myid.eq.1 ) print *, 'Alarm has not been set for Tag: ',tag
d1fef4a45f Andr*0164 freq = 0
660d83f1cd Andr*0165 datein = 0
0166 timein = 0
d1fef4a45f Andr*0167 tleft = 0
0168 endif
0169
0170 return
0171 end
0172
813eb1e07a Jean*0173 LOGICAL FUNCTION ALARM (tag)
d1fef4a45f Andr*0174 implicit none
0175 character*(*) tag
0176 #include "chronos.h"
0177
813eb1e07a Jean*0178 integer datein,timein
0179 integer n,nalarm
0180 external nalarm
d1fef4a45f Andr*0181
660d83f1cd Andr*0182 call get_time (datein,timein)
d1fef4a45f Andr*0183
0184 alarm = .false.
0185 do n=1,ntags
813eb1e07a Jean*0186 if( tags(n).eq.tag ) then
0187 if( freqs(n).eq.0 ) then
660d83f1cd Andr*0188 alarm = (dates(n).eq.datein) .and. (times(n).eq.timein)
813eb1e07a Jean*0189 else
660d83f1cd Andr*0190 alarm = ( datein.gt.dates(n) .or.
813eb1e07a Jean*0191 & (datein.eq.dates(n) .and. timein.ge.times(n)) )
0192 & .and. nalarm( freqs(n),datein,timein,dates(n),times(n) ).eq.0
0193 endif
0194 endif
d1fef4a45f Andr*0195 enddo
0196
0197 return
0198 end
0199
813eb1e07a Jean*0200 LOGICAL FUNCTION ALARM2 (tag)
333e96bf9c Andr*0201 implicit none
0202 character*(*) tag
0203 #include "chronos.h"
0204
813eb1e07a Jean*0205 integer datein,timein
0206 integer n,nalarm2
0207 external nalarm2
333e96bf9c Andr*0208
0209 call get_time (datein,timein)
0210
0211 alarm2 = .false.
0212 do n=1,ntags
813eb1e07a Jean*0213 if( tags(n).eq.tag ) then
0214 if( freqs(n).eq.0 ) then
333e96bf9c Andr*0215 alarm2 = (dates(n).eq.datein) .and. (times(n).eq.timein)
813eb1e07a Jean*0216 else
333e96bf9c Andr*0217 alarm2 = ( datein.gt.dates(n) .or.
813eb1e07a Jean*0218 & (datein.eq.dates(n) .and. timein.ge.times(n)) )
0219 & .and. nalarm2( freqs(n),datein,timein,dates(n),times(n) ).eq.0
0220 endif
0221 endif
333e96bf9c Andr*0222 enddo
0223
0224 return
0225 end
0226
813eb1e07a Jean*0227 LOGICAL FUNCTION ALARM2NEXT (tag,deltat)
615a167388 Andr*0228 implicit none
0229 character*(*) tag
0230 _RL deltat
0231 #include "chronos.h"
0232
813eb1e07a Jean*0233 integer datein,timein,ndt
0234 integer dateminus,timeminus
0235 integer n,nalarm2
0236 external nalarm2
615a167388 Andr*0237
0238 ndt = int(deltat)
0239 call get_time (dateminus,timeminus)
0240 datein = dateminus
0241 timein = timeminus
0242 call tick(datein,timein,ndt)
0243
0244 alarm2next = .false.
0245 do n=1,ntags
813eb1e07a Jean*0246 if( tags(n).eq.tag ) then
0247 if( freqs(n).eq.0 ) then
615a167388 Andr*0248 alarm2next = (dates(n).eq.datein) .and. (times(n).eq.timein)
813eb1e07a Jean*0249 else
615a167388 Andr*0250 alarm2next = ( datein.gt.dates(n) .or.
813eb1e07a Jean*0251 & (datein.eq.dates(n) .and. timein.ge.times(n)) )
0252 & .and. nalarm2( freqs(n),datein,timein,dates(n),times(n) ).eq.0
0253 endif
0254 endif
615a167388 Andr*0255 enddo
0256
0257 return
0258 end
0259
660d83f1cd Andr*0260 subroutine set_time (datein,timein)
d1fef4a45f Andr*0261 implicit none
660d83f1cd Andr*0262 integer datein,timein
d1fef4a45f Andr*0263
0264 #include "chronos.h"
0265
ed0b0d8f16 Andr*0266 integer myid
d1fef4a45f Andr*0267
3811d190df Andr*0268 myid = 1
0269 if( myid.eq.1 ) then
d1fef4a45f Andr*0270 print *, 'Setting Clock'
660d83f1cd Andr*0271 print *, 'Date: ',datein
0272 print *, 'Time: ',timein
d1fef4a45f Andr*0273 endif
0274
660d83f1cd Andr*0275 nymd = datein
0276 nhms = timein
d1fef4a45f Andr*0277 return
0278 end
0279
660d83f1cd Andr*0280 subroutine get_time (datein,timein)
d1fef4a45f Andr*0281 implicit none
660d83f1cd Andr*0282 integer datein,timein
d1fef4a45f Andr*0283
0284 #include "chronos.h"
0285
660d83f1cd Andr*0286 datein = nymd
0287 timein = nhms
d1fef4a45f Andr*0288 return
0289 end
0290
0291 function nsecf (nhms)
0292
0293
0294
0295
0296
0297 implicit none
0298 integer nhms, nsecf
0299 nsecf = nhms/10000*3600 + mod(nhms,10000)/100*60 + mod(nhms,100)
0300 return
0301 end
0302
0303 function nhmsf (nsec)
0304
0305
0306
0307
0308
0309 implicit none
0310 integer nhmsf, nsec
0311 nhmsf = nsec/3600*10000 + mod(nsec,3600)/60*100 + mod(nsec,60)
0312 return
0313 end
0314
0315 function nsecf2 (nhhmmss,nmmdd,nymd)
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
ed0b0d8f16 Andr*0329 implicit none
0330
0331 integer nsecf2,nhhmmss,nmmdd,nymd
d1fef4a45f Andr*0332
ed0b0d8f16 Andr*0333 INTEGER NSDAY, NCYCLE
d1fef4a45f Andr*0334 PARAMETER ( NSDAY = 86400 )
0335 PARAMETER ( NCYCLE = 1461*24*3600 )
0336
ed0b0d8f16 Andr*0337 INTEGER YEAR, MONTH, DAY
d1fef4a45f Andr*0338
0889f02121 Jean*0339
0340 INTEGER MNDY(12*4)
d1fef4a45f Andr*0341 DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
53135ac441 Jean*0342 & 397,34*0 /
d1fef4a45f Andr*0343
ed0b0d8f16 Andr*0344 integer nsecf,i,nsegm,nsegd,iday,iday2,nday
0345
d1fef4a45f Andr*0346
0347
0348
0349
0350 nsecf2 = nsecf( nhhmmss )
0351
0352 if( nmmdd.eq.0 ) return
0353
0354
0355
0356
0357
ed0b0d8f16 Andr*0358 DO I=15,48
0889f02121 Jean*0359
0360 MNDY(I) = MNDY(I-12) + 365
ed0b0d8f16 Andr*0361 ENDDO
d1fef4a45f Andr*0362
0363
0364
0365
0366
0367 nsegm = nmmdd/100
0368 nsegd = mod(nmmdd,100)
0369
0370 YEAR = NYMD / 10000
0371 MONTH = MOD(NYMD,10000) / 100
0372 DAY = MOD(NYMD,100)
0373
0889f02121 Jean*0374
0375 IDAY = MNDY( MONTH +12*MOD(YEAR ,4) )
4936127039 Andr*0376 month = month + nsegm
0377 If( month.gt.12 ) then
0378 month = month - 12
0379 year = year + 1
d1fef4a45f Andr*0380 endif
0889f02121 Jean*0381
0382 IDAY2 = MNDY( MONTH +12*MOD(YEAR ,4) )
d1fef4a45f Andr*0383
4936127039 Andr*0384 nday = iday2-iday
d1fef4a45f Andr*0385 if(nday.lt.0) nday = nday + 1461
0386 nday = nday + nsegd
0387
0388 nsecf2 = nsecf2 + nday*nsday
0389
0390 return
0391 end
0392
0393 subroutine fixdate (nymd)
0394 implicit none
0395 integer nymd
0396
813eb1e07a Jean*0397
0398
d1fef4a45f Andr*0399 if (nymd .lt. 500101) then
0400 nymd = 20000000 + nymd
0401 else if (nymd .le. 991231) then
0402 nymd = 19000000 + nymd
0403 endif
0404
0405 return
0406 end
0407
0889f02121 Jean*0408 subroutine interp_time ( nymd ,nhms ,
53135ac441 Jean*0409 & nymd1,nhms1, nymd2,nhms2, fac1,fac2 )
0889f02121 Jean*0410
0411
d1fef4a45f Andr*0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0889f02121 Jean*0422
0423
0424
d1fef4a45f Andr*0425
0426
0427
0428
0429
0430
0889f02121 Jean*0431
0432
0433
d1fef4a45f Andr*0434
0435
0889f02121 Jean*0436
0437
0438
ed0b0d8f16 Andr*0439 implicit none
0440
0441 integer nhms,nymd,nhms1,nymd1,nhms2,nymd2
813eb1e07a Jean*0442 _RL fac1,fac2
0889f02121 Jean*0443
ed0b0d8f16 Andr*0444 INTEGER YEAR , MONTH , DAY , SEC
d1fef4a45f Andr*0445 INTEGER YEAR1, MONTH1, DAY1, SEC1
0446 INTEGER YEAR2, MONTH2, DAY2, SEC2
0447
660d83f1cd Andr*0448 _RL time00, time1, time2
0889f02121 Jean*0449
0450 INTEGER DAYSCY
b292841e25 Andr*0451 parameter ( dayscy = 365*4 + 1 )
d1fef4a45f Andr*0452
0889f02121 Jean*0453 INTEGER MNDY(12*4)
0454
0455 LOGICAL FIRST
0456 DATA FIRST/.TRUE./
0457
0458 DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
53135ac441 Jean*0459 & 397,34*0 /
ed0b0d8f16 Andr*0460
0461 integer i,nsecf
0889f02121 Jean*0462
0463
0464
0465
0466
ed0b0d8f16 Andr*0467 YEAR = NYMD / 10000
0468 MONTH = MOD(NYMD,10000) / 100
0469 DAY = MOD(NYMD,100)
0470 SEC = NSECF(NHMS)
0889f02121 Jean*0471
ed0b0d8f16 Andr*0472 YEAR1 = NYMD1 / 10000
0473 MONTH1 = MOD(NYMD1,10000) / 100
0474 DAY1 = MOD(NYMD1,100)
0475 SEC1 = NSECF(NHMS1)
0889f02121 Jean*0476
ed0b0d8f16 Andr*0477 YEAR2 = NYMD2 / 10000
0478 MONTH2 = MOD(NYMD2,10000) / 100
0479 DAY2 = MOD(NYMD2,100)
0480 SEC2 = NSECF(NHMS2)
0889f02121 Jean*0481
0482
0483
0484
0485
ed0b0d8f16 Andr*0486 IF(FIRST) THEN
0487 DO I=15,48
0889f02121 Jean*0488 MNDY(I) = MNDY(I-12) + 365
d1fef4a45f Andr*0489 ENDDO
ed0b0d8f16 Andr*0490 FIRST=.FALSE.
0491 ENDIF
0889f02121 Jean*0492
0493
0494
0495
0496
0497 time00 = DAY + MNDY(MONTH +12*MOD(YEAR ,4)) + float(sec )/86400.
0498 time1 = DAY1 + MNDY(MONTH1+12*MOD(YEAR1,4)) + float(sec1)/86400.
0499 time2 = DAY2 + MNDY(MONTH2+12*MOD(YEAR2,4)) + float(sec2)/86400.
d1fef4a45f Andr*0500
660d83f1cd Andr*0501 if( time00 .lt.time1 ) time00 = time00 + dayscy
d1fef4a45f Andr*0502 if( time2.lt.time1 ) time2 = time2 + dayscy
0503
660d83f1cd Andr*0504 fac1 = (time2-time00)/(time2-time1)
0505 fac2 = (time00-time1)/(time2-time1)
d1fef4a45f Andr*0506
ed0b0d8f16 Andr*0507 RETURN
0508 END
d1fef4a45f Andr*0509
0510 subroutine tick (nymd,nhms,ndt)
0511
0512
0513
0514
0515
ed0b0d8f16 Andr*0516 implicit none
0517
0518 integer nymd,nhms,ndt
0519
0520 integer nsec,nsecf,incymd,nhmsf
d1fef4a45f Andr*0521
0522 IF(NDT.NE.0) THEN
0523 NSEC = NSECF(NHMS) + NDT
0524
0525 IF (NSEC.GT.86400) THEN
0526 DO WHILE (NSEC.GT.86400)
0527 NSEC = NSEC - 86400
0528 NYMD = INCYMD (NYMD,1)
0529 ENDDO
0889f02121 Jean*0530 ENDIF
0531
d1fef4a45f Andr*0532 IF (NSEC.EQ.86400) THEN
0533 NSEC = 0
0534 NYMD = INCYMD (NYMD,1)
0889f02121 Jean*0535 ENDIF
0536
d1fef4a45f Andr*0537 IF (NSEC.LT.00000) THEN
0538 DO WHILE (NSEC.LT.0)
0539 NSEC = 86400 + NSEC
0540 NYMD = INCYMD (NYMD,-1)
0541 ENDDO
0889f02121 Jean*0542 ENDIF
0543
d1fef4a45f Andr*0544 NHMS = NHMSF (NSEC)
0889f02121 Jean*0545 ENDIF
d1fef4a45f Andr*0546
813eb1e07a Jean*0547 #ifdef FIZHI_USE_FIXED_DAY
0548 NYMD = 20040321
0549 #endif
0550
0889f02121 Jean*0551 RETURN
0552 END
d1fef4a45f Andr*0553
0554 subroutine tic_time (mymd,mhms,ndt)
0555
0556
0557
0558
0559
ed0b0d8f16 Andr*0560 implicit none
0561 #include "chronos.h"
d1fef4a45f Andr*0562
ed0b0d8f16 Andr*0563 integer mymd,mhms,ndt
0564
0565 integer nsec,nsecf,incymd,nhmsf
d1fef4a45f Andr*0566
0567 IF(NDT.NE.0) THEN
0568 NSEC = NSECF(NHMS) + NDT
0569
0570 IF (NSEC.GT.86400) THEN
0571 DO WHILE (NSEC.GT.86400)
0572 NSEC = NSEC - 86400
0573 NYMD = INCYMD (NYMD,1)
0574 ENDDO
0889f02121 Jean*0575 ENDIF
0576
d1fef4a45f Andr*0577 IF (NSEC.EQ.86400) THEN
0578 NSEC = 0
0579 NYMD = INCYMD (NYMD,1)
0889f02121 Jean*0580 ENDIF
0581
d1fef4a45f Andr*0582 IF (NSEC.LT.00000) THEN
0583 DO WHILE (NSEC.LT.0)
0584 NSEC = 86400 + NSEC
0585 NYMD = INCYMD (NYMD,-1)
0586 ENDDO
0889f02121 Jean*0587 ENDIF
0588
d1fef4a45f Andr*0589 NHMS = NHMSF (NSEC)
0889f02121 Jean*0590 ENDIF
d1fef4a45f Andr*0591
813eb1e07a Jean*0592
0593
d1fef4a45f Andr*0594 mymd = nymd
0595 mhms = nhms
0596
0889f02121 Jean*0597 RETURN
0598 END
0599
0600 FUNCTION NALARM (MHMS,NYMD,NHMS,NYMD0,NHMS0)
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
ed0b0d8f16 Andr*0613 implicit none
0614
0615 integer nalarm,MHMS,NYMD,NHMS,NYMD0,NHMS0
0616
0617 integer nsday, ncycle
0618 PARAMETER ( NSDAY = 86400 )
0619 PARAMETER ( NCYCLE = 1461*24*3600 )
0620
0621 INTEGER YEAR, MONTH, DAY, SEC, YEAR0, MONTH0, DAY0, SEC0
0622
0889f02121 Jean*0623 integer MNDY(12*4)
ed0b0d8f16 Andr*0624 DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
53135ac441 Jean*0625 & 397,34*0 /
ed0b0d8f16 Andr*0626
0627 integer i,nsecf,iday,iday0,nsec,nsec0,ntime
0628
0889f02121 Jean*0629
0630
0631
ed0b0d8f16 Andr*0632
0633 DO I=15,48
0889f02121 Jean*0634 MNDY(I) = MNDY(I-12) + 365
ed0b0d8f16 Andr*0635 ENDDO
0636
0889f02121 Jean*0637
0638
0639
ed0b0d8f16 Andr*0640
0641 YEAR = NYMD / 10000
0642 MONTH = MOD(NYMD,10000) / 100
0643 DAY = MOD(NYMD,100)
0644 SEC = NSECF(NHMS)
0645
0646 YEAR0 = NYMD0 / 10000
0647 MONTH0 = MOD(NYMD0,10000) / 100
0648 DAY0 = MOD(NYMD0,100)
0649 SEC0 = NSECF(NHMS0)
0650
0889f02121 Jean*0651
0652
0653
0654
0655 IDAY = (DAY -1) + MNDY( MONTH +12*MOD(YEAR ,4) )
0656 IDAY0 = (DAY0-1) + MNDY( MONTH0+12*MOD(YEAR0,4) )
0657
0658 NSEC = IDAY *NSDAY + SEC
0659 NSEC0 = IDAY0*NSDAY + SEC0
0660
0661 NTIME = NSEC-NSEC0
0662 IF (NTIME.LT.0 ) NTIME = NTIME + NCYCLE
0663 NALARM = NTIME
0664 IF ( MHMS.NE.0 ) NALARM = MOD( NALARM,NSECF(MHMS) )
0665
0666 RETURN
0667 END
0668
0669 FUNCTION NALARM2(MHMS,NYMD,NHMS,NYMD0,NHMS0)
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
333e96bf9c Andr*0682 implicit none
0683
0684 integer nalarm2,MHMS,NYMD,NHMS,NYMD0,NHMS0
0685
0686 integer nsday, ncycle
0687 PARAMETER ( NSDAY = 86400 )
0688 PARAMETER ( NCYCLE = 1461*24*3600 )
0689
0690 INTEGER YEAR, MONTH, DAY, SEC, YEAR0, MONTH0, DAY0, SEC0
0691
0889f02121 Jean*0692 integer MNDY(12*4)
333e96bf9c Andr*0693 DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
53135ac441 Jean*0694 & 397,34*0 /
ff2bdf39c9 Andr*0695 INTEGER NDPM(12)
0696 DATA NDPM /31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/
333e96bf9c Andr*0697
813eb1e07a Jean*0698 integer i,nsecf,iday,iday0,nsec,nsec0,ntime
333e96bf9c Andr*0699 integer NHMMSS,NMMDD
ff2bdf39c9 Andr*0700 integer iloop
0701 integer testnymd,testnhms,testndpm
333e96bf9c Andr*0702
0889f02121 Jean*0703
0704
0705
333e96bf9c Andr*0706
0707 DO I=15,48
0889f02121 Jean*0708 MNDY(I) = MNDY(I-12) + 365
333e96bf9c Andr*0709 ENDDO
0710
0889f02121 Jean*0711
0712
0713
333e96bf9c Andr*0714
0715 YEAR = NYMD / 10000
0716 MONTH = MOD(NYMD,10000) / 100
0717 DAY = MOD(NYMD,100)
0718 SEC = NSECF(NHMS)
0719
0720 YEAR0 = NYMD0 / 10000
0721 MONTH0 = MOD(NYMD0,10000) / 100
0722 DAY0 = MOD(NYMD0,100)
0723 SEC0 = NSECF(NHMS0)
0724
0889f02121 Jean*0725
0726
0727
0728
0729 IDAY = (DAY -1) + MNDY( MONTH +12*MOD(YEAR ,4) )
0730 IDAY0 = (DAY0-1) + MNDY( MONTH0+12*MOD(YEAR0,4) )
0731
0732 NSEC = IDAY *NSDAY + SEC
0733 NSEC0 = IDAY0*NSDAY + SEC0
0734
0735 NTIME = NSEC-NSEC0
ff2bdf39c9 Andr*0736 IF(NTIME.LT.0) NTIME = NTIME + NCYCLE
0889f02121 Jean*0737 NALARM2 = NTIME
c607322566 Andr*0738 IF(MHMS.NE.0)NALARM2 = MOD( NALARM2,NSECF(MHMS) )
0739 IF(MHMS.GE.1000000) THEN
ff2bdf39c9 Andr*0740 testnymd=nymd0
0741 testnhms=nhms0
333e96bf9c Andr*0742 NMMDD = MHMS / 1000000
0743 NHMMSS = MOD(MHMS,1000000)
ff2bdf39c9 Andr*0744 do iloop=1,100000
0745 testnymd=testnymd + nmmdd
0746 testnhms=testnhms + nhmmss
0747 year0=testnymd/10000
0748 month0=mod(testnymd,10000)/100
0749 day0 = mod(testnymd,100)
0750 testndpm = ndpm(month0)
0751 if( month0.eq.2 .and. mod(year0,4).eq.0) testndpm = 29
0752 if(testnhms.ge.240000) then
0753 testnhms = testnhms-240000
0754 testnymd = testnymd + 1
0755 day0 = day0 + 1
0756 endif
0757 if(day0.gt.testndpm) then
0758 testnymd = testnymd - testndpm
0759 testnymd = testnymd + 100
0760 day0 = day0 - testndpm
0761 month0 = month0 + 1
0762 endif
0763 if(month0.gt.12) then
0764 month0 = month0 - 12
0765 year0 = year0 + 1
a7b78cc42e Andr*0766 testnymd = testnymd + 10000 - 1200
ff2bdf39c9 Andr*0767 endif
0768 sec0 = nsecf(testnhms)
0889f02121 Jean*0769 iday0 = (day0-1) + MNDY(month0+12*mod(year0,4) )
ff2bdf39c9 Andr*0770 nsec0 = iday0 *nsday + sec0
0889f02121 Jean*0771 if( (testnymd.gt.nymd) .or.
53135ac441 Jean*0772 & (testnymd.eq.testnymd) .and. (testnhms.gt.nhms) )
0773 & go to 200
ff2bdf39c9 Andr*0774 nalarm2 = nsec-nsec0
0775 enddo
0776 200 continue
333e96bf9c Andr*0777 ENDIF
0889f02121 Jean*0778
0779 RETURN
0780 END
0781
0782 FUNCTION INCYMD (NYMD,M)
0783
0784
0785
0786
b292841e25 Andr*0787
0889f02121 Jean*0788
0789
0790
0791
ed0b0d8f16 Andr*0792 implicit none
0793 integer incymd,nymd,m
0889f02121 Jean*0794
ed0b0d8f16 Andr*0795 integer ny,nm,nd,ny00,modymd
0796
0797 INTEGER NDPM(12)
0798 DATA NDPM /31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/
0799 LOGICAL LEAP
0800 DATA NY00 /1900 /
0801 LEAP(NY) = MOD(NY,4).EQ.0 .AND. (NY.NE.0 .OR. MOD(NY00,400).EQ.0)
0889f02121 Jean*0802
0803
0804
ed0b0d8f16 Andr*0805 NY = NYMD / 10000
0806 NM = MOD(NYMD,10000) / 100
0807 ND = MOD(NYMD,100) + M
0889f02121 Jean*0808
ed0b0d8f16 Andr*0809 IF (ND.EQ.0) THEN
0810 NM = NM - 1
0811 IF (NM.EQ.0) THEN
0812 NM = 12
0813 NY = NY - 1
0814 ENDIF
0815 ND = NDPM(NM)
0816 IF (NM.EQ.2 .AND. LEAP(NY)) ND = 29
0817 ENDIF
0889f02121 Jean*0818
ed0b0d8f16 Andr*0819 IF (ND.EQ.29 .AND. NM.EQ.2 .AND. LEAP(NY)) GO TO 20
0820
0821 IF (ND.GT.NDPM(NM)) THEN
0822 ND = 1
0823 NM = NM + 1
0824 IF (NM.GT.12) THEN
0825 NM = 1
0826 NY = NY + 1
0827 ENDIF
0828 ENDIF
0889f02121 Jean*0829
ed0b0d8f16 Andr*0830 20 CONTINUE
0831 INCYMD = NY*10000 + NM*100 + ND
0832
0833 RETURN
0889f02121 Jean*0834
0835
0836
0837
0838
ed0b0d8f16 Andr*0839 ENTRY MODYMD (NYMD)
d1fef4a45f Andr*0840
ed0b0d8f16 Andr*0841 NY = NYMD / 10000
0842 NM = MOD(NYMD,10000) / 100
0843 ND = MOD(NYMD,100)
0889f02121 Jean*0844
ed0b0d8f16 Andr*0845 40 CONTINUE
0846 IF (NM.LE.1) GO TO 60
0847 NM = NM - 1
0848 ND = ND + NDPM(NM)
0849 IF (NM.EQ.2 .AND. LEAP(NY)) ND = ND + 1
0850 GO TO 40
0889f02121 Jean*0851
ed0b0d8f16 Andr*0852 60 CONTINUE
0853 MODYMD = ND
d1fef4a45f Andr*0854
ed0b0d8f16 Andr*0855 RETURN
0856 END
9bc7f6e71e Andr*0857
0858 SUBROUTINE ASTRO ( NYMD,NHMS,ALAT,ALON,IRUN,COSZ,RA )
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886 implicit none
0887
813eb1e07a Jean*0888
0889
9bc7f6e71e Andr*0890 integer nymd, nhms, irun
b292841e25 Andr*0891 _RL getcon, cosz(irun), alat(irun), alon(irun), ra
9bc7f6e71e Andr*0892
813eb1e07a Jean*0893
0894
9bc7f6e71e Andr*0895 integer year, day, sec, month, iday, idayp1
0896 integer dayscy
ed0b0d8f16 Andr*0897 integer i,nsecf,k,km,kp
9bc7f6e71e Andr*0898
a20b61c7ed Andr*0899 _RL hc
0900 _RL pi, zero, one, two, six, dg2rd, yrlen, eqnx, ob, ecc, per
0901 _RL daylen, fac, thm, thp, thnow, zs, zc, sj, cj
9bc7f6e71e Andr*0902
17e5b05fae Jean*0903 parameter ( zero = 0.0 )
9bc7f6e71e Andr*0904 parameter ( one = 1.0 )
0905 parameter ( two = 2.0 )
0906 parameter ( six = 6.0 )
b292841e25 Andr*0907 parameter ( dayscy = 365*4 + 1 )
9bc7f6e71e Andr*0908
0889f02121 Jean*0909 _RL TH(DAYSCY),T0,T1,T2,T3,T4,FUN,Y
0910 INTEGER MNDY(12*4)
9bc7f6e71e Andr*0911
0912 LOGICAL FIRST
0913 DATA FIRST/.TRUE./
0914 SAVE
0915
0916 DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
53135ac441 Jean*0917 & 397,34*0 /
9bc7f6e71e Andr*0918
b292841e25 Andr*0919 FUN(Y,PI,ECC,YRLEN,PER) = (TWO*PI/((ONE-ECC**2)**1.5))*(ONE/YRLEN)
53135ac441 Jean*0920 & * (ONE - ECC*COS(Y-PER)) ** 2
9bc7f6e71e Andr*0921
0922
b292841e25 Andr*0923
0924
0925 pi = getcon('PI')
0926 dg2rd = getcon('DEG2RAD')
0927 yrlen = getcon('YRLEN')
0928 ob = getcon('OBLDEG') * dg2rd
0929 daylen = getcon('SDAY')
0930 eqnx = getcon('VERNAL EQUINOX')
0931 ecc = getcon('ECCENTRICITY')
0932 per = getcon('PERIHELION') * dg2rd
0933
0934
9bc7f6e71e Andr*0935
0936
0937
0938 YEAR = NYMD / 10000
0939 MONTH = MOD(NYMD,10000) / 100
0940 DAY = MOD(NYMD,100)
0941 SEC = NSECF(NHMS)
0942
0943
0944
0945
0946
0947 IF(FIRST) THEN
0948 DO 100 I=15,48
0889f02121 Jean*0949 MNDY(I) = MNDY(I-12) + 365
9bc7f6e71e Andr*0950 100 CONTINUE
0951
0952 KM = INT(EQNX) + 1
0953 FAC = KM-EQNX
0954 T0 = ZERO
b292841e25 Andr*0955 T1 = FUN(T0,PI,ECC,YRLEN,PER )*FAC
0956 T2 = FUN(ZERO+T1/TWO,PI,ECC,YRLEN,PER)*FAC
0957 T3 = FUN(ZERO+T2/TWO,PI,ECC,YRLEN,PER)*FAC
0958 T4 = FUN(ZERO+T3,PI,ECC,YRLEN,PER )*FAC
9bc7f6e71e Andr*0959 TH(KM) = (T1 + TWO*(T2 + T3) + T4) / SIX
0960
0961 DO 200 K=2,DAYSCY
b292841e25 Andr*0962 T1 = FUN(TH(KM),PI,ECC,YRLEN,PER )
0963 T2 = FUN(TH(KM)+T1/TWO,PI,ECC,YRLEN,PER)
0964 T3 = FUN(TH(KM)+T2/TWO,PI,ECC,YRLEN,PER)
0965 T4 = FUN(TH(KM)+T3,PI,ECC,YRLEN,PER )
9bc7f6e71e Andr*0966 KP = MOD(KM,DAYSCY) + 1
0967 TH(KP) = TH(KM) + (T1 + TWO*(T2 + T3) + T4) / SIX
0968 KM = KP
0969 200 CONTINUE
0970
0971 FIRST=.FALSE.
0972 ENDIF
0973
0974
0975
0976
0977
0889f02121 Jean*0978 IDAY = DAY + MNDY(MONTH+12*MOD(YEAR,4) )
9bc7f6e71e Andr*0979 IDAYP1 = MOD( IDAY,DAYSCY) + 1
0980 THM = MOD( TH(IDAY) ,TWO*PI)
0981 THP = MOD( TH(IDAYP1),TWO*PI)
0982
0983 IF(THP.LT.THM) THP = THP + TWO*PI
0984 FAC = FLOAT(SEC)/DAYLEN
0985 THNOW = THM*(ONE-FAC) + THP*FAC
0986
0987 ZS = SIN(THNOW) * SIN(OB)
0988 ZC = SQRT(ONE-ZS*ZS)
0989 RA = (1.-ECC*ECC) / ( ONE-ECC*COS(THNOW-PER) )
0990
0991
0992
0993
0994
0995 FAC = FAC*TWO*PI + PI
0996 DO I = 1,IRUN
0997
0998 HC = COS( FAC+ALON(I)*DG2RD )
0999 SJ = SIN(ALAT(I)*DG2RD)
1000 CJ = SQRT(ONE-SJ*SJ)
1001
1002 COSZ(I) = SJ*ZS + CJ*ZC*HC
1003 IF( COSZ(I).LT.ZERO ) COSZ(I) = ZERO
1004 ENDDO
1005
1006 RETURN
1007 END
63416ca6a5 Andr*1008
1009 subroutine time_bound(nymd,nhms,nymd1,nhms1,nymd2,nhms2,imnm,imnp)
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027 implicit none
1028 integer nymd,nhms, nymd1,nhms1, nymd2,nhms2
1029
813eb1e07a Jean*1030
1031
63416ca6a5 Andr*1032 integer month,day,nyear,midmon1,midmon,midmon2
1033 integer imnm,imnp
1034 INTEGER DAYS(14), daysm, days0, daysp
1035 DATA DAYS /31,31,28,31,30,31,30,31,31,30,31,30,31,31/
1036
1037 integer nmonf,ndayf,n
1038 NMONF(N) = MOD(N,10000)/100
1039 NDAYF(N) = MOD(N,100)
1040
1041
1042
1043
1044
1045 MONTH = NMONF(NYMD)
1046 DAY = NDAYF(NYMD)
1047
1048 daysm = days(month )
1049 days0 = days(month+1)
1050 daysp = days(month+2)
1051
813eb1e07a Jean*1052
1053
63416ca6a5 Andr*1054 nyear = nymd/10000
1055 if( 4*(nyear/4).eq.nyear ) then
1056 if( month.eq.3 ) daysm = daysm+1
1057 if( month.eq.2 ) days0 = days0+1
1058 if( month.eq.1 ) daysp = daysp+1
1059 endif
1060
1061 MIDMON1 = daysm/2 + 1
1062 MIDMON = days0/2 + 1
1063 MIDMON2 = daysp/2 + 1
1064
1065
1066 IF(DAY.LT.MIDMON) THEN
1067 imnm = month
1068 imnp = month + 1
1069 nymd2 = (nymd/10000)*10000 + month*100 + midmon
1070 nhms2 = 000000
1071 nymd1 = nymd2
1072 nhms1 = nhms2
1073 call tick ( nymd1,nhms1, -midmon *86400 )
1074 call tick ( nymd1,nhms1,-(daysm-midmon1)*86400 )
1075 ELSE
1076 IMNM = MONTH + 1
1077 IMNP = MONTH + 2
1078 nymd1 = (nymd/10000)*10000 + month*100 + midmon
1079 nhms1 = 000000
1080 nymd2 = nymd1
1081 nhms2 = nhms1
1082 call tick ( nymd2,nhms2,(days0-midmon)*86400 )
1083 call tick ( nymd2,nhms2, midmon2*86400 )
1084 ENDIF
1085
813eb1e07a Jean*1086
1087
1088
1089
1090
1091
63416ca6a5 Andr*1092
1093 imnm = imnm-1
1094 imnp = imnp-1
1095
1096 if( imnm.eq.0 ) imnm = 12
1097 if( imnp.eq.0 ) imnp = 12
1098 if( imnm.eq.13 ) imnm = 1
1099 if( imnp.eq.13 ) imnp = 1
1100
1101 return
1102 end
0889f02121 Jean*1103 subroutine time2freq2(MMDD,NYMD,NHMS,timeleft)
1104
1105
1c45378270 Andr*1106
6baaecc600 Andr*1107
0889f02121 Jean*1108
1109
1110
1111
1112
1c45378270 Andr*1113
0889f02121 Jean*1114
1c45378270 Andr*1115
0889f02121 Jean*1116
1117
1c45378270 Andr*1118 implicit none
1119
81042e38bf Andr*1120 integer mmdd,nymd,nhms,timeleft,daysleft
1c45378270 Andr*1121
1122 integer nsday
a4c347b7e5 Andr*1123 PARAMETER ( NSDAY = 86400 )
0889f02121 Jean*1124 integer year, month, day, sec
813eb1e07a Jean*1125 integer yearnext, monthnext, daynext
1126 integer i,nsecf,iday,idaynext,nsec
1c45378270 Andr*1127 integer testnymd
0889f02121 Jean*1128 integer MNDY(12*4)
1c45378270 Andr*1129 DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
53135ac441 Jean*1130 & 397,34*0 /
1c45378270 Andr*1131
0889f02121 Jean*1132
1133
1134
1c45378270 Andr*1135 DO I=15,48
0889f02121 Jean*1136 MNDY(I) = MNDY(I-12) + 365
1c45378270 Andr*1137 ENDDO
0889f02121 Jean*1138
1139
1140
1c45378270 Andr*1141 YEAR = NYMD / 10000
1142 MONTH = MOD(NYMD,10000) / 100
1143 DAY = MOD(NYMD,100)
1144 SEC = NSECF(NHMS)
0889f02121 Jean*1145
1146
1147
1148 IDAY = (DAY -1) + MNDY( MONTH +12*MOD(YEAR ,4) )
1149 NSEC = IDAY *NSDAY + SEC
1150
1c45378270 Andr*1151 testnymd=nymd + mmdd
1152 yearnext=testnymd/10000
1153 monthnext=mod(testnymd,10000)/100
1154 daynext = 1
1155 if(monthnext.gt.12) then
1156 monthnext = monthnext - 12
1157 yearnext = yearnext + 1
1158 endif
1159 testnymd = yearnext*10000 + monthnext*100 + daynext
0889f02121 Jean*1160 idaynext = MNDY(monthnext+12*mod(yearnext,4) )
81042e38bf Andr*1161 daysleft = idaynext - iday
1162 if(daysleft.lt.0) daysleft = daysleft + 1461
1c45378270 Andr*1163
6baaecc600 Andr*1164 timeleft = daysleft * nsday - sec
0889f02121 Jean*1165
1166 RETURN
1167 END