Changeset 4050 for LMDZ6/trunk/libf/dyn3d
- Timestamp:
- Dec 23, 2021, 6:54:17 PM (3 years ago)
- Location:
- LMDZ6/trunk/libf/dyn3d
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/dyn3d/advtrac.F90
r2622 r4050 9 9 ! M.A Filiberti (04/2002) 10 10 ! 11 USE infotrac, ONLY: nqtot, iadv,nqperes,ok_iso_verif11 USE infotrac, ONLY: nqtot, tracers, nqperes,ok_iso_verif 12 12 USE control_mod, ONLY: iapp_tracvl, day_step 13 13 USE comconst_mod, ONLY: dtvr … … 72 72 real cflz(ip1jmp1,llm) 73 73 real, save :: cflxmax(llm),cflymax(llm),cflzmax(llm) 74 INTEGER :: iadv 74 75 75 76 IF(iadvtr.EQ.0) THEN … … 226 227 do iq=1,nqperes 227 228 ! call clock(t_initial) 228 if(iadv(iq) == 0) cycle 229 iadv = tracers(iq)%iadv 230 SELECT CASE(iadv) 231 CASE(0); CYCLE 232 CASE(10) 229 233 ! ---------------------------------------------------------------- 230 234 ! Schema de Van Leer I MUSCL 231 235 ! ---------------------------------------------------------------- 232 if(iadv(iq).eq.10) THEN233 236 ! CRisi: on fait passer tout q pour avoir acces aux fils 234 237 … … 236 239 call vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq) 237 240 241 CASE(14) 238 242 ! ---------------------------------------------------------------- 239 243 ! Schema "pseudo amont" + test sur humidite specifique 240 244 ! pour la vapeur d'eau. F. Codron 241 245 ! ---------------------------------------------------------------- 242 else if(iadv(iq).eq.14) then243 246 ! 244 247 !write(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:) … … 246 249 pbarug,pbarvg,dtvr,p,pk,teta,iq) 247 250 251 CASE(12) 248 252 ! ---------------------------------------------------------------- 249 253 ! Schema de Frederic Hourdin 250 254 ! ---------------------------------------------------------------- 251 else if(iadv(iq).eq.12) then252 255 ! Pas de temps adaptatif 253 call adaptdt(iadv (iq),dtbon,n,pbarug,massem)256 call adaptdt(iadv,dtbon,n,pbarug,massem) 254 257 if (n.GT.1) then 255 258 write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', & … … 259 262 call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1) 260 263 end do 261 else if(iadv(iq).eq.13) then264 CASE(13) 262 265 ! Pas de temps adaptatif 263 call adaptdt(iadv (iq),dtbon,n,pbarug,massem)266 call adaptdt(iadv,dtbon,n,pbarug,massem) 264 267 if (n.GT.1) then 265 268 write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', & … … 269 272 call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2) 270 273 end do 274 CASE(20) 271 275 ! ---------------------------------------------------------------- 272 276 ! Schema de pente SLOPES 273 277 ! ---------------------------------------------------------------- 274 else if (iadv(iq).eq.20) then275 278 call pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0) 276 279 280 CASE(30) 277 281 ! ---------------------------------------------------------------- 278 282 ! Schema de Prather 279 283 ! ---------------------------------------------------------------- 280 else if (iadv(iq).eq.30) then281 284 ! Pas de temps adaptatif 282 call adaptdt(iadv (iq),dtbon,n,pbarug,massem)285 call adaptdt(iadv,dtbon,n,pbarug,massem) 283 286 if (n.GT.1) then 284 287 write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', & … … 288 291 n,dtbon) 289 292 293 CASE(11,16,17,18) 290 294 ! ---------------------------------------------------------------- 291 295 ! Schemas PPM Lin et Rood 292 296 ! ---------------------------------------------------------------- 293 else if (iadv(iq).eq.11.OR.(iadv(iq).GE.16.AND. &294 iadv(iq).LE.18)) then295 297 296 298 ! Test sur le flux horizontal 297 299 ! Pas de temps adaptatif 298 call adaptdt(iadv (iq),dtbon,n,pbarug,massem)300 call adaptdt(iadv,dtbon,n,pbarug,massem) 299 301 if (n.GT.1) then 300 302 write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', & … … 316 318 317 319 !----------------------------------------------------------- 318 ! Ss-prg interface LMDZ.4->PPM3d 320 ! Ss-prg interface LMDZ.4->PPM3d (ss-prg de Lin) 319 321 !----------------------------------------------------------- 320 322 … … 327 329 ! VL (version PPM) horiz. et PPM vert. 328 330 !---------------------------------------------------------------- 329 if (iadv(iq).eq.11) then330 ! Ss-prg PPM3d de Lin331 SELECT CASE(iadv) 332 CASE(11) 331 333 call ppm3d(1,qppm(1,1,iq), & 332 334 psppm,psppm, & … … 335 337 fill,dum,220.) 336 338 339 CASE(16) 337 340 !------------------------------------------------------------- 338 341 ! Monotonic PPM 339 342 !------------------------------------------------------------- 340 else if (iadv(iq).eq.16) then341 ! Ss-prg PPM3d de Lin342 343 call ppm3d(1,qppm(1,1,iq), & 343 344 psppm,psppm, & … … 347 348 !------------------------------------------------------------- 348 349 350 CASE(17) 349 351 !------------------------------------------------------------- 350 352 ! Semi Monotonic PPM 351 353 !------------------------------------------------------------- 352 else if (iadv(iq).eq.17) then353 ! Ss-prg PPM3d de Lin354 354 call ppm3d(1,qppm(1,1,iq), & 355 355 psppm,psppm, & … … 359 359 !------------------------------------------------------------- 360 360 361 CASE(18) 361 362 !------------------------------------------------------------- 362 363 ! Positive Definite PPM 363 364 !------------------------------------------------------------- 364 else if (iadv(iq).eq.18) then365 ! Ss-prg PPM3d de Lin366 365 call ppm3d(1,qppm(1,1,iq), & 367 366 psppm,psppm, & … … 370 369 fill,dum,220.) 371 370 !------------------------------------------------------------- 372 endif371 END SELECT 373 372 enddo 374 373 !----------------------------------------------------------------- … … 376 375 !----------------------------------------------------------------- 377 376 call interpost(q(1,1,iq),qppm(1,1,iq)) 378 endif377 END SELECT 379 378 !---------------------------------------------------------------------- 380 379 -
LMDZ6/trunk/libf/dyn3d/check_isotopes.F
r4037 r4050 1 1 subroutine check_isotopes_seq(q,ip1jmp1,err_msg) 2 USE infotrac 2 USE infotrac, ONLY: nqtot, nqo, niso, ntraciso, ntraceurs_zone, 3 & ok_isotopes, ok_isotrac, use_iso, 4 & iqiso, index_trac,indnum_fn_num, tnat 3 5 implicit none 4 6 -
LMDZ6/trunk/libf/dyn3d/dynetat0.f90
r4046 r4050 6 6 ! Purpose: Initial state reading. 7 7 !------------------------------------------------------------------------------- 8 USE infotrac 8 USE infotrac, ONLY: nqtot, tracers, iqiso, iso_indnum, tnat, alpha_ideal, & 9 ok_isotopes, maxlen 9 10 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_INQ_VARID, NF90_NoErr, & 10 11 NF90_CLOSE, NF90_GET_VAR 11 12 USE control_mod, ONLY: planet_type 12 USE strings_mod, ONLY: maxlen13 13 USE assert_eq_m, ONLY: assert_eq 14 14 USE comvert_mod, ONLY: pa,preff … … 39 39 CHARACTER(LEN=maxlen) :: msg, var, modname 40 40 INTEGER, PARAMETER :: length=100 41 INTEGER :: iq, fID, vID, idecal !, iml, jml, lml, nqt41 INTEGER :: iq, fID, vID, idecal, iqParent, iName, iZone, iPhase 42 42 REAL :: time, tab_cntrl(length) !--- RUN PARAMS TABLE 43 43 !------------------------------------------------------------------------------- … … 135 135 q(:,:,:,iq)=0. 136 136 !--- CRisi: for isotops, theoretical initialization using very simplified 137 ! Rayleigh distillation las. 138 IF(ok_isotopes.AND.iso_num(iq)>0) THEN 139 IF(zone_num(iq)==0) q(:,:,:,iq)=q(:,:,:,iqpere(iq))*tnat(iso_num(iq)) & 140 & *(q(:,:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1) 141 IF(zone_num(iq)==1) q(:,:,:,iq)=q(:,:,:,iqiso(iso_indnum(iq),phase_num(iq))) 137 ! Rayleigh distillation law. 138 iName = tracers(iq)%iso_iName 139 iZone = tracers(iq)%iso_iZone 140 iPhase= tracers(iq)%iso_iPhase 141 iqParent = tracers(iq)%iqParent 142 IF(ok_isotopes .AND. iName>0) THEN 143 IF(iZone==0) q(:,:,:,iq) = q(:,:,:,iqParent)*tnat(iName) & 144 *(q(:,:,:,iqParent)/30.e-3)**(alpha_ideal(iName)-1.) 145 IF(iZone==1) q(:,:,:,iq) = q(:,:,:,iqiso(iso_indnum(iq),iPhase)) 142 146 END IF 143 147 END DO -
LMDZ6/trunk/libf/dyn3d/dynredem.F90
r4046 r4050 7 7 USE IOIPSL 8 8 #endif 9 USE infotrac 9 USE infotrac, ONLY: nqtot, tracers, maxlen 10 10 USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL, & 11 11 NF90_CLOSE, NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER, & 12 12 NF90_64BIT_OFFSET 13 13 USE dynredem_mod, ONLY: cre_var, put_var1, put_var2, err, modname, fil 14 USE strings_mod, ONLY: maxlen15 14 USE comvert_mod, ONLY: ap,bp,aps,bps,presnivs,pseudoalt,pa,preff, & 16 15 nivsig,nivsigs … … 167 166 ! Purpose: Write the NetCDF restart file (append). 168 167 !------------------------------------------------------------------------------- 169 USE infotrac 168 USE infotrac, ONLY: nqtot, tracers, type_trac, maxlen 170 169 USE control_mod 171 170 USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID, & -
LMDZ6/trunk/libf/dyn3d/iniacademic.F90
r3976 r4050 5 5 6 6 USE filtreg_mod, ONLY: inifilr 7 USE infotrac 7 USE infotrac, ONLY: nqtot,niso_possibles,ok_isotopes,ok_iso_verif,tnat,alpha_ideal, & 8 & iqiso,iso_indnum, tracers 8 9 USE control_mod, ONLY: day_step,planet_type 9 10 #ifdef CPP_IOIPSL … … 61 62 real tetastrat ! potential temperature in the stratosphere, in K 62 63 real tetajl(jjp1,llm) 63 INTEGER i,j,l,lsup,ij 64 INTEGER i,j,l,lsup,ij, iq 64 65 65 66 REAL teta0,ttp,delt_y,delt_z,eps ! Constantes pour profil de T … … 70 71 71 72 real zz,ran1 72 integer idum 73 integer idum, iqParent, iName, iZone, iPhase 73 74 74 75 REAL zdtvr … … 275 276 if (planet_type=="earth") then 276 277 ! Earth: first two tracers will be water 277 do i =1,nqtot278 if (i == 1) q(:,:,i)=1.e-10279 if (i == 2) q(:,:,i)=1.e-15280 if (i.gt.2) q(:,:,i)=0.278 do iq=1,nqtot 279 q(:,:,iq)=0. 280 IF(tracers(iq)%name == 'H2Ov') q(:,:,iq)=1.e-10 281 IF(tracers(iq)%name == 'H2Ol') q(:,:,iq)=1.e-15 281 282 282 283 ! CRisi: init des isotopes 283 284 ! distill de Rayleigh très simplifiée 284 if (ok_isotopes) then 285 if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then 286 q(:,:,i)=q(:,:,iqpere(i)) & 287 & *tnat(iso_num(i)) & 288 & *(q(:,:,iqpere(i))/30.e-3) & 289 & **(alpha_ideal(iso_num(i))-1) 290 endif 291 if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then 292 q(:,:,i)=q(:,:,iqiso(iso_indnum(i),phase_num(i))) 293 endif 285 iName = tracers(iq)%iso_iName 286 iZone = tracers(iq)%iso_iZone 287 iPhase= tracers(iq)%iso_iPhase 288 iqParent = tracers(iq)%iqParent 289 if (ok_isotopes .AND. iName > 0) then 290 if (iZone == 0) q(:,:,iq) = q(:,:,iqParent)*tnat(iName) & 291 *(q(:,:,iqParent)/30.e-3)**(alpha_ideal(iName)-1) 292 if (iZone == 1) q(:,:,iq) = q(:,:,iqiso(iso_indnum(iq),iPhase)) 294 293 endif !if (ok_isotopes) then 295 294 -
LMDZ6/trunk/libf/dyn3d/vlsplt.F
r4008 r4050 4 4 5 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) 6 USE infotrac, ONLY: nqtot, nqdesc,iqfils6 USE infotrac, ONLY: nqtot,tracers 7 7 c 8 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 83 83 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 84 84 85 if (nqdesc(iq).gt.0) then 86 do ifils=1,nqdesc(iq) 87 iq2=iqfils(ifils,iq) 88 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 89 enddo 90 endif !if (nqfils(iq).gt.0) then 85 do ifils=1,tracers(iq)%nqDescen 86 iq2=tracers(iq)%iqDescen(ifils) 87 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 88 enddo 91 89 92 90 cprint*,'Entree vlx1' … … 122 120 ENDDO 123 121 ! CRisi: aussi pour les fils 124 if (nqdesc(iq).gt.0) then 125 do ifils=1,nqdesc(iq) 126 iq2=iqfils(ifils,iq) 122 do ifils=1,tracers(iq)%nqDescen 123 iq2=tracers(iq)%iqDescen(ifils) 127 124 DO l=1,llm 128 DO ij=1,ip1jmp1129 q(ij,l,iq2)=zq(ij,l,iq2)130 ENDDO131 DO ij=1,ip1jm+1,iip1125 DO ij=1,ip1jmp1 126 q(ij,l,iq2)=zq(ij,l,iq2) 127 ENDDO 128 DO ij=1,ip1jm+1,iip1 132 129 q(ij+iim,l,iq2)=q(ij,l,iq2) 133 ENDDO130 ENDDO 134 131 ENDDO 135 enddo !do ifils=1,nqdesc(iq) 136 endif ! if (nqdesc(iq).gt.0) then 132 enddo 137 133 138 134 RETURN 139 135 END 140 136 RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq) 141 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils, ! CRisi137 USE infotrac, ONLY : nqtot,tracers, ! CRisi 142 138 & qperemin,masseqmin,ratiomin ! MVals et CRisi 143 139 … … 449 445 ! CRisi: appel récursif de l'advection sur les fils. 450 446 ! Il faut faire ça avant d'avoir mis à jour q et masse 451 !write(*,*) 'vlsplt 326: iq,nq fils(iq)=',iq,nqfils(iq)447 !write(*,*) 'vlsplt 326: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen 452 448 453 if (nqdesc(iq).gt.0) then 454 do ifils=1,nqdesc(iq) 455 iq2=iqfils(ifils,iq) 456 DO l=1,llm 449 do ifils=1,tracers(iq)%nqDescen 450 iq2=tracers(iq)%iqDescen(ifils) 451 DO l=1,llm 457 452 DO ij=iip2,ip1jm 458 ! On a besoin de q et masse seulement entre iip2 et ip1jm459 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)460 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)461 !Mvals: veiller a ce qu'on n'ait pas de denominateur nul462 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)463 if (q(ij,l,iq).gt.qperemin) then464 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)465 else466 Ratio(ij,l,iq2)=ratiomin467 endif453 ! On a besoin de q et masse seulement entre iip2 et ip1jm 454 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 455 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 456 !Mvals: veiller a ce qu'on n'ait pas de denominateur nul 457 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin) 458 if (q(ij,l,iq).gt.qperemin) then 459 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 460 else 461 Ratio(ij,l,iq2)=ratiomin 462 endif 468 463 enddo 469 enddo 470 enddo !do ifils=1,nqdesc(iq) 471 do ifils=1,nqfils(iq) 472 iq2=iqfils(ifils,iq) 473 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 474 enddo !do ifils=1,nqfils(iq) 475 endif !if (nqfils(iq).gt.0) then 464 enddo 465 enddo 466 do ifils=1,tracers(iq)%nqDescen 467 iq2=tracers(iq)%iqDescen(ifils) 468 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 469 enddo 476 470 ! end CRisi 477 471 … … 498 492 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 499 493 ! puis on boucle en longitude 500 if (nqfils(iq).gt.0) then 501 do ifils=1,nqdesc(iq) 502 iq2=iqfils(ifils,iq) 503 DO l=1,llm 494 do ifils=1,tracers(iq)%nqDescen 495 iq2=tracers(iq)%iqDescen(ifils) 496 DO l=1,llm 504 497 DO ij=iip2+1,ip1jm 505 498 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) … … 508 501 q(ij-iim,l,iq2)=q(ij,l,iq2) 509 502 enddo ! DO ij=ijb+iip1-1,ije,iip1 510 enddo !DO l=1,llm 511 enddo !do ifils=1,nqdesc(iq) 512 endif !if (nqfils(iq).gt.0) then 503 enddo !DO l=1,llm 504 enddo 513 505 514 506 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 519 511 END 520 512 RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq) 521 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils, ! CRisi513 USE infotrac, ONLY : nqtot,tracers, ! CRisi 522 514 & qperemin,masseqmin,ratiomin ! MVals et CRisi 523 515 c … … 778 770 ! CRisi: appel récursif de l'advection sur les fils. 779 771 ! Il faut faire ça avant d'avoir mis à jour q et masse 780 !write(*,*) 'vly 689: iq,nq fils(iq)=',iq,nqfils(iq)772 !write(*,*) 'vly 689: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen 781 773 782 if (nqfils(iq).gt.0) then 783 do ifils=1,nqdesc(iq) 784 iq2=iqfils(ifils,iq) 785 DO l=1,llm 786 DO ij=1,ip1jmp1 787 ! attention, chaque fils doit avoir son masseq, sinon, le 1er 788 ! fils ecrase le masseq de ses freres. 789 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 790 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 791 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 792 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin) 793 if (q(ij,l,iq).gt.qperemin) then 794 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 795 else 796 Ratio(ij,l,iq2)=ratiomin 797 endif 774 do ifils=1,tracers(iq)%nqDescen 775 iq2=tracers(iq)%iqDescen(ifils) 776 DO l=1,llm 777 DO ij=1,ip1jmp1 778 ! attention, chaque fils doit avoir son masseq, sinon, le 1er 779 ! fils ecrase le masseq de ses freres. 780 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 781 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 782 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 783 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin) 784 if (q(ij,l,iq).gt.qperemin) then 785 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 786 else 787 Ratio(ij,l,iq2)=ratiomin 788 endif 798 789 enddo 799 enddo 800 enddo !do ifils=1,nqdesc(iq) 801 802 do ifils=1,nqfils(iq) 803 iq2=iqfils(ifils,iq) 804 call vly(Ratio,pente_max,masseq,qbyv,iq2) 805 enddo !do ifils=1,nqfils(iq) 806 endif !if (nqfils(iq).gt.0) then 790 enddo 791 enddo 792 793 do ifils=1,tracers(iq)%nqDescen 794 iq2=tracers(iq)%iqDescen(ifils) 795 call vly(Ratio,pente_max,masseq,qbyv,iq2) 796 enddo 807 797 808 798 DO l=1,llm … … 872 862 873 863 ! retablir les fils en rapport de melange par rapport a l'air: 874 if (nqfils(iq).gt.0) then 875 do ifils=1,nqdesc(iq) 876 iq2=iqfils(ifils,iq) 877 DO l=1,llm 864 do ifils=1,tracers(iq)%nqDescen 865 iq2=tracers(iq)%iqDescen(ifils) 866 DO l=1,llm 878 867 DO ij=1,ip1jmp1 879 868 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 880 869 enddo 881 enddo 882 enddo !do ifils=1,nqdesc(iq) 883 endif !if (nqfils(iq).gt.0) then 870 enddo 871 enddo 884 872 885 873 !write(*,*) 'vly 853: sortie' … … 888 876 END 889 877 RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq) 890 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils, ! CRisi878 USE infotrac, ONLY : nqtot,tracers, ! CRisi 891 879 & qperemin,masseqmin,ratiomin ! MVals et CRisi 892 880 c … … 1009 997 ! CRisi: appel récursif de l'advection sur les fils. 1010 998 ! Il faut faire ça avant d'avoir mis à jour q et masse 1011 !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq) 1012 if (nqfils(iq).gt.0) then 1013 do ifils=1,nqdesc(iq) 1014 iq2=iqfils(ifils,iq) 1015 DO l=1,llm 999 !write(*,*) 'vlsplt 942: iq,nqChilds(iq)=',iq,nqChilds(iq) 1000 do ifils=1,tracers(iq)%nqDescen 1001 iq2=tracers(iq)%iqDescen(ifils) 1002 DO l=1,llm 1016 1003 DO ij=1,ip1jmp1 1017 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)1018 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)1019 !MVals: veiller a ce qu'on n'ait pas de denominateur nul1020 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)1021 if (q(ij,l,iq).gt.qperemin) then1022 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)1023 else1024 Ratio(ij,l,iq2)=ratiomin1025 endif1004 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 1005 !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1006 !MVals: veiller a ce qu'on n'ait pas de denominateur nul 1007 masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin) 1008 if (q(ij,l,iq).gt.qperemin) then 1009 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 1010 else 1011 Ratio(ij,l,iq2)=ratiomin 1012 endif 1026 1013 enddo 1027 1028 enddo !do ifils=1,nqdesc(iq)1014 enddo 1015 enddo 1029 1016 1030 do ifils=1,nqfils(iq) 1031 iq2=iqfils(ifils,iq) 1032 call vlz(Ratio,pente_max,masseq,wq,iq2) 1033 enddo !do ifils=1,nqfils(iq) 1034 endif !if (nqfils(iq).gt.0) then 1017 do ifils=1,tracers(iq)%nqDescen 1018 iq2=tracers(iq)%iqDescen(ifils) 1019 call vlz(Ratio,pente_max,masseq,wq,iq2) 1020 enddo 1035 1021 ! end CRisi 1036 1022 … … 1045 1031 1046 1032 ! retablir les fils en rapport de melange par rapport a l'air: 1047 if (nqfils(iq).gt.0) then 1048 do ifils=1,nqdesc(iq) 1049 iq2=iqfils(ifils,iq) 1050 DO l=1,llm 1033 do ifils=1,tracers(iq)%nqDescen 1034 iq2=tracers(iq)%iqDescen(ifils) 1035 DO l=1,llm 1051 1036 DO ij=1,ip1jmp1 1052 1037 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 1053 1038 enddo 1054 enddo 1055 enddo !do ifils=1,nqdesc(iq) 1056 endif !if (nqfils(iq).gt.0) then 1039 enddo 1040 enddo 1057 1041 !write(*,*) 'vlsplt 1032' 1058 1042 -
LMDZ6/trunk/libf/dyn3d/vlspltqs.F
r2603 r4050 4 4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt, 5 5 , p,pk,teta,iq ) 6 USE infotrac, ONLY: nqtot, nqdesc,iqfils6 USE infotrac, ONLY: nqtot,tracers 7 7 c 8 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron … … 121 121 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 122 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) 123 do ifils=1,tracers(iq)%nqDescen 124 iq2=tracers(iq)%iqDescen(ifils) 126 125 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 127 enddo 128 endif !if (nqfils(iq).gt.0) then 126 enddo 129 127 130 128 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') … … 162 160 ENDDO 163 161 ! CRisi: aussi pour les fils 164 if (nqdesc(iq).gt.0) then 165 do ifils=1,nqdesc(iq) 166 iq2=iqfils(ifils,iq) 162 do ifils=1,tracers(iq)%nqDescen 163 iq2=tracers(iq)%iqDescen(ifils) 167 164 DO l=1,llm 168 DO ij=1,ip1jmp1169 q(ij,l,iq2)=zq(ij,l,iq2)170 ENDDO171 DO ij=1,ip1jm+1,iip1165 DO ij=1,ip1jmp1 166 q(ij,l,iq2)=zq(ij,l,iq2) 167 ENDDO 168 DO ij=1,ip1jm+1,iip1 172 169 q(ij+iim,l,iq2)=q(ij,l,iq2) 173 ENDDO170 ENDDO 174 171 ENDDO 175 enddo !do ifils=1,nqdesc(iq) 176 endif ! if (nqfils(iq).gt.0) then 172 enddo 177 173 !write(*,*) 'vlspltqs 183: fin de la routine' 178 174 … … 180 176 END 181 177 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq) 182 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils ! CRisi178 USE infotrac, ONLY : nqtot,tracers ! CRisi 183 179 184 180 c … … 483 479 ! CRisi: appel récursif de l'advection sur les fils. 484 480 ! Il faut faire ça avant d'avoir mis à jour q et masse 485 !write(*,*) 'vlspltqs 326: iq,nq fils(iq)=',iq,nqfils(iq)481 !write(*,*) 'vlspltqs 326: iq,nqChilds(iq)=',iq,tracers(iq)%nqChilds 486 482 487 if (nqfils(iq).gt.0) then 488 do ifils=1,nqdesc(iq) 489 iq2=iqfils(ifils,iq) 490 DO l=1,llm 483 do ifils=1,tracers(iq)%nqDescen 484 iq2=tracers(iq)%iqDescen(ifils) 485 DO l=1,llm 491 486 DO ij=iip2,ip1jm 492 493 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)494 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)487 ! On a besoin de q et masse seulement entre iip2 et ip1jm 488 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 489 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 495 490 enddo 496 enddo 497 enddo !do ifils=1,nqdesc(iq) 498 do ifils=1,nqfils(iq) 499 iq2=iqfils(ifils,iq) 500 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 501 enddo !do ifils=1,nqfils(iq) 502 endif !if (nqfils(iq).gt.0) then 491 enddo 492 enddo 493 do ifils=1,tracers(iq)%nqChilds 494 iq2=tracers(iq)%iqDescen(ifils) 495 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 496 enddo 503 497 ! end CRisi 504 498 … … 523 517 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 524 518 ! puis on boucle en longitude 525 if (nqdesc(iq).gt.0) then 526 do ifils=1,nqdesc(iq) 527 iq2=iqfils(ifils,iq) 528 DO l=1,llm 519 do ifils=1,tracers(iq)%nqDescen 520 iq2=tracers(iq)%iqDescen(ifils) 521 DO l=1,llm 529 522 DO ij=iip2+1,ip1jm 530 523 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 531 524 enddo 532 525 DO ij=iip1+iip1,ip1jm,iip1 533 q(ij-iim,l,iq2)=q(ij,l,iq2) 534 enddo ! DO ij=ijb+iip1-1,ije,iip1 535 enddo !DO l=1,llm 536 enddo !do ifils=1,nqdesc(iq) 537 endif !if (nqfils(iq).gt.0) then 526 q(ij-iim,l,iq2)=q(ij,l,iq2) 527 enddo 528 enddo 529 enddo 538 530 539 531 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 544 536 END 545 537 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq) 546 USE infotrac, ONLY : nqtot, nqfils,nqdesc,iqfils ! CRisi538 USE infotrac, ONLY : nqtot,tracers ! CRisi 547 539 c 548 540 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 794 786 ! CRisi: appel récursif de l'advection sur les fils. 795 787 ! Il faut faire ça avant d'avoir mis à jour q et masse 796 !write(*,*) 'vlyqs 689: iq,nq fils(iq)=',iq,nqfils(iq)788 !write(*,*) 'vlyqs 689: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen 797 789 798 if (nqfils(iq).gt.0) then 799 do ifils=1,nqdesc(iq) 800 iq2=iqfils(ifils,iq) 801 DO l=1,llm 802 DO ij=1,ip1jmp1 803 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 804 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 790 do ifils=1,tracers(iq)%nqDescen 791 iq2=tracers(iq)%iqDescen(ifils) 792 DO l=1,llm 793 DO ij=1,ip1jmp1 794 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 795 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 805 796 enddo 806 enddo 807 enddo !do ifils=1,nqdesc(iq) 808 809 do ifils=1,nqfils(iq) 810 iq2=iqfils(ifils,iq) 811 !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2 812 call vly(Ratio,pente_max,masseq,qbyv,iq2) 813 enddo !do ifils=1,nqfils(iq) 814 endif !if (nqfils(iq).gt.0) then 797 enddo 798 enddo 799 do ifils=1,tracers(iq)%nqChilds 800 iq2=tracers(iq)%iqDescen(ifils) 801 !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2 802 call vly(Ratio,pente_max,masseq,qbyv,iq2) 803 enddo 815 804 816 805 DO l=1,llm … … 868 857 869 858 ! retablir les fils en rapport de melange par rapport a l'air: 870 if (nqdesc(iq).gt.0) then 871 do ifils=1,nqdesc(iq) 872 iq2=iqfils(ifils,iq) 873 DO l=1,llm 859 do ifils=1,tracers(iq)%nqDescen 860 iq2=tracers(iq)%iqDescen(ifils) 861 DO l=1,llm 874 862 DO ij=1,ip1jmp1 875 863 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 876 864 enddo 877 enddo 878 enddo !do ifils=1,nqdesc(iq) 879 endif !if (nqfils(iq).gt.0) then 865 enddo 866 enddo 880 867 !write(*,*) 'vly 879' 881 868
Note: See TracChangeset
for help on using the changeset viewer.