Changeset 357 for LMDZ.3.3/trunk/libf
- Timestamp:
- May 7, 2002, 3:04:11 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ.3.3/trunk/libf/dyn3d/vlsplt.F
r2 r357 26 26 c ---------- 27 27 REAL masse(ip1jmp1,llm),pente_max 28 c REAL masse(iip1,jjp1,llm),pente_max 28 29 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 29 30 REAL q(ip1jmp1,llm) 31 c REAL q(iip1,jjp1,llm) 30 32 REAL w(ip1jmp1,llm),pdt 31 33 c … … 33 35 c --------- 34 36 c 35 INTEGER ij,l 36 c 37 REAL zm(ip1jmp1,llm) 37 INTEGER i,ij,l,j,ii 38 INTEGER ijlqmin,iqmin,jqmin,lqmin 39 c 40 REAL zm(ip1jmp1,llm),newmasse 38 41 REAL mu(ip1jmp1,llm) 39 42 REAL mv(ip1jm,llm) 40 43 REAL mw(ip1jmp1,llm+1) 41 REAL zq(ip1jmp1,llm) 42 REAL temps1,temps2,temps3 44 REAL zq(ip1jmp1,llm),zz 45 REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm) 46 REAL second,temps0,temps1,temps2,temps3 47 REAL ztemps1,ztemps2,ztemps3 43 48 REAL zzpbar, zzw 44 49 LOGICAL testcpu 45 50 SAVE testcpu 46 51 SAVE temps1,temps2,temps3 52 INTEGER iminn,imaxx 47 53 48 54 REAL qmin,qmax … … 51 57 DATA temps1,temps2,temps3/0.,0.,0./ 52 58 53 c PRINT*,'Debut vlsplt version debug sans vly'54 59 55 60 zzpbar = 0.5 * pdt … … 70 75 mw(ij,llm+1)=0. 71 76 ENDDO 72 77 73 78 CALL SCOPY(ijp1llm,q,1,zq,1) 74 79 CALL SCOPY(ijp1llm,masse,1,zm,1) 75 80 76 c call minmaxq(zq,qmin,qmax,'avant vlx ') 81 print*,'Entree vlx1' 82 c call minmaxq(zq,qmin,qmax,'avant vlx ') 77 83 call vlx(zq,pente_max,zm,mu) 78 79 80 c call minmaxq(zq,qmin,qmax,'avant vly ') 81 84 print*,'Sortie vlx1' 85 c call minmaxq(zq,qmin,qmax,'apres vlx1 ') 86 87 print*,'Entree vly1' 82 88 call vly(zq,pente_max,zm,mv) 83 84 85 c call minmaxq(zq,qmin,qmax,'avant vlz ') 86 89 c call minmaxq(zq,qmin,qmax,'apres vly1 ') 90 print*,'Sortie vly1' 87 91 call vlz(zq,pente_max,zm,mw) 88 89 90 c call minmaxq(zq,qmin,qmax,'avant vly ') 91 c call minmaxq(zm,qmin,qmax,'M avant vly ') 92 c call minmaxq(zq,qmin,qmax,'apres vlz ') 93 92 94 93 95 call vly(zq,pente_max,zm,mv) 94 95 96 c call minmaxq(zq,qmin,qmax,'avant vlx ') 97 c call minmaxq(zm,qmin,qmax,'M avant vlx ') 96 c call minmaxq(zq,qmin,qmax,'apres vly ') 97 98 98 99 99 call vlx(zq,pente_max,zm,mu) 100 101 c call minmaxq(zq,qmin,qmax,'apres vlx ') 102 c call minmaxq(zm,qmin,qmax,'M apres vlx ') 103 100 c call minmaxq(zq,qmin,qmax,'apres vlx2 ') 101 104 102 105 103 DO l=1,llm … … 115 113 END 116 114 SUBROUTINE vlx(q,pente_max,masse,u_m) 117 c 115 118 116 c Auteurs: P.Le Van, F.Hourdin, F.Forget 119 117 c … … 137 135 c ---------- 138 136 REAL masse(ip1jmp1,llm),pente_max 139 REAL u_m( ip1jmp1,llm ) 137 REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm) 140 138 REAL q(ip1jmp1,llm) 139 REAL w(ip1jmp1,llm) 141 140 c 142 141 c Local … … 147 146 c 148 147 REAL new_m,zu_m,zdum(ip1jmp1,llm) 149 REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)148 REAL sigu(ip1jmp1),dxq(ip1jmp1,llm),dxqu(ip1jmp1) 150 149 REAL zz(ip1jmp1) 151 150 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) 152 151 REAL u_mq(ip1jmp1,llm) 153 152 154 Logical first,testcpu153 Logical extremum,first,testcpu 155 154 SAVE first,testcpu 156 155 157 156 REAL SSUM 158 157 EXTERNAL SSUM 159 REAL temps1,temps2,temps3,temps4,temps5 160 SAVE temps1,temps2,temps3,temps4,temps5 161 158 REAL temps0,temps1,temps2,temps3,temps4,temps5,second 159 SAVE temps0,temps1,temps2,temps3,temps4,temps5 160 161 REAL z1,z2,z3 162 162 163 163 DATA first,testcpu/.true.,.false./ … … 176 176 177 177 IF (pente_max.gt.-1.e-5) THEN 178 c IF (pente_max.gt.10) THEN178 c IF (pente_max.gt.10) THEN 179 179 180 180 c calcul des pentes avec limitation, Van Leer scheme I: … … 230 230 231 231 ENDDO ! l=1,llm 232 print*,'Ok calcul des pentes' 232 233 233 234 ELSE ! (pente_max.lt.-1.e-5) … … 266 267 dxq(ij-iim,l)=dxq(ij,l) 267 268 ENDDO 268 269 269 DO ij=1,ip1jmp1 270 270 iadvplus(ij,l)=0 … … 273 273 ENDDO 274 274 275 print*,'Bouclage en iip1' 275 276 276 277 c calcul des flux a gauche et a droite … … 294 295 c on cumule le flux correspondant a toutes les mailles dont la masse 295 296 c au travers de la paroi pENDant le pas de temps. 297 print*,'Cumule ....' 298 296 299 DO l=1,llm 297 300 DO ij=iip2,ip1jm-1 301 c print*,'masse(',ij,')=',masse(ij,l) 298 302 IF (u_m(ij,l).gt.0.) THEN 299 303 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l) … … 306 310 ENDDO 307 311 #endif 308 309 312 c stop 313 314 c go to 9999 310 315 c detection des points ou on advecte plus que la masse de la 311 316 c maille … … 318 323 ENDDO 319 324 ENDDO 325 print*,'Ok test 1' 320 326 DO l=1,llm 321 327 DO ij=iip1+iip1,ip1jm,iip1 … … 323 329 ENDDO 324 330 ENDDO 325 331 print*,'Ok test 2' 326 332 327 333 … … 342 348 343 349 IF(n0.gt.1) THEN 344 cccPRINT*,'Nombre de points pour lesquels on advect plus que le'345 ccc& ,'contenu de la maille : ',n0350 PRINT*,'Nombre de points pour lesquels on advect plus que le' 351 & ,'contenu de la maille : ',n0 346 352 347 353 DO l=1,llm … … 395 401 ENDDO 396 402 ENDIF ! n0.gt.0 397 403 9999 continue 398 404 399 405 400 406 c bouclage en latitude 401 407 print*,'Avant bouclage en latitude' 402 408 DO l=1,llm 403 409 DO ij=iip1+iip1,ip1jm,iip1 … … 423 429 ENDDO 424 430 ENDDO 425 426 431 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) 427 432 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) … … 456 461 REAL masse(ip1jmp1,llm),pente_max 457 462 REAL masse_adv_v( ip1jm,llm) 458 REAL q(ip1jmp1,llm) 463 REAL q(ip1jmp1,llm), dq( ip1jmp1,llm) 459 464 c 460 465 c Local … … 464 469 c 465 470 REAL airej2,airejjm,airescb(iim),airesch(iim) 466 REAL dyq(ip1jmp1,llm),dyqv(ip1jm) 471 REAL dyq(ip1jmp1,llm),dyqv(ip1jm),zdvm(ip1jmp1,llm) 467 472 REAL adyqv(ip1jm),dyqmax(ip1jmp1) 468 473 REAL qbyv(ip1jm,llm) 469 474 470 REAL qpns,qpsn, dyn1,dys1,dyn2,dys2,newmasse,fn,fs475 REAL qpns,qpsn,apn,aps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs 471 476 c REAL newq,oldmasse 472 Logical first,testcpu473 REAL temps0,temps1,temps2,temps3,temps4,temps5 477 Logical extremum,first,testcpu 478 REAL temps0,temps1,temps2,temps3,temps4,temps5,second 474 479 SAVE temps0,temps1,temps2,temps3,temps4,temps5 475 480 SAVE first,testcpu 476 481 477 482 REAL convpn,convps,convmpn,convmps 483 real massepn,masseps,qpn,qps 478 484 REAL sinlon(iip1),sinlondlon(iip1) 479 485 REAL coslon(iip1),coslondlon(iip1) … … 506 512 507 513 c 508 514 PRINT*,'CALCUL EN LATITUDE' 509 515 510 516 DO l = 1, llm … … 565 571 c calcul des pentes limites aux poles 566 572 573 goto 8888 567 574 fn=1. 568 575 fs=1. … … 578 585 dyq(ij,l)=fn*dyq(ij,l) 579 586 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l) 587 ENDDO 588 8888 continue 589 DO ij=1,iip1 590 dyq(ij,l)=0. 591 dyq(ip1jm+ij,l)=0. 580 592 ENDDO 581 593 … … 682 694 ENDDO 683 695 c.-. ancienne version 684 convpn=SSUM(iim,qbyv(1,l),1)/apoln 685 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln 686 DO ij = 1,iip1 687 newmasse=masse(ij,l)+convmpn*aire(ij) 688 q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/ 689 & newmasse 690 masse(ij,l)=newmasse 691 ENDDO 692 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols 693 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols 694 DO ij = ip1jm+1,ip1jmp1 695 newmasse=masse(ij,l)+convmps*aire(ij) 696 q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/ 697 & newmasse 698 masse(ij,l)=newmasse 699 ENDDO 696 c convpn=SSUM(iim,qbyv(1,l),1)/apoln 697 c convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln 698 699 convpn=SSUM(iim,qbyv(1,l),1) 700 convmpn=ssum(iim,masse_adv_v(1,l),1) 701 massepn=ssum(iim,masse(1,l),1) 702 qpn=0. 703 do ij=1,iim 704 qpn=qpn+masse(ij,l)*q(ij,l) 705 enddo 706 qpn=(qpn+convpn)/(massepn+convmpn) 707 do ij=1,iip1 708 q(ij,l)=qpn 709 enddo 710 711 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols 712 c convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols 713 714 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) 715 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) 716 masseps=ssum(iim, masse(ip1jm+1,l),1) 717 qps=0. 718 do ij = ip1jm+1,ip1jmp1-1 719 qps=qps+masse(ij,l)*q(ij,l) 720 enddo 721 qps=(qps+convps)/(masseps+convmps) 722 do ij=ip1jm+1,ip1jmp1 723 q(ij,l)=qps 724 enddo 725 700 726 c.-. fin ancienne version 701 727 … … 852 878 RETURN 853 879 END 854 SUBROUTINE minmaxq(zq,qmin,qmax,comment) 880 c SUBROUTINE minmaxq(zq,qmin,qmax,comment) 881 c 882 c#include "dimensions.h" 883 c#include "paramet.h" 884 885 c CHARACTER*(*) comment 886 c real qmin,qmax 887 c real zq(ip1jmp1,llm) 888 889 c INTEGER jadrs(ip1jmp1), jbad, k, i 890 891 892 c DO k = 1, llm 893 c jbad = 0 894 c DO i = 1, ip1jmp1 895 c IF (zq(i,k).GT.qmax .OR. zq(i,k).LT.qmin) THEN 896 c jbad = jbad + 1 897 c jadrs(jbad) = i 898 c ENDIF 899 c ENDDO 900 c IF (jbad.GT.0) THEN 901 c PRINT*, comment 902 c DO i = 1, jbad 903 cc PRINT*, "i,k,zq=", jadrs(i),k,zq(jadrs(i),k) 904 c ENDDO 905 c ENDIF 906 c ENDDO 907 908 c return 909 c end 910 subroutine minmaxq(zq,qmin,qmax,comment) 855 911 856 912 #include "dimensions.h" 857 913 #include "paramet.h" 858 914 859 CHARACTER*(*)comment915 character*20 comment 860 916 real qmin,qmax 861 917 real zq(ip1jmp1,llm) 862 863 INTEGER jadrs(ip1jmp1), jbad, k, i 864 865 DO k = 1, llm 866 jbad = 0 867 DO i = 1, ip1jmp1 868 IF (zq(i,k).GT.qmax .OR. zq(i,k).LT.qmin) THEN 869 jbad = jbad + 1 870 jadrs(jbad) = i 871 ENDIF 872 ENDDO 873 IF (jbad.GT.0) THEN 874 PRINT*, comment 875 DO i = 1, jbad 876 cc PRINT*, "i,k,zq=", jadrs(i),k,zq(jadrs(i),k) 877 ENDDO 878 ENDIF 879 ENDDO 918 real zzq(iip1,jjp1,llm) 919 920 integer imin,jmin,lmin,ijlmin 921 integer imax,jmax,lmax,ijlmax 922 923 integer ismin,ismax 924 925 call scopy (ip1jmp1*llm,zq,1,zzq,1) 926 927 ijlmin=ismin(ijp1llm,zq,1) 928 lmin=(ijlmin-1)/ip1jmp1+1 929 ijlmin=ijlmin-(lmin-1.)*ip1jmp1 930 jmin=(ijlmin-1)/iip1+1 931 imin=ijlmin-(jmin-1.)*iip1 932 zqmin=zq(ijlmin,lmin) 933 934 ijlmax=ismax(ijp1llm,zq,1) 935 lmax=(ijlmax-1)/ip1jmp1+1 936 ijlmax=ijlmax-(lmax-1.)*ip1jmp1 937 jmax=(ijlmax-1)/iip1+1 938 imax=ijlmax-(jmax-1.)*iip1 939 zqmax=zq(ijlmax,lmax) 940 941 if(zqmin.lt.qmin) 942 c s write(*,9999) comment, 943 s write(*,*) comment, 944 s imin,jmin,lmin,zqmin,zzq(imin,jmin,lmin) 945 if(zqmax.gt.qmax) 946 c s write(*,9999) comment, 947 s write(*,*) comment, 948 s imax,jmax,lmax,zqmax,zzq(imax,jmax,lmax) 880 949 881 950 return 951 9999 format(a20,' q(',i3,',',i2,',',i2,')=',e12.5,e12.5) 882 952 end 883 953
Note: See TracChangeset
for help on using the changeset viewer.