Changeset 5159 for LMDZ6/branches/Amaury_dev/libf/phylmd/rrtm/dates.F90
- Timestamp:
- Aug 2, 2024, 9:58:25 PM (7 weeks ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/phylmd/rrtm/dates.F90
r5158 r5159 1 1 subroutine dates_demo 2 2 ! -------------------------------------------------------------- 3 ! 3 4 4 ! Conseils a l'utilisateur: 5 ! 5 6 6 ! 1. VOUS COMPILEZ LES ENTIERS EN 32 BITS: 7 7 ! Utilisez alors les routines … … 17 17 ! les parametres subsequents assurant que seuls des entiers 18 18 ! representables en 32 bits y soient utilises. 19 ! 19 20 20 ! 2. VOUS COMPILEZ LES ENTIERS EN 64 BITS: 21 21 ! Vous pouvez alors utiliser toutes les routines ci-dessus … … 30 30 ! - amqhmsree_vers_dj: Conversion date gr�gorienne (en un seul r�el) > date julienne. 31 31 ! - dj_vers_amqhmsree: Conversion date julienne > date gr�gorienne (en un seul r�el). 32 ! 33 ! -------------------------------------------------------------- 34 ! 32 33 ! -------------------------------------------------------------- 34 35 35 ! D�finition des dates employ�es ci-dessous: 36 ! 36 37 37 ! Date julienne DJ: 38 38 ! Elle est compos�e d'un r�el. 39 39 ! R1: Ce r�el cro�t de 1 tous les jours, 40 40 ! et vaut 2451545.0 le 1er janvier 2000 � 12 UTC. 41 ! 41 42 42 ! Date gr�gorienne "en clair" AMQHMS: 43 43 ! Elle est compos�e de 5 entiers et d'un r�el. … … 80 80 character*200 clzue,clze,clech 81 81 character *(*) cdtit 82 ! 82 83 83 !------------------------------------------------- 84 84 ! Date de validit�. 85 85 !------------------------------------------------- 86 ! 86 87 87 zs=0. 88 88 zsssss=psssss/3600. … … 95 95 call dj_vers_amqhms(zdj,ianv,imov,iquv,ihev,imiv,zsv) ! date gr�gorienne de validit�. 96 96 if(pstati < 3600.) then 97 ! 97 98 98 !------------------------------------------------- 99 99 ! Ech�ance en minutes. 100 100 !------------------------------------------------- 101 ! 101 102 102 zech=pstati/60. ; clzue='mn' 103 103 elseif(pstati < 259200.) then 104 ! 104 105 105 !------------------------------------------------- 106 106 ! Ech�ance en heures. 107 107 !------------------------------------------------- 108 ! 108 109 109 zech=pstati/3600. ; clzue='h' 110 110 else 111 ! 111 112 112 !------------------------------------------------- 113 113 ! Ech�ance en jours. 114 114 !------------------------------------------------- 115 ! 115 116 116 zech=pstati/86400. ; clzue='j' 117 117 endif 118 ! 118 119 119 ! Affichage de l'echeance avec deux chiffres apres la virgule. 120 ! 120 121 121 write(clze,fmt='(f9.2)') zech 122 ! 122 123 123 ! Si l'echeance est voisine d'un entier a mieux que 10**-2 pres, 124 124 ! on l'affiche au format entier. 125 ! 125 126 126 if(clze(len_trim(clze)-2:len_trim(clze)) == '.00') then 127 127 clze=clze(1:len_trim(clze)-3) … … 130 130 ilze=len_trim(clze) 131 131 clech=clze(1:ilze)//clzue 132 ! 132 133 133 !------------------------------------------------- 134 134 ! Titre 3, de type 135 135 ! BASE 2000.01.15 00:00 +72H VALID 2000.01.18 15:00. 136 136 !------------------------------------------------- 137 ! 137 138 138 if(imi == 0 .and. imiv == 0) then 139 ! 139 140 140 !------------------------------------------------- 141 141 ! Les minutes de base et validit� sont nulles. 142 142 ! On ne les affiche pas. 143 143 !------------------------------------------------- 144 ! 144 145 145 write(cdtit,fmt='(a,i2,a,i2.2,a,i4.4,a,i2.2,3a,i2,a,i2.2,a,i4.4,a,i2.2,a)')& 146 146 &'BASE ',kqu,'.',kmo,'.',kan,' ',ihe,'h UTC + ',clech(1:len_trim(clech))& 147 147 &,', VALID ',iquv,'.',imov,'.',ianv,' ',ihev,'h UTC' 148 148 else 149 ! 149 150 150 !------------------------------------------------- 151 151 ! Les minutes de base ou validit� sont non nulles. 152 152 ! On les affiche. 153 153 !------------------------------------------------- 154 ! 154 155 155 write(cdtit,fmt='(a,i2,a,i2.2,a,i4.4,a,i2.2,a,i2.2,3a,i2,a,i2.2,a,i4.4,a,i2.2,a,i2.2,a)')& 156 156 &'BASE ',kqu,'.',kmo,'.',kan,' ',ihe,':',imi,' UTC + ',clech(1:len_trim(clech))& … … 207 207 character*3 cljour(0:6) 208 208 data cljour/'Dim','Lun','Mar','Mer','Jeu','Ven','Sam'/ 209 ! 209 210 210 !------------------------------------------------- 211 211 ! Date courante � la f90. 212 212 !------------------------------------------------- 213 ! 213 214 214 clgol1=' ' 215 215 clgol2=' ' 216 216 clgol3=' ' 217 217 call date_and_time(clgol1,clgol2,clgol3,idatat) 218 ! 218 219 219 !------------------------------------------------- 220 220 ! clgol1 est du type "AAAAMMQQ". 221 221 !------------------------------------------------- 222 ! 222 223 223 read(clgol1,fmt='(i4,2i2)') kaaaa,kmm,kqq 224 ! 224 225 225 !------------------------------------------------- 226 226 ! clgol2 est du type "HHMMSS.SSS". 227 227 !------------------------------------------------- 228 ! 228 229 229 read(clgol2,fmt='(2i2)') khh,kmi 230 230 read(clgol2(5:),fmt=*) zs 231 231 kss=nint(zs) 232 232 read(clgol1,fmt='(i8)') iaaaammqq 233 ! 233 234 234 !------------------------------------------------- 235 235 ! Jour de la semaine. 236 236 !------------------------------------------------- 237 ! 237 238 238 kjs=ijoursem(iaaaammqq) 239 239 cdjs=cljour(kjs) 240 ! 240 241 241 !------------------------------------------------- 242 242 ! Date totale. 243 243 !------------------------------------------------- 244 ! 244 245 245 write(cddt,fmt='(i4.4,a,2(i2.2,a),2a,i2.2,a,i2.2,a,i2.2)') & 246 246 &kaaaa,'_',kmm,'_',kqq,'_',cdjs,'_',khh,':',kmi,':',kss … … 253 253 ! ------- 254 254 ! 1999-08-17, J.M. Piriou. 255 ! 255 256 256 ! Modifications: 257 257 ! -------------- 258 ! 258 259 259 ! -------------------------------------------------------------------------- 260 260 ! En entree: … … 284 284 idate1=20000101 285 285 idate2=kaaaa*10000+kmm*100+kqq 286 ! 286 287 287 !------------------------------------------------- 288 288 ! Nombre de jours �coul�s entre la date 289 289 ! d'entr�e � 0h UTC et le 1er janvier 2000 � 0h UTC. 290 290 !------------------------------------------------- 291 ! 291 292 292 call ecartdj(idate1,idate2,iecart) 293 ! 293 294 294 !------------------------------------------------- 295 295 ! Date julienne. 296 296 !------------------------------------------------- 297 ! 297 298 298 pdj=2451545.0- 0.5 +real(iecart)+real(khh)/24. & 299 299 & +real(kmn)/1440.+ps/86400. … … 306 306 ! ------- 307 307 ! 94-10-31, J.M. Piriou. 308 ! 308 309 309 ! Modifications: 310 310 ! -------------- 311 ! 311 312 312 ! -------------------------------------------------------------------------- 313 313 ! En entree: … … 326 326 ! En sortie: 327 327 ! kdat2 date finale. 328 ! 328 329 329 ! -------------------------------------------------------------------------- 330 330 ! Exemple: call DAPLUS(19940503,1,456,ires) fournira … … 373 373 ! Cette routine est utilisable avec des entiers 32 bits ou 64 bits. 374 374 ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 375 ! 375 376 376 ! ------------------------------------------------- 377 377 ! Date d'arrivee au jour pres. … … 409 409 ! si l'ecart entre les deux dates est inferieur a 2**31 secondes, 410 410 ! soit 68 ans!... 411 ! 411 412 412 ! Au-dela de cette duree, les entiers doivent etre 64 bits. 413 413 ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ … … 429 429 INTEGER(KIND=4) :: KEC 430 430 character*(*) cd1,cd2 431 ! 431 432 432 ! ------------------------------------------------- 433 433 ! On lit les dates sur des entiers. 434 434 ! ------------------------------------------------- 435 ! 435 436 436 read(cd1,fmt='(i8,3i2)') iamq1,ih1,im1,is1 437 ! 437 438 438 ! ------------------------------------------------- 439 439 ! Calculs d'ecarts et de leur partition 440 440 ! en multiples de 86400 et sous-multiples. 441 441 ! ------------------------------------------------- 442 ! 442 443 443 isec=ih1*3600+im1*60+is1 ! nombre de secondes ecoulees depuis cd10h. 444 444 idelta=kec+isec ! nombre de secondes entre cd10h et cd2. 445 445 ireste=modulo(idelta,86400) ! nombre de secondes entre cd20h et cd2. 446 446 iecjours=(idelta-ireste)/86400 ! nombre de jours entre cd10h et cd20h. 447 ! 447 448 448 ! ------------------------------------------------- 449 449 ! Date d'arrivee au jour pres. 450 450 ! ------------------------------------------------- 451 ! 451 452 452 call daplus(iamq1,1,iecjours,iamq2) 453 ! 453 454 454 ! ------------------------------------------------- 455 455 ! Date finale a la seconde pres. 456 456 ! ------------------------------------------------- 457 ! 457 458 458 ih2=ireste/3600 459 459 ireste=ireste-3600*ih2 … … 470 470 ! ------- 471 471 ! 1999-08-17, J.M. Piriou. 472 ! 472 473 473 ! Modifications: 474 474 ! -------------- 475 ! 475 476 476 ! -------------------------------------------------------------------------- 477 477 ! En entree: … … 485 485 ! ps seconde 486 486 ! -------------------------------------------------------------------------- 487 ! 487 488 488 !------------------------------------------------- 489 489 ! Nombre de jours entre le 1er janvier 2000 � 0 UTC … … 508 508 REAL(KIND=8) :: ZFRAC 509 509 zecart=pdj-2451544.5 510 ! 510 511 511 !------------------------------------------------- 512 512 ! Nombre entier de jours. 513 513 !------------------------------------------------- 514 ! 514 515 515 zfrac=modulo(zecart, 1._8 ) 516 516 iecart=nint(zecart-zfrac) 517 ! 517 518 518 !------------------------------------------------- 519 519 ! Date gr�gorienne associ�e. 520 520 !------------------------------------------------- 521 ! 521 522 522 idate1=20000101 523 523 call daplusj(idate1,iecart,idate2) … … 526 526 kmm=mod(knouv,100) 527 527 kaaaa=knouv/100 528 ! 528 529 529 !------------------------------------------------- 530 530 ! Calcul de des heure, minute et seconde. 531 531 !------------------------------------------------- 532 ! 532 533 533 zfrac=(zecart-real(iecart))*24. 534 534 khh=int(zfrac) … … 544 544 ! ------- 545 545 ! 2002-11, J.M. Piriou. 546 ! 546 547 547 ! Modifications: 548 548 ! -------------- 549 ! 549 550 550 ! -------------------------------------------------------------------------- 551 551 ! En entree: … … 561 561 REAL(KIND=8) :: ZS 562 562 INTEGER(KIND=4) :: iaaaa,imm,iqq,ihh,imn 563 ! 563 564 564 !------------------------------------------------- 565 565 ! Conversion gr�gorien julien; cible 5 entiers et un r�el. 566 566 !------------------------------------------------- 567 ! 567 568 568 call dj_vers_amqhms(pdj,iaaaa,imm,iqq,ihh,imn,zs) 569 ! 569 570 570 !------------------------------------------------- 571 571 ! On passe de ces 5 entiers et un r�el � un seul r�el. 572 572 !------------------------------------------------- 573 ! 573 574 574 pgrer=real(iaaaa)*10000.+real(imm)*100. & 575 575 & + real(iqq)+real(ihh)/100. & … … 583 583 ! ------- 584 584 ! 2002-11, J.M. Piriou. 585 ! 585 586 586 ! Modifications: 587 587 ! -------------- 588 ! 588 589 589 ! -------------------------------------------------------------------------- 590 590 ! En entree: … … 600 600 REAL(KIND=8) :: ZS,zloc 601 601 INTEGER(KIND=4) :: iaaaa,imm,iqq,ihh,imn,iloc 602 ! 602 603 603 !------------------------------------------------- 604 604 ! On passe de cette date gr�gorienne donn�e 605 605 ! comme un seul r�el � 5 entiers et un r�el. 606 606 !------------------------------------------------- 607 ! 607 608 608 iloc=int(pgrer) 609 609 iqq=mod(iloc,100) … … 617 617 imn=mod(iloc,100) 618 618 ihh=iloc/100 619 ! 619 620 620 !------------------------------------------------- 621 621 ! Conversion gr�gorien julien; cible 5 entiers et un r�el. 622 622 !------------------------------------------------- 623 ! 623 624 624 call amqhms_vers_dj(iaaaa,imm,iqq,ihh,imn,zs,pdj) 625 625 end … … 631 631 ! ------- 632 632 ! 97-01-09, J.M. Piriou. 633 ! 633 634 634 ! Modifications: 635 635 ! -------------- 636 ! 636 637 637 ! -------------------------------------------------------------------------- 638 638 ! En entree: kopt option de precision sur les dates: … … 703 703 ! si l'ecart entre les deux dates est inferieur a 2**31 jours, 704 704 ! soit 5879489 ans!... 705 ! 705 706 706 ! Au-dela de cette duree, les entiers doivent etre 64 bits. 707 707 ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 708 ! 708 709 709 ! ------------------------------------------------- 710 710 ! Ecart entre les deux dates au jour pres. … … 742 742 ! si l'ecart entre les deux dates est inferieur a 2**31 secondes, 743 743 ! soit 68 ans!... 744 ! 744 745 745 ! Au-dela de cette duree, les entiers doivent etre 64 bits. 746 746 ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ … … 759 759 INTEGER(KIND=4) :: KECQ 760 760 character*(*) cd1,cd2 761 ! 761 762 762 ! ------------------------------------------------- 763 763 ! On lit les dates sur des entiers. 764 764 ! ------------------------------------------------- 765 ! 765 766 766 read(cd1,fmt='(i8,3i2)') iamq1,ih1,im1,is1 767 767 read(cd2,fmt='(i8,3i2)') iamq2,ih2,im2,is2 768 ! 768 769 769 ! ------------------------------------------------- 770 770 ! Ecart entre les deux dates au jour pres. 771 771 ! ------------------------------------------------- 772 ! 772 773 773 call ecartd(iamq1,iamq2,1,kecq) 774 ! 774 775 775 ! ------------------------------------------------- 776 776 ! Ecart en secondes. 777 777 ! ------------------------------------------------- 778 ! 778 779 779 kec=kecq*86400+(ih2-ih1)*3600+(im2-im1)*60+is2-is1 780 780 end … … 786 786 ! ------- 787 787 ! 92-05-27, J.M. Piriou. 788 ! 788 789 789 ! Modifications: 790 790 ! -------------- 791 ! 791 792 792 ! -------------------------------------------------------------------------- 793 793 ! En entree: kopt option de precision sur les dates: … … 837 837 INTEGER(KIND=4) :: KOPT 838 838 data idebm/0,31,59,90,120,151,181,212,243,273,304,334/ 839 ! 839 840 840 ! -------------------------------------------------------------------------- 841 841 ! ** 1. Calcul du nb de jours separant ki2 du 1er janv 1900 842 ! 842 843 843 ! * 1.1 Extraction des quantieme, mois et annee 844 844 if(kopt == 1) then … … 909 909 ! -------------------------------------------------------------------------- 910 910 ! ** 2. Calcul du nb de jours separant ii1 du 1er janv 1900 911 ! 911 912 912 ! * 2.1 Extraction des quantieme, mois et annee 913 913 ii1=19000101 … … 952 952 ! ------- 953 953 ! 92-05-27, J.M. Piriou. 954 ! 954 955 955 ! Modifications: 956 956 ! -------------- 957 ! 957 958 958 ! -------------------------------------------------------------------------- 959 959 ! En entree: kopt option de precision sur les dates: … … 1004 1004 ! -------------------------------------------------------------------------- 1005 1005 ! ** On determine la date approximative d'arrivee en annees decimales 1006 ! 1006 1007 1007 if(kopt == 1) then 1008 1008 ! Date de type AAAAMMQQ … … 1026 1026 ! -------------------------------------------------------------------------- 1027 1027 ! ** On determine la date en clair ii2p associee a la date decimale 1028 ! 1028 1029 1029 iaaaa=int(zarrdec) 1030 1030 zarrdec=12.*(zarrdec-real(iaaaa)) … … 1035 1035 ! -------------------------------------------------------------------------- 1036 1036 ! ** On calcule le nombre de jours separant 19000101 de ii2p 1037 ! 1037 1038 1038 call gregod(ii2p,1,igii2p) 1039 1039 imod=mod(kgre,iconv) … … 1042 1042 ! -------------------------------------------------------------------------- 1043 1043 ! ** On avance de iec jours par rapport a ii2p 1044 ! 1044 1045 1045 ! * L'annee est-elle bissextile? 1046 1046 ! Une annee est bissextile ssi elle est … … 1071 1071 ! -------------------------------------------------------------------------- 1072 1072 ! ** On met en forme la date finale 1073 ! 1073 1074 1074 idat=iqq+imm*100+iaaaa*10000 1075 1075 if(kopt == 2) then … … 1101 1101 ! ------- 1102 1102 ! 94-10-31, J.M. Piriou. 1103 ! 1103 1104 1104 ! Modifications: 1105 1105 ! -------------- 1106 ! 1106 1107 1107 ! -------------------------------------------------------------------------- 1108 1108 ! En entree: … … 1133 1133 ! ------- 1134 1134 ! 92-05-27, J.M. Piriou. 1135 ! 1135 1136 1136 ! Modifications: 1137 1137 ! -------------- 1138 ! 1138 1139 1139 ! -------------------------------------------------------------------------- 1140 1140
Note: See TracChangeset
for help on using the changeset viewer.