- Timestamp:
- Apr 24, 2020, 6:55:59 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/dyn3d/vlsplt.F
r1508 r2296 456 456 DO ij=iip2,ip1jm 457 457 ! On a besoin de q et masse seulement entre iip2 et ip1jm 458 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 459 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 458 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 459 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 460 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 461 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),1e-16) 462 if (q(ij,l,iq).gt.1e-16) then 463 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 464 else 465 Ratio(ij,l,iq2)=0. 466 endif 460 467 enddo 461 468 enddo … … 473 480 DO l=1,llm 474 481 DO ij=iip2+1,ip1jm 475 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 482 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 483 new_m=max(masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l),1e-16) 476 484 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 477 485 & u_mq(ij-1,l)-u_mq(ij,l)) … … 777 785 ! attention, chaque fils doit avoir son masseq, sinon, le 1er 778 786 ! fils ecrase le masseq de ses freres. 779 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 780 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 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 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 790 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),1e-16) 791 if (q(ij,l,iq).gt.1e-16) then 792 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 793 else 794 Ratio(ij,l,iq2)=0. 795 endif 781 796 enddo 782 797 enddo … … 997 1012 DO l=1,llm 998 1013 DO ij=1,ip1jmp1 999 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1000 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1014 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1015 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1016 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 1017 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),1e-16) 1018 if (q(ij,l,iq).gt.1e-16) then 1019 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1020 else 1021 Ratio(ij,l,iq2)=0. 1022 endif 1001 1023 enddo 1002 1024 enddo -
trunk/LMDZ.COMMON/libf/dyn3d_common/infotrac.F90
r1971 r2296 109 109 110 110 INTEGER :: nqtrue ! number of tracers read from tracer.def, without higer order of moment 111 INTEGER :: iq, new_iq, iiq, jq, ierr, ierr 2, ierr3111 INTEGER :: iq, new_iq, iiq, jq, ierr, ierr1, ierr2, ierr3, ierr4 !MVals: add ierr1 et ierr4 for the isotope case 112 112 INTEGER :: ifils,ipere,generation ! CRisi 113 113 LOGICAL :: continu,nouveau_traceurdef … … 533 533 ! try to be smart when reading traceur.def 534 534 read(90,'(80a)') line ! store the line from traceur.def 535 ! if format is hadv, vadv, tnom_0, tnom_transp 536 read(line,*,iostat=ierr1) hadv(iq),vadv(iq),tnom_0(iq),tnom_transp(iq) 537 if (ierr1.ne.0) then 535 538 ! assume format is hadv,vadv,tnom_0 536 read(line,*,iostat=ierr2) hadv(iq),vadv(iq),tnom_0(iq)537 if (ierr2.ne.0) then539 read(line,*,iostat=ierr2) hadv(iq),vadv(iq),tnom_0(iq) 540 if (ierr2.ne.0) then 538 541 ! maybe format is tnom0,hadv,vadv 539 542 read(line,*,iostat=ierr3) tnom_0(iq),hadv(iq),vadv(iq) 540 if (ierr3.ne.0) then 541 ! assume only tnom0 is provided (havd and vad default to 10) 542 read(line,*) tnom_0(iq) 543 if (ierr3.ne.0) then 544 !assuming values of hadv et vadv 543 545 hadv(iq)=10 544 546 vadv(iq)=10 547 read(line,*, iostat=ierr4) tnom_0(iq), tnom_transp(iq) 548 if (ierr4.ne.0) then 549 ! assume only tnom0 is provided (havd and vad default to 10) 550 read(line,*) tnom_0(iq) 551 tnom_transp(iq)='air' 552 endif 545 553 endif 554 endif 555 !tnom_transp(iq)='air' ! no isotopes... for now... !LRossi: we now add the possibility to use isotopes (HDO cycle) 546 556 endif ! of if(ierr2.ne.0) 547 tnom_transp(iq)='air' ! no isotopes... for now...548 557 END DO ! of DO iq=1,nqtrue 549 558 CLOSE(90) -
trunk/LMDZ.COMMON/libf/dyn3dpar/advtrac_p.F90
r2126 r2296 17 17 USE Vampir 18 18 USE times 19 USE infotrac, ONLY: nqtot, iadv 19 USE infotrac, ONLY: nqtot, iadv, ok_iso_verif 20 20 USE control_mod, ONLY: iapp_tracvl, day_step, planet_type, & 21 21 force_conserv_tracer … … 271 271 272 272 !ym call massbar_p(massem,massebx,masseby) 273 274 273 call vlspltgen_p( q,iadv, 2., massem, wg , & 275 274 pbarug,pbarvg,dtvr,p_tmp,pk_tmp,teta_tmp ) 276 275 276 !write(*,*) 'advtrac 162: apres appel vlspltgen_loc' 277 if (ok_iso_verif) then 278 call check_isotopes(q,1,ip1jmp1,'advtrac 162') 279 endif !if (ok_iso_verif) then 277 280 278 281 !!! ATTENTION !!!! TOUT CE QUI EST ENTRE ICI ET 1234 EST OBSOLETE !!!!!!! … … 291 294 if(iadv(iq).eq.10) THEN 292 295 293 call vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr) 296 ! call vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr) 297 call vlsplt_p(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq) !MVals 294 298 295 299 ! ---------------------------------------------------------------- -
trunk/LMDZ.COMMON/libf/dyn3dpar/vlsplt_p.F
r1422 r2296 1 SUBROUTINE vlsplt_p(q,pente_max,masse,w,pbaru,pbarv,pdt )1 SUBROUTINE vlsplt_p(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) 2 2 c 3 3 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 17 17 USE mod_hallo 18 18 USE Vampir 19 USE infotrac, ONLY : nqtot,nqdesc,iqfils ! CRisi 19 20 IMPLICIT NONE 20 21 c … … 28 29 c REAL masse(iip1,jjp1,llm),pente_max 29 30 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 30 REAL q(ip1jmp1,llm) 31 c REAL q(iip1,jjp1,llm) 31 REAL q(ip1jmp1,llm,nqtot) !CRisi: add dimension nqtot 32 32 REAL w(ip1jmp1,llm),pdt 33 INTEGER iq !CRisi 33 34 c 34 35 c Local … … 38 39 INTEGER ijlqmin,iqmin,jqmin,lqmin 39 40 c 40 REAL zm(ip1jmp1,llm ),newmasse41 REAL zm(ip1jmp1,llm,nqtot),newmasse 41 42 REAL mu(ip1jmp1,llm) 42 43 REAL mv(ip1jm,llm) 43 REAL mw(ip1jmp1,llm+1 )44 REAL zq(ip1jmp1,llm ),zz44 REAL mw(ip1jmp1,llm+1,nqtot) 45 REAL zq(ip1jmp1,llm,nqtot),zz 45 46 REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm) 46 47 REAL second,temps0,temps1,temps2,temps3 … … 51 52 SAVE temps1,temps2,temps3 52 53 INTEGER iminn,imaxx 54 INTEGER ifils,iq2 ! CRisi 53 55 54 56 REAL qmin,qmax … … 93 95 DO l=1,llm 94 96 DO ij=ijb,ije 95 mw(ij,l )=w(ij,l) * zzw97 mw(ij,l,iq)=w(ij,l) * zzw 96 98 ENDDO 97 99 ENDDO 98 100 99 101 DO ij=ijb,ije 100 mw(ij,llm+1 )=0.102 mw(ij,llm+1,iq)=0. 101 103 ENDDO 102 104 … … 106 108 ijb=ij_begin 107 109 ije=ij_end 108 zq(ijb:ije,: )=q(ijb:ije,:)109 zm(ijb:ije,: )=masse(ijb:ije,:)110 zq(ijb:ije,:,iq)=q(ijb:ije,:,iq) 111 zm(ijb:ije,:,iq)=masse(ijb:ije,:) 110 112 111 113 112 114 c print*,'Entree vlx1' 113 115 c call minmaxq(zq,qmin,qmax,'avant vlx ') 114 call vlx_p(zq,pente_max,zm,mu,ij_begin,ij_begin+2*iip1-1 )115 call vlx_p(zq,pente_max,zm,mu,ij_end-2*iip1+1,ij_end )116 call vlx_p(zq,pente_max,zm,mu,ij_begin,ij_begin+2*iip1-1,iq) 117 call vlx_p(zq,pente_max,zm,mu,ij_end-2*iip1+1,ij_end,iq) 116 118 call VTb(VTHallo) 117 119 call Register_Hallo(zq,ip1jmp1,llm,2,2,2,2,MyRequest1) … … 119 121 call SendRequest(MyRequest1) 120 122 call VTe(VTHallo) 121 call vlx_p(zq,pente_max,zm,mu,ij_begin+2*iip1,ij_end-2*iip1 )123 call vlx_p(zq,pente_max,zm,mu,ij_begin+2*iip1,ij_end-2*iip1,iq) 122 124 c call vlx_p(zq,pente_max,zm,mu,ij_begin,ij_end) 123 125 call VTb(VTHallo) … … 133 135 c call exchange_hallo(zm,ip1jmp1,llm,1,1) 134 136 135 call vly_p(zq,pente_max,zm,mv )137 call vly_p(zq,pente_max,zm,mv,iq) 136 138 c call minmaxq(zq,qmin,qmax,'apres vly1 ') 137 139 c print*,'Sortie vly1' 138 call vlz_p(zq,pente_max,zm,mw,ij_begin,ij_begin+2*iip1-1 )139 call vlz_p(zq,pente_max,zm,mw,ij_end-2*iip1+1,ij_end )140 call vlz_p(zq,pente_max,zm,mw,ij_begin,ij_begin+2*iip1-1,iq) 141 call vlz_p(zq,pente_max,zm,mw,ij_end-2*iip1+1,ij_end,iq) 140 142 call VTb(VTHallo) 141 143 call Register_Hallo(zq,ip1jmp1,llm,2,2,2,2,MyRequest2) … … 143 145 call SendRequest(MyRequest2) 144 146 call VTe(VTHallo) 145 call vlz_p(zq,pente_max,zm,mw,ij_begin+2*iip1,ij_end-2*iip1 )147 call vlz_p(zq,pente_max,zm,mw,ij_begin+2*iip1,ij_end-2*iip1,iq) 146 148 call VTb(VTHallo) 147 149 call WaitRecvRequest(MyRequest2) … … 154 156 155 157 156 call vly_p(zq,pente_max,zm,mv )158 call vly_p(zq,pente_max,zm,mv,iq) 157 159 c call minmaxq(zq,qmin,qmax,'apres vly ') 158 160 159 161 160 call vlx_p(zq,pente_max,zm,mu,ij_begin,ij_end )162 call vlx_p(zq,pente_max,zm,mu,ij_begin,ij_end,iq) 161 163 c call minmaxq(zq,qmin,qmax,'apres vlx2 ') 162 164 … … 167 169 DO l=1,llm 168 170 DO ij=ijb,ije 169 q(ij,l )=zq(ij,l)171 q(ij,l,iq)=zq(ij,l,iq) 170 172 ENDDO 171 173 ENDDO … … 174 176 DO l=1,llm 175 177 DO ij=ijb,ije-iip1+1,iip1 176 q(ij+iim,l)=q(ij,l) 177 ENDDO 178 ENDDO 178 q(ij+iim,l,iq)=q(ij,l,iq) 179 ENDDO 180 ENDDO 181 182 ! CRisi: aussi pour les fils 183 if (nqdesc(iq).gt.0) then 184 do ifils=1,nqdesc(iq) 185 iq2=iqfils(ifils,iq) 186 DO l=1,llm 187 DO ij=ijb,ije 188 q(ij,l,iq2)=zq(ij,l,iq2) 189 ENDDO 190 DO ij=ijb,ije-iip1+1,iip1 191 q(ij+iim,l,iq2)=q(ij,l,iq2) 192 ENDDO 193 ENDDO 194 enddo !do ifils=1,nqdesc(iq) 195 endif ! if (nqdesc(iq).gt.0) then 179 196 180 197 call WaitSendRequest(MyRequest1) … … 185 202 186 203 187 SUBROUTINE vlx_p(q,pente_max,masse,u_m,ijb_x,ije_x)204 RECURSIVE SUBROUTINE vlx_p(q,pente_max,masse,u_m,ijb_x,ije_x,iq) 188 205 189 206 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 197 214 c -------------------------------------------------------------------- 198 215 USE Parallel_lmdz 216 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 199 217 IMPLICIT NONE 200 218 c … … 205 223 c Arguments: 206 224 c ---------- 207 REAL masse(ip1jmp1,llm ),pente_max225 REAL masse(ip1jmp1,llm,nqtot),pente_max 208 226 REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm) 209 REAL q(ip1jmp1,llm) 210 REAL w(ip1jmp1,llm) 227 REAL q(ip1jmp1,llm,nqtot) ! CRisi: ajout dimension nqtot 228 !REAL w(ip1jmp1,llm,nqtot) !MVals seems not useful in this case 229 INTEGER iq ! CRisi 211 230 c 212 231 c Local … … 222 241 REAL u_mq(ip1jmp1,llm) 223 242 243 REAL Ratio(ip1jmp1,llm,nqtot) ! CRisi,MVals: Ratio zq(fils)/zq(pere) 244 INTEGER ifils,iq2 ! CRisi,MVals: indices pour les traceurs fils 245 224 246 Logical extremum 225 247 … … 238 260 if (pole_nord.and.ijb==1) ijb=ijb+iip1 239 261 if (pole_sud.and.ije==ip1jmp1) ije=ije-iip1 240 262 241 263 IF (pente_max.gt.-1.e-5) THEN 242 264 c IF (pente_max.gt.10) THEN … … 250 272 251 273 DO ij=ijb,ije-1 252 dxqu(ij)=q(ij+1,l )-q(ij,l)274 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 253 275 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 254 c sigu(ij)=u_m(ij,l)/masse(ij,l )276 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 255 277 ENDDO 256 278 DO ij=ijb+iip1-1,ije,iip1 … … 306 328 DO l = 1, llm 307 329 DO ij=ijb,ije-1 308 dxqu(ij)=q(ij+1,l )-q(ij,l)330 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 309 331 ENDDO 310 332 DO ij=ijb+iip1-1,ije,iip1 … … 326 348 c$OMP END DO NOWAIT 327 349 ENDIF ! (pente_max.lt.-1.e-5) 328 329 350 c bouclage de la pente en iip1: 330 351 c ----------------------------- … … 348 369 DO l=1,llm 349 370 DO ij=ijb,ije-1 350 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),351 , 1.+u_m(ij,l)/masse(ij+1,l ),352 , u_m(ij,l ))371 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 372 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 373 , u_m(ij,l,iq)) 353 374 zdum(ij,l)=0.5*zdum(ij,l) 354 375 u_mq(ij,l)=cvmgp( 355 , q(ij,l )+zdum(ij,l)*dxq(ij,l),356 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),376 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 377 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 357 378 , u_m(ij,l)) 358 379 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 367 388 DO l=1,llm 368 389 DO ij=ijb,ije-1 369 c print*,'masse(',ij,')=',masse(ij,l )390 c print*,'masse(',ij,')=',masse(ij,l,iq) 370 391 IF (u_m(ij,l).gt.0.) THEN 371 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l )372 u_mq(ij,l)=u_m(ij,l)*(q(ij,l )+0.5*zdum(ij,l)*dxq(ij,l))392 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 393 u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l)) 373 394 ELSE 374 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l) 375 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l)) 395 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 396 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq)-0.5*zdum(ij,l) 397 & *dxq(ij+1,l)) 376 398 ENDIF 377 399 ENDDO … … 426 448 c PRINT*,'Nombre de points pour lesquels on advect plus que le' 427 449 c & ,'contenu de la maille : ',n0 450 428 451 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 429 452 DO l=1,llm … … 450 473 i=ijq-(j-1)*iip1 451 474 c accumulation pour les mailles completements advectees 452 do while(zu_m.gt.masse(ijq,l)) 453 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 454 zu_m=zu_m-masse(ijq,l) 475 do while(zu_m.gt.masse(ijq,l,iq)) 476 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq)* 477 & masse(ijq,l,iq) 478 zu_m=zu_m-masse(ijq,l,iq) 455 479 i=mod(i-2+iim,iim)+1 456 480 ijq=(j-1)*iip1+i … … 458 482 c ajout de la maille non completement advectee 459 483 u_mq(ij,l)=u_mq(ij,l)+zu_m* 460 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 484 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) 485 & *dxq(ijq,l)) 461 486 ELSE 462 487 ijq=ij+1 463 488 i=ijq-(j-1)*iip1 464 489 c accumulation pour les mailles completements advectees 465 do while(-zu_m.gt.masse(ijq,l)) 466 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 467 zu_m=zu_m+masse(ijq,l) 490 do while(-zu_m.gt.masse(ijq,l,iq)) 491 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 492 & *masse(ijq,l,iq) 493 zu_m=zu_m+masse(ijq,l,iq) 468 494 i=mod(i,iim)+1 469 495 ijq=(j-1)*iip1+i 470 496 ENDDO 471 497 c ajout de la maille non completement advectee 472 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-473 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))498 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 499 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 474 500 ENDIF 475 501 ENDDO … … 491 517 c$OMP END DO NOWAIT 492 518 519 ! CRisi: appel récursif de l'advection sur les fils. 520 ! Il faut faire ça avant d'avoir mis à jour q et masse 521 if (nqfils(iq).gt.0) then 522 do ifils=1,nqdesc(iq) 523 iq2=iqfils(ifils,iq) 524 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 525 DO l=1,llm 526 DO ij=ijb,ije 527 ! On a besoin de q et masse seulement entre ijb et ije. On ne 528 ! les calcule donc que de ijb à ije 529 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 530 masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),1e-16) 531 if (q(ij,l,iq).gt.1e-16) then 532 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 533 else 534 Ratio(ij,l,iq2)=0. 535 endif 536 enddo 537 enddo 538 c$OMP END DO NOWAIT 539 enddo !do ifils=1,nqdesc(iq) 540 do ifils=1,nqfils(iq) 541 iq2=iqfils(ifils,iq) 542 call vlx_p(Ratio,pente_max,masse,u_mq,ijb_x,ije_x,iq2) 543 enddo !do ifils=1,nqfils(iq) 544 endif !if (nqfils(iq).gt.0) then 545 ! end CRisi 493 546 c calcul des tENDances 494 547 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 495 548 DO l=1,llm 496 549 DO ij=ijb+1,ije 497 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l) 498 q(ij,l)=(q(ij,l)*masse(ij,l)+ 550 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 551 new_m=max(masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l),1e-16) 552 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 499 553 & u_mq(ij-1,l)-u_mq(ij,l)) 500 554 & /new_m 501 masse(ij,l )=new_m555 masse(ij,l,iq)=new_m 502 556 ENDDO 503 557 c ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 504 558 DO ij=ijb+iip1-1,ije,iip1 505 q(ij-iim,l )=q(ij,l)506 masse(ij-iim,l )=masse(ij,l)559 q(ij-iim,l,iq)=q(ij,l,iq) 560 masse(ij-iim,l,iq)=masse(ij,l,iq) 507 561 ENDDO 508 562 ENDDO … … 511 565 c CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) 512 566 567 ! retablir les fils en rapport de melange par rapport a l'air: 568 ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio 569 ! puis on boucle en longitude 570 if (nqfils(iq).gt.0) then 571 do ifils=1,nqdesc(iq) 572 iq2=iqfils(ifils,iq) 573 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 574 DO l=1,llm 575 DO ij=ijb+1,ije 576 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 577 enddo 578 DO ij=ijb+iip1-1,ije,iip1 579 q(ij-iim,l,iq2)=q(ij,l,iq2) 580 enddo ! DO ij=ijb+iip1-1,ije,iip1 581 enddo !DO l=1,llm 582 c$OMP END DO NOWAIT 583 enddo !do ifils=1,nqdesc(iq) 584 endif !if (nqfils(iq).gt.0) then 513 585 514 586 RETURN … … 516 588 517 589 518 SUBROUTINE vly_p(q,pente_max,masse,masse_adv_v)590 RECURSIVE SUBROUTINE vly_p(q,pente_max,masse,masse_adv_v,iq) 519 591 c 520 592 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 529 601 c -------------------------------------------------------------------- 530 602 USE parallel_lmdz 603 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 531 604 USE comconst_mod, ONLY: pi 532 605 … … 540 613 c Arguments: 541 614 c ---------- 542 REAL masse(ip1jmp1,llm ),pente_max615 REAL masse(ip1jmp1,llm,nqtot),pente_max 543 616 REAL masse_adv_v( ip1jm,llm) 544 REAL q(ip1jmp1,llm), dq( ip1jmp1,llm) 617 REAL q(ip1jmp1,llm,nqtot), dq( ip1jmp1,llm) ! CRisi: ajout dimension nqtot 618 INTEGER iq ! CRisi 545 619 c 546 620 c Local … … 571 645 SAVE airej2,airejjm 572 646 c$OMP THREADPRIVATE(airej2,airejjm) 647 648 REAL Ratio(ip1jmp1,llm,nqtot) ! CRisi,MVals: Ratio zq(fils)/zq(pere) 649 INTEGER ifils,iq2 ! CRisi,MVals: indices pour les traceurs fils 573 650 c 574 651 c … … 613 690 if (pole_nord) then 614 691 DO i = 1, iim 615 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )692 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 616 693 ENDDO 617 694 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 620 697 if (pole_sud) then 621 698 DO i = 1, iim 622 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )699 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 623 700 ENDDO 624 701 qpsn = SSUM( iim, airesch ,1 ) / airejjm … … 635 712 636 713 DO ij=ijb,ije 637 dyqv(ij)=q(ij,l )-q(ij+iip1,l)714 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 638 715 adyqv(ij)=abs(dyqv(ij)) 639 716 ENDDO … … 654 731 IF (pole_nord) THEN 655 732 DO ij=1,iip1 656 dyq(ij,l)=qpns-q(ij+iip1,l )733 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 657 734 ENDDO 658 735 … … 676 753 677 754 DO ij=1,iip1 678 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn755 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 679 756 ENDDO 680 757 … … 812 889 DO ij=ijb,ije 813 890 IF(masse_adv_v(ij,l).gt.0) THEN 814 qbyv(ij,l)=q(ij+iip1,l )+dyq(ij+iip1,l)*815 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l ))891 qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)* 892 , 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l,iq)) 816 893 ELSE 817 qbyv(ij,l)=q(ij,l )-dyq(ij,l)*818 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l ))894 qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)* 895 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) 819 896 ENDIF 820 897 qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l) … … 822 899 ENDDO 823 900 c$OMP END DO NOWAIT 901 902 ! CRisi: appel récursif de l'advection sur les fils. 903 ! Il faut faire ça avant d'avoir mis à jour q et masse 904 !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) 905 906 ijb=ij_begin-2*iip1 907 ije=ij_end+2*iip1 908 if (pole_nord) ijb=ij_begin 909 if (pole_sud) ije=ij_end 910 911 if (nqfils(iq).gt.0) then 912 do ifils=1,nqdesc(iq) 913 iq2=iqfils(ifils,iq) 914 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 915 DO l=1,llm 916 DO ij=ijb,ije 917 !masse(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 918 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 919 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 920 masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),1e-16) 921 if (q(ij,l,iq).gt.1e-16) then 922 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 923 else 924 Ratio(ij,l,iq2)=0. 925 endif 926 enddo 927 enddo 928 c$OMP END DO NOWAIT 929 enddo !do ifils=1,nqdesc(iq) 930 931 do ifils=1,nqfils(iq) 932 iq2=iqfils(ifils,iq) 933 call vly_p(Ratio,pente_max,masse,qbyv,iq2) 934 enddo !do ifils=1,nqfils(iq) 935 endif !if (nqfils(iq).gt.0) then 936 ! end CRisi 824 937 825 938 ijb=ij_begin … … 831 944 DO l=1,llm 832 945 DO ij=ijb,ije 833 newmasse=masse(ij,l )946 newmasse=masse(ij,l,iq) 834 947 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 835 948 836 q(ij,l )=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))837 & /newmasse838 masse(ij,l )=newmasse949 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq) 950 & +qbyv(ij,l)-qbyv(ij-iip1,l))/newmasse 951 masse(ij,l,iq)=newmasse 839 952 ENDDO 840 953 c.-. ancienne version … … 844 957 convpn=SSUM(iim,qbyv(1,l),1) 845 958 convmpn=ssum(iim,masse_adv_v(1,l),1) 846 massepn=ssum(iim,masse(1,l ),1)959 massepn=ssum(iim,masse(1,l,iq),1) 847 960 qpn=0. 848 961 do ij=1,iim 849 qpn=qpn+masse(ij,l )*q(ij,l)962 qpn=qpn+masse(ij,l,iq)*q(ij,l,iq) 850 963 enddo 851 964 qpn=(qpn+convpn)/(massepn+convmpn) 852 965 do ij=1,iip1 853 q(ij,l )=qpn966 q(ij,l,iq)=qpn 854 967 enddo 855 968 endif … … 862 975 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) 863 976 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1) 864 masseps=ssum(iim, masse(ip1jm+1,l ),1)977 masseps=ssum(iim, masse(ip1jm+1,l,iq),1) 865 978 qps=0. 866 979 do ij = ip1jm+1,ip1jmp1-1 867 qps=qps+masse(ij,l )*q(ij,l)980 qps=qps+masse(ij,l,iq)*q(ij,l,iq) 868 981 enddo 869 982 qps=(qps+convps)/(masseps+convmps) 870 983 do ij=ip1jm+1,ip1jmp1 871 q(ij,l )=qps984 q(ij,l,iq)=qps 872 985 enddo 873 986 endif … … 899 1012 c$OMP END DO NOWAIT 900 1013 1014 ! CRisi: retablir les fils en rapport de melange par rapport a l'air: 1015 ijb=ij_begin 1016 ije=ij_end 1017 ! if (pole_nord) ijb=ij_begin 1018 ! if (pole_sud) ije=ij_end 1019 1020 if (nqfils(iq).gt.0) then 1021 do ifils=1,nqdesc(iq) 1022 iq2=iqfils(ifils,iq) 1023 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1024 DO l=1,llm 1025 DO ij=ijb,ije 1026 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1027 enddo 1028 enddo 1029 c$OMP END DO NOWAIT 1030 enddo !do ifils=1,nqdesc(iq) 1031 endif !if (nqfils(iq).gt.0) then 1032 901 1033 RETURN 902 1034 END … … 904 1036 905 1037 906 SUBROUTINE vlz_p(q,pente_max,masse,w,ijb_x,ije_x)1038 RECURSIVE SUBROUTINE vlz_p(q,pente_max,masse,w,ijb_x,ije_x,iq) 907 1039 c 908 1040 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 917 1049 c -------------------------------------------------------------------- 918 1050 USE Parallel_lmdz 1051 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 919 1052 IMPLICIT NONE 920 1053 c … … 925 1058 c Arguments: 926 1059 c ---------- 927 REAL masse(ip1jmp1,llm),pente_max 928 REAL q(ip1jmp1,llm) 929 REAL w(ip1jmp1,llm+1) 1060 REAL masse(ip1jmp1,llm,nqtot),pente_max 1061 REAL q(ip1jmp1,llm,nqtot) 1062 REAL w(ip1jmp1,llm+1,nqtot) 1063 INTEGER iq 930 1064 c 931 1065 c Local … … 934 1068 INTEGER i,ij,l,j,ii 935 1069 c 936 REAL,SAVE :: wq(ip1jmp1,llm+1) 1070 ! REAL,SAVE :: wq(ip1jmp1,llm+1) 1071 REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: wq !MVals 1072 937 1073 REAL newmasse 938 1074 … … 956 1092 c On oriente tout dans le sens de la pression c'est a dire dans le 957 1093 c sens de W 1094 !REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi 1095 ! Ces varibles doivent être déclarées en pointer et en save dans 1096 ! vlz_loc si on veut qu'elles soient vues par tous les threads. 1097 !REAL Ratio(ip1jmp1,llm,nqtot) ! CRisi 1098 REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: Ratio ! CRisi 1099 INTEGER ifils,iq2 ! CRisi 1100 LOGICAL, SAVE :: first=.TRUE.!MVals 1101 !$OMP THREADPRIVATE(first) 1102 1103 IF (first) THEN !MVals 1104 first=.FALSE. 1105 !$OMP MASTER 1106 ALLOCATE(wq(ip1jmp1,llm+1,nqtot)) !MVals 1107 ALLOCATE(Ratio(ip1jmp1,llm,nqtot)) !MVals 1108 !$OMP END MASTER 1109 !$OMP BARRIER 1110 END IF !MVals 958 1111 959 1112 #ifdef BIDON … … 969 1122 DO l=2,llm 970 1123 DO ij=ijb,ije 971 dzqw(ij,l)=q(ij,l-1 )-q(ij,l)1124 dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq) 972 1125 adzqw(ij,l)=abs(dzqw(ij,l)) 973 1126 ENDDO … … 999 1152 dzq(ij,llm)=0. 1000 1153 ENDDO 1154 ! ALLOCATE(wq(ip1jmp1,llm+1,nqtot)) !MVals 1001 1155 c$OMP END MASTER 1002 1156 c$OMP BARRIER … … 1015 1169 DO l = 1,llm-1 1016 1170 do ij = ijb,ije 1017 IF(w(ij,l+1).gt.0.) THEN 1018 sigw=w(ij,l+1)/masse(ij,l+1) 1019 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1)) 1171 IF(w(ij,l+1,iq).gt.0.) THEN 1172 sigw=w(ij,l+1,iq)/masse(ij,l+1,iq) 1173 wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l+1,iq)+0.5*(1.-sigw) 1174 & *dzq(ij,l+1)) 1020 1175 ELSE 1021 sigw=w(ij,l+1)/masse(ij,l) 1022 wq(ij,l+1)=w(ij,l+1)*(q(ij,l)-0.5*(1.+sigw)*dzq(ij,l)) 1176 sigw=w(ij,l+1,iq)/masse(ij,l,iq) 1177 wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l,iq)-0.5*(1.+sigw) 1178 & *dzq(ij,l)) 1023 1179 ENDIF 1024 1180 ENDDO … … 1028 1184 c$OMP MASTER 1029 1185 DO ij=ijb,ije 1030 wq(ij,llm+1 )=0.1031 wq(ij,1 )=0.1186 wq(ij,llm+1,iq)=0. 1187 wq(ij,1,iq)=0. 1032 1188 ENDDO 1033 1189 c$OMP END MASTER 1034 1190 c$OMP BARRIER 1035 1191 1192 ! CRisi: appel récursif de l'advection sur les fils. 1193 ! Il faut faire ça avant d'avoir mis à jour q et masse 1194 !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) 1195 if (nqfils(iq).gt.0) then 1196 do ifils=1,nqdesc(iq) 1197 iq2=iqfils(ifils,iq) 1198 !print*,"margaux:vlsplt,PERE",iq 1199 !print*,"margaux:vlsplt,FILS",iq2 1200 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1201 DO l=1,llm 1202 DO ij=ijb,ije 1203 !masse(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1204 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1205 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 1206 masse(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),1e-16) 1207 if (q(ij,l,iq).gt.1e-16) then 1208 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1209 else 1210 Ratio(ij,l,iq2)=0. 1211 endif 1212 !wq(ij,l,iq2)=wq(ij,l,iq) ! correction bug le 15mai2015 1213 w(ij,l,iq2)=wq(ij,l,iq) 1214 enddo 1215 enddo 1216 c$OMP END DO NOWAIT 1217 enddo !do ifils=1,nqdesc(iq) 1218 c$OMP BARRIER 1219 1220 do ifils=1,nqfils(iq) 1221 iq2=iqfils(ifils,iq) 1222 call vlz_p(Ratio,pente_max,masse,w,ijb_x,ije_x,iq2) 1223 enddo !do ifils=1,nqfils(iq) 1224 endif !if (nqfils(iq).gt.0) then 1225 ! end CRisi 1226 1227 ! CRisi: On rajoute ici une barrière car on veut être sur que tous les 1228 ! wq soient synchronisés 1229 1230 c$OMP BARRIER 1036 1231 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1037 1232 DO l=1,llm 1038 1233 DO ij=ijb,ije 1039 newmasse=masse(ij,l)+w(ij,l+1)-w(ij,l) 1040 q(ij,l)=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l)) 1041 & /newmasse 1042 masse(ij,l)=newmasse 1043 ENDDO 1044 ENDDO 1045 c$OMP END DO NOWAIT 1046 1234 newmasse=masse(ij,l,iq)+w(ij,l+1,iq)-w(ij,l,iq) 1235 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq) 1236 & +wq(ij,l+1,iq)-wq(ij,l,iq))/newmasse 1237 masse(ij,l,iq)=newmasse 1238 ENDDO 1239 ENDDO 1240 c$OMP END DO NOWAIT 1241 1242 ! retablir les fils en rapport de melange par rapport a l'air: 1243 if (nqfils(iq).gt.0) then 1244 do ifils=1,nqdesc(iq) 1245 iq2=iqfils(ifils,iq) 1246 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 1247 DO l=1,llm 1248 DO ij=ijb,ije 1249 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1250 enddo 1251 enddo 1252 c$OMP END DO NOWAIT 1253 enddo !do ifils=1,nqdesc(iq) 1254 endif !if (nqfils(iq).gt.0) then 1047 1255 1048 1256 RETURN -
trunk/LMDZ.COMMON/libf/dyn3dpar/vlspltgen_p.F
r1422 r2296 26 26 USE Write_Field_p 27 27 USE VAMPIR 28 USE infotrac, ONLY : nqtot 28 USE infotrac, ONLY : nqtot,nqperes,nqdesc,nqfils,iqfils, 29 & ok_iso_verif 29 30 USE comconst_mod, ONLY: cpp 30 31 IMPLICIT NONE … … 53 54 REAL,SAVE :: mu(ip1jmp1,llm) 54 55 REAL,SAVE :: mv(ip1jm,llm) 55 REAL,SAVE :: mw(ip1jmp1,llm+1) 56 !REAL,SAVE :: mw(ip1jmp1,llm+1) 57 REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: mw !MVals 56 58 REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: zq 57 59 REAL zzpbar, zzw … … 65 67 REAL ptarg,pdelarg,foeew,zdelta 66 68 REAL tempe(ip1jmp1) 67 INTEGER ijb,ije,iq 69 INTEGER ijb,ije,iq,iq2,ifils 68 70 LOGICAL, SAVE :: firstcall=.TRUE. 69 71 !$OMP THREADPRIVATE(firstcall) … … 91 93 !$OMP MASTER 92 94 ALLOCATE(zm(ip1jmp1,llm,nqtot)) 95 ALLOCATE(mw(ip1jmp1,llm+1,nqtot)) !MVals 93 96 ALLOCATE(zq(ip1jmp1,llm,nqtot)) 94 97 !$OMP END MASTER … … 155 158 ije=ij_end 156 159 160 DO iq=1,nqtot 157 161 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 158 162 DO l=1,llm 159 163 DO ij=ijb,ije 160 mw(ij,l )=w(ij,l) * zzw164 mw(ij,l,iq)=w(ij,l) * zzw 161 165 ENDDO 162 166 ENDDO 163 167 c$OMP END DO NOWAIT 164 168 ENDDO 169 170 DO iq=1,nqtot 165 171 c$OMP MASTER 166 172 DO ij=ijb,ije 167 mw(ij,llm+1)=0. 168 ENDDO 169 c$OMP END MASTER 173 mw(ij,llm+1,iq)=0. 174 ENDDO 175 c$OMP END MASTER 176 ENDDO 170 177 171 178 c CALL SCOPY(ijp1llm,q,1,zq,1) … … 184 191 ENDDO 185 192 193 ! verif temporaire 194 ijb=ij_begin 195 ije=ij_end 196 if (ok_iso_verif) then 197 call check_isotopes(zq,ijb,ije,'vlspltgen_loc 197') 198 endif !if (ok_iso_verif) then 186 199 187 200 c$OMP BARRIER 188 DO iq=1,nqtot189 201 ! DO iq=1,nqtot 202 DO iq=1,nqperes ! CRisi: on ne boucle que sur les pères= ceux qui sont transportés directement par l'air 190 203 if(iadv(iq) == 0) then 191 204 … … 193 206 194 207 else if (iadv(iq)==10) then 195 196 #ifdef _ADV_HALO 197 call vlx_p(zq(1,1,iq),pente_max,zm(1,1,iq),mu, 198 & ij_begin,ij_begin+2*iip1-1) 199 call vlx_p(zq(1,1,iq),pente_max,zm(1,1,iq),mu, 200 & ij_end-2*iip1+1,ij_end) 208 #ifdef _ADV_HALO 209 call vlx_p(zq,pente_max,zm,mu, 210 & ij_begin,ij_begin+2*iip1-1,iq) 211 call vlx_p(zq,pente_max,zm,mu, 212 & ij_end-2*iip1+1,ij_end,iq) 201 213 #else 202 call vlx_p(zq (1,1,iq),pente_max,zm(1,1,iq),mu,203 & ij_begin,ij_end )214 call vlx_p(zq,pente_max,zm,mu, 215 & ij_begin,ij_end,iq) 204 216 #endif 205 217 … … 209 221 call Register_Hallo(zq(1,1,iq),ip1jmp1,llm,2,2,2,2,MyRequest1) 210 222 call Register_Hallo(zm(1,1,iq),ip1jmp1,llm,1,1,1,1,MyRequest1) 211 223 ! CRisi 224 do ifils=1,nqdesc(iq) 225 iq2=iqfils(ifils,iq) 226 call Register_Hallo(zq(1,1,iq2),ip1jmp1,llm,2,2,2,2,MyRequest1) 227 call Register_Hallo(zm(1,1,iq2),ip1jmp1,llm,1,1,1,1,MyRequest1) 228 enddo 212 229 c$OMP MASTER 213 230 call VTe(VTHallo) … … 232 249 call Register_Hallo(zq(1,1,iq),ip1jmp1,llm,2,2,2,2,MyRequest1) 233 250 call Register_Hallo(zm(1,1,iq),ip1jmp1,llm,1,1,1,1,MyRequest1) 234 251 !CRisi 252 do ifils=1,nqdesc(iq) 253 iq2=iqfils(ifils,iq) 254 call Register_Hallo(zq(1,1,iq2),ip1jmp1,llm,2,2,2,2,MyRequest1) 255 call Register_Hallo(zm(1,1,iq2),ip1jmp1,llm,1,1,1,1,MyRequest1) 256 enddo 235 257 c$OMP MASTER 236 258 call VTe(VTHallo) … … 242 264 endif 243 265 244 enddo 266 enddo !DO iq=1,nqperes 245 267 246 268 … … 256 278 c$OMP END MASTER 257 279 c$OMP BARRIER 258 do iq=1,nqtot 280 281 ! ! verif temporaire 282 ! ijb=ij_begin-2*iip1 283 ! ije=ij_end+2*iip1 284 ! if (pole_nord) ijb=ij_begin 285 ! if (pole_sud) ije=ij_end 286 if (ok_iso_verif) then 287 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 293') 288 endif !if (ok_iso_verif) then 289 290 ! do iq=1,nqtot 291 do iq=1,nqperes !CRisi 259 292 260 293 if(iadv(iq) == 0) then … … 265 298 266 299 #ifdef _ADV_HALLO 267 call vlx_p(zq (1,1,iq),pente_max,zm(1,1,iq),mu,268 & ij_begin+2*iip1,ij_end-2*iip1 )300 call vlx_p(zq,pente_max,zm,mu, 301 & ij_begin+2*iip1,ij_end-2*iip1,iq) 269 302 #endif 270 303 else if (iadv(iq)==14) then … … 295 328 c$OMP END MASTER 296 329 c$OMP BARRIER 297 298 do iq=1,nqtot 330 331 if (ok_iso_verif) then 332 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 326') 333 endif !if (ok_iso_verif) then 334 if (ok_iso_verif) then 335 ijb=ij_begin-2*iip1 336 ije=ij_end+2*iip1 337 if (pole_nord) ijb=ij_begin 338 if (pole_sud) ije=ij_end 339 call check_isotopes(zq,ijb,ije,'vlspltgen_loc 336') 340 endif !if (ok_iso_verif) then 341 342 ! do iq=1,nqtot 343 do iq=1,nqperes !CRisi 299 344 300 345 if(iadv(iq) == 0) then … … 304 349 else if (iadv(iq)==10) then 305 350 306 call vly_p(zq (1,1,iq),pente_max,zm(1,1,iq),mv)351 call vly_p(zq,pente_max,zm,mv,iq) 307 352 308 353 else if (iadv(iq)==14) then … … 318 363 enddo 319 364 320 321 do iq=1,nqtot 365 if (ok_iso_verif) then 366 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 357') 367 endif !if (ok_iso_verif) then 368 369 ! do iq=1,nqtot 370 do iq=1,nqperes !CRisi 322 371 323 372 if(iadv(iq) == 0) then … … 329 378 c$OMP BARRIER 330 379 #ifdef _ADV_HALLO 331 call vlz_p(zq (1,1,iq),pente_max,zm(1,1,iq),mw,332 & ij_begin,ij_begin+2*iip1-1 )333 call vlz_p(zq (1,1,iq),pente_max,zm(1,1,iq),mw,334 & ij_end-2*iip1+1,ij_end )380 call vlz_p(zq,pente_max,zm,mw, 381 & ij_begin,ij_begin+2*iip1-1,iq) 382 call vlz_p(zq,pente_max,zm,mw, 383 & ij_end-2*iip1+1,ij_end,iq) 335 384 #else 336 call vlz_p(zq (1,1,iq),pente_max,zm(1,1,iq),mw,337 & ij_begin,ij_end )385 call vlz_p(zq,pente_max,zm,mw, 386 & ij_begin,ij_end,iq) 338 387 #endif 339 388 c$OMP BARRIER … … 345 394 call Register_Hallo(zq(1,1,iq),ip1jmp1,llm,2,2,2,2,MyRequest2) 346 395 call Register_Hallo(zm(1,1,iq),ip1jmp1,llm,1,1,1,1,MyRequest2) 347 396 ! CRisi 397 do ifils=1,nqdesc(iq) 398 iq2=iqfils(ifils,iq) 399 call Register_Hallo(zq(1,1,iq2),ip1jmp1,llm,2,2,2,2,MyRequest2) 400 call Register_Hallo(zm(1,1,iq2),ip1jmp1,llm,1,1,1,1,MyRequest2) 401 enddo 348 402 c$OMP MASTER 349 403 call VTe(VTHallo) … … 369 423 c$OMP END MASTER 370 424 371 c$OMP BARRIER 372 do iq=1,nqtot 425 if (ok_iso_verif) then 426 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429') 427 endif !if (ok_iso_verif) then 428 429 c$OMP BARRIER 430 ! do iq=1,nqtot 431 do iq=1,nqperes !CRisi 373 432 374 433 if(iadv(iq) == 0) then … … 380 439 381 440 #ifdef _ADV_HALLO 382 call vlz_p(zq (1,1,iq),pente_max,zm(1,1,iq),mw,383 & ij_begin+2*iip1,ij_end-2*iip1 )441 call vlz_p(zq,pente_max,zm,mw, 442 & ij_begin+2*iip1,ij_end-2*iip1,iq) 384 443 #endif 385 444 … … 408 467 c$OMP BARRIER 409 468 410 411 do iq=1,nqtot 469 !write(*,*) 'vlspltgen_loc 494' 470 if (ok_iso_verif) then 471 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 461') 472 endif !if (ok_iso_verif) then 473 474 ! do iq=1,nqtot 475 do iq=1,nqperes !CRisi 412 476 413 477 if(iadv(iq) == 0) then … … 417 481 else if (iadv(iq)==10) then 418 482 419 call vly_p(zq (1,1,iq),pente_max,zm(1,1,iq),mv)483 call vly_p(zq,pente_max,zm,mv,iq) 420 484 421 485 else if (iadv(iq)==14) then … … 429 493 endif 430 494 431 enddo 432 433 do iq=1,nqtot 495 enddo !do iq=1,nqperes 496 497 if (ok_iso_verif) then 498 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 493') 499 endif !if (ok_iso_verif) then 500 501 ! do iq=1,nqtot 502 do iq=1,nqperes !CRisi 434 503 435 504 if(iadv(iq) == 0) then … … 439 508 else if (iadv(iq)==10) then 440 509 441 call vlx_p(zq (1,1,iq),pente_max,zm(1,1,iq),mu,442 & ij_begin,ij_end )510 call vlx_p(zq,pente_max,zm,mu, 511 & ij_begin,ij_end,iq) 443 512 444 513 else if (iadv(iq)==14) then … … 453 522 endif 454 523 455 enddo 456 524 enddo !do iq=1,nqperes 525 526 !write(*,*) 'vlspltgen 550: apres derniere serie de call vlx' 527 if (ok_iso_verif) then 528 call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 521') 529 endif !if (ok_iso_verif) then 457 530 458 531 ijb=ij_begin … … 483 556 ENDDO 484 557 485 558 if (ok_iso_verif) then 559 call check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557') 560 endif !if (ok_iso_verif) then 561 486 562 c$OMP BARRIER 487 563 -
trunk/LMDZ.MARS/README
r2294 r2296 2964 2964 Now default emissivity/albedo is 0.95/0.1 2965 2965 Flags to change these fields are now more explicit: surfemis_without_startfi instead of surfemis (idem for surfalbedo) 2966 2967 == 24/04/2020 == MV 2968 dyn3dpar: Implementation in the parallel version of the dynamics of the dynamical transport of the isotopes using the same scheme as the one implemented by Camille Risi in the Earth GCM (see LMDZ6/libf/dyn3dmem, and Risi et al. 2009: genealogy of the tracers+transport of the isotopic ratio). This is added to prepare the future implementation of the HDO cycle in the GCM. These changes had been already added in the sequential part. 2969 dyn3d: corrections to prevent from dividing by zero in the case of the use of the isotopes scheme. 2970 traceur.def.isotopes: example of how to write the traceur.def if you want to use the new dynamics with the genealogy of the isotopes: air is the father of all, H2O is the father of HDO.
Note: See TracChangeset
for help on using the changeset viewer.