Changeset 2298 for LMDZ5/branches/testing/libf/dyn3d/vlsplt.F
- Timestamp:
- Jun 14, 2015, 9:13:32 PM (9 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/testing
- Property svn:mergeinfo changed
/LMDZ5/trunk merged: 2238-2257,2259-2271,2273,2277-2282,2284-2288,2290-2291
- Property svn:mergeinfo changed
-
LMDZ5/branches/testing/libf/dyn3d/vlsplt.F
r1910 r2298 3 3 c 4 4 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt) 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) 6 USE infotrac, ONLY: nqtot,nqdesc,iqfils 6 7 c 7 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 32 33 c REAL masse(iip1,jjp1,llm),pente_max 33 34 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 34 REAL q(ip1jmp1,llm )35 REAL q(ip1jmp1,llm,nqtot) 35 36 c REAL q(iip1,jjp1,llm) 36 37 REAL w(ip1jmp1,llm),pdt 38 INTEGER iq ! CRisi 37 39 c 38 40 c Local … … 42 44 INTEGER ijlqmin,iqmin,jqmin,lqmin 43 45 c 44 REAL zm(ip1jmp1,llm ),newmasse46 REAL zm(ip1jmp1,llm,nqtot),newmasse 45 47 REAL mu(ip1jmp1,llm) 46 48 REAL mv(ip1jm,llm) 47 49 REAL mw(ip1jmp1,llm+1) 48 REAL zq(ip1jmp1,llm ),zz50 REAL zq(ip1jmp1,llm,nqtot),zz 49 51 REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm) 50 52 REAL second,temps0,temps1,temps2,temps3 … … 55 57 SAVE temps1,temps2,temps3 56 58 INTEGER iminn,imaxx 59 INTEGER ifils,iq2 ! CRisi 57 60 58 61 REAL qmin,qmax … … 79 82 mw(ij,llm+1)=0. 80 83 ENDDO 81 82 CALL SCOPY(ijp1llm,q,1,zq,1) 83 CALL SCOPY(ijp1llm,masse,1,zm,1) 84 85 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 86 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 87 88 if (nqdesc(iq).gt.0) then 89 do ifils=1,nqdesc(iq) 90 iq2=iqfils(ifils,iq) 91 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 92 enddo 93 endif !if (nqfils(iq).gt.0) then 84 94 85 95 cprint*,'Entree vlx1' 86 96 c call minmaxq(zq,qmin,qmax,'avant vlx ') 87 call vlx(zq,pente_max,zm,mu )97 call vlx(zq,pente_max,zm,mu,iq) 88 98 cprint*,'Sortie vlx1' 89 99 c call minmaxq(zq,qmin,qmax,'apres vlx1 ') 90 100 91 101 c print*,'Entree vly1' 92 call vly(zq,pente_max,zm,mv) 102 103 call vly(zq,pente_max,zm,mv,iq) 93 104 c call minmaxq(zq,qmin,qmax,'apres vly1 ') 94 105 cprint*,'Sortie vly1' 95 call vlz(zq,pente_max,zm,mw )106 call vlz(zq,pente_max,zm,mw,iq) 96 107 c call minmaxq(zq,qmin,qmax,'apres vlz ') 97 108 98 109 99 call vly(zq,pente_max,zm,mv )110 call vly(zq,pente_max,zm,mv,iq) 100 111 c call minmaxq(zq,qmin,qmax,'apres vly ') 101 112 102 113 103 call vlx(zq,pente_max,zm,mu )114 call vlx(zq,pente_max,zm,mu,iq) 104 115 c call minmaxq(zq,qmin,qmax,'apres vlx2 ') 105 116 … … 107 118 DO l=1,llm 108 119 DO ij=1,ip1jmp1 109 q(ij,l )=zq(ij,l)120 q(ij,l,iq)=zq(ij,l,iq) 110 121 ENDDO 111 122 DO ij=1,ip1jm+1,iip1 112 q(ij+iim,l)=q(ij,l) 113 ENDDO 114 ENDDO 123 q(ij+iim,l,iq)=q(ij,l,iq) 124 ENDDO 125 ENDDO 126 ! CRisi: aussi pour les fils 127 if (nqdesc(iq).gt.0) then 128 do ifils=1,nqdesc(iq) 129 iq2=iqfils(ifils,iq) 130 DO l=1,llm 131 DO ij=1,ip1jmp1 132 q(ij,l,iq2)=zq(ij,l,iq2) 133 ENDDO 134 DO ij=1,ip1jm+1,iip1 135 q(ij+iim,l,iq2)=q(ij,l,iq2) 136 ENDDO 137 ENDDO 138 enddo !do ifils=1,nqdesc(iq) 139 endif ! if (nqdesc(iq).gt.0) then 115 140 116 141 RETURN 117 142 END 118 SUBROUTINE vlx(q,pente_max,masse,u_m) 143 RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq) 144 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 119 145 120 146 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 139 165 c Arguments: 140 166 c ---------- 141 REAL masse(ip1jmp1,llm ),pente_max167 REAL masse(ip1jmp1,llm,nqtot),pente_max 142 168 REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm) 143 REAL q(ip1jmp1,llm )169 REAL q(ip1jmp1,llm,nqtot) 144 170 REAL w(ip1jmp1,llm) 171 INTEGER iq ! CRisi 145 172 c 146 173 c Local … … 155 182 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) 156 183 REAL u_mq(ip1jmp1,llm) 184 185 ! CRisi 186 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 187 INTEGER ifils,iq2 ! CRisi 157 188 158 189 Logical extremum,first,testcpu … … 188 219 DO l = 1, llm 189 220 DO ij=iip2,ip1jm-1 190 dxqu(ij)=q(ij+1,l )-q(ij,l)221 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 191 222 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 192 c sigu(ij)=u_m(ij,l)/masse(ij,l )223 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 193 224 ENDDO 194 225 DO ij=iip1+iip1,ip1jm,iip1 … … 243 274 DO l = 1, llm 244 275 DO ij=iip2,ip1jm-1 245 dxqu(ij)=q(ij+1,l )-q(ij,l)276 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 246 277 ENDDO 247 278 DO ij=iip1+iip1,ip1jm,iip1 … … 285 316 DO l=1,llm 286 317 DO ij=iip2,ip1jm-1 287 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),288 , 1.+u_m(ij,l)/masse(ij+1,l ),318 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 319 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 289 320 , u_m(ij,l)) 290 321 zdum(ij,l)=0.5*zdum(ij,l) 291 322 u_mq(ij,l)=cvmgp( 292 , q(ij,l )+zdum(ij,l)*dxq(ij,l),293 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),323 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 324 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 294 325 , u_m(ij,l)) 295 326 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 303 334 DO l=1,llm 304 335 DO ij=iip2,ip1jm-1 305 c print*,'masse(',ij,')=',masse(ij,l )336 c print*,'masse(',ij,')=',masse(ij,l,iq) 306 337 IF (u_m(ij,l).gt.0.) THEN 307 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l )308 u_mq(ij,l)=u_m(ij,l)*(q(ij,l )+0.5*zdum(ij,l)*dxq(ij,l))338 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 339 u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l)) 309 340 ELSE 310 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l) 311 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l)) 341 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 342 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq) 343 & -0.5*zdum(ij,l)*dxq(ij+1,l)) 312 344 ENDIF 313 345 ENDDO … … 379 411 i=ijq-(j-1)*iip1 380 412 c accumulation pour les mailles completements advectees 381 do while(zu_m.gt.masse(ijq,l)) 382 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 383 zu_m=zu_m-masse(ijq,l) 413 do while(zu_m.gt.masse(ijq,l,iq)) 414 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) 415 & *masse(ijq,l,iq) 416 zu_m=zu_m-masse(ijq,l,iq) 384 417 i=mod(i-2+iim,iim)+1 385 418 ijq=(j-1)*iip1+i … … 387 420 c ajout de la maille non completement advectee 388 421 u_mq(ij,l)=u_mq(ij,l)+zu_m* 389 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 422 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) 423 & *dxq(ijq,l)) 390 424 ELSE 391 425 ijq=ij+1 392 426 i=ijq-(j-1)*iip1 393 427 c accumulation pour les mailles completements advectees 394 do while(-zu_m.gt.masse(ijq,l)) 395 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 396 zu_m=zu_m+masse(ijq,l) 428 do while(-zu_m.gt.masse(ijq,l,iq)) 429 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 430 & *masse(ijq,l,iq) 431 zu_m=zu_m+masse(ijq,l,iq) 397 432 i=mod(i,iim)+1 398 433 ijq=(j-1)*iip1+i 399 434 ENDDO 400 435 c ajout de la maille non completement advectee 401 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-402 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))436 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 437 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 403 438 ENDIF 404 439 ENDDO … … 417 452 ENDDO 418 453 454 ! CRisi: appel récursif de l'advection sur les fils. 455 ! Il faut faire ça avant d'avoir mis à jour q et masse 456 !write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq) 457 458 if (nqdesc(iq).gt.0) then 459 do ifils=1,nqdesc(iq) 460 iq2=iqfils(ifils,iq) 461 DO l=1,llm 462 DO ij=iip2,ip1jm 463 ! On a besoin de q et masse seulement entre iip2 et ip1jm 464 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 465 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 466 enddo 467 enddo 468 enddo !do ifils=1,nqdesc(iq) 469 do ifils=1,nqfils(iq) 470 iq2=iqfils(ifils,iq) 471 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 472 enddo !do ifils=1,nqfils(iq) 473 endif !if (nqfils(iq).gt.0) then 474 ! end CRisi 475 419 476 420 477 c calcul des tENDances … … 422 479 DO l=1,llm 423 480 DO ij=iip2+1,ip1jm 424 new_m=masse(ij,l )+u_m(ij-1,l)-u_m(ij,l)425 q(ij,l )=(q(ij,l)*masse(ij,l)+481 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 482 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 426 483 & u_mq(ij-1,l)-u_mq(ij,l)) 427 484 & /new_m 428 masse(ij,l )=new_m485 masse(ij,l,iq)=new_m 429 486 ENDDO 430 487 c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 431 488 DO ij=iip1+iip1,ip1jm,iip1 432 q(ij-iim,l)=q(ij,l) 433 masse(ij-iim,l)=masse(ij,l) 434 ENDDO 435 ENDDO 489 q(ij-iim,l,iq)=q(ij,l,iq) 490 masse(ij-iim,l,iq)=masse(ij,l,iq) 491 ENDDO 492 ENDDO 493 494 ! retablir les fils en rapport de melange par rapport a l'air: 495 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 496 ! puis on boucle en longitude 497 if (nqdesc(iq).gt.0) then 498 do ifils=1,nqdesc(iq) 499 iq2=iqfils(ifils,iq) 500 DO l=1,llm 501 DO ij=iip2+1,ip1jm 502 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 503 enddo 504 DO ij=iip1+iip1,ip1jm,iip1 505 q(ij-iim,l,iq2)=q(ij,l,iq2) 506 enddo ! DO ij=ijb+iip1-1,ije,iip1 507 enddo !DO l=1,llm 508 enddo !do ifils=1,nqdesc(iq) 509 endif !if (nqfils(iq).gt.0) then 510 436 511 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) 437 512 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) … … 440 515 RETURN 441 516 END 442 SUBROUTINE vly(q,pente_max,masse,masse_adv_v) 517 RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq) 518 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 443 519 c 444 520 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 464 540 c Arguments: 465 541 c ---------- 466 REAL masse(ip1jmp1,llm ),pente_max542 REAL masse(ip1jmp1,llm,nqtot),pente_max 467 543 REAL masse_adv_v( ip1jm,llm) 468 REAL q(ip1jmp1,llm), dq( ip1jmp1,llm) 544 REAL q(ip1jmp1,llm,nqtot), dq( ip1jmp1,llm) 545 INTEGER iq ! CRisi 469 546 c 470 547 c Local … … 491 568 SAVE sinlon,coslon,sinlondlon,coslondlon 492 569 SAVE airej2,airejjm 570 571 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 572 INTEGER ifils,iq2 ! CRisi 573 493 574 c 494 575 c … … 497 578 DATA first,testcpu/.true.,.false./ 498 579 DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./ 580 581 !write(*,*) 'vly 578: entree, iq=',iq 499 582 500 583 IF(first) THEN … … 529 612 530 613 DO i = 1, iim 531 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )532 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )614 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 615 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 533 616 ENDDO 534 617 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 538 621 539 622 DO ij=1,ip1jm 540 dyqv(ij)=q(ij,l )-q(ij+iip1,l)623 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 541 624 adyqv(ij)=abs(dyqv(ij)) 542 625 ENDDO … … 553 636 554 637 DO ij=1,iip1 555 dyq(ij,l)=qpns-q(ij+iip1,l )556 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn638 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 639 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 557 640 ENDDO 558 641 … … 675 758 ENDDO 676 759 760 !write(*,*) 'vly 756' 677 761 DO l=1,llm 678 762 DO ij=1,ip1jm 679 763 IF(masse_adv_v(ij,l).gt.0) THEN 680 qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)* 681 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)) 764 qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)* 765 , 0.5*(1.-masse_adv_v(ij,l) 766 , /masse(ij+iip1,l,iq)) 682 767 ELSE 683 qbyv(ij,l)=q(ij,l)-dyq(ij,l)* 684 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) 768 qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)* 769 , 0.5*(1.+masse_adv_v(ij,l) 770 , /masse(ij,l,iq)) 685 771 ENDIF 686 772 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l) … … 688 774 ENDDO 689 775 776 ! CRisi: appel récursif de l'advection sur les fils. 777 ! Il faut faire ça avant d'avoir mis à jour q et masse 778 !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) 779 780 if (nqfils(iq).gt.0) then 781 do ifils=1,nqdesc(iq) 782 iq2=iqfils(ifils,iq) 783 DO l=1,llm 784 DO ij=1,ip1jmp1 785 ! attention, chaque fils doit avoir son masseq, sinon, le 1er 786 ! fils ecrase le masseq de ses freres. 787 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 788 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 789 enddo 790 enddo 791 enddo !do ifils=1,nqdesc(iq) 792 793 do ifils=1,nqfils(iq) 794 iq2=iqfils(ifils,iq) 795 call vly(Ratio,pente_max,masseq,qbyv,iq2) 796 enddo !do ifils=1,nqfils(iq) 797 endif !if (nqfils(iq).gt.0) then 690 798 691 799 DO l=1,llm 692 800 DO ij=iip2,ip1jm 693 newmasse=masse(ij,l )801 newmasse=masse(ij,l,iq) 694 802 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 695 q(ij,l )=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))696 & /newmasse697 masse(ij,l )=newmasse803 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) 804 & -qbyv(ij-iip1,l))/newmasse 805 masse(ij,l,iq)=newmasse 698 806 ENDDO 699 807 c.-. ancienne version … … 703 811 convpn=SSUM(iim,qbyv(1,l),1) 704 812 convmpn=ssum(iim,masse_adv_v(1,l),1) 705 massepn=ssum(iim,masse(1,l ),1)813 massepn=ssum(iim,masse(1,l,iq),1) 706 814 qpn=0. 707 815 do ij=1,iim 708 qpn=qpn+masse(ij,l )*q(ij,l)816 qpn=qpn+masse(ij,l,iq)*q(ij,l,iq) 709 817 enddo 710 818 qpn=(qpn+convpn)/(massepn+convmpn) 711 819 do ij=1,iip1 712 q(ij,l )=qpn820 q(ij,l,iq)=qpn 713 821 enddo 714 822 … … 718 826 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) 719 827 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) 720 masseps=ssum(iim, masse(ip1jm+1,l ),1)828 masseps=ssum(iim, masse(ip1jm+1,l,iq),1) 721 829 qps=0. 722 830 do ij = ip1jm+1,ip1jmp1-1 723 qps=qps+masse(ij,l )*q(ij,l)831 qps=qps+masse(ij,l,iq)*q(ij,l,iq) 724 832 enddo 725 833 qps=(qps+convps)/(masseps+convmps) 726 834 do ij=ip1jm+1,ip1jmp1 727 q(ij,l )=qps835 q(ij,l,iq)=qps 728 836 enddo 729 837 … … 739 847 c DO ij = 1,iip1 740 848 c q(ij,l)=newq 741 c masse(ij,l )=newmasse*aire(ij)849 c masse(ij,l,iq)=newmasse*aire(ij) 742 850 c ENDDO 743 851 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) … … 749 857 c DO ij = ip1jm+1,ip1jmp1 750 858 c q(ij,l)=newq 751 c masse(ij,l )=newmasse*aire(ij)859 c masse(ij,l,iq)=newmasse*aire(ij) 752 860 c ENDDO 753 861 c._. fin nouvelle version 754 862 ENDDO 863 864 ! retablir les fils en rapport de melange par rapport a l'air: 865 if (nqfils(iq).gt.0) then 866 do ifils=1,nqdesc(iq) 867 iq2=iqfils(ifils,iq) 868 DO l=1,llm 869 DO ij=1,ip1jmp1 870 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 871 enddo 872 enddo 873 enddo !do ifils=1,nqdesc(iq) 874 endif !if (nqfils(iq).gt.0) then 875 876 !write(*,*) 'vly 853: sortie' 755 877 756 878 RETURN 757 879 END 758 SUBROUTINE vlz(q,pente_max,masse,w) 880 RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq) 881 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 759 882 c 760 883 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 779 902 c Arguments: 780 903 c ---------- 781 REAL masse(ip1jmp1,llm ),pente_max782 REAL q(ip1jmp1,llm )904 REAL masse(ip1jmp1,llm,nqtot),pente_max 905 REAL q(ip1jmp1,llm,nqtot) 783 906 REAL w(ip1jmp1,llm+1) 907 INTEGER iq 784 908 c 785 909 c Local … … 792 916 REAL dzq(ip1jmp1,llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax 793 917 REAL sigw 918 919 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 920 INTEGER ifils,iq2 ! CRisi 794 921 795 922 LOGICAL testcpu … … 805 932 c On oriente tout dans le sens de la pression c'est a dire dans le 806 933 c sens de W 934 935 !write(*,*) 'vlz 923: entree' 807 936 808 937 #ifdef BIDON … … 813 942 DO l=2,llm 814 943 DO ij=1,ip1jmp1 815 dzqw(ij,l)=q(ij,l-1 )-q(ij,l)944 dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq) 816 945 adzqw(ij,l)=abs(dzqw(ij,l)) 817 946 ENDDO … … 835 964 ENDDO 836 965 966 !write(*,*) 'vlz 954' 837 967 DO ij=1,ip1jmp1 838 968 dzq(ij,1)=0. … … 851 981 c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq 852 982 983 !write(*,*) 'vlz 969' 853 984 DO l = 1,llm-1 854 985 do ij = 1,ip1jmp1 855 986 IF(w(ij,l+1).gt.0.) THEN 856 sigw=w(ij,l+1)/masse(ij,l+1) 857 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1)) 987 sigw=w(ij,l+1)/masse(ij,l+1,iq) 988 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1,iq) 989 & +0.5*(1.-sigw)*dzq(ij,l+1)) 858 990 ELSE 859 sigw=w(ij,l+1)/masse(ij,l )860 wq(ij,l+1)=w(ij,l+1)*(q(ij,l )-0.5*(1.+sigw)*dzq(ij,l))991 sigw=w(ij,l+1)/masse(ij,l,iq) 992 wq(ij,l+1)=w(ij,l+1)*(q(ij,l,iq)-0.5*(1.+sigw)*dzq(ij,l)) 861 993 ENDIF 862 994 ENDDO … … 868 1000 ENDDO 869 1001 1002 ! CRisi: appel récursif de l'advection sur les fils. 1003 ! Il faut faire ça avant d'avoir mis à jour q et masse 1004 !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) 1005 if (nqfils(iq).gt.0) then 1006 do ifils=1,nqdesc(iq) 1007 iq2=iqfils(ifils,iq) 1008 DO l=1,llm 1009 DO ij=1,ip1jmp1 1010 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1011 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1012 enddo 1013 enddo 1014 enddo !do ifils=1,nqdesc(iq) 1015 1016 do ifils=1,nqfils(iq) 1017 iq2=iqfils(ifils,iq) 1018 call vlz(Ratio,pente_max,masseq,wq,iq2) 1019 enddo !do ifils=1,nqfils(iq) 1020 endif !if (nqfils(iq).gt.0) then 1021 ! end CRisi 1022 870 1023 DO l=1,llm 871 1024 DO ij=1,ip1jmp1 872 newmasse=masse(ij,l )+w(ij,l+1)-w(ij,l)873 q(ij,l )=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l))1025 newmasse=masse(ij,l,iq)+w(ij,l+1)-w(ij,l) 1026 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+wq(ij,l+1)-wq(ij,l)) 874 1027 & /newmasse 875 masse(ij,l)=newmasse 876 ENDDO 877 ENDDO 878 1028 masse(ij,l,iq)=newmasse 1029 ENDDO 1030 ENDDO 1031 1032 ! retablir les fils en rapport de melange par rapport a l'air: 1033 if (nqfils(iq).gt.0) then 1034 do ifils=1,nqdesc(iq) 1035 iq2=iqfils(ifils,iq) 1036 DO l=1,llm 1037 DO ij=1,ip1jmp1 1038 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1039 enddo 1040 enddo 1041 enddo !do ifils=1,nqdesc(iq) 1042 endif !if (nqfils(iq).gt.0) then 1043 !write(*,*) 'vlsplt 1032' 879 1044 880 1045 RETURN
Note: See TracChangeset
for help on using the changeset viewer.