Changeset 232
- Timestamp:
- Jun 20, 2001, 3:53:15 PM (23 years ago)
- Location:
- LMDZ.3.3/branches/rel-LF/libf/dyn3d
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ.3.3/branches/rel-LF/libf/dyn3d/calfis.F
r177 r232 319 319 c 320 320 DO l=1,llm 321 pvervel(1,l)=pw(1,1,l) /apoln321 pvervel(1,l)=pw(1,1,l) * g /apoln 322 322 ig0=2 323 323 DO j=2,jjm 324 324 DO i = 1, iim 325 pvervel(ig0,l) = pw(i,j,l) * unsaire(i,j)325 pvervel(ig0,l) = pw(i,j,l) * g * unsaire(i,j) 326 326 ig0 = ig0 + 1 327 327 ENDDO 328 328 ENDDO 329 pvervel(ig0,l)=pw(1,jjp1,l) /apols329 pvervel(ig0,l)=pw(1,jjp1,l) * g /apols 330 330 ENDDO 331 331 -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/comvert.h
r2 r232 3 3 4 4 COMMON/comvert/ap(llm+1),bp(llm+1),presnivs(llm),dpres(llm) , 5 , pa,preff,nivsigs(llm),nivsig(llm p1)5 , pa,preff,nivsigs(llm),nivsig(llm+1) 6 6 7 7 REAL ap,bp,presnivs,dpres,pa,preff,nivsigs,nivsig -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/create_limit.F
r177 r232 305 305 ENDIF 306 306 END DO 307 308 307 c 309 308 c … … 338 337 STOP 339 338 ENDIF 339 #ifdef NC_DOUBLE 340 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlon) 341 #else 340 342 ierr = NF_GET_VAR_REAL(ncid,dimid,dlon) 343 #endif 341 344 if (ierr.ne.0) then 342 345 print *, NF_STRERROR(ierr) … … 354 357 STOP 355 358 ENDIF 359 #ifdef NC_DOUBLE 360 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlat) 361 #else 356 362 ierr = NF_GET_VAR_REAL(ncid,dimid,dlat) 363 #endif 357 364 if (ierr.ne.0) then 358 365 print *, NF_STRERROR(ierr) … … 370 377 STOP 371 378 ENDIF 379 #ifdef NC_DOUBLE 380 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,timecoord) 381 #else 372 382 ierr = NF_GET_VAR_REAL(ncid,dimid,timecoord) 383 #endif 373 384 if (ierr.ne.0) then 374 385 print *, NF_STRERROR(ierr) … … 387 398 PRINT*,'Lecture temporelle et int. horizontale ',l,timecoord(l) 388 399 print*,dimfirst,dimlast 400 #ifdef NC_DOUBLE 401 ierr = NF_GET_VARA_DOUBLE(ncid,varid,dimfirst,dimlast,champ) 402 #else 389 403 ierr = NF_GET_VARA_REAL(ncid,varid,dimfirst,dimlast,champ) 404 #endif 390 405 if (ierr.ne.0) then 391 406 print *, NF_STRERROR(ierr) … … 471 486 STOP 472 487 ENDIF 488 #ifdef NC_DOUBLE 489 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlon) 490 #else 473 491 ierr = NF_GET_VAR_REAL(ncid,dimid,dlon) 492 #endif 474 493 if (ierr.ne.0) then 475 494 print *, NF_STRERROR(ierr) … … 487 506 STOP 488 507 ENDIF 508 #ifdef NC_DOUBLE 509 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlat) 510 #else 489 511 ierr = NF_GET_VAR_REAL(ncid,dimid,dlat) 512 #endif 490 513 if (ierr.ne.0) then 491 514 print *, NF_STRERROR(ierr) … … 503 526 STOP 504 527 ENDIF 528 #ifdef NC_DOUBLE 529 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,timecoord) 530 #else 505 531 ierr = NF_GET_VAR_REAL(ncid,dimid,timecoord) 532 #endif 506 533 if (ierr.ne.0) then 507 534 print *, NF_STRERROR(ierr) … … 519 546 c 520 547 PRINT*,'Lecture temporelle et int. horizontale ',l,timecoord(l) 548 #ifdef NC_DOUBLE 549 ierr = NF_GET_VARA_DOUBLE(ncid,varid,dimfirst,dimlast,champ) 550 #else 521 551 ierr = NF_GET_VARA_REAL(ncid,varid,dimfirst,dimlast,champ) 552 #endif 522 553 if (ierr.ne.0) then 523 554 print *, NF_STRERROR(ierr) … … 698 729 STOP 699 730 ENDIF 731 #ifdef NC_DOUBLE 732 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlon) 733 #else 700 734 ierr = NF_GET_VAR_REAL(ncid,dimid,dlon) 735 #endif 736 701 737 if (ierr.ne.0) then 702 738 print *, NF_STRERROR(ierr) … … 714 750 STOP 715 751 ENDIF 752 #ifdef NC_DOUBLE 753 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlat) 754 #else 716 755 ierr = NF_GET_VAR_REAL(ncid,dimid,dlat) 756 #endif 717 757 if (ierr.ne.0) then 718 758 print *, NF_STRERROR(ierr) … … 730 770 STOP 731 771 ENDIF 772 #ifdef NC_DOUBLE 773 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,timecoord) 774 #else 732 775 ierr = NF_GET_VAR_REAL(ncid,dimid,timecoord) 776 #endif 733 777 if (ierr.ne.0) then 734 778 print *, NF_STRERROR(ierr) … … 746 790 c 747 791 PRINT*,'Lecture temporelle et int. horizontale ',l,timecoord(l) 792 #ifdef NC_DOUBLE 793 ierr = NF_GET_VARA_DOUBLE(ncid,varid,dimfirst,dimlast,champ) 794 #else 748 795 ierr = NF_GET_VARA_REAL(ncid,varid,dimfirst,dimlast,champ) 796 #endif 749 797 if (ierr.ne.0) then 750 798 print *, NF_STRERROR(ierr) … … 825 873 STOP 826 874 ENDIF 875 #ifdef NC_DOUBLE 876 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlon) 877 #else 827 878 ierr = NF_GET_VAR_REAL(ncid,dimid,dlon) 879 #endif 828 880 if (ierr.ne.0) then 829 881 print *, NF_STRERROR(ierr) … … 841 893 STOP 842 894 ENDIF 895 #ifdef NC_DOUBLE 896 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,dlat) 897 #else 843 898 ierr = NF_GET_VAR_REAL(ncid,dimid,dlat) 899 #endif 844 900 if (ierr.ne.0) then 845 901 print *, NF_STRERROR(ierr) … … 857 913 STOP 858 914 ENDIF 915 #ifdef NC_DOUBLE 916 ierr = NF_GET_VAR_DOUBLE(ncid,dimid,timecoord) 917 #else 859 918 ierr = NF_GET_VAR_REAL(ncid,dimid,timecoord) 919 #endif 860 920 if (ierr.ne.0) then 861 921 print *, NF_STRERROR(ierr) … … 873 933 c 874 934 PRINT*,'Lecture temporelle et int. horizontale ',l,timecoord(l) 935 #ifdef NC_DOUBLE 936 ierr = NF_GET_VARA_DOUBLE(ncid,varid,dimfirst,dimlast,champ) 937 #else 875 938 ierr = NF_GET_VARA_REAL(ncid,varid,dimfirst,dimlast,champ) 939 #endif 876 940 if (ierr.ne.0) then 877 941 print *, NF_STRERROR(ierr) -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/defrun_new.F
r177 r232 1 c 2 c $Header$ 3 c 1 4 SUBROUTINE defrun_new( tapedef, etatinit, clesphy0 ) 2 5 c … … 36 39 INTEGER tapeout 37 40 REAL clonn,clatt,grossismxx,grossismyy 38 REAL dzoomxx,dzoomyy 41 REAL dzoomxx,dzoomyy,tauxx,tauyy 39 42 LOGICAL fxyhypbb, ysinuss 40 43 INTEGER i … … 258 261 WRITE(tapeout,*) clonn 259 262 IF( ABS(clon - clonn).GE. 0.001 ) THEN 260 PRINT *,' La valeur de clon passee par run.def est differente de261 * celle lue sur le fichier start '263 WRITE(tapeout,*) ' La valeur de clon passee par run.def est diffe 264 *rente de celle lue sur le fichier start ' 262 265 STOP 263 266 ENDIF 264 c265 267 c 266 268 READ (tapedef,9001) ch1,ch4 … … 270 272 271 273 IF( ABS(clat - clatt).GE. 0.001 ) THEN 272 PRINT *,' La valeur de clat passee par run.def est differente de273 * celle lue sur le fichier start '274 WRITE(tapeout,*) ' La valeur de clat passee par run.def est diffe 275 *rente de celle lue sur le fichier start ' 274 276 STOP 275 277 ENDIF … … 281 283 282 284 IF( ABS(grossismx - grossismxx).GE. 0.001 ) THEN 283 PRINT *,' La valeur de grossismx passee par run.def est differente284 *de celle lue sur le fichier start '285 WRITE(tapeout,*) ' La valeur de grossismx passee par run.def est 286 , differente de celle lue sur le fichier start ' 285 287 STOP 286 288 ENDIF … … 292 294 293 295 IF( ABS(grossismy - grossismyy).GE. 0.001 ) THEN 294 PRINT *,' La valeur de grossismy passee par run.def est differen295 *te de celle lue sur le fichier start '296 WRITE(tapeout,*) ' La valeur de grossismy passee par run.def est 297 , differente de celle lue sur le fichier start ' 296 298 STOP 297 299 ENDIF 298 300 299 301 IF( grossismx.LT.1. ) THEN 300 PRINT *,' *** ATTENTION !! grossismx < 1 . *** '302 WRITE(tapeout,*) ' *** ATTENTION !! grossismx < 1 . *** ' 301 303 STOP 302 304 ELSE … … 306 308 307 309 IF( grossismy.LT.1. ) THEN 308 PRINT *,' *** ATTENTION !! grossismy < 1 . *** '310 WRITE(tapeout,*) ' *** ATTENTION !! grossismy < 1 . *** ' 309 311 STOP 310 312 ELSE … … 312 314 ENDIF 313 315 314 PRINT *,' alphax alphay defrun ',alphax,alphay315 316 c 316 317 c alphax et alphay sont les anciennes formulat. des grossissements … … 324 325 IF( .NOT.fxyhypb ) THEN 325 326 IF( fxyhypbb ) THEN 326 PRINT *,' ******** PBS DANS DEFRUN ******** '327 PRINT *,' *** fxyhypb lu sur le fichier start est F ',328 * 'alors qu il est T sur run.def ***'327 WRITE(tapeout,*) ' ******** PBS DANS DEFRUN ******** ' 328 WRITE(tapeout,*)' *** fxyhypb lu sur le fichier start est F' 329 *, ' alors qu il est T sur run.def ***' 329 330 STOP 330 331 ENDIF 331 332 ELSE 332 333 IF( .NOT.fxyhypbb ) THEN 333 PRINT *,' ******** PBS DANS DEFRUN ******** '334 PRINT *,' *** fxyhypb lu sur le fichier start est T ',335 * 'alors qu il est F sur run.def ****'334 WRITE(tapeout,*) ' ******** PBS DANS DEFRUN ******** ' 335 WRITE(tapeout,*)' *** fxyhypb lu sur le fichier start est t' 336 *, ' alors qu il est F sur run.def ***' 336 337 STOP 337 338 ENDIF … … 343 344 WRITE(tapeout,*) dzoomxx 344 345 345 IF( fxyhypb ) THEN346 IF( ABS(dzoomx - dzoomxx).GE. 0.001 ) THEN347 PRINT *,' La valeur de dzoomx passee par run.def est differente348 * de celle lue sur le fichier start '349 STOP350 ENDIF351 ENDIF352 353 346 READ (tapedef,9001) ch1,ch4 354 347 READ (tapedef,*) dzoomyy … … 356 349 WRITE(tapeout,*) dzoomyy 357 350 351 READ (tapedef,9001) ch1,ch4 352 READ (tapedef,*) tauxx 353 WRITE(tapeout,9001) ch1,'taux' 354 WRITE(tapeout,*) tauxx 355 356 READ (tapedef,9001) ch1,ch4 357 READ (tapedef,*) tauyy 358 WRITE(tapeout,9001) ch1,'tauy' 359 WRITE(tapeout,*) tauyy 360 358 361 IF( fxyhypb ) THEN 362 363 IF( ABS(dzoomx - dzoomxx).GE. 0.001 ) THEN 364 WRITE(tapeout,*)' La valeur de dzoomx passee par run.def est dif 365 *ferente de celle lue sur le fichier start ' 366 CALL ABORT 367 ENDIF 368 359 369 IF( ABS(dzoomy - dzoomyy).GE. 0.001 ) THEN 360 PRINT *,' La valeur de dzoomy passee par run.def est differente361 * de celle lue sur le fichier start '362 STOP370 WRITE(tapeout,*)' La valeur de dzoomy passee par run.def est dif 371 *ferente de celle lue sur le fichier start ' 372 CALL ABORT 363 373 ENDIF 374 375 IF( ABS(taux - tauxx).GE. 0.001 ) THEN 376 WRITE(6,*)' La valeur de taux passee par run.def est differente 377 * de celle lue sur le fichier start ' 378 CALL ABORT 379 ENDIF 380 381 IF( ABS(tauy - tauyy).GE. 0.001 ) THEN 382 WRITE(6,*)' La valeur de tauy passee par run.def est differente 383 * de celle lue sur le fichier start ' 384 CALL ABORT 385 ENDIF 386 364 387 ENDIF 365 388 … … 374 397 IF( .NOT.ysinus ) THEN 375 398 IF( ysinuss ) THEN 376 PRINT *,' ******** PBS DANS DEFRUN ******** '377 PRINT *,' *** ysinus lu sur le fichier start est F',378 * ' alors qu il est T sur run.def ***'399 WRITE(6,*) ' ******** PBS DANS DEFRUN ******** ' 400 WRITE(tapeout,*)'** ysinus lu sur le fichier start est F', 401 * ' alors qu il est T sur run.def ***' 379 402 STOP 380 403 ENDIF 381 404 ELSE 382 405 IF( .NOT.ysinuss ) THEN 383 PRINT *,' ******** PBS DANS DEFRUN ******** '384 PRINT *,' *** ysinus lu sur le fichier start est T',385 * 'alors qu il est F sur run.def ****'406 WRITE(6,*) ' ******** PBS DANS DEFRUN ******** ' 407 WRITE(tapeout,*)'** ysinus lu sur le fichier start est T', 408 * ' alors qu il est F sur run.def ***' 386 409 STOP 387 410 ENDIF … … 389 412 ENDIF 390 413 c 391 close(tapedef) 414 WRITE(6,*) ' alphax alphay defrun ',alphax,alphay 415 416 CLOSE(tapedef) 417 392 418 RETURN 393 419 c ............................................... … … 416 442 417 443 IF( grossismx.LT.1. ) THEN 418 PRINT *,'*** ATTENTION !! grossismx < 1 . *** '444 WRITE(tapeout,*) '*** ATTENTION !! grossismx < 1 . *** ' 419 445 STOP 420 446 ELSE … … 423 449 424 450 IF( grossismy.LT.1. ) THEN 425 PRINT *,' *** ATTENTION !! grossismy < 1 . *** '451 WRITE(tapeout,*) ' *** ATTENTION !! grossismy < 1 . *** ' 426 452 STOP 427 453 ELSE … … 429 455 ENDIF 430 456 431 PRINT *,' alphax alphay defrun ',alphax,alphay432 433 457 c 434 458 READ (tapedef,9001) ch1,ch4 … … 446 470 WRITE(tapeout,9001) ch1,'dzoomy' 447 471 WRITE(tapeout,*) dzoomy 448 c 472 473 READ (tapedef,9001) ch1,ch4 474 READ (tapedef,*) taux 475 WRITE(tapeout,9001) ch1,'taux' 476 WRITE(tapeout,*) taux 477 c 478 READ (tapedef,9001) ch1,ch4 479 READ (tapedef,*) tauy 480 WRITE(tapeout,9001) ch1,'tauy' 481 WRITE(tapeout,*) tauy 482 449 483 READ (tapedef,9001) ch1,ch4 450 484 READ (tapedef,*) ysinus … … 452 486 WRITE(tapeout,*) ysinus 453 487 488 WRITE(tapeout,*) ' alphax alphay defrun ',alphax,alphay 454 489 c 455 490 9000 FORMAT(3(/,a72)) 456 491 9001 FORMAT(/,a72,/,a12) 457 492 cc 458 close(tapedef) 493 CLOSE(tapedef) 494 459 495 RETURN 460 496 END -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/dynetat0.F
r2 r232 1 c 2 c $Header$ 3 c 1 4 SUBROUTINE dynetat0(fichnom,nq,vcov,ucov, 2 5 . teta,q,masse,ps,phis,time) … … 105 108 dzoomx = tab_cntrl(25) 106 109 dzoomy = tab_cntrl(26) 110 taux = tab_cntrl(28) 111 tauy = tab_cntrl(29) 107 112 ELSE 108 113 fxyhypb = . FALSE . -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/dynredem.F
r179 r232 94 94 tab_cntrl(25) = dzoomx 95 95 tab_cntrl(26) = dzoomy 96 tab_cntrl(27) = 0. 97 tab_cntrl(28) = taux 98 tab_cntrl(29) = tauy 96 99 ELSE 97 100 tab_cntrl(24) = 0. … … 99 102 tab_cntrl(26) = dzoomy 100 103 tab_cntrl(27) = 0. 101 IF( ysinus ) tab_cntrl(27) = 1. 104 tab_cntrl(28) = 0. 105 tab_cntrl(29) = 0. 106 IF( ysinus ) tab_cntrl(27) = 1. 102 107 ENDIF 103 108 c -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/etat0_netcdf.F
r227 r232 274 274 q3d(:,:,:,:) = 0.0 275 275 qd(:,:,:) = 0.0 276 q3d(:,:,:,:) = 0.0 276 277 WRITE(*,*) 'QSAT min,max:',minval(qsat(:,:,:)), 277 278 . maxval(qsat(:,:,:)) -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/fluxstokenc.F
r79 r232 1 1 SUBROUTINE fluxstokenc(pbaru,pbarv,masse,teta,phi,phis, 2 . time_step,itau , fluxid, fluxvid,fluxdid)2 . time_step,itau ) 3 3 4 4 USE IOIPSL … … 30 30 31 31 REAL pbarvst(iip1,jjp1,llm),zistdyn 32 real dtcum 32 33 33 34 INTEGER iadvtr 35 integer ndex1d(1) 36 integer ndex2d(ip1jmp1) 37 integer ndex3dv(ip1jm*llm),ndex3d(ip1jmp1*llm) 34 INTEGER iadvtr,ndex(1) 38 35 integer nscal 39 36 real tst(1),ist(1),istp(1) … … 53 50 . time_step,istdyn* time_step,istdyn* time_step, 54 51 . nqmx, fluxid,fluxvid,fluxdid) 52 53 ndex(1) = 0 54 call histwrite(fluxid, 'phis', 1, phis, iip1*jjp1, ndex) 55 call histwrite(fluxid, 'aire', 1, aire, iip1*jjp1, ndex) 56 57 ndex(1) = 0 58 nscal = 1 59 tst(1) = time_step 60 call histwrite(fluxdid, 'dtvr', 1, tst, nscal, ndex) 61 ist(1)=istdyn 62 call histwrite(fluxdid, 'istdyn', 1, ist, nscal, ndex) 63 istp(1)= istphy 64 call histwrite(fluxdid, 'istphy', 1, istp, nscal, ndex) 65 55 66 first = .false. 56 67 57 68 endif 58 59 60 ndex1d = 061 ndex2d = 062 ndex3dv = 063 ndex3d = 064 69 65 70 … … 93 98 c Test pour savoir si on advecte a ce pas de temps 94 99 IF ( iadvtr.EQ.istdyn ) THEN 95 96 100 c normalisation 97 101 DO l=1,llm … … 124 128 125 129 iadvtr=0 126 127 c write(*,*)'histwrite phis' 128 call histwrite(fluxid, 'phis', 1, phis, iip1*jjp1, ndex2d) 129 c write(*,*)'histwrite aire' 130 call histwrite(fluxid, 'aire', 1, aire, iip1*jjp1, ndex2d) 130 Print*,'ITAU auqel on stoke les fluxmasses',itau 131 131 132 nscal = 1 133 tst(1) = time_step 134 c write(*,*)'histwrite dtvr' 135 call histwrite(fluxdid, 'dtvr', 1, tst, nscal, ndex1d) 136 ist(1)=istdyn 137 c write(*,*)'histwrite istdyn' 138 call histwrite(fluxdid, 'istdyn', 1, ist, nscal, ndex1d) 139 istp(1)= istphy 140 c write(*,*)'histwrite istphy' 141 call histwrite(fluxdid, 'istphy', 1, istp, nscal, ndex1d) 142 143 c write(*,*)'histwrite masse' 144 call histwrite(fluxid, 'masse', itau, masse, 145 . iip1*jjp1*llm, ndex3d) 132 call histwrite(fluxid, 'masse', itau, massem, 133 . iip1*jjp1*llm, ndex) 146 134 147 c write(*,*)'histwrite pbaru'148 135 call histwrite(fluxid, 'pbaru', itau, pbarug, 149 . iip1*jjp1*llm, ndex 3d)136 . iip1*jjp1*llm, ndex) 150 137 151 c write(*,*)'histwrite pbarv' 152 call histwrite(fluxvid, 'pbarv', itau, pbarvst, 153 . iim*jjp1*llm, ndex3dv) 138 call histwrite(fluxvid, 'pbarv', itau, pbarvg, 139 . iip1*jjm*llm, ndex) 154 140 155 c write(*,*)'histwrite w'156 141 call histwrite(fluxid, 'w' ,itau, wg, 157 . iip1*jjp1*llm, ndex 3d)142 . iip1*jjp1*llm, ndex) 158 143 159 c write(*,*)'histwrite teta'160 144 call histwrite(fluxid, 'teta' ,itau, tetac, 161 . iip1*jjp1*llm, ndex 3d)145 . iip1*jjp1*llm, ndex) 162 146 163 c write(*,*)'histwrite phi'164 147 call histwrite(fluxid, 'phi' ,itau, phic, 165 . iip1*jjp1*llm, ndex 3d)148 . iip1*jjp1*llm, ndex) 166 149 167 150 C -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/fxhyp.F
r2 r232 1 1 SUBROUTINE fxhyp ( xzoomdeg,grossism,dzoom,tau , 2 , rlonm025,xprimm025,rlonv,xprimv,rlonu,xprimu,rlonp025,xprimp025) 2 , rlonm025,xprimm025,rlonv,xprimv,rlonu,xprimu,rlonp025,xprimp025, 3 , champmin,champmax ) 3 4 4 5 c Auteur : P. Le Van … … 11 12 c grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois,etc.) 12 13 c dzoom etant la distance totale de la zone du zoom 13 c tau la transition , normalement = 1 . 14 c 14 c tau la raideur de la transition de l'interieur a l'exterieur du zoom 15 c 16 c On doit avoir grossism x dzoom < pi ( radians ) , en longitude. 17 c ******************************************************************** 18 15 19 16 20 INTEGER nmax, nmax2 17 PARAMETER ( nmax = 50000, nmax2 = 2*nmax )21 PARAMETER ( nmax = 30000, nmax2 = 2*nmax ) 18 22 19 23 #include "dimensions.h" … … 23 27 c 24 28 REAL xzoomdeg,dzoom,tau,grossism 29 30 c ...... arguments de sortie ...... 31 25 32 REAL rlonm025(iip1),xprimm025(iip1),rlonv(iip1),xprimv(iip1), 26 33 , rlonu(iip1),xprimu(iip1),rlonp025(iip1),xprimp025(iip1) 27 34 28 c ...... arguments de sortie ...... 29 c 30 REAL xlon(iip1),xprimm(iip1),xuv 31 REAL xtild(0:nmax2) 32 REAL fhyp(0:nmax),ffdx(0:nmax),beta,Xprimt(0:nmax2) 33 REAL Xf(0:nmax2),xxpr(0:nmax2) 34 REAL xvrai(iip1),xxprim(iip1) 35 REAL pi,depi,epsilon,xzoom 35 c .... variables locales .... 36 c 37 REAL*8 xlon(iip1),xprimm(iip1),xuv 38 REAL*8 xtild(0:nmax2) 39 REAL*8 fhyp(0:nmax2),ffdx,beta,Xprimt(0:nmax2) 40 REAL*8 Xf(0:nmax2),xxpr(0:nmax2) 41 REAL*8 xvrai(iip1),xxprim(iip1) 42 REAL*8 pi,depi,epsilon,xzoom,fa,fb 43 REAL*8 Xf1, Xfi , a0,a1,a2,a3,xi2 36 44 INTEGER i,it,ik,iter,ii,idif 37 REAL xi,xo1,xint,xmoy,xlon2,fxm,Xprimin38 REAL champmin,champmax45 REAL*8 xi,xo1,xmoy,xlon2,fxm,Xprimin 46 REAL*8 champmin,champmax 39 47 INTEGER is2 40 48 SAVE is2 41 REAL dlon1(iip1),dlon2(iip1),dlon3(iip1) 49 50 REAL*8 heavyside 51 EXTERNAL coefpoly,heavyside 42 52 43 53 pi = 2. * ASIN(1.) 44 54 depi = 2. * pi 45 epsilon = 1.e- 655 epsilon = 1.e-3 46 56 xzoom = xzoomdeg * pi/180. 47 57 48 58 IF( dzoom.LT.1.) THEN 59 dzoom = dzoom * depi 60 ELSEIF( dzoom.LT. 25. ) THEN 61 WRITE(6,*) ' Le param. dzoomy pour fxhyp est trop petit ! L aug 62 ,menter et relancer ! ' 63 STOP 1 64 ELSE 65 dzoom = dzoom * pi/180. 66 ENDIF 67 68 WRITE(6,*) ' xzoom( rad.),grossism,tau,dzoom (radians)' 69 WRITE(6,24) xzoom,grossism,tau,dzoom 49 70 50 71 DO i = 0, nmax2 51 xtild(i) = FLOAT(i) /nmax2 52 IF( xtild(i).EQ. 0.5 ) xtild(i) = xtild(i) + 1.e-6 53 ENDDO 54 55 DO i = 1, nmax 56 fhyp(i) = TANH ( ( xtild(i) - 0.5*(1.- dzoom) ) / 57 , ( tau * xtild(i) * ( 0.5 -xtild(i))) ) 58 ENDDO 59 60 fhyp( 0 ) = - 1. 61 fhyp( nmax ) = 1. 72 xtild(i) = - pi + FLOAT(i) * depi /nmax2 73 ENDDO 74 75 DO i = 0, nmax2 76 77 fa = tau* ( dzoom/2. - xtild(i) ) 78 fb = xtild(i) * ( pi - xtild(i) ) 79 80 81 IF( 200.* fb .LT. - fa ) THEN 82 fhyp ( i) = - 1. 83 ELSEIF( 200. * fb .LT. fa ) THEN 84 fhyp ( i) = 1. 85 ELSE 86 fhyp(i) = TANH ( fa/fb ) 87 ENDIF 88 89 IF ( xtild(i).EQ. 0. ) fhyp(i) = 1. 90 IF ( xtild(i).EQ. pi ) fhyp(i) = -1. 91 92 ENDDO 62 93 63 94 cc .... Calcul de beta .... 64 c 65 ffdx( 0 ) = 0. 66 67 DO i = 1, nmax 68 xmoy = 0.5 * ( xtild(i-1) + xtild( i ) ) 69 fxm = TANH ( ( xmoy - 0.5 * ( 1. - dzoom ) ) / 70 , ( tau * xmoy * ( 0.5 -xmoy)) ) 71 ffdx(i) = ffdx(i-1) + fxm * ( xtild(i) - xtild(i-1) ) 72 ENDDO 73 74 beta = ( grossism * ffdx(nmax) - 0.5 ) / ( ffdx(nmax) - 0.5 ) 95 c ............................ 96 97 ffdx = 0. 98 99 DO i = nmax +1,nmax2 100 101 xmoy = 0.5 * ( xtild(i-1) + xtild( i ) ) 102 fa = tau* ( dzoom/2. - xmoy ) 103 fb = xmoy * ( pi - xmoy ) 104 105 IF( 200.* fb .LT. - fa ) THEN 106 fxm = - 1. 107 ELSEIF( 200. * fb .LT. fa ) THEN 108 fxm = 1. 109 ELSE 110 fxm = TANH ( fa/fb ) 111 ENDIF 112 113 IF ( xmoy.EQ. 0. ) fhyp(i) = 1. 114 IF ( xmoy.EQ. pi ) fhyp(i) = -1. 115 ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) ) 116 117 ENDDO 118 119 beta = ( grossism * ffdx - pi ) / ( ffdx - pi ) 120 121 IF( 2.*beta - grossism.LE. 0.) THEN 122 WRITE(6,*) ' ** Attention ! La valeur beta calculee dans la rou 123 ,tine fxhyp est mauvaise ! ' 124 WRITE(6,*)'Modifier les valeurs de grossismx ,tau ou dzoomx ', 125 , ' et relancer ! *** ' 126 CALL ABORT 127 ENDIF 75 128 c 76 129 c ..... calcul de Xprimt ..... 77 130 c 78 131 79 DO i = 0, nmax132 DO i = nmax, nmax2 80 133 Xprimt(i) = beta + ( grossism - beta ) * fhyp(i) 81 134 ENDDO 82 135 c 83 DO i = 0, nmax136 DO i = nmax+1, nmax2 84 137 Xprimt( nmax2 - i ) = Xprimt( i ) 85 138 ENDDO … … 88 141 c ..... Calcul de Xf ........ 89 142 90 Xf(0) = 0. 91 DO i = 1, nmax 92 xmoy = 0.5 * ( xtild(i-1) + xtild( i ) ) 93 fxm = TANH ( ( xmoy - 0.5 * ( 1. - dzoom ) ) / 94 , ( tau * xmoy * ( 0.5 -xmoy)) ) 95 xxpr(i) = beta + ( grossism - beta ) * fxm 96 ENDDO 97 98 DO i = 1,nmax 99 xxpr(nmax2-i+1) = xxpr(i) 143 Xf(0) = - pi 144 145 DO i = nmax +1, nmax2 146 147 xmoy = 0.5 * ( xtild(i-1) + xtild( i ) ) 148 fa = tau* ( dzoom/2. - xmoy ) 149 fb = xmoy * ( pi - xmoy ) 150 151 IF( 200.* fb .LT. - fa ) THEN 152 fxm = - 1. 153 ELSEIF( 200. * fb .LT. fa ) THEN 154 fxm = 1. 155 ELSE 156 fxm = TANH ( fa/fb ) 157 ENDIF 158 159 IF ( xmoy.EQ. 0. ) fxm = 1. 160 IF ( xmoy.EQ. pi ) fxm = -1. 161 xxpr(i) = beta + ( grossism - beta ) * fxm 162 163 ENDDO 164 165 DO i = nmax+1, nmax2 166 xxpr(nmax2-i+1) = xxpr(i) 100 167 ENDDO 101 168 … … 103 170 Xf(i) = Xf(i-1) + xxpr(i) * ( xtild(i) - xtild(i-1) ) 104 171 ENDDO 105 do i=1,nmax2106 xf(i)=xf(i)/xf(nmax2)107 enddo108 109 110 PRINT *,' XF ',xf(0),xf(nmax),xf(nmax2)111 172 112 173 … … 117 178 c ..... xuv = 0.5 si calcul aux pts U ........ 118 179 c 180 WRITE(6,18) 119 181 c 120 182 DO 5000 ik = 1, 4 … … 130 192 ENDIF 131 193 194 xo1 = 0. 132 195 133 196 DO 1500 i = 1, iim 134 197 135 xlon2 = ( FLOAT(i) + xuv - 0.75) / FLOAT(iim) 136 137 xo1 = 0. 138 xi = xlon2 139 c 140 DO 500 iter = 1,300 141 198 xlon2 = - pi + (FLOAT(i) + xuv - 0.75) * depi / FLOAT(iim) 199 200 Xfi = xlon2 201 c 142 202 DO 250 it = nmax2,0,-1 143 IF( xi.GE.xtild(it)) GO TO 350203 IF( Xfi.GE.Xf(it)) GO TO 350 144 204 250 CONTINUE 145 205 146 206 it = 0 147 xi = xtild(it)148 207 149 208 350 CONTINUE 150 IF(it.EQ.nmax2) THEN 151 it = nmax2 -1 152 xf(it+1) = 1. 153 ENDIF 154 c ................................................................. 155 c .... Interpolation entre xi(it) et xi(it+1) pour avoir X(xi) 156 c ..... et X'(xi) ..... 157 c ................................................................. 158 159 xint = ( Xf(it+1)-Xf(it) ) / ( xtild(it+1)-xtild(it) ) * 160 + ( xi-xtild(it) ) + Xf(it) 161 Xprimin = ( Xprimt(it+1)-Xprimt(it) )/ ( xtild(it+1)-xtild(it) ) * 162 + ( xi-xtild(it) ) + Xprimt(it) 163 164 xi = xi - (xint-xlon2)/Xprimin 165 166 IF( ABS(xi-xo1).LE.epsilon) GO TO 550 167 xo1 = xi 168 c 209 210 c ...... Calcul de Xf(xi) ...... 211 c 212 xi = xtild(it) 213 214 IF(it.EQ.nmax2) THEN 215 it = nmax2 -1 216 Xf(it+1) = pi 217 ENDIF 218 c ..................................................................... 219 c 220 c Appel de la routine qui calcule les coefficients a0,a1,a2,a3 d'un 221 c polynome de degre 3 qui passe par les points (Xf(it),xtild(it) ) 222 c et (Xf(it+1),xtild(it+1) ) 223 224 CALL coefpoly ( Xf(it),Xf(it+1),Xprimt(it),Xprimt(it+1), 225 , xtild(it),xtild(it+1), a0, a1, a2, a3 ) 226 227 Xf1 = Xf(it) 228 Xprimin = a1 + 2.* a2 * xi + 3.*a3 * xi *xi 229 230 DO 500 iter = 1,300 231 xi = xi - ( Xf1 - Xfi )/ Xprimin 232 233 IF( ABS(xi-xo1).LE.epsilon) GO TO 550 234 xo1 = xi 235 xi2 = xi * xi 236 Xf1 = a0 + a1 * xi + a2 * xi2 + a3 * xi2 * xi 237 Xprimin = a1 + 2.* a2 * xi + 3.* a3 * xi2 169 238 500 CONTINUE 170 PRINT *,' *** PAS DE SOLUTION **** ',i,xlon2171 STOP 4239 WRITE(6,*) ' Pas de solution ***** ',i,xlon2,iter 240 STOP 6 172 241 550 CONTINUE 173 242 174 xxprim(i) = depi/( FLOAT(iim) * Xprimin) 175 xvrai(i) = depi * (xi - 0.5) + xzoom 176 243 xxprim(i) = depi/ ( FLOAT(iim) * Xprimin ) 244 xvrai(i) = xi + xzoom 177 245 178 246 1500 CONTINUE 179 247 180 248 DO i = 1 , iim 181 xlon (i)= xvrai(i)249 xlon(i) = xvrai(i) 182 250 xprimm(i) = xxprim(i) 183 cc xxlon(i) = xlon(i)*180./pi184 251 ENDDO 185 252 186 cc PRINT *,' XLON avant '187 cc PRINT 68,(xxlon(i),i=1,iim)188 189 253 DO i = 1, iim -1 190 254 IF( xvrai(i+1). LT. xvrai(i) ) THEN 191 PRINT *,' PBS. avec rlonu(',i+1,'plus petit que rlonu(',i,192 , 193 STOP255 WRITE(6,*) ' PBS. avec rlonu(',i+1,') plus petit que rlonu(',i, 256 , ')' 257 STOP 7 194 258 ENDIF 195 259 ENDDO … … 205 269 ENDDO 206 270 207 PRINT *,' LONGITUDES min max ',champmin,champmax208 209 271 IF(champmin .GE. - pi .AND. champmax.LE. pi ) THEN 210 272 GO TO 1600 211 273 ELSE 212 PRINT 18 213 PRINT *,'Reorganisation des longitudes pour avoir entre - pi ', 214 , ' et pi ' 274 WRITE(6,*) 'Reorganisation des longitudes pour avoir entre - pi', 275 , ' et pi ' 215 276 c 216 277 IF( xzoom.LE.0.) THEN … … 219 280 IF( xvrai(i).GE. - pi ) GO TO 80 220 281 ENDDO 221 PRINT *, ' PBS. 1'222 STOP 282 WRITE(6,*) ' PBS. 1 ! Xvrai plus petit que - pi ! ' 283 STOP 8 223 284 80 CONTINUE 224 285 is2 = i … … 240 301 IF( xvrai(i).LE. pi ) GO TO 90 241 302 ENDDO 242 PRINT *,' PBS. 2'243 STOP 303 WRITE(6,*) ' PBS. 2 ! Xvrai plus grand que pi ! ' 304 STOP 9 244 305 90 CONTINUE 245 306 is2 = i 246 307 ENDIF 247 cc PRINT *,' IS2 ',is2248 308 idif = iim -is2 249 309 DO ii = 1, is2 … … 270 330 ENDDO 271 331 272 273 332 IF( ik.EQ.1 ) THEN 274 PRINT *, ' XLON aux pts. V-0.25 apres ( en deg. ) ' 275 PRINT 18 276 PRINT 68,xvrai 277 PRINT *,' XPRIM ' 278 PRINT 68, xprimm 333 c WRITE(6,*) ' XLON aux pts. V-0.25 apres ( en deg. ) ' 334 c WRITE(6,18) 335 c WRITE(6,68) xvrai 336 ccc WRITE(6,*) ' XPRIM k ',ik 337 ccc WRITE(6,566) xprimm 338 279 339 DO i = 1,iim + 1 280 340 rlonm025(i) = xlon( i ) 281 341 xprimm025(i) = xprimm(i) 282 342 ENDDO 343 283 344 ELSE IF( ik.EQ.2 ) THEN 284 PRINT 18 285 PRINT *, ' XLON aux pts. V apres ( en deg. ) ' 286 PRINT 68,xvrai 287 PRINT *,' XPRIM ' 288 PRINT 68, xprimm 345 c WRITE(6,18) 346 c WRITE(6,*) ' XLON aux pts. V apres ( en deg. ) ' 347 c WRITE(6,68) xvrai 348 ccc WRITE(6,*) ' XPRIM k ',ik 349 ccc WRITE(6,566) xprimm 350 289 351 DO i = 1,iim + 1 290 352 rlonv(i) = xlon( i ) 291 353 xprimv(i) = xprimm(i) 292 354 ENDDO 293 ELSE IF( ik.EQ.3 ) THEN 294 PRINT 18 295 PRINT *, ' XLON aux pts. U apres ( en deg. ) ' 296 PRINT 68,xvrai 297 PRINT *,' XPRIM ' 298 PRINT 68, xprimm 355 356 ELSE IF( ik.EQ.3) THEN 357 c WRITE(6,18) 358 c WRITE(6,*) ' XLON aux pts. U apres ( en deg. ) ' 359 c WRITE(6,68) xvrai 360 ccc WRITE(6,*) ' XPRIM ik ',ik 361 ccc WRITE(6,566) xprimm 362 299 363 DO i = 1,iim + 1 300 364 rlonu(i) = xlon( i ) 301 365 xprimu(i) = xprimm(i) 302 366 ENDDO 367 303 368 ELSE IF( ik.EQ.4 ) THEN 304 PRINT 18 305 PRINT *, ' XLON aux pts. V+0.25 apres ( en deg. ) ' 306 PRINT 68,xvrai 307 PRINT *,' XPRIM ' 308 PRINT 68, xprimm 369 c WRITE(6,18) 370 c WRITE(6,*) ' XLON aux pts. V+0.25 apres ( en deg. ) ' 371 c WRITE(6,68) xvrai 372 ccc WRITE(6,*) ' XPRIM ik ',ik 373 ccc WRITE(6,566) xprimm 374 309 375 DO i = 1,iim + 1 310 376 rlonp025(i) = xlon( i ) 311 377 xprimp025(i) = xprimm(i) 312 378 ENDDO 379 313 380 ENDIF 314 381 315 382 5000 CONTINUE 316 383 c 317 c ........... fin de la boucle do 5000 ............ 318 319 c 320 DO i = 1, iim + 1 321 dlon1(i) = rlonm025(i) - rlonv(i) 322 dlon2(i) = rlonm025(i) - rlonp025(i) 323 dlon3(i) = rlonm025(i) - rlonu(i) 384 WRITE(6,18) 385 c 386 c ........... fin de la boucle do 5000 ............ 387 388 DO i = 1, iim 389 xlon(i) = rlonv(i+1) - rlonv(i) 324 390 ENDDO 325 326 DO i = 1, iim + 1 327 rlonm025(i) = rlonm025(i) + dlon1(i) 391 champmin = 1.e12 392 champmax = -1.e12 393 DO i = 1, iim 394 champmin = MIN( champmin, xlon(i) ) 395 champmax = MAX( champmax, xlon(i) ) 328 396 ENDDO 329 330 DO i = 1, iim + 1 331 rlonv(i) = rlonm025(i) - dlon1(i) 332 rlonp025(i) = rlonm025(i) - dlon2(i) 333 rlonu(i) = rlonm025(i) - dlon3(i) 334 ENDDO 335 336 DO i = 1, iim 337 xprimu (i) = rlonu(i+1) - rlonu(i) 338 xprimv (i) = rlonv(i+1) - rlonv(i) 339 xprimm025(i) = rlonm025(i+1) - rlonm025(i) 340 xprimp025(i) = rlonp025(i+1) - rlonp025(i) 341 ENDDO 342 xprimu (iip1) = xprimu (1) 343 xprimv (iip1) = xprimv (1) 344 xprimm025(iip1) = xprimm025(1) 345 xprimp025(iip1) = xprimp025(1) 346 347 348 18 FORMAT(/) 349 68 FORMAT(1x,7f9.2) 350 351 352 RETURN 353 END 397 champmin = champmin * 180./pi 398 champmax = champmax * 180./pi 399 400 18 FORMAT(/) 401 24 FORMAT(2x,'Parametres xzoom,gross,tau ,dzoom pour fxhyp ',4f8.3) 402 68 FORMAT(1x,7f9.2) 403 404 RETURN 405 END -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/fxyhyper.F
r2 r232 1 SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy,deltay , 2 , xzoom, grossx, dzoomx,taux, 1 c 2 c $Header$ 3 c 4 SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy , 5 , xzoom, grossx, dzoomx,taux , 3 6 , rlatu,yprimu,rlatv,yprimv,rlatu1, yprimu1, rlatu2, yprimu2 , 4 7 , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025) … … 19 22 c a) le grossissement du zoom : grossy ( en y ) et grossx ( en x ) 20 23 c b) l' extension du zoom : dzoomy ( en y ) et dzoomx ( en x ) 21 c c) la raideur du zoom : tau , ici = 1.24 c c) la raideur de la transition du zoom : taux et tauy 22 25 c 23 c N.B : le produit ( grossissement * extension ) doit etre < 1. 24 c ******* 25 c En plus , il y a un autre parametre , moins important mais quand 26 c meme utile , c'est deltay , deplacement de la zone du zoom en 27 c latitude : Si on deplace de 10. degres vers le nord ( deltay 28 c = 10. dans inigeom ) . 29 c 26 c N.B : Il vaut mieux avoir : grossx * dzoomx < pi ( radians ) 27 c ****** 28 c et grossy * dzoomy < pi/2 ( radians ) 30 29 c 31 30 #include "dimensions.h" … … 40 39 REAL rlonu(iip1),xprimu(iip1),rlonv(iip1),xprimv(iip1), 41 40 , rlonm025(iip1),xprimm025(iip1), rlonp025(iip1),xprimp025(iip1) 42 REAL deltay41 REAL*8 dxmin, dxmax , dymin, dymax 43 42 44 43 c .... var. locales ..... … … 47 46 c 48 47 49 CALL fyhyp ( yzoom, grossy, dzoomy,tauy, deltay , 50 , rlatu, yprimu,rlatv,yprimv,rlatu2,yprimu2,rlatu1,yprimu1 ) 48 CALL fyhyp ( yzoom, grossy, dzoomy,tauy , 49 , rlatu, yprimu,rlatv,yprimv,rlatu2,yprimu2,rlatu1,yprimu1 , 50 , dymin,dymax ) 51 52 CALL fxhyp(xzoom,grossx,dzoomx,taux,rlonm025,xprimm025,rlonv, 53 , xprimv,rlonu,xprimu,rlonp025,xprimp025 , dxmin,dxmax ) 51 54 52 55 53 CALL fxhyp(xzoom,grossx,dzoomx,taux,rlonm025,xprimm025,rlonv, 54 , xprimv,rlonu,xprimu,rlonp025,xprimp025 ) 55 56 57 DO i = 1, iim 56 DO i = 1, iip1 58 57 IF(rlonp025(i).LT.rlonv(i)) THEN 59 PRINT *,' Attention ! rlonp025 < rlonv',i58 WRITE(6,*) ' Attention ! rlonp025 < rlonv',i 60 59 STOP 61 60 ENDIF 62 61 63 62 IF(rlonv(i).LT.rlonm025(i)) THEN 64 PRINT *,' Attention ! rlonm025 > rlonv',i63 WRITE(6,*) ' Attention ! rlonm025 > rlonv',i 65 64 STOP 66 65 ENDIF 67 66 68 67 IF(rlonp025(i).GT.rlonu(i)) THEN 69 PRINT *,' Attention ! rlonp025 > rlonu',i68 WRITE(6,*) ' Attention ! rlonp025 > rlonu',i 70 69 STOP 71 70 ENDIF 72 71 ENDDO 73 72 74 PRINT *,' *** TEST DE COHERENCE OK POUR FX **** '73 WRITE(6,*) ' *** TEST DE COHERENCE OK POUR FX **** ' 75 74 76 75 c … … 78 77 c 79 78 IF(rlatu1(j).LE.rlatu2(j)) THEN 80 PRINT *,'Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j79 WRITE(6,*)'Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j 81 80 STOP 13 82 81 ENDIF 83 82 c 84 83 IF(rlatu2(j).LE.rlatu(j+1)) THEN 85 PRINT *,'Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j84 WRITE(6,*)'Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j 86 85 STOP 14 87 86 ENDIF 88 87 c 89 88 IF(rlatu(j).LE.rlatu1(j)) THEN 90 PRINT *,' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j89 WRITE(6,*)' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j 91 90 STOP 15 92 91 ENDIF 93 92 c 94 93 IF(rlatv(j).LE.rlatu2(j)) THEN 95 PRINT *,' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j94 WRITE(6,*)' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j 96 95 STOP 16 97 96 ENDIF 98 97 c 99 98 IF(rlatv(j).ge.rlatu1(j)) THEN 100 PRINT *,' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j99 WRITE(6,*)' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j 101 100 STOP 17 102 101 ENDIF 103 102 c 104 103 IF(rlatv(j).ge.rlatu(j)) THEN 105 PRINT *,'Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j104 WRITE(6,*) ' Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j 106 105 STOP 18 107 106 ENDIF … … 109 108 ENDDO 110 109 c 111 PRINT *,' *** TEST DE COHERENCE OK POUR FY **** ' 112 110 WRITE(6,*) ' *** TEST DE COHERENCE OK POUR FY **** ' 113 111 c 112 WRITE(6,18) 113 WRITE(6,*) ' Latitudes ' 114 WRITE(6,*) ' *********** ' 115 WRITE(6,18) 116 WRITE(6,3) dymin, dymax 117 WRITE(6,*) ' Si cette derniere est trop lache , modifiez les par 118 ,ametres grossism , tau , dzoom pour Y et repasser ! ' 119 c 120 WRITE(6,18) 121 WRITE(6,*) ' Longitudes ' 122 WRITE(6,*) ' ************ ' 123 WRITE(6,18) 124 WRITE(6,3) dxmin, dxmax 125 WRITE(6,*) ' Si cette derniere est trop lache , modifiez les par 126 ,ametres grossism , tau , dzoom pour Y et repasser ! ' 127 WRITE(6,18) 128 c 129 3 Format(1x, ' Au centre du zoom , la longueur de la maille est', 130 , ' d environ ',f8.2 ,' degres ', 131 , ' alors que la maille en dehors de la zone du zoom est d environ 132 , ', f8.2,' degres ' ) 133 18 FORMAT(/) 114 134 115 135 RETURN -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/fyhyp.F
r2 r232 1 SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau,deltay , 2 , rrlatu,yyprimu,rrlatv,yyprimv,rlatu2,yprimu2,rlatu1,yprimu1 ) 3 1 c 2 c $Header$ 3 c 4 SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau , 5 , rrlatu,yyprimu,rrlatv,yyprimv,rlatu2,yprimu2,rlatu1,yprimu1 , 6 , champmin,champmax ) 7 8 cc ... Version du 01/04/2001 .... 4 9 5 10 IMPLICIT NONE … … 13 18 c 14 19 c grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois , etc) 15 c dzoom etant la distance totale de la zone du zoom 16 c tau la transition , normalement = 1 . 17 18 c N.B : on doit avoir : grossism * dzoom < 1 . 19 c ************** 20 c 21 c Pour Indoex , on a pris : 22 c ******* 23 c grossism = 2.5 , dzoom = 7/24 en x et y , pour iim = 128 et jjm=64 24 c yzoomdeg = 0. , tau = 1. et delaty = 10. 20 c dzoom etant la distance totale de la zone du zoom ( en radians ) 21 c tau la raideur de la transition de l'interieur a l'exterieur du zoom 22 c 23 c 24 c N.B : Il vaut mieux avoir : grossism * dzoom < pi/2 (radians) ,en lati. 25 c ******************************************************************** 25 26 c 26 27 c … … 29 30 30 31 INTEGER nmax , nmax2 31 PARAMETER ( nmax = 50000, nmax2 = 2*nmax )32 PARAMETER ( nmax = 30000, nmax2 = 2*nmax ) 32 33 c 33 34 c 34 35 c ....... arguments d'entree ....... 35 36 c 36 REAL yzoomdeg, grossism,dzoom,tau , deltay 37 REAL yzoomdeg, grossism,dzoom,tau 38 c ( rentres par run.def ) 37 39 38 40 c ....... arguments de sortie ....... … … 42 44 43 45 c 44 c ..... Champs locaux .....46 c ..... champs locaux ..... 45 47 c 46 48 47 REAl ylat(jjp1), yprim(jjp1) 48 REAL yuv 49 REAL ytild(0:nmax2) 50 REAL fhyp(0:nmax),ffdx(0:nmax),beta,Ytprim(0:nmax2) 51 SAVE Ytprim, ytild,Yf 52 REAL Yf(0:nmax2),yypr(0:nmax2) 53 REAL yvrai(jjp1), yprimm(jjp1),ylatt(jjp1) 54 REAL pi,depi,pis2,epsilon,yzoom 55 REAL yo1,yi,ylon2,fxm,ymoy,yint,Yprimin 56 REAL ypn,deply,y00 49 REAL*8 ylat(jjp1), yprim(jjp1) 50 REAL*8 yuv 51 REAL*8 yt(0:nmax2) 52 REAL*8 fhyp(0:nmax2),beta,Ytprim(0:nmax2),fxm(0:nmax2) 53 SAVE Ytprim, yt,Yf 54 REAL*8 Yf(0:nmax2),yypr(0:nmax2) 55 REAL*8 yvrai(jjp1), yprimm(jjp1),ylatt(jjp1) 56 REAL*8 pi,depi,pis2,epsilon,y0,pisjm 57 REAL*8 yo1,yi,ylon2,ymoy,Yprimin,champmin,champmax 58 REAL*8 yfi,Yf1,ffdy 59 REAL*8 ypn,deply,y00 57 60 SAVE y00, deply 58 61 … … 60 63 INTEGER jpn,jjpn 61 64 SAVE jpn 62 65 REAL*8 a0,a1,a2,a3,yi2,heavyy0,heavyy0m 66 REAL*8 fa(0:nmax2),fb(0:nmax2) 67 REAL y0min,y0max 68 69 REAL*8 heavyside 70 EXTERNAL heavyside 63 71 64 72 pi = 2. * ASIN(1.) 65 73 depi = 2. * pi 66 74 pis2 = pi/2. 67 epsilon = 1.e-6 68 yzoom = yzoomdeg * pi/180. 69 70 75 pisjm = pi/ FLOAT(jjm) 76 epsilon = 1.e-3 77 y0 = yzoomdeg * pi/180. 78 79 IF( dzoom.LT.1.) THEN 80 dzoom = dzoom * pi 81 ELSEIF( dzoom.LT. 12. ) THEN 82 WRITE(6,*) ' Le param. dzoomy pour fyhyp est trop petit ! L aug 83 ,menter et relancer ! ' 84 STOP 1 85 ELSE 86 dzoom = dzoom * pi/180. 87 ENDIF 88 89 WRITE(6,18) 90 WRITE(6,*) ' yzoom( rad.),grossism,tau,dzoom (radians)' 91 WRITE(6,24) y0,grossism,tau,dzoom 71 92 72 93 DO i = 0, nmax2 73 ytild(i) = FLOAT(i) /nmax2 74 IF( ytild(i).EQ.0.5 ) ytild(i) = ytild(i) + 1.e-6 75 ENDDO 76 77 DO i = 1, nmax 78 fhyp(i) = TANH ( ( ytild(i) - 0.5*(1.- dzoom) ) / 79 , ( tau * ytild(i) * ( 0.5 -ytild(i))) ) 80 ENDDO 81 82 fhyp( 0 ) = - 1. 83 fhyp( nmax ) = 1. 94 yt(i) = - pis2 + FLOAT(i)* pi /nmax2 95 ENDDO 96 97 heavyy0m = heavyside( -y0 ) 98 heavyy0 = heavyside( y0 ) 99 y0min = 2.*y0*heavyy0m - pis2 100 y0max = 2.*y0*heavyy0 + pis2 101 102 DO i = 0, nmax2 103 IF( yt(i).LT.y0 ) THEN 104 fa (i) = tau* (yt(i)-y0+dzoom/2. ) 105 fb(i) = (yt(i)-2.*y0*heavyy0m +pis2) * ( y0 - yt(i) ) 106 ELSEIF ( yt(i).GT.y0 ) THEN 107 fa(i) = tau *(y0-yt(i)+dzoom/2. ) 108 fb(i) = (2.*y0*heavyy0 -yt(i)+pis2) * ( yt(i) - y0 ) 109 ENDIF 110 111 IF( 200.* fb(i) .LT. - fa(i) ) THEN 112 fhyp ( i) = - 1. 113 ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN 114 fhyp ( i) = 1. 115 ELSE 116 fhyp(i) = TANH ( fa(i)/fb(i) ) 117 ENDIF 118 119 IF( yt(i).EQ.y0 ) fhyp(i) = 1. 120 IF(yt(i).EQ. y0min. OR.yt(i).EQ. y0max ) fhyp(i) = -1. 121 122 ENDDO 84 123 85 124 cc .... Calcul de beta .... 86 125 c 87 ffdx( 0 ) = 0. 88 89 DO i = 1, nmax 90 ymoy = 0.5 * ( ytild(i-1) + ytild( i ) ) 91 fxm = TANH ( ( ymoy - 0.5 * ( 1. - dzoom ) ) / 92 , ( tau * ymoy * ( 0.5 -ymoy)) ) 93 ffdx(i) = ffdx(i-1) + fxm * ( ytild(i) - ytild(i-1) ) 94 ENDDO 95 96 beta = ( grossism * ffdx(nmax) - 0.5 ) / ( ffdx(nmax) - 0.5 ) 126 ffdy = 0. 127 128 DO i = 1, nmax2 129 ymoy = 0.5 * ( yt(i-1) + yt( i ) ) 130 IF( ymoy.LT.y0 ) THEN 131 fa(i)= tau * ( ymoy-y0+dzoom/2.) 132 fb(i) = (ymoy-2.*y0*heavyy0m +pis2) * ( y0 - ymoy ) 133 ELSEIF ( ymoy.GT.y0 ) THEN 134 fa(i)= tau * ( y0-ymoy+dzoom/2. ) 135 fb(i) = (2.*y0*heavyy0 -ymoy+pis2) * ( ymoy - y0 ) 136 ENDIF 137 138 IF( 200.* fb(i) .LT. - fa(i) ) THEN 139 fxm ( i) = - 1. 140 ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN 141 fxm ( i) = 1. 142 ELSE 143 fxm(i) = TANH ( fa(i)/fb(i) ) 144 ENDIF 145 IF( ymoy.EQ.y0 ) fxm(i) = 1. 146 IF (ymoy.EQ. y0min. OR.yt(i).EQ. y0max ) fxm(i) = -1. 147 ffdy = ffdy + fxm(i) * ( yt(i) - yt(i-1) ) 148 149 ENDDO 150 151 beta = ( grossism * ffdy - pi ) / ( ffdy - pi ) 152 153 IF( 2.*beta - grossism.LE. 0.) THEN 154 155 WRITE(6,*) ' ** Attention ! La valeur beta calculee dans la rou 156 ,tine fyhyp est mauvaise ! ' 157 WRITE(6,*)'Modifier les valeurs de grossismy ,tauy ou dzoomy', 158 , ' et relancer ! *** ' 159 CALL ABORT 160 161 ENDIF 97 162 c 98 163 c ..... calcul de Ytprim ..... 99 164 c 100 165 101 DO i = 0, nmax 166 DO i = 0, nmax2 102 167 Ytprim(i) = beta + ( grossism - beta ) * fhyp(i) 103 168 ENDDO 104 c105 DO i = 0, nmax106 Ytprim( nmax2 - i ) = Ytprim( i )107 ENDDO108 c109 169 110 170 c ..... Calcul de Yf ........ 111 171 112 Yf(0) = 0. 113 DO i = 1, nmax 114 ymoy = 0.5 * ( ytild(i-1) + ytild( i ) ) 115 fxm = TANH ( ( ymoy - 0.5 * ( 1. - dzoom ) ) / 116 , ( tau * ymoy * ( 0.5 -ymoy)) ) 117 yypr(i) = beta + ( grossism - beta ) * fxm 118 ENDDO 119 120 DO i = 1,nmax 121 yypr(nmax2-i+1) = yypr(i) 122 ENDDO 123 124 DO i=1,nmax2 125 Yf(i) = Yf(i-1) + yypr(i) * ( ytild(i) - ytild(i-1) ) 126 ENDDO 127 c 128 c 172 Yf(0) = - pis2 173 DO i = 1, nmax2 174 yypr(i) = beta + ( grossism - beta ) * fxm(i) 175 ENDDO 176 177 DO i=1,nmax2 178 Yf(i) = Yf(i-1) + yypr(i) * ( yt(i) - yt(i-1) ) 179 ENDDO 129 180 130 181 c **************************************************************** … … 133 184 c ..... yuv = 0.5 si calcul des latitudes aux pts. V ..... 134 185 c 186 WRITE(6,18) 135 187 c 136 188 DO 5000 ik = 1,4 … … 149 201 jlat = jjm 150 202 ENDIF 151 152 c 203 c 204 yo1 = 0. 153 205 DO 1500 j = 1,jlat 154 155 ylon2 = ( FLOAT(j) + yuv -1.) / FLOAT(jjm)156 157 206 yo1 = 0. 158 yi = ylon2 159 160 c 161 DO 500 iter = 1,300 162 207 ylon2 = - pis2 + pisjm * ( FLOAT(j) + yuv -1.) 208 yfi = ylon2 209 c 163 210 DO 250 it = nmax2,0,-1 164 IF( y i.GE.ytild(it)) GO TO 350211 IF( yfi.GE.Yf(it)) GO TO 350 165 212 250 CONTINUE 166 167 213 it = 0 168 yi = ytild(it)169 170 214 350 CONTINUE 171 215 216 yi = yt(it) 172 217 IF(it.EQ.nmax2) THEN 173 218 it = nmax2 -1 174 Yf(it+1) = 1.219 Yf(it+1) = pis2 175 220 ENDIF 176 221 c ................................................................. … … 179 224 c ................................................................. 180 225 181 yint = ( Yf(it+1)-Yf(it) ) / ( ytild(it+1)-ytild(it) ) * 182 + ( yi-ytild(it) ) + Yf(it) 183 Yprimin = ( Ytprim(it+1)-Ytprim(it) )/ ( ytild(it+1)-ytild(it) ) * 184 + ( yi-ytild(it) ) + Ytprim(it) 185 yi = yi - (yint-ylon2)/Yprimin 186 187 IF( ABS(yi-yo1).LE.epsilon) GO TO 550 188 yo1 = yi 189 c 226 CALL coefpoly ( Yf(it),Yf(it+1),Ytprim(it), Ytprim(it+1), 227 , yt(it),yt(it+1) , a0,a1,a2,a3 ) 228 229 Yf1 = Yf(it) 230 Yprimin = a1 + 2.* a2 * yi + 3.*a3 * yi *yi 231 232 DO 500 iter = 1,300 233 yi = yi - ( Yf1 - yfi )/ Yprimin 234 235 IF( ABS(yi-yo1).LE.epsilon) GO TO 550 236 yo1 = yi 237 yi2 = yi * yi 238 Yf1 = a0 + a1 * yi + a2 * yi2 + a3 * yi2 * yi 239 Yprimin = a1 + 2.* a2 * yi + 3.* a3 * yi2 190 240 500 CONTINUE 191 PRINT *,' *** PAS DE SOLUTION ****',j,ylon2,iter192 STOP 4241 WRITE(6,*) ' Pas de solution ***** ',j,ylon2,iter 242 STOP 2 193 243 550 CONTINUE 194 195 yprim(j) = pi /( FLOAT(jjm) * Yprimin) 196 yvrai(j) = pi * (yi - 0.5) + yzoom 244 c 245 Yprimin = a1 + 2.* a2 * yi + 3.* a3 * yi* yi 246 yprim(j) = pi / ( jjm * Yprimin ) 247 yvrai(j) = yi 197 248 198 249 1500 CONTINUE 199 200 cc print *,' LAT avant reorgan '201 cc print 68,(yyvrai(j),j=1,jlat)202 250 203 251 DO j = 1, jlat -1 204 252 IF( yvrai(j+1). LT. yvrai(j) ) THEN 205 PRINT *,' PBS. avec rlat(',j+1,' plus petit que rlat(',j, 206 , ')' 207 STOP 208 ENDIF 209 ENDDO 210 211 PRINT 18 212 PRINT *,'Reorganisation des latitudes pour avoir entre - pi/2 ', 213 , ' et pi/2 ' 214 c 215 253 WRITE(6,*) ' PBS. avec rlat(',j+1,') plus petit que rlat(',j, 254 , ')' 255 STOP 3 256 ENDIF 257 ENDDO 258 259 WRITE(6,*) 'Reorganisation des latitudes pour avoir entre - pi/2' 260 , ,' et pi/2 ' 261 c 216 262 IF( ik.EQ.1 ) THEN 217 ypn = pis2 - deltay * pi/180.263 ypn = pis2 218 264 DO j = jlat,1,-1 219 265 IF( yvrai(j).LE. ypn ) GO TO 1502 … … 239 285 ENDDO 240 286 241 242 243 287 c *********** Fin de la reorganisation ************* 244 288 c 245 289 1600 CONTINUE 246 247 248 290 249 291 DO j = 1, jlat … … 256 298 ENDDO 257 299 258 259 300 IF( ik.EQ.1 ) THEN 260 PRINT 18 261 PRINT *, ' YLAT en U apres ( en deg. ) ' 262 PRINT 68,(yvrai(j),j=1,jlat) 263 PRINT *,' YPRIM ' 264 PRINT 68,( yprim(j),j=1,jlat) 301 c WRITE(6,18) 302 c WRITE(6,*) ' YLAT en U apres ( en deg. ) ' 303 c WRITE(6,68) (yvrai(j),j=1,jlat) 304 cc WRITE(6,*) ' YPRIM ' 305 cc WRITE(6,445) ( yprim(j),j=1,jlat) 306 265 307 DO j = 1, jlat 266 308 rrlatu(j) = ylat( j ) 267 309 yyprimu(j) = yprim( j ) 268 310 ENDDO 269 c 311 270 312 ELSE IF ( ik.EQ. 2 ) THEN 271 PRINT 18 272 PRINT *, ' YLAT en V apres ( en deg. ) ' 273 PRINT 68,(yvrai(j),j=1,jlat) 274 PRINT *,' YPRIM ' 275 PRINT 68,( yprim(j),j=1,jlat) 313 c WRITE(6,18) 314 c WRITE(6,*) ' YLAT en V apres ( en deg. ) ' 315 c WRITE(6,68) (yvrai(j),j=1,jlat) 316 cc WRITE(6,*)' YPRIM ' 317 cc WRITE(6,445) ( yprim(j),j=1,jlat) 318 276 319 DO j = 1, jlat 277 320 rrlatv(j) = ylat( j ) 278 321 yyprimv(j) = yprim( j ) 279 322 ENDDO 280 c 323 281 324 ELSE IF ( ik.EQ. 3 ) THEN 282 PRINT 18 283 PRINT *, ' YLAT en U + 0.75 apres ( en deg. ) ' 284 PRINT 68,(yvrai(j),j=1,jlat) 285 PRINT *,' YPRIM ' 286 PRINT 68,( yprim(j),j=1,jlat) 325 c WRITE(6,18) 326 c WRITE(6,*) ' YLAT en U + 0.75 apres ( en deg. ) ' 327 c WRITE(6,68) (yvrai(j),j=1,jlat) 328 cc WRITE(6,*) ' YPRIM ' 329 cc WRITE(6,445) ( yprim(j),j=1,jlat) 330 287 331 DO j = 1, jlat 288 332 rlatu2(j) = ylat( j ) … … 291 335 292 336 ELSE IF ( ik.EQ. 4 ) THEN 293 PRINT 18 294 PRINT *, ' YLAT en U + 0.25 apres ( en deg. ) ' 295 PRINT 68,(yvrai(j),j=1,jlat) 296 PRINT *,' YPRIM ' 297 PRINT 68,( yprim(j),j=1,jlat) 337 c WRITE(6,18) 338 c WRITE(6,*) ' YLAT en U + 0.25 apres ( en deg. ) ' 339 c WRITE(6,68)(yvrai(j),j=1,jlat) 340 cc WRITE(6,*) ' YPRIM ' 341 cc WRITE(6,68) ( yprim(j),j=1,jlat) 342 298 343 DO j = 1, jlat 299 344 rlatu1(j) = ylat( j ) 300 345 yprimu1(j) = yprim( j ) 301 346 ENDDO 347 302 348 ENDIF 303 349 304 350 5000 CONTINUE 305 351 c 352 WRITE(6,18) 353 c 306 354 c ..... fin de la boucle do 5000 ..... 307 355 356 DO j = 1, jjm 357 ylat(j) = rrlatu(j) - rrlatu(j+1) 358 ENDDO 359 champmin = 1.e12 360 champmax = -1.e12 361 DO j = 1, jjm 362 champmin = MIN( champmin, ylat(j) ) 363 champmax = MAX( champmax, ylat(j) ) 364 ENDDO 365 champmin = champmin * 180./pi 366 champmax = champmax * 180./pi 367 368 24 FORMAT(2x,'Parametres yzoom,gross,tau ,dzoom pour fyhyp ',4f8.3) 308 369 18 FORMAT(/) 309 370 68 FORMAT(1x,7f9.2) -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/gcm.F
r228 r232 22 22 c 23 23 c======================================================================= 24 25 c ... Dans inigeom , nouveaux calculs pour les elongations cu , cv 26 c et possibilite d'appeler une fonction f(y) a derivee tangente 27 c hyperbolique a la place de la fonction a derivee sinusoidale. 28 29 c ... Possibilite de choisir le shema de Van-leer pour l'advection de 30 c q , en faisant iadv = 3 dans traceur (29/04/97) . 24 c 25 c ... Dans inigeom , nouveaux calculs pour les elongations cu , cv 26 c et possibilite d'appeler une fonction f(y) a derivee tangente 27 c hyperbolique a la place de la fonction a derivee sinusoidale. 28 29 c ... Possibilite de choisir le shema de Van-leer pour l'advection de 30 c q , en faisant iadv = 3 dans traceur (29/04/97) . 31 c 32 c Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99) 31 33 c 32 34 c----------------------------------------------------------------------- … … 135 137 LOGICAL true_calendar 136 138 PARAMETER (true_calendar = .false.) 139 C Run nudge 140 LOGICAL ok_nudge 141 PARAMETER (ok_nudge = .false.) 137 142 138 143 c----------------------------------------------------------------------- … … 160 165 c iadv = 2 shema amont 161 166 c iadv = 3 shema Van-leer 167 c iadv = 4 schema Van-leer + humidite specifique 168 c Modif F.Codron 162 169 c 163 170 c dans le tableau q(ij,l,iq) , iq = 1 pour l'eau vapeur … … 171 178 ENDDO 172 179 c 173 DO iq = 1, nqmx 180 IF( iadv(1).EQ.1 ) PRINT *,' Choix du shema humidite specifique' 181 * ,' pour la vapeur d''eau' 182 IF( iadv(1).EQ.2 ) PRINT *,' Choix du shema amont',' pour la' 183 * ,' vapeur d''eau ' 184 IF( iadv(1).EQ.3 ) PRINT *,' Choix du shema Van-Leer ',' pour' 185 * ,'la vapeur d''eau' 186 IF( iadv(1).EQ.4 ) PRINT *,' Choix du shema Van-Leer + humidite' 187 * ,' specifique pour la vapeur d''eau' 188 c 189 IF( iadv(1).LE.0.OR.iadv(1).GT.4 ) THEN 190 PRINT *,' Erreur dans le choix de iadv (1).Corriger et repasser 191 * , car iadv(1) = ', iadv(1) 192 CALL ABORT 193 ENDIF 194 195 DO iq = 2, nqmx 174 196 IF( iadv(iq).EQ.1 ) PRINT *,' Choix du shema humidite specifique' 175 197 * ,' pour le traceur no ', iq … … 178 200 IF( iadv(iq).EQ.3 ) PRINT *,' Choix du shema Van-Leer ',' pour' 179 201 * ,'le traceur no ', iq 180 IF( iadv(iq).LE.0.OR.iadv(iq).GT.3 ) THEN 202 203 IF( iadv(iq).EQ.4 ) THEN 204 PRINT *,' Le shema Van-Leer + humidite specifique ', 205 * ' est uniquement pour la vapeur d eau .' 206 PRINT *,' Corriger iadv( ',iq, ') et repasser ! ' 207 CALL ABORT 208 ENDIF 209 210 IF( iadv(iq).LE.0.OR.iadv(iq).GT.4 ) THEN 181 211 PRINT *,' Erreur dans le choix de iadv . Corriger et repasser 182 212 * . ' 183 STOP213 CALL ABORT 184 214 ENDIF 185 215 ENDDO … … 188 218 numvanle = nqmx + 1 189 219 DO iq = 1, nqmx 190 IF( iadv(iq).EQ.3.AND.first ) THEN220 IF((iadv(iq).EQ.3.OR.iadv(iq).EQ.4).AND.first ) THEN 191 221 numvanle = iq 192 222 first = .FALSE. … … 195 225 c 196 226 DO iq = 1, nqmx 197 IF( iadv(iq).NE.3.AND.iq.GT.numvanle )THEN227 IF( (iadv(iq).NE.3.AND.iadv(iq).NE.4).AND.iq.GT.numvanle ) THEN 198 228 PRINT *,' Il y a discontinuite dans le choix du shema de ', 199 229 * 'Van-leer pour les traceurs . Corriger et repasser . ' 200 STOP201 202 IF( iadv(iq).LT.1.OR.iadv(iq).GT. 3) THEN230 CALL ABORT 231 ENDIF 232 IF( iadv(iq).LT.1.OR.iadv(iq).GT.4 ) THEN 203 233 PRINT *,' Le choix de iadv est errone pour le traceur ', 204 234 * iq … … 297 327 298 328 1 CONTINUE 299 c call nudge(itau,ucov,vcov,teta,masse,ps) 329 330 if (ok_nudge) then 331 call nudge(itau,ucov,vcov,teta,masse,ps) 332 endif 300 333 c 301 334 c IF( MOD( itau, 10* day_step ).EQ.0 ) THEN … … 379 412 c 380 413 CALL vanleer(numvanle,iapp_tracvl,nqmx,q,pbaru,pbarv, 381 * p, masse, dq ) 414 * p, masse, dq, iadv(1), teta, pk ) 415 c 416 c ... Modif F.Codron .... 382 417 c 383 418 ENDIF … … 389 424 390 425 CALL fluxstokenc(pbaru,pbarv,masse,teta,phi,phis, 391 . time_step, itau,fluxid, fluxvid,fluxdid ) 426 . time_step, itau) 427 392 428 393 429 ENDIF -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/inigeom.F
r2 r232 1 c 2 c $Header$ 3 c 1 4 SUBROUTINE inigeom 2 5 c 3 6 c Auteur : P. Le Van 4 c ..................... 5 c 6 c ............ Version du 20/12/98 ........................ 7 c 8 c ............ Version du 01/04/2001 ........................ 7 9 c 8 10 c Calcul des elongations cuij1,.cuij4 , cvij1,..cvij4 aux memes en- 9 11 c endroits que les aires aireij1,..aireij4 . 12 10 13 c Choix entre f(y) a derivee sinusoid. ou a derivee tangente hyperbol. 11 14 c 12 15 c 13 16 IMPLICIT NONE 14 c15 REAL deltay, tauy, taux16 PARAMETER ( deltay = 0. , tauy = 1. , taux = 1. )17 c18 c deltay est ( en degres ) le deplacement eventuel en Y du zoom19 cc taux et tauy sont les raideurs du zoom20 c21 17 c 22 18 #include "dimensions.h" … … 50 46 SAVE rlonm025,xprimm025,rlonp025,xprimp025 51 47 52 53 54 c----------------------------------------------------------------------55 48 REAL SSUM 56 49 EXTERNAL SSUM 57 c58 50 c 59 51 c … … 62 54 c - calcul des coeff. ( cu, cv , 1./cu**2, 1./cv**2 ) - 63 55 c - - 64 c ------------------------------------------------------------------65 56 c ------------------------------------------------------------------ 66 57 c … … 168 159 c 169 160 c 170 PRINT 3161 WRITE(6,3) 171 162 3 FORMAT( // 10x,' .... INIGEOM date du 01/06/98 ..... ', 172 163 * //5x,' Calcul des elongations cu et cv comme sommes des 4 ' / … … 191 182 ENDIF 192 183 193 PRINT *,' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis,184 WRITE(6,*) ' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis, 194 185 * nitergdiv,nitergrot,niterh 195 186 c 196 187 pi = 2.* ASIN(1.) 197 188 c 198 PRINT 990189 WRITE(6,990) 199 190 200 191 c ---------------------------------------------------------------- … … 205 196 IF( ysinus ) THEN 206 197 c 207 PRINT *,' *** Inigeom , Y = Sinus ( Latitude ) *** '198 WRITE(6,*) ' *** Inigeom , Y = Sinus ( Latitude ) *** ' 208 199 c 209 200 c .... utilisation de f(x,y ) avec y = sinus de la latitude ..... … … 215 206 ELSE 216 207 c 217 PRINT *,'*** Inigeom , Y = Latitude , der. sinusoid . ***'208 WRITE(6,*) '*** Inigeom , Y = Latitude , der. sinusoid . ***' 218 209 219 210 c .... utilisation de f(x,y) a tangente sinusoidale , y etant la latit. ... … … 267 258 ELSE 268 259 c 269 c .... utilisation de fxyhyper , f(x,y) a derivee tangente hyperbol.260 c .... Utilisation de fxyhyper , f(x,y) a derivee tangente hyperbol. 270 261 c ..................................................................... 271 262 272 PRINT *,'*** Inigeom , Y = Latitude , der.tg. hyperbolique ***'273 274 CALL fxyhyper( clat, grossismy, dzoomy, tauy , deltay ,275 , clon, grossismx, dzoomx, taux,263 WRITE(6,*)'*** Inigeom , Y = Latitude , der.tg. hyperbolique ***' 264 265 CALL fxyhyper( clat, grossismy, dzoomy, tauy , 266 , clon, grossismx, dzoomx, taux , 276 267 , rlatu,yprimu,rlatv, yprimv,rlatu1, yprimu1,rlatu2,yprimu2 , 277 268 , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025 ) … … 387 378 c 388 379 IF ( j. eq. jjp1 ) THEN 389 390 380 yprp = yprimu2(j-1) 391 381 rlatp = rlatu2 (j-1) 392 cc yprp = fyprim( FLOAT(j) - 0.25 )393 cc rlatp = fy ( FLOAT(j) - 0.25 )382 ccc yprp = fyprim( FLOAT(j) - 0.25 ) 383 ccc rlatp = fy ( FLOAT(j) - 0.25 ) 394 384 c 395 385 coslatp = COS( rlatp ) … … 425 415 rlatm = rlatu1 ( j ) 426 416 yprm = yprimu1( j ) 427 c rlatp = fy ( FLOAT(j) - 0.25 )428 c yprp = fyprim( FLOAT(j) - 0.25 )429 c rlatm = fy ( FLOAT(j) + 0.25 )430 c yprm = fyprim( FLOAT(j) + 0.25 )417 cc rlatp = fy ( FLOAT(j) - 0.25 ) 418 cc yprp = fyprim( FLOAT(j) - 0.25 ) 419 cc rlatm = fy ( FLOAT(j) + 0.25 ) 420 cc yprm = fyprim( FLOAT(j) + 0.25 ) 431 421 432 422 coslatm = COS( rlatm ) … … 490 480 36 CONTINUE 491 481 c 492 c .... Modif P. Le Van ( 4/07/96 ) .....493 482 c 494 483 aire (iip1,j) = aire (1,j) … … 620 609 aiuscv2gam(iip1,j) = aiuscv2gam(1,j) 621 610 ENDDO 622 c 611 623 612 c 624 613 c calcul des aires aux poles : … … 666 655 c----------------------------------------------------------------------- 667 656 c 668 PRINT *,' INIGEOM RLONV ' 657 WRITE(6,*) ' *** Coordonnees de la grille *** ' 658 WRITE(6,995) 659 c 660 WRITE(6,*) ' LONGITUDES aux pts. V ( degres ) ' 661 WRITE(6,995) 669 662 DO i=1,iip1 670 663 rlonvv(i) = rlonv(i)*180./pi 671 664 ENDDO 672 PRINT 400,rlonvv 673 c 674 PRINT *,' RLATV ' 665 WRITE(6,400) rlonvv 666 c 667 WRITE(6,995) 668 WRITE(6,*) ' LATITUDES aux pts. V ( degres ) ' 669 WRITE(6,995) 675 670 DO i=1,jjm 676 671 rlatuu(i)=rlatv(i)*180./pi 677 672 ENDDO 678 PRINT 400,(rlatuu(i),i=1,jjm)673 WRITE(6,400) (rlatuu(i),i=1,jjm) 679 674 c 680 675 DO i=1,iip1 681 676 rlonvv(i)=rlonu(i)*180./pi 682 677 ENDDO 683 PRINT *,' RLONU ' 684 PRINT 400,rlonvv 685 c 686 PRINT *,' RLATU ' 678 WRITE(6,995) 679 WRITE(6,*) ' LONGITUDES aux pts. U ( degres ) ' 680 WRITE(6,995) 681 WRITE(6,400) rlonvv 682 WRITE(6,995) 683 684 WRITE(6,*) ' LATITUDES aux pts. U ( degres ) ' 685 WRITE(6,995) 687 686 DO i=1,jjp1 688 687 rlatuu(i)=rlatu(i)*180./pi 689 688 ENDDO 690 PRINT 400,(rlatuu(i),i=1,jjp1) 691 c 689 WRITE(6,400) (rlatuu(i),i=1,jjp1) 690 WRITE(6,995) 691 c 692 444 format(f10.3,f6.0) 692 693 400 FORMAT(1x,8f8.2) 693 694 990 FORMAT(//) 695 995 FORMAT(/) 694 696 c 695 697 RETURN -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/paramet.h
r2 r232 7 7 INTEGER jcfil,jcfllm 8 8 9 PARAMETER( iip1= iim+1, iip2= iim+2, iip3= iim+3, jjp1= jjm+1 ) 9 PARAMETER( iip1= iim+1-1/iim,iip2=iim+2,iip3=iim+3 10 s ,jjp1=jjm+1-1/jjm) 10 11 PARAMETER( llmp1 = llm+1, llmp2 = llm+2, llmm1 = llm-1 ) 11 12 PARAMETER( kftd = iim/2 -ndm ) -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/physdem.F
r115 r232 527 527 ierr = NF_PUT_VAR_REAL (nid,nvarid,zstd) 528 528 #endif 529 c530 529 ierr = NF_REDEF (nid) 531 530 #ifdef NC_DOUBLE … … 540 539 ierr = NF_PUT_VAR_REAL (nid,nvarid,zsig) 541 540 #endif 542 c543 541 ierr = NF_REDEF (nid) 544 542 #ifdef NC_DOUBLE … … 553 551 ierr = NF_PUT_VAR_REAL (nid,nvarid,zgam) 554 552 #endif 555 c556 553 ierr = NF_REDEF (nid) 557 554 #ifdef NC_DOUBLE … … 566 563 ierr = NF_PUT_VAR_REAL (nid,nvarid,zthe) 567 564 #endif 568 c569 565 ierr = NF_REDEF (nid) 570 566 #ifdef NC_DOUBLE … … 579 575 ierr = NF_PUT_VAR_REAL (nid,nvarid,zpic) 580 576 #endif 581 c582 577 ierr = NF_REDEF (nid) 583 578 #ifdef NC_DOUBLE … … 592 587 ierr = NF_PUT_VAR_REAL (nid,nvarid,zval) 593 588 #endif 594 c595 589 ierr = NF_REDEF (nid) 596 590 #ifdef NC_DOUBLE -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/serre.h
r2 r232 1 c 2 c $Header$ 3 c 1 4 c..include serre.h 2 5 c 3 6 REAL clon,clat,transx,transy,alphax,alphay,pxo,pyo, 4 , grossismx, grossismy, dzoomx, dzoomy 7 , grossismx, grossismy, dzoomx, dzoomy,taux,tauy 5 8 COMMON/serre/clon,clat,transx,transy,alphax,alphay,pxo,pyo , 6 , grossismx, grossismy, dzoomx, dzoomy 9 , grossismx, grossismy, dzoomx, dzoomy,taux,tauy -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/tracvl.F
r2 r232 1 1 SUBROUTINE tracvl(numvanle,iapp_tracvl,nq,pbaru,pbarv , 2 * p, masse , q, iapptrac)2 * p, masse , q, iapptrac, iadv1, teta, pk ) 3 3 c 4 4 c Auteur : F. Hourdin … … 6 6 c 7 7 ccc .. Modif. P. Le Van ( 20/12/97 ) ... 8 c F. Codron (10/99) 9 8 10 c 9 11 IMPLICIT NONE … … 15 17 #include "comgeom.h" 16 18 17 INTEGER nq,iapp_tracvl 19 c .... Arguments .... 20 c 21 INTEGER numvanle, nq, iapp_tracvl, iapptrac, iadv1 18 22 19 23 REAL pbaru(ip1jmp1,llm),pbarv(ip1jm,llm) 20 24 REAL q(ip1jmp1,llm,nq),masse(ip1jmp1,llm) 21 REAL p( ip1jmp1,llmp1 ) 25 REAL p( ip1jmp1,llmp1 ),teta(ip1jmp1,llm) 26 REAL pk(ip1jmp1,llm) 22 27 28 c .... var. locales ..... 29 c 23 30 REAL pbaruc(ip1jmp1,llm),pbarvc(ip1jm,llm) 24 31 REAL massem(ip1jmp1,llm),zdp(ip1jmp1) … … 26 33 REAL pbarug(ip1jmp1,llm),pbarvg(ip1jm,llm),wg(ip1jmp1,llm) 27 34 28 INTEGER iapptrac29 35 30 INTEGER iadvtr, numvan le36 INTEGER iadvtr, numvan 31 37 INTEGER ij,l,iq 32 38 REAL zdpmin, zdpmax 33 39 EXTERNAL minmax 34 35 SAVE iadvtr, massem,pbaruc,pbarvc 40 SAVE iadvtr, massem, pbaruc, pbarvc, numvan 36 41 DATA iadvtr/0/ 42 43 numvan = numvanle 37 44 38 45 IF(iadvtr.EQ.0) THEN … … 99 106 100 107 c Advection proprement dite. 101 DO iq = numvanle, nq 108 c 109 c test sur iadv1 pour le schema de vapeur d'eau 110 c 111 IF (numvanle.EQ.1.AND.iadv1.EQ.4) THEN 112 CALL vlspltqs( q(1,1,1), 2., massem, wg , 113 * pbarug,pbarvg,dtvr,p,pk,teta ) 114 numvan = 2 115 ENDIF 116 117 DO iq = numvan, nq 102 118 CALL vlsplt( q(1,1,iq), 2. ,massem,wg,pbarug,pbarvg,dtvr ) 103 119 ENDDO -
LMDZ.3.3/branches/rel-LF/libf/dyn3d/vanleer.F
r2 r232 1 1 SUBROUTINE vanleer(numvanle,iapp_tracvl,nq,q,pbaru,pbarv , 2 * p ,masse, dq)2 * p ,masse, dq , iadv1, teta, pk ) 3 3 c 4 4 IMPLICIT NONE 5 5 c 6 c Auteurs: F.Hourdin , P.Le Van, F.Forget 6 c Auteurs: F.Hourdin , P.Le Van, F.Forget, F.Codron 7 c 8 c F.Codron (10/99) : ajout humidite specifique pour eau vapeur 7 9 c======================================================================= 8 10 c … … 18 20 c Arguments: 19 21 c ---------- 20 INTEGER nq, numvanle,iapp_tracvl22 INTEGER nq, numvanle, iapp_tracvl, iadv1 21 23 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm),masse(ip1jmp1,llm) 22 24 REAL p( ip1jmp1,llmp1),q( ip1jmp1,llm,nq),dq( ip1jmp1,llm,nq ) 23 25 REAL teta( ip1jmp1,llm),pk( ip1jmp1,llm) 24 26 c .................................................................. 25 27 c … … 28 30 c numvanle est le numero du premier traceur qui appelle le 29 31 c shema de Van-Leer ( 1<= numvanle <= nqmx ) . 32 c si numvanle=1, iadv1=3 si Van-Leer seul, iadv1=4 si 33 c Van-Leer+humidite specifique. 30 34 c .................................................................. 31 35 c … … 61 65 62 66 CALL tracvl( numvanle,iapp_tracvl,nq,pbaru,pbarv,p , masse,q , 63 * iapptrac)67 * iapptrac, iadv1, teta ,pk ) 64 68 65 69 IF( numvanle.EQ.1 ) THEN
Note: See TracChangeset
for help on using the changeset viewer.