Changeset 2270 for LMDZ5/trunk/libf/dyn3d/vlspltqs.F
- Timestamp:
- May 7, 2015, 5:45:04 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dyn3d/vlspltqs.F
r1907 r2270 3 3 c 4 4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt, 5 , p,pk,teta ) 5 , p,pk,teta,iq ) 6 USE infotrac, ONLY: nqtot,nqdesc,iqfils 6 7 c 7 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron … … 35 36 REAL masse(ip1jmp1,llm),pente_max 36 37 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 37 REAL q(ip1jmp1,llm )38 REAL q(ip1jmp1,llm,nqtot) 38 39 REAL w(ip1jmp1,llm),pdt 39 40 REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm) 41 INTEGER iq ! CRisi 40 42 c 41 43 c Local … … 43 45 c 44 46 INTEGER i,ij,l,j,ii 47 INTEGER ifils,iq2 ! CRisi 45 48 c 46 49 REAL qsat(ip1jmp1,llm) 47 REAL zm(ip1jmp1,llm )50 REAL zm(ip1jmp1,llm,nqtot) 48 51 REAL mu(ip1jmp1,llm) 49 52 REAL mv(ip1jm,llm) 50 53 REAL mw(ip1jmp1,llm+1) 51 REAL zq(ip1jmp1,llm )54 REAL zq(ip1jmp1,llm,nqtot) 52 55 REAL temps1,temps2,temps3 53 56 REAL zzpbar, zzw … … 116 119 ENDDO 117 120 118 CALL SCOPY(ijp1llm,q,1,zq,1) 119 CALL SCOPY(ijp1llm,masse,1,zm,1) 121 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 122 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 123 if (nqdesc(iq).gt.0) then 124 do ifils=1,nqdesc(iq) 125 iq2=iqfils(ifils,iq) 126 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 127 enddo 128 endif !if (nqfils(iq).gt.0) then 120 129 121 130 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') 122 call vlxqs(zq,pente_max,zm,mu,qsat) 123 131 call vlxqs(zq,pente_max,zm,mu,qsat,iq) 124 132 125 133 c call minmaxq(zq,qmin,qmax,'avant vlyqs ') 126 134 127 call vlyqs(zq,pente_max,zm,mv,qsat) 128 135 call vlyqs(zq,pente_max,zm,mv,qsat,iq) 129 136 130 137 c call minmaxq(zq,qmin,qmax,'avant vlz ') 131 138 132 call vlz(zq,pente_max,zm,mw) 133 139 call vlz(zq,pente_max,zm,mw,iq) 134 140 135 141 c call minmaxq(zq,qmin,qmax,'avant vlyqs ') 136 142 c call minmaxq(zm,qmin,qmax,'M avant vlyqs ') 137 143 138 call vlyqs(zq,pente_max,zm,mv,qsat) 139 144 call vlyqs(zq,pente_max,zm,mv,qsat,iq) 140 145 141 146 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') 142 147 c call minmaxq(zm,qmin,qmax,'M avant vlxqs ') 143 148 144 call vlxqs(zq,pente_max,zm,mu,qsat )149 call vlxqs(zq,pente_max,zm,mu,qsat,iq) 145 150 146 151 c call minmaxq(zq,qmin,qmax,'apres vlxqs ') … … 150 155 DO l=1,llm 151 156 DO ij=1,ip1jmp1 152 q(ij,l )=zq(ij,l)157 q(ij,l,iq)=zq(ij,l,iq) 153 158 ENDDO 154 159 DO ij=1,ip1jm+1,iip1 155 q(ij+iim,l)=q(ij,l) 156 ENDDO 157 ENDDO 160 q(ij+iim,l,iq)=q(ij,l,iq) 161 ENDDO 162 ENDDO 163 ! CRisi: aussi pour les fils 164 if (nqdesc(iq).gt.0) then 165 do ifils=1,nqdesc(iq) 166 iq2=iqfils(ifils,iq) 167 DO l=1,llm 168 DO ij=1,ip1jmp1 169 q(ij,l,iq2)=zq(ij,l,iq2) 170 ENDDO 171 DO ij=1,ip1jm+1,iip1 172 q(ij+iim,l,iq2)=q(ij,l,iq2) 173 ENDDO 174 ENDDO 175 enddo !do ifils=1,nqdesc(iq) 176 endif ! if (nqfils(iq).gt.0) then 177 write(*,*) 'vlspltqs 183: fin de la routine' 158 178 159 179 RETURN 160 180 END 161 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat) 181 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq) 182 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 183 162 184 c 163 185 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 179 201 c Arguments: 180 202 c ---------- 181 REAL masse(ip1jmp1,llm ),pente_max203 REAL masse(ip1jmp1,llm,nqtot),pente_max 182 204 REAL u_m( ip1jmp1,llm ) 183 REAL q(ip1jmp1,llm )205 REAL q(ip1jmp1,llm,nqtot) 184 206 REAL qsat(ip1jmp1,llm) 207 INTEGER iq ! CRisi 185 208 c 186 209 c Local … … 195 218 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) 196 219 REAL u_mq(ip1jmp1,llm) 220 221 ! CRisi 222 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 223 INTEGER ifils,iq2 ! CRisi 197 224 198 225 Logical first,testcpu … … 227 254 DO l = 1, llm 228 255 DO ij=iip2,ip1jm-1 229 dxqu(ij)=q(ij+1,l )-q(ij,l)256 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 230 257 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 231 c sigu(ij)=u_m(ij,l)/masse(ij,l )258 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 232 259 ENDDO 233 260 DO ij=iip1+iip1,ip1jm,iip1 … … 281 308 DO l = 1, llm 282 309 DO ij=iip2,ip1jm-1 283 dxqu(ij)=q(ij+1,l )-q(ij,l)310 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 284 311 ENDDO 285 312 DO ij=iip1+iip1,ip1jm,iip1 … … 323 350 DO l=1,llm 324 351 DO ij=iip2,ip1jm-1 325 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),326 , 1.+u_m(ij,l)/masse(ij+1,l ),352 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 353 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 327 354 , u_m(ij,l)) 328 355 zdum(ij,l)=0.5*zdum(ij,l) 329 356 u_mq(ij,l)=cvmgp( 330 , q(ij,l )+zdum(ij,l)*dxq(ij,l),331 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),357 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 358 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 332 359 , u_m(ij,l)) 333 360 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 341 368 DO ij=iip2,ip1jm-1 342 369 IF (u_m(ij,l).gt.0.) THEN 343 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l )370 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 344 371 u_mq(ij,l)=u_m(ij,l)* 345 $ min(q(ij,l )+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))372 $ min(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l)) 346 373 ELSE 347 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l )374 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 348 375 u_mq(ij,l)=u_m(ij,l)* 349 $ min(q(ij+1,l )-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))376 $ min(q(ij+1,l,iq)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l)) 350 377 ENDIF 351 378 ENDDO … … 416 443 i=ijq-(j-1)*iip1 417 444 c accumulation pour les mailles completements advectees 418 do while(zu_m.gt.masse(ijq,l)) 419 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 420 zu_m=zu_m-masse(ijq,l) 445 do while(zu_m.gt.masse(ijq,l,iq)) 446 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) 447 & *masse(ijq,l,iq) 448 zu_m=zu_m-masse(ijq,l,iq) 421 449 i=mod(i-2+iim,iim)+1 422 450 ijq=(j-1)*iip1+i … … 424 452 c ajout de la maille non completement advectee 425 453 u_mq(ij,l)=u_mq(ij,l)+zu_m* 426 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 454 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) 455 & *dxq(ijq,l)) 427 456 ELSE 428 457 ijq=ij+1 429 458 i=ijq-(j-1)*iip1 430 459 c accumulation pour les mailles completements advectees 431 do while(-zu_m.gt.masse(ijq,l)) 432 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 433 zu_m=zu_m+masse(ijq,l) 460 do while(-zu_m.gt.masse(ijq,l,iq)) 461 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 462 & *masse(ijq,l,iq) 463 zu_m=zu_m+masse(ijq,l,iq) 434 464 i=mod(i,iim)+1 435 465 ijq=(j-1)*iip1+i 436 466 ENDDO 437 467 c ajout de la maille non completement advectee 438 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-439 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))468 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 469 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 440 470 ENDIF 441 471 ENDDO … … 454 484 ENDDO 455 485 486 ! CRisi: appel récursif de l'advection sur les fils. 487 ! Il faut faire ça avant d'avoir mis à jour q et masse 488 write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq) 489 490 if (nqfils(iq).gt.0) then 491 do ifils=1,nqdesc(iq) 492 iq2=iqfils(ifils,iq) 493 DO l=1,llm 494 DO ij=iip2,ip1jm 495 ! On a besoin de q et masse seulement entre iip2 et ip1jm 496 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 497 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 498 enddo 499 enddo 500 enddo !do ifils=1,nqdesc(iq) 501 do ifils=1,nqfils(iq) 502 iq2=iqfils(ifils,iq) 503 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 504 enddo !do ifils=1,nqfils(iq) 505 endif !if (nqfils(iq).gt.0) then 506 ! end CRisi 456 507 457 508 c calcul des tendances … … 459 510 DO l=1,llm 460 511 DO ij=iip2+1,ip1jm 461 new_m=masse(ij,l )+u_m(ij-1,l)-u_m(ij,l)462 q(ij,l )=(q(ij,l)*masse(ij,l)+512 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 513 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 463 514 & u_mq(ij-1,l)-u_mq(ij,l)) 464 515 & /new_m 465 masse(ij,l )=new_m516 masse(ij,l,iq)=new_m 466 517 ENDDO 467 518 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 468 519 DO ij=iip1+iip1,ip1jm,iip1 469 q(ij-iim,l)=q(ij,l) 470 masse(ij-iim,l)=masse(ij,l) 471 ENDDO 472 ENDDO 520 q(ij-iim,l,iq)=q(ij,l,iq) 521 masse(ij-iim,l,iq)=masse(ij,l,iq) 522 ENDDO 523 ENDDO 524 525 ! retablir les fils en rapport de melange par rapport a l'air: 526 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 527 ! puis on boucle en longitude 528 if (nqdesc(iq).gt.0) then 529 do ifils=1,nqdesc(iq) 530 iq2=iqfils(ifils,iq) 531 DO l=1,llm 532 DO ij=iip2+1,ip1jm 533 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 534 enddo 535 DO ij=iip1+iip1,ip1jm,iip1 536 q(ij-iim,l,iq2)=q(ij,l,iq2) 537 enddo ! DO ij=ijb+iip1-1,ije,iip1 538 enddo !DO l=1,llm 539 enddo !do ifils=1,nqdesc(iq) 540 endif !if (nqfils(iq).gt.0) then 473 541 474 542 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 478 546 RETURN 479 547 END 480 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat) 548 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq) 549 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 481 550 c 482 551 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 502 571 c Arguments: 503 572 c ---------- 504 REAL masse(ip1jmp1,llm ),pente_max573 REAL masse(ip1jmp1,llm,nqtot),pente_max 505 574 REAL masse_adv_v( ip1jm,llm) 506 REAL q(ip1jmp1,llm )575 REAL q(ip1jmp1,llm,nqtot) 507 576 REAL qsat(ip1jmp1,llm) 577 INTEGER iq ! CRisi 508 578 c 509 579 c Local … … 529 599 SAVE sinlon,coslon,sinlondlon,coslondlon 530 600 SAVE airej2,airejjm 601 602 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 603 INTEGER ifils,iq2 ! CRisi 531 604 c 532 605 c … … 567 640 568 641 DO i = 1, iim 569 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )570 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )642 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 643 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 571 644 ENDDO 572 645 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 576 649 577 650 DO ij=1,ip1jm 578 dyqv(ij)=q(ij,l )-q(ij+iip1,l)651 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 579 652 adyqv(ij)=abs(dyqv(ij)) 580 653 ENDDO … … 591 664 592 665 DO ij=1,iip1 593 dyq(ij,l)=qpns-q(ij+iip1,l )594 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn666 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 667 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 595 668 ENDDO 596 669 … … 710 783 DO ij=1,ip1jm 711 784 IF( masse_adv_v(ij,l).GT.0. ) THEN 712 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) + 713 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))) 785 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l,iq ) + 786 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l) 787 , /masse(ij+iip1,l,iq))) 714 788 ELSE 715 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l ) - dyq(ij,l) *716 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l )) )789 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l,iq) - dyq(ij,l) * 790 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) ) 717 791 ENDIF 718 792 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l) … … 721 795 722 796 797 ! CRisi: appel récursif de l'advection sur les fils. 798 ! Il faut faire ça avant d'avoir mis à jour q et masse 799 write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq) 800 801 if (nqfils(iq).gt.0) then 802 do ifils=1,nqdesc(iq) 803 iq2=iqfils(ifils,iq) 804 DO l=1,llm 805 DO ij=1,ip1jmp1 806 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 807 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 808 enddo 809 enddo 810 enddo !do ifils=1,nqdesc(iq) 811 812 do ifils=1,nqfils(iq) 813 iq2=iqfils(ifils,iq) 814 write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2 815 call vly(Ratio,pente_max,masseq,qbyv,iq2) 816 enddo !do ifils=1,nqfils(iq) 817 endif !if (nqfils(iq).gt.0) then 818 723 819 DO l=1,llm 724 820 DO ij=iip2,ip1jm 725 newmasse=masse(ij,l )821 newmasse=masse(ij,l,iq) 726 822 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 727 q(ij,l )=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))728 & /newmasse729 masse(ij,l )=newmasse823 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) 824 & -qbyv(ij-iip1,l))/newmasse 825 masse(ij,l,iq)=newmasse 730 826 ENDDO 731 827 c.-. ancienne version … … 733 829 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln 734 830 DO ij = 1,iip1 735 newmasse=masse(ij,l )+convmpn*aire(ij)736 q(ij,l )=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/831 newmasse=masse(ij,l,iq)+convmpn*aire(ij) 832 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convpn*aire(ij))/ 737 833 & newmasse 738 masse(ij,l )=newmasse834 masse(ij,l,iq)=newmasse 739 835 ENDDO 740 836 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols 741 837 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols 742 838 DO ij = ip1jm+1,ip1jmp1 743 newmasse=masse(ij,l )+convmps*aire(ij)744 q(ij,l )=(q(ij,l)*masse(ij,l)+convps*aire(ij))/839 newmasse=masse(ij,l,iq)+convmps*aire(ij) 840 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convps*aire(ij))/ 745 841 & newmasse 746 masse(ij,l )=newmasse842 masse(ij,l,iq)=newmasse 747 843 ENDDO 748 844 c.-. fin ancienne version … … 757 853 c DO ij = 1,iip1 758 854 c q(ij,l)=newq 759 c masse(ij,l )=newmasse*aire(ij)855 c masse(ij,l,iq)=newmasse*aire(ij) 760 856 c ENDDO 761 857 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) … … 767 863 c DO ij = ip1jm+1,ip1jmp1 768 864 c q(ij,l)=newq 769 c masse(ij,l )=newmasse*aire(ij)865 c masse(ij,l,iq)=newmasse*aire(ij) 770 866 c ENDDO 771 867 c._. fin nouvelle version 772 868 ENDDO 773 869 870 write(*,*) 'vly 866' 871 872 ! retablir les fils en rapport de melange par rapport a l'air: 873 if (nqdesc(iq).gt.0) then 874 do ifils=1,nqdesc(iq) 875 iq2=iqfils(ifils,iq) 876 DO l=1,llm 877 DO ij=1,ip1jmp1 878 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 879 enddo 880 enddo 881 enddo !do ifils=1,nqdesc(iq) 882 endif !if (nqfils(iq).gt.0) then 883 write(*,*) 'vly 879' 884 774 885 RETURN 775 886 END
Note: See TracChangeset
for help on using the changeset viewer.