Changeset 2298 for LMDZ5/branches/testing/libf/dyn3dmem/vlsplt_loc.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/dyn3dmem/vlsplt_loc.F
r1910 r2298 2 2 ! $Id$ 3 3 ! 4 SUBROUTINE vlx_loc(q,pente_max,masse,u_m,ijb_x,ije_x)4 RECURSIVE SUBROUTINE vlx_loc(q,pente_max,masse,u_m,ijb_x,ije_x,iq) 5 5 6 6 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 14 14 c -------------------------------------------------------------------- 15 15 USE parallel_lmdz 16 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 16 17 IMPLICIT NONE 17 18 c … … 25 26 c Arguments: 26 27 c ---------- 27 REAL masse(ijb_u:ije_u,llm),pente_max 28 REAL u_m( ijb_u:ije_u,llm ),pbarv( iip1,jjb_v:jje_v,llm) 29 REAL q(ijb_u:ije_u,llm) 30 REAL w(ijb_u:ije_u,llm) 28 REAL masse(ijb_u:ije_u,llm,nqtot),pente_max 29 REAL u_m( ijb_u:ije_u,llm),pbarv( iip1,jjb_v:jje_v,llm) 30 REAL q(ijb_u:ije_u,llm,nqtot) ! CRisi: ajout dimension nqtot 31 REAL w(ijb_u:ije_u,llm) 32 INTEGER iq ! CRisi 31 33 c 32 34 c Local … … 42 44 REAL u_mq(ijb_u:ije_u,llm) 43 45 46 REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi 47 INTEGER ifils,iq2 ! CRisi 48 44 49 Logical extremum 45 50 … … 51 56 INTEGER ijb,ije,ijb_x,ije_x 52 57 58 !write(*,*) 'vlsplt 58: entree dans vlx_loc, iq,ijb_x=', 59 ! & iq,ijb_x 53 60 c calcul de la pente a droite et a gauche de la maille 54 61 … … 64 71 c calcul des pentes avec limitation, Van Leer scheme I: 65 72 c ----------------------------------------------------- 66 73 ! on a besoin de q entre ijb et ije 67 74 c calcul de la pente aux points u 68 75 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) … … 70 77 71 78 DO ij=ijb,ije-1 72 dxqu(ij)=q(ij+1,l )-q(ij,l)79 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 73 80 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 74 c sigu(ij)=u_m(ij,l)/masse(ij,l )81 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 75 82 ENDDO 76 83 DO ij=ijb+iip1-1,ije,iip1 … … 126 133 DO l = 1, llm 127 134 DO ij=ijb,ije-1 128 dxqu(ij)=q(ij+1,l )-q(ij,l)135 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 129 136 ENDDO 130 137 DO ij=ijb+iip1-1,ije,iip1 … … 147 154 ENDIF ! (pente_max.lt.-1.e-5) 148 155 156 !write(*,*) 'vlx 156: iq,ijb_x=',iq,ijb_x 157 149 158 c bouclage de la pente en iip1: 150 159 c ----------------------------- … … 168 177 DO l=1,llm 169 178 DO ij=ijb,ije-1 170 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),171 , 1.+u_m(ij,l)/masse(ij+1,l ),172 , u_m(ij,l ))179 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 180 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 181 , u_m(ij,l,iq)) 173 182 zdum(ij,l)=0.5*zdum(ij,l) 174 183 u_mq(ij,l)=cvmgp( 175 , q(ij,l )+zdum(ij,l)*dxq(ij,l),176 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),184 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 185 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 177 186 , u_m(ij,l)) 178 187 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 185 194 c print*,'Cumule ....' 186 195 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 196 ! on a besoin de masse entre ijb et ije 187 197 DO l=1,llm 188 198 DO ij=ijb,ije-1 189 c print*,'masse(',ij,')=',masse(ij,l )199 c print*,'masse(',ij,')=',masse(ij,l,iq) 190 200 IF (u_m(ij,l).gt.0.) THEN 191 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l) 192 u_mq(ij,l)=u_m(ij,l)*(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l)) 201 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 202 u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq) 203 : +0.5*zdum(ij,l)*dxq(ij,l)) 193 204 ELSE 194 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l) 195 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l)) 205 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 206 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq) 207 : -0.5*zdum(ij,l)*dxq(ij+1,l)) 196 208 ENDIF 197 209 ENDDO … … 215 227 c$OMP END DO NOWAIT 216 228 c print*,'Ok test 1' 229 217 230 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 218 231 DO l=1,llm … … 223 236 c$OMP END DO NOWAIT 224 237 c print*,'Ok test 2' 225 238 226 239 227 240 c traitement special pour le cas ou on advecte en longitude plus que le … … 247 260 c & ,'contenu de la maille : ',n0 248 261 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 262 263 249 264 DO l=1,llm 250 265 IF(nl(l).gt.0) THEN … … 258 273 ENDDO 259 274 niju=iju 260 c PRINT*,'niju,nl',niju,nl(l)275 !PRINT*,'vlx 278, niju,nl',niju,nl(l) 261 276 262 277 c traitement des mailles … … 270 285 i=ijq-(j-1)*iip1 271 286 c accumulation pour les mailles completements advectees 272 do while(zu_m.gt.masse(ijq,l)) 273 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 274 zu_m=zu_m-masse(ijq,l) 287 do while(zu_m.gt.masse(ijq,l,iq)) 288 u_mq(ij,l)=u_mq(ij,l) 289 & +q(ijq,l,iq)*masse(ijq,l,iq) 290 zu_m=zu_m-masse(ijq,l,iq) 275 291 i=mod(i-2+iim,iim)+1 276 292 ijq=(j-1)*iip1+i … … 278 294 c ajout de la maille non completement advectee 279 295 u_mq(ij,l)=u_mq(ij,l)+zu_m* 280 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 296 & (q(ijq,l,iq)+0.5* 297 & (1.-zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 281 298 ELSE 282 299 ijq=ij+1 283 300 i=ijq-(j-1)*iip1 284 301 c accumulation pour les mailles completements advectees 285 do while(-zu_m.gt.masse(ijq,l)) 286 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 287 zu_m=zu_m+masse(ijq,l) 302 do while(-zu_m.gt.masse(ijq,l,iq)) 303 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 304 & *masse(ijq,l,iq) 305 zu_m=zu_m+masse(ijq,l,iq) 288 306 i=mod(i,iim)+1 289 307 ijq=(j-1)*iip1+i 290 308 ENDDO 291 309 c ajout de la maille non completement advectee 292 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-293 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))310 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 311 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 294 312 ENDIF 295 313 ENDDO … … 299 317 cym ENDIF ! n0.gt.0 300 318 9999 continue 301 302 319 303 320 c bouclage en latitude … … 311 328 c$OMP END DO NOWAIT 312 329 330 ! CRisi: appel récursif de l'advection sur les fils. 331 ! Il faut faire ça avant d'avoir mis à jour q et masse 332 333 !write(*,*) 'vlsplt 326: iq,ijb_x,nqfils(iq)=',iq,ijb_x,nqfils(iq) 334 335 if (nqfils(iq).gt.0) then 336 do ifils=1,nqdesc(iq) 337 iq2=iqfils(ifils,iq) 338 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 339 DO l=1,llm 340 DO ij=ijb,ije 341 ! On a besoin de q et masse seulement entre ijb et ije. On ne 342 ! les calcule donc que de ijb à ije 343 masse(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 344 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 345 enddo 346 enddo 347 c$OMP END DO NOWAIT 348 enddo !do ifils=1,nqdesc(iq) 349 do ifils=1,nqfils(iq) 350 iq2=iqfils(ifils,iq) 351 call vlx_loc(Ratio,pente_max,masse,u_mq,ijb_x,ije_x,iq2) 352 enddo !do ifils=1,nqfils(iq) 353 endif !if (nqfils(iq).gt.0) then 354 ! end CRisi 355 356 !write(*,*) 'vlsplt 360: iq,ijb_x=',iq,ijb_x 357 313 358 c calcul des tENDances 314 359 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 315 360 DO l=1,llm 316 361 DO ij=ijb+1,ije 317 new_m=masse(ij,l )+u_m(ij-1,l)-u_m(ij,l)318 q(ij,l )=(q(ij,l)*masse(ij,l)+319 & u_mq(ij-1,l)-u_mq(ij,l))320 & /new_m321 masse(ij,l )=new_m362 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 363 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 364 & u_mq(ij-1,l)-u_mq(ij,l)) 365 & /new_m 366 masse(ij,l,iq)=new_m 322 367 ENDDO 323 368 c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 324 369 DO ij=ijb+iip1-1,ije,iip1 325 q(ij-iim,l)=q(ij,l) 326 masse(ij-iim,l)=masse(ij,l) 327 ENDDO 328 ENDDO 329 c$OMP END DO NOWAIT 370 q(ij-iim,l,iq)=q(ij,l,iq) 371 masse(ij-iim,l,iq)=masse(ij,l,iq) 372 ENDDO 373 ENDDO 374 c$OMP END DO NOWAIT 375 !write(*,*) 'vlsplt 380: iq,ijb_x=',iq,ijb_x 376 377 ! retablir les fils en rapport de melange par rapport a l'air: 378 ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio 379 ! puis on boucle en longitude 380 if (nqfils(iq).gt.0) then 381 do ifils=1,nqdesc(iq) 382 iq2=iqfils(ifils,iq) 383 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 384 DO l=1,llm 385 DO ij=ijb+1,ije 386 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 387 enddo 388 DO ij=ijb+iip1-1,ije,iip1 389 q(ij-iim,l,iq2)=q(ij,l,iq2) 390 enddo ! DO ij=ijb+iip1-1,ije,iip1 391 enddo !DO l=1,llm 392 c$OMP END DO NOWAIT 393 enddo !do ifils=1,nqdesc(iq) 394 endif !if (nqfils(iq).gt.0) then 395 396 !write(*,*) 'vlsplt 399: iq,ijb_x=',iq,ijb_x 330 397 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) 331 398 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) … … 336 403 337 404 338 SUBROUTINE vly_loc(q,pente_max,masse,masse_adv_v)405 RECURSIVE SUBROUTINE vly_loc(q,pente_max,masse,masse_adv_v,iq) 339 406 c 340 407 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 349 416 c -------------------------------------------------------------------- 350 417 USE parallel_lmdz 418 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 351 419 IMPLICIT NONE 352 420 c … … 361 429 c Arguments: 362 430 c ---------- 363 REAL masse(ijb_u:ije_u,llm ),pente_max431 REAL masse(ijb_u:ije_u,llm,nqtot),pente_max 364 432 REAL masse_adv_v( ijb_v:ije_v,llm) 365 REAL q(ijb_u:ije_u,llm), dq( ijb_u:ije_u,llm) 433 REAL q(ijb_u:ije_u,llm,nqtot), dq( ijb_u:ije_u,llm) 434 INTEGER iq ! CRisi 366 435 c 367 436 c Local … … 392 461 SAVE airej2,airejjm 393 462 c$OMP THREADPRIVATE(airej2,airejjm) 463 464 REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi 465 INTEGER ifils,iq2 ! CRisi 394 466 c 395 467 c … … 401 473 INTEGER ijb,ije 402 474 475 ijb=ij_begin-2*iip1 476 ije=ij_end+2*iip1 477 if (pole_nord) ijb=ij_begin 478 if (pole_sud) ije=ij_end 479 403 480 IF(first) THEN 404 cPRINT*,'Shema Amont nouveau appele dans Vanleer '481 PRINT*,'Shema Amont nouveau appele dans Vanleer ' 405 482 first=.false. 406 483 do i=2,iip1 … … 434 511 if (pole_nord) then 435 512 DO i = 1, iim 436 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )513 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 437 514 ENDDO 438 515 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 441 518 if (pole_sud) then 442 519 DO i = 1, iim 443 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )520 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 444 521 ENDDO 445 522 qpsn = SSUM( iim, airesch ,1 ) / airejjm 446 523 endif 447 524 448 449 450 525 c calcul des pentes aux points v 451 526 … … 455 530 if (pole_sud) ije=ij_end-iip1 456 531 532 ! on a besoin de q entre ij_begin-2*iip1 et ij_end+2*iip1 533 ! Si pole sud, entre ij_begin-2*iip1 et ij_end 534 ! Si pole Nord, entre ij_begin et ij_end+2*iip1 457 535 DO ij=ijb,ije 458 dyqv(ij)=q(ij,l )-q(ij+iip1,l)536 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 459 537 adyqv(ij)=abs(dyqv(ij)) 460 538 ENDDO 539 461 540 462 541 c calcul des pentes aux points scalaires … … 475 554 IF (pole_nord) THEN 476 555 DO ij=1,iip1 477 dyq(ij,l)=qpns-q(ij+iip1,l )556 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 478 557 ENDDO 479 558 … … 497 576 498 577 DO ij=1,iip1 499 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn578 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 500 579 ENDDO 501 580 … … 633 712 DO ij=ijb,ije 634 713 IF(masse_adv_v(ij,l).gt.0) THEN 635 qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)* 636 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)) 714 qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)* 715 , 0.5*(1.-masse_adv_v(ij,l) 716 , /masse(ij+iip1,l,iq)) 637 717 ELSE 638 qbyv(ij,l)=q(ij,l )-dyq(ij,l)*639 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l ))718 qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)* 719 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) 640 720 ENDIF 641 721 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l) … … 643 723 ENDDO 644 724 c$OMP END DO NOWAIT 725 726 ! CRisi: appel récursif de l'advection sur les fils. 727 ! Il faut faire ça avant d'avoir mis à jour q et masse 728 !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) 729 730 ijb=ij_begin-2*iip1 731 ije=ij_end+2*iip1 732 if (pole_nord) ijb=ij_begin 733 if (pole_sud) ije=ij_end 734 735 if (nqfils(iq).gt.0) then 736 do ifils=1,nqdesc(iq) 737 iq2=iqfils(ifils,iq) 738 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 739 DO l=1,llm 740 DO ij=ijb,ije 741 masse(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 742 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 743 enddo 744 enddo 745 c$OMP END DO NOWAIT 746 enddo !do ifils=1,nqdesc(iq) 747 748 do ifils=1,nqfils(iq) 749 iq2=iqfils(ifils,iq) 750 call vly_loc(Ratio,pente_max,masse,qbyv,iq2) 751 enddo !do ifils=1,nqfils(iq) 752 endif !if (nqfils(iq).gt.0) then 753 ! end CRisi 645 754 646 755 ijb=ij_begin … … 652 761 DO l=1,llm 653 762 DO ij=ijb,ije 654 newmasse=masse(ij,l) 655 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 656 657 q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l)) 658 & /newmasse 659 masse(ij,l)=newmasse 660 ENDDO 763 newmasse=masse(ij,l,iq) 764 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 765 766 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) 767 & -qbyv(ij-iip1,l))/newmasse 768 769 masse(ij,l,iq)=newmasse 770 771 ENDDO 772 773 661 774 c.-. ancienne version 662 775 c convpn=SSUM(iim,qbyv(1,l),1)/apoln … … 665 778 convpn=SSUM(iim,qbyv(1,l),1) 666 779 convmpn=ssum(iim,masse_adv_v(1,l),1) 667 massepn=ssum(iim,masse(1,l ),1)780 massepn=ssum(iim,masse(1,l,iq),1) 668 781 qpn=0. 669 782 do ij=1,iim 670 qpn=qpn+masse(ij,l )*q(ij,l)783 qpn=qpn+masse(ij,l,iq)*q(ij,l,iq) 671 784 enddo 672 785 qpn=(qpn+convpn)/(massepn+convmpn) 673 786 do ij=1,iip1 674 q(ij,l )=qpn787 q(ij,l,iq)=qpn 675 788 enddo 676 789 endif … … 683 796 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) 684 797 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) 685 masseps=ssum(iim, masse(ip1jm+1,l ),1)798 masseps=ssum(iim, masse(ip1jm+1,l,iq),1) 686 799 qps=0. 687 800 do ij = ip1jm+1,ip1jmp1-1 688 qps=qps+masse(ij,l )*q(ij,l)801 qps=qps+masse(ij,l,iq)*q(ij,l,iq) 689 802 enddo 690 803 qps=(qps+convps)/(masseps+convmps) 691 804 do ij=ip1jm+1,ip1jmp1 692 q(ij,l )=qps805 q(ij,l,iq)=qps 693 806 enddo 694 807 endif … … 704 817 c DO ij = 1,iip1 705 818 c q(ij,l)=newq 706 c masse(ij,l )=newmasse*aire(ij)819 c masse(ij,l,iq)=newmasse*aire(ij) 707 820 c ENDDO 708 821 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) … … 714 827 c DO ij = ip1jm+1,ip1jmp1 715 828 c q(ij,l)=newq 716 c masse(ij,l )=newmasse*aire(ij)829 c masse(ij,l,iq)=newmasse*aire(ij) 717 830 c ENDDO 718 831 c._. fin nouvelle version … … 720 833 c$OMP END DO NOWAIT 721 834 835 ! retablir les fils en rapport de melange par rapport a l'air: 836 ijb=ij_begin 837 ije=ij_end 838 ! if (pole_nord) ijb=ij_begin 839 ! if (pole_sud) ije=ij_end 840 841 if (nqfils(iq).gt.0) then 842 do ifils=1,nqdesc(iq) 843 iq2=iqfils(ifils,iq) 844 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 845 DO l=1,llm 846 DO ij=ijb,ije 847 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 848 enddo 849 enddo 850 c$OMP END DO NOWAIT 851 enddo !do ifils=1,nqdesc(iq) 852 endif !if (nqfils(iq).gt.0) then 853 854 722 855 RETURN 723 856 END … … 725 858 726 859 727 SUBROUTINE vlz_loc(q,pente_max,masse,w,ijb_x,ije_x)860 RECURSIVE SUBROUTINE vlz_loc(q,pente_max,masse,w,ijb_x,ije_x,iq) 728 861 c 729 862 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 739 872 USE parallel_lmdz 740 873 USE vlz_mod 874 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 741 875 IMPLICIT NONE 742 876 c … … 750 884 c Arguments: 751 885 c ---------- 752 REAL masse(ijb_u:ije_u,llm),pente_max 753 REAL q(ijb_u:ije_u,llm) 754 REAL w(ijb_u:ije_u,llm+1) 886 REAL masse(ijb_u:ije_u,llm,nqtot),pente_max 887 REAL q(ijb_u:ije_u,llm,nqtot) 888 REAL w(ijb_u:ije_u,llm+1,nqtot) 889 INTEGER iq 755 890 c 756 891 c Local … … 779 914 LOGICAL,SAVE :: first=.TRUE. 780 915 !$OMP THREADPRIVATE(first) 781 916 917 !REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi 918 ! Ces varibles doivent être déclarées en pointer et en save dans 919 ! vlz_loc si on veut qu'elles soient vues par tous les threads. 920 INTEGER ifils,iq2 ! CRisi 782 921 783 922 IF (first) THEN … … 787 926 c sens de W 788 927 928 !write(*,*) 'vlsplt 926: entree dans vlz_loc, iq=',iq 789 929 #ifdef BIDON 790 930 IF(testcpu) THEN … … 799 939 DO l=2,llm 800 940 DO ij=ijb,ije 801 dzqw(ij,l)=q(ij,l-1 )-q(ij,l)941 dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq) 802 942 adzqw(ij,l)=abs(dzqw(ij,l)) 803 943 ENDDO … … 842 982 c calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq 843 983 984 !write(*,*) 'vlz 982,ijb,ije=',ijb,ije 844 985 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 845 986 DO l = 1,llm-1 846 987 do ij = ijb,ije 847 IF(w(ij,l+1).gt.0.) THEN 848 sigw=w(ij,l+1)/masse(ij,l+1) 849 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1)) 988 IF(w(ij,l+1,iq).gt.0.) THEN 989 sigw=w(ij,l+1,iq)/masse(ij,l+1,iq) 990 wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l+1,iq) 991 : +0.5*(1.-sigw)*dzq(ij,l+1)) 850 992 ELSE 851 sigw=w(ij,l+1)/masse(ij,l) 852 wq(ij,l+1)=w(ij,l+1)*(q(ij,l)-0.5*(1.+sigw)*dzq(ij,l)) 993 sigw=w(ij,l+1,iq)/masse(ij,l,iq) 994 wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l,iq) 995 : -0.5*(1.+sigw)*dzq(ij,l)) 853 996 ENDIF 854 997 ENDDO 855 998 ENDDO 856 c$OMP END DO NOWAIT 999 c$OMP END DO NOWAIT 1000 !write(*,*) 'vlz 1001' 857 1001 858 1002 c$OMP MASTER 859 1003 DO ij=ijb,ije 860 wq(ij,llm+1 )=0.861 wq(ij,1 )=0.1004 wq(ij,llm+1,iq)=0. 1005 wq(ij,1,iq)=0. 862 1006 ENDDO 863 1007 c$OMP END MASTER 864 1008 c$OMP BARRIER 865 1009 1010 ! CRisi: appel récursif de l'advection sur les fils. 1011 ! Il faut faire ça avant d'avoir mis à jour q et masse 1012 !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) 1013 if (nqfils(iq).gt.0) then 1014 do ifils=1,nqdesc(iq) 1015 iq2=iqfils(ifils,iq) 1016 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1017 DO l=1,llm 1018 DO ij=ijb,ije 1019 masse(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1020 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1021 !wq(ij,l,iq2)=wq(ij,l,iq) ! correction bug le 15mai2015 1022 w(ij,l,iq2)=wq(ij,l,iq) 1023 enddo 1024 enddo 1025 c$OMP END DO NOWAIT 1026 enddo !do ifils=1,nqdesc(iq) 1027 c$OMP BARRIER 1028 1029 do ifils=1,nqfils(iq) 1030 iq2=iqfils(ifils,iq) 1031 call vlz_loc(Ratio,pente_max,masse,w,ijb_x,ije_x,iq2) 1032 enddo !do ifils=1,nqfils(iq) 1033 endif !if (nqfils(iq).gt.0) then 1034 ! end CRisi 1035 1036 ! CRisi: On rajoute ici une barrière car on veut être sur que tous les 1037 ! wq soient synchronisés 1038 1039 c$OMP BARRIER 866 1040 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 867 1041 DO l=1,llm 868 1042 DO ij=ijb,ije 869 newmasse=masse(ij,l)+w(ij,l+1)-w(ij,l) 870 q(ij,l)=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l)) 1043 newmasse=masse(ij,l,iq)+w(ij,l+1,iq)-w(ij,l,iq) 1044 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq) 1045 & +wq(ij,l+1,iq)-wq(ij,l,iq)) 871 1046 & /newmasse 872 masse(ij,l)=newmasse 873 ENDDO 874 ENDDO 875 c$OMP END DO NOWAIT 876 1047 masse(ij,l,iq)=newmasse 1048 ENDDO 1049 ENDDO 1050 c$OMP END DO NOWAIT 1051 1052 1053 ! retablir les fils en rapport de melange par rapport a l'air: 1054 if (nqfils(iq).gt.0) then 1055 do ifils=1,nqdesc(iq) 1056 iq2=iqfils(ifils,iq) 1057 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1058 DO l=1,llm 1059 DO ij=ijb,ije 1060 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1061 enddo 1062 enddo 1063 c$OMP END DO NOWAIT 1064 enddo !do ifils=1,nqdesc(iq) 1065 endif !if (nqfils(iq).gt.0) then 877 1066 878 1067 RETURN
Note: See TracChangeset
for help on using the changeset viewer.