Changeset 2298 for LMDZ5/branches/testing/libf/dyn3d
- Timestamp:
- Jun 14, 2015, 9:13:32 PM (10 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 3 deleted
- 12 edited
- 2 copied
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/advtrac.F90
r1999 r2298 9 9 ! M.A Filiberti (04/2002) 10 10 ! 11 USE infotrac, ONLY: nqtot, iadv 11 USE infotrac, ONLY: nqtot, iadv,nqperes,ok_iso_verif 12 12 USE control_mod, ONLY: iapp_tracvl, day_step 13 13 … … 79 79 80 80 IF(iadvtr.EQ.0) THEN 81 CALL initial0(ijp1llm,pbaruc)82 CALL initial0(ijmllm,pbarvc)81 pbaruc(:,:)=0 82 pbarvc(:,:)=0 83 83 ENDIF 84 84 … … 223 223 ! Appel des sous programmes d'advection 224 224 !----------------------------------------------------------- 225 do iq=1,nqtot 225 226 if (ok_iso_verif) then 227 write(*,*) 'advtrac 227' 228 call check_isotopes_seq(q,ip1jmp1,'advtrac 162') 229 endif !if (ok_iso_verif) then 230 231 do iq=1,nqperes 226 232 ! call clock(t_initial) 227 233 if(iadv(iq) == 0) cycle … … 230 236 ! ---------------------------------------------------------------- 231 237 if(iadv(iq).eq.10) THEN 232 call vlsplt(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr) 233 238 ! CRisi: on fait passer tout q pour avoir acces aux fils 239 240 !write(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:) 241 call vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq) 242 234 243 ! ---------------------------------------------------------------- 235 244 ! Schema "pseudo amont" + test sur humidite specifique … … 238 247 else if(iadv(iq).eq.14) then 239 248 ! 240 CALL vlspltqs( q(1,1,1), 2., massem, wg , & 241 pbarug,pbarvg,dtvr,p,pk,teta ) 249 !write(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:) 250 CALL vlspltqs( q, 2., massem, wg , & 251 pbarug,pbarvg,dtvr,p,pk,teta,iq) 252 242 253 ! ---------------------------------------------------------------- 243 254 ! Schema de Frederic Hourdin … … 388 399 end DO 389 400 401 if (ok_iso_verif) then 402 write(*,*) 'advtrac 402' 403 call check_isotopes_seq(q,ip1jmp1,'advtrac 397') 404 endif !if (ok_iso_verif) then 390 405 391 406 !------------------------------------------------------------------ -
LMDZ5/branches/testing/libf/dyn3d/caladvtrac.F
r1910 r2298 53 53 if (planet_type.eq."earth") then 54 54 C initialisation 55 dq(:,:,1:2)=q(:,:,1:2) 55 ! CRisi: il faut gérer tous les traceurs si on veut pouvoir faire des 56 ! isotopes 57 ! dq(:,:,1:2)=q(:,:,1:2) 58 dq(:,:,1:nqtot)=q(:,:,1:nqtot) 56 59 57 60 c test des valeurs minmax … … 81 84 ENDDO 82 85 ENDDO 83 84 CALL qminimum( q, 2, finmasse ) 86 87 !write(*,*) 'caladvtrac 87' 88 CALL qminimum( q, nqtot, finmasse ) 89 !write(*,*) 'caladvtrac 89' 85 90 86 91 CALL SCOPY ( ip1jmp1*llm, masse, 1, finmasse, 1 ) … … 92 97 dtvrtrac = iapp_tracvl * dtvr 93 98 c 94 DO iq = 1 , 299 DO iq = 1 , nqtot 95 100 DO l = 1 , llm 96 101 DO ij = 1,ip1jmp1 … … 105 110 if (planet_type.eq."earth") then 106 111 ! Earth-specific treatment for the first 2 tracers (water) 107 dq(:,:,1: 2)=0.112 dq(:,:,1:nqtot)=0. 108 113 endif ! of if (planet_type.eq."earth") 109 114 ENDIF ! of IF( iapptrac.EQ.iapp_tracvl ) -
LMDZ5/branches/testing/libf/dyn3d/conf_gcm.F90
r2258 r2298 46 46 LOGICAL fxyhypbb, ysinuss 47 47 INTEGER i 48 LOGICAL use_filtre_fft49 48 50 49 ! ------------------------------------------------------------------- … … 89 88 90 89 !Config Key = prt_level 91 !Config Desc = niveau d'impressions de d ébogage90 !Config Desc = niveau d'impressions de d\'ebogage 92 91 !Config Def = 0 93 !Config Help = Niveau d'impression pour le d ébogage92 !Config Help = Niveau d'impression pour le d\'ebogage 94 93 !Config (0 = minimum d'impression) 95 94 prt_level = 0 … … 733 732 dzoomy = 0.2 734 733 CALL getin('dzoomy',dzoomy) 735 call assert(dzoomy < 1, "conf_gcm: dzoomy must be < 1")734 call assert(dzoomy < 1, "conf_gcm: dzoomy must be < 1") 736 735 737 736 !Config Key = taux … … 810 809 CALL getin('ok_dyn_ave',ok_dyn_ave) 811 810 812 !Config Key = use_filtre_fft813 !Config Desc = flag d'activation des FFT pour le filtre814 !Config Def = false815 !Config Help = permet d'activer l'utilisation des FFT pour effectuer816 !Config le filtrage aux poles.817 ! Le filtre fft n'est pas implemente dans dyn3d818 use_filtre_fft=.FALSE.819 CALL getin('use_filtre_fft',use_filtre_fft)820 821 IF (use_filtre_fft) THEN822 write(lunout,*)'STOP !!!'823 write(lunout,*)'use_filtre_fft n est pas implemente dans dyn3d'824 STOP 1825 ENDIF826 827 811 !Config key = ok_strato 828 812 !Config Desc = activation de la version strato 829 813 !Config Def = .FALSE. 830 !Config Help = active la version stratosph érique de LMDZ de F. Lott814 !Config Help = active la version stratosph\'erique de LMDZ de F. Lott 831 815 832 816 ok_strato=.FALSE. -
LMDZ5/branches/testing/libf/dyn3d/dynetat0.F
r1999 r2298 297 297 write(lunout,*)" Il est donc initialise a zero" 298 298 q(:,:,:,iq)=0. 299 300 ! CRisi: pour les isotopes, on peut faire init théorique 301 ! distill de Rayleigh très simplifiée 302 if (ok_isotopes) then 303 if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.0)) then 304 q(:,:,:,iq)=q(:,:,:,iqpere(iq)) 305 & *tnat(iso_num(iq)) 306 & *(q(:,:,:,iqpere(iq))/30.e-3) 307 & **(alpha_ideal(iso_num(iq))-1) 308 endif 309 if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.1)) then 310 q(:,:,:,iq)=q(:,:,:,iqiso(iso_indnum(iq), 311 & phase_num(iq))) 312 endif 313 endif !if (ok_isotopes) then 299 314 ELSE 300 315 ierr = NF90_GET_VAR(nid, nvarid, q(:,:,:,iq)) -
LMDZ5/branches/testing/libf/dyn3d/fluxstokenc.F
r1910 r2298 83 83 84 84 IF(iadvtr.EQ.0) THEN 85 CALL initial0(ijp1llm,phic)86 CALL initial0(ijp1llm,tetac)87 CALL initial0(ijp1llm,pbaruc)88 CALL initial0(ijmllm,pbarvc)85 phic(:,:)=0 86 tetac(:,:)=0 87 pbaruc(:,:)=0 88 pbarvc(:,:)=0 89 89 ENDIF 90 90 -
LMDZ5/branches/testing/libf/dyn3d/guide_mod.F90
r2160 r2298 81 81 ! Lecture des parametres: 82 82 ! --------------------------------------------- 83 call ini_getparam("nudging_parameters_out.txt") 83 84 ! Variables guidees 84 85 CALL getpar('guide_u',.true.,guide_u,'guidage de u') … … 109 110 CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie') 110 111 CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim') 111 112 112 113 ! Sauvegarde du for�age 113 114 CALL getpar('guide_sav',.false.,guide_sav,'sauvegarde guidage') … … 147 148 CALL getpar('guide_2D',.false.,guide_2D,'fichier guidage lat-P') 148 149 150 call fin_getparam 151 149 152 ! --------------------------------------------- 150 153 ! Determination du nombre de niveaux verticaux … … 156 159 rcod=nf90_open('apbp.nc',Nf90_NOWRITe, ncidpl) 157 160 if (rcod.NE.NF_NOERR) THEN 158 print *,'Guide: probleme -> pas de fichier apbp.nc'159 CALL abort_gcm(modname,abort_message,1)161 CALL abort_gcm(modname, & 162 'Guide: probleme -> pas de fichier apbp.nc',1) 160 163 endif 161 164 endif … … 165 168 rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl) 166 169 if (rcod.NE.NF_NOERR) THEN 167 print *,'Guide: probleme -> pas de fichier u.nc'168 CALL abort_gcm(modname,abort_message,1)170 CALL abort_gcm(modname, & 171 'Guide: probleme -> pas de fichier u.nc',1) 169 172 endif 170 173 endif … … 173 176 rcod=nf90_open('v.nc',nf90_nowrite,ncidpl) 174 177 if (rcod.NE.NF_NOERR) THEN 175 print *,'Guide: probleme -> pas de fichier v.nc'176 CALL abort_gcm(modname,abort_message,1)178 CALL abort_gcm(modname, & 179 'Guide: probleme -> pas de fichier v.nc',1) 177 180 endif 178 181 endif … … 181 184 rcod=nf90_open('T.nc',nf90_nowrite,ncidpl) 182 185 if (rcod.NE.NF_NOERR) THEN 183 print *,'Guide: probleme -> pas de fichier T.nc'184 CALL abort_gcm(modname,abort_message,1)186 CALL abort_gcm(modname, & 187 'Guide: probleme -> pas de fichier T.nc',1) 185 188 endif 186 189 endif … … 189 192 rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl) 190 193 if (rcod.NE.NF_NOERR) THEN 191 print *,'Guide: probleme -> pas de fichier hur.nc'192 CALL abort_gcm(modname,abort_message,1)194 CALL abort_gcm(modname, & 195 'Guide: probleme -> pas de fichier hur.nc',1) 193 196 endif 194 197 endif … … 198 201 IF (error.NE.NF_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid) 199 202 IF (error.NE.NF_NOERR) THEN 200 print *,'Guide: probleme lecture niveaux pression' 201 CALL abort_gcm(modname,abort_message,1) 203 CALL abort_gcm(modname,'Guide: probleme lecture niveaux pression',1) 202 204 ENDIF 203 205 error=NF_INQ_DIMLEN(ncidpl,rid,nlevnc) -
LMDZ5/branches/testing/libf/dyn3d/iniacademic.F90
r2160 r2298 5 5 6 6 USE filtreg_mod, ONLY: inifilr 7 USE infotrac , ONLY : nqtot7 USE infotrac 8 8 USE control_mod, ONLY: day_step,planet_type 9 9 #ifdef CPP_IOIPSL … … 262 262 if (i == 2) q(:,:,i)=1.e-15 263 263 if (i.gt.2) q(:,:,i)=0. 264 265 ! CRisi: init des isotopes 266 ! distill de Rayleigh très simplifiée 267 if (ok_isotopes) then 268 if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then 269 q(:,:,i)=q(:,:,iqpere(i)) & 270 & *tnat(iso_num(i)) & 271 & *(q(:,:,iqpere(i))/30.e-3) & 272 & **(alpha_ideal(iso_num(i))-1) 273 endif 274 if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then 275 q(:,:,i)=q(:,:,iqiso(iso_indnum(i),phase_num(i))) 276 endif 277 endif !if (ok_isotopes) then 278 264 279 enddo 265 280 else 266 281 q(:,:,:)=0 267 282 endif ! of if (planet_type=="earth") 283 284 if (ok_iso_verif) then 285 call check_isotopes_seq(q,1,ip1jmp1,'iniacademic_loc') 286 endif !if (ok_iso_verif) then 268 287 269 288 ! add random perturbation to temperature -
LMDZ5/branches/testing/libf/dyn3d/leapfrog.F
r2258 r2298 11 11 use IOIPSL 12 12 #endif 13 USE infotrac, ONLY: nqtot 13 USE infotrac, ONLY: nqtot,ok_iso_verif 14 14 USE guide_mod, ONLY : guide_main 15 15 USE write_field, ONLY: writefield … … 235 235 jH_cur = jH_cur - int(jH_cur) 236 236 237 if (ok_iso_verif) then 238 call check_isotopes_seq(q,ip1jmp1,'leapfrog 321') 239 endif !if (ok_iso_verif) then 237 240 238 241 #ifdef CPP_IOIPSL … … 265 268 ! CALL SCOPY ( ijp1llm, masse, 1, finvmaold, 1 ) 266 269 ! CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 ) 270 271 if (ok_iso_verif) then 272 call check_isotopes_seq(q,ip1jmp1,'leapfrog 400') 273 endif !if (ok_iso_verif) then 267 274 268 275 2 CONTINUE ! Matsuno backward or leapfrog step begins here … … 305 312 endif 306 313 314 315 if (ok_iso_verif) then 316 call check_isotopes_seq(q,ip1jmp1,'leapfrog 589') 317 endif !if (ok_iso_verif) then 318 307 319 c----------------------------------------------------------------------- 308 320 c calcul des tendances dynamiques: … … 321 333 c calcul des tendances advection des traceurs (dont l'humidite) 322 334 c ------------------------------------------------------------- 335 336 if (ok_iso_verif) then 337 call check_isotopes_seq(q,ip1jmp1, 338 & 'leapfrog 686: avant caladvtrac') 339 endif !if (ok_iso_verif) then 323 340 324 341 IF( forward. OR . leapf ) THEN … … 327 344 * p, masse, dq, teta, 328 345 . flxw, pk) 346 !write(*,*) 'caladvtrac 346' 347 329 348 330 349 IF (offline) THEN … … 346 365 c ---------------------------------- 347 366 348 349 CALL integrd ( 2,vcovm1,ucovm1,tetam1,psm1,massem1 , 367 if (ok_iso_verif) then 368 write(*,*) 'leapfrog 720' 369 call check_isotopes_seq(q,ip1jmp1,'leapfrog 756') 370 endif !if (ok_iso_verif) then 371 372 CALL integrd ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 , 350 373 $ dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis ) 351 374 ! $ finvmaold ) 352 375 376 if (ok_iso_verif) then 377 write(*,*) 'leapfrog 724' 378 call check_isotopes_seq(q,ip1jmp1,'leapfrog 762') 379 endif !if (ok_iso_verif) then 353 380 354 381 c .P.Le Van (26/04/94 ajout de finvpold dans l'appel d'integrd) … … 437 464 #endif 438 465 ! #endif of #ifdef CPP_IOIPSL 466 #ifdef CPP_PHYS 439 467 CALL calfis( lafin , jD_cur, jH_cur, 440 468 $ ucov,vcov,teta,q,masse,ps,p,pk,phis,phi , 441 469 $ du,dv,dteta,dq, 442 470 $ flxw,dufi,dvfi,dtetafi,dqfi,dpfi ) 443 471 #endif 444 472 c ajout des tendances physiques: 445 473 c ------------------------------ … … 515 543 CALL massdair(p,masse) 516 544 545 if (ok_iso_verif) then 546 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196') 547 endif !if (ok_iso_verif) then 517 548 518 549 c----------------------------------------------------------------------- … … 599 630 c preparation du pas d'integration suivant ...... 600 631 632 if (ok_iso_verif) then 633 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509') 634 endif !if (ok_iso_verif) then 635 601 636 IF ( .NOT.purmats ) THEN 602 637 c ........................................................ … … 656 691 ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin)) 657 692 693 if (ok_iso_verif) then 694 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584') 695 endif !if (ok_iso_verif) then 696 658 697 c----------------------------------------------------------------------- 659 698 c ecriture de la bande histoire: … … 734 773 ELSE ! of IF (.not.purmats) 735 774 775 if (ok_iso_verif) then 776 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664') 777 endif !if (ok_iso_verif) then 778 736 779 c ........................................................ 737 780 c .............. schema matsuno ............... … … 756 799 757 800 ELSE ! of IF(forward) i.e. backward step 801 802 if (ok_iso_verif) then 803 call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698') 804 endif !if (ok_iso_verif) then 758 805 759 806 IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN -
LMDZ5/branches/testing/libf/dyn3d/qminimum.F
r1910 r2298 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE qminimum( q,nq ,deltap )4 SUBROUTINE qminimum( q,nqtot,deltap ) 5 5 6 USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif 6 7 IMPLICIT none 7 8 c … … 13 14 #include "comvert.h" 14 15 c 15 INTEGER nq 16 REAL q(ip1jmp1,llm,nq ), deltap(ip1jmp1,llm)16 INTEGER nqtot 17 REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm) 17 18 c 18 19 INTEGER iq_vap, iq_liq … … 30 31 INTEGER i, k, iq 31 32 REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe 33 34 real zx_defau_diag(ip1jmp1,llm,2) 35 real q_follow(ip1jmp1,llm,2) 32 36 c 33 37 REAL SSUM … … 36 40 SAVE imprim 37 41 DATA imprim /0/ 42 !INTEGER ijb,ije 43 !INTEGER Index_pump(ij_end-ij_begin+1) 44 !INTEGER nb_pump 45 INTEGER ixt 38 46 c 39 47 c Quand l'eau liquide est trop petite (ou negative), on prend … … 41 49 c (sans changer la temperature !) 42 50 c 51 52 if (ok_iso_verif) then 53 call check_isotopes_seq(q,ip1jmp1,'qminimum 52') 54 endif !if (ok_iso_verif) then 55 56 zx_defau_diag(:,:,:)=0.0 57 q_follow(:,:,1:2)=q(:,:,1:2) 43 58 DO 1000 k = 1, llm 44 59 DO 1040 i = 1, ip1jmp1 45 60 if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then 61 62 if (ok_isotopes) then 63 zx_defau_diag(i,k,iq_liq)=AMAX1 64 : ( seuil_liq - q(i,k,iq_liq), 0.0 ) 65 endif !if (ok_isotopes) then 66 46 67 q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq 47 68 q(i,k,iq_liq) = seuil_liq … … 59 80 DO i = 1, ip1jmp1 60 81 if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then 82 83 if (ok_isotopes) then 84 zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 ) 85 endif !if (ok_isotopes) then 86 61 87 q(i,k-1,iq) = q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) * 62 88 & deltap(i,k) / deltap(i,k-1) … … 83 109 ENDDO 84 110 ENDIF 111 112 !write(*,*) 'qminimum 128' 113 if (ok_isotopes) then 114 ! CRisi: traiter de même les traceurs d'eau 115 ! Mais il faut les prendre à l'envers pour essayer de conserver la 116 ! masse. 117 ! 1) pompage dans le sol 118 ! On suppose que ce pompage se fait sans isotopes -> on ne modifie 119 ! rien ici et on croise les doigts pour que ça ne soit pas trop 120 ! génant 121 DO i = 1,ip1jmp1 122 if (zx_pump(i).gt.0.0) then 123 q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i) 124 endif !if (zx_pump(i).gt.0.0) then 125 enddo !DO i = 1,ip1jmp1 126 127 ! 2) transfert de vap vers les couches plus hautes 128 !write(*,*) 'qminimum 139' 129 do k=2,llm 130 DO i = 1,ip1jmp1 131 if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 132 ! on ajoute la vapeur en k 133 do ixt=1,ntraciso 134 q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap)) 135 : +zx_defau_diag(i,k,iq_vap) 136 : *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap) 137 138 ! et on la retranche en k-1 139 q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap)) 140 : -zx_defau_diag(i,k,iq_vap) 141 : *deltap(i,k)/deltap(i,k-1) 142 : *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap) 143 144 enddo !do ixt=1,niso 145 q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap) 146 : +zx_defau_diag(i,k,iq_vap) 147 q_follow(i,k-1,iq_vap)= q_follow(i,k-1,iq_vap) 148 : -zx_defau_diag(i,k,iq_vap) 149 : *deltap(i,k)/deltap(i,k-1) 150 endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 151 enddo !DO i = 1, ip1jmp1 152 enddo !do k=2,llm 153 154 if (ok_iso_verif) then 155 call check_isotopes_seq(q,ip1jmp1,'qminimum 168') 156 endif !if (ok_iso_verif) then 157 158 159 ! 3) transfert d'eau de la vapeur au liquide 160 !write(*,*) 'qminimum 164' 161 do k=1,llm 162 DO i = 1,ip1jmp1 163 if (zx_defau_diag(i,k,iq_liq).gt.0.0) then 164 165 ! on ajoute eau liquide en k en k 166 do ixt=1,ntraciso 167 q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq)) 168 : +zx_defau_diag(i,k,iq_liq) 169 : *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap) 170 ! et on la retranche à la vapeur en k 171 q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap)) 172 : -zx_defau_diag(i,k,iq_liq) 173 : *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap) 174 enddo !do ixt=1,niso 175 q_follow(i,k,iq_liq)= q_follow(i,k,iq_liq) 176 : +zx_defau_diag(i,k,iq_liq) 177 q_follow(i,k,iq_vap)= q_follow(i,k,iq_vap) 178 : -zx_defau_diag(i,k,iq_liq) 179 endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then 180 enddo !DO i = 1, ip1jmp1 181 enddo !do k=2,llm 182 183 if (ok_iso_verif) then 184 call check_isotopes_seq(q,ip1jmp1,'qminimum 197') 185 endif !if (ok_iso_verif) then 186 187 endif !if (ok_isotopes) then 188 !write(*,*) 'qminimum 188' 189 85 190 c 86 191 RETURN -
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 -
LMDZ5/branches/testing/libf/dyn3d/vlspltqs.F
r1910 r2298 3 3 c 4 4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt, 5 , p,pk,teta ) 5 , p,pk,teta,iq ) 6 USE infotrac, ONLY: nqtot,nqdesc,iqfils 6 7 c 7 8 c Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron … … 35 36 REAL masse(ip1jmp1,llm),pente_max 36 37 REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm) 37 REAL q(ip1jmp1,llm )38 REAL q(ip1jmp1,llm,nqtot) 38 39 REAL w(ip1jmp1,llm),pdt 39 40 REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm) 41 INTEGER iq ! CRisi 40 42 c 41 43 c Local … … 43 45 c 44 46 INTEGER i,ij,l,j,ii 47 INTEGER ifils,iq2 ! CRisi 45 48 c 46 49 REAL qsat(ip1jmp1,llm) 47 REAL zm(ip1jmp1,llm )50 REAL zm(ip1jmp1,llm,nqtot) 48 51 REAL mu(ip1jmp1,llm) 49 52 REAL mv(ip1jm,llm) 50 53 REAL mw(ip1jmp1,llm+1) 51 REAL zq(ip1jmp1,llm )54 REAL zq(ip1jmp1,llm,nqtot) 52 55 REAL temps1,temps2,temps3 53 56 REAL zzpbar, zzw … … 116 119 ENDDO 117 120 118 CALL SCOPY(ijp1llm,q,1,zq,1) 119 CALL SCOPY(ijp1llm,masse,1,zm,1) 121 CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1) 122 CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1) 123 if (nqdesc(iq).gt.0) then 124 do ifils=1,nqdesc(iq) 125 iq2=iqfils(ifils,iq) 126 CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1) 127 enddo 128 endif !if (nqfils(iq).gt.0) then 120 129 121 130 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') 122 call vlxqs(zq,pente_max,zm,mu,qsat) 123 131 call vlxqs(zq,pente_max,zm,mu,qsat,iq) 124 132 125 133 c call minmaxq(zq,qmin,qmax,'avant vlyqs ') 126 134 127 call vlyqs(zq,pente_max,zm,mv,qsat) 128 135 call vlyqs(zq,pente_max,zm,mv,qsat,iq) 129 136 130 137 c call minmaxq(zq,qmin,qmax,'avant vlz ') 131 138 132 call vlz(zq,pente_max,zm,mw) 133 139 call vlz(zq,pente_max,zm,mw,iq) 134 140 135 141 c call minmaxq(zq,qmin,qmax,'avant vlyqs ') 136 142 c call minmaxq(zm,qmin,qmax,'M avant vlyqs ') 137 143 138 call vlyqs(zq,pente_max,zm,mv,qsat) 139 144 call vlyqs(zq,pente_max,zm,mv,qsat,iq) 140 145 141 146 c call minmaxq(zq,qmin,qmax,'avant vlxqs ') 142 147 c call minmaxq(zm,qmin,qmax,'M avant vlxqs ') 143 148 144 call vlxqs(zq,pente_max,zm,mu,qsat )149 call vlxqs(zq,pente_max,zm,mu,qsat,iq) 145 150 146 151 c call minmaxq(zq,qmin,qmax,'apres vlxqs ') … … 150 155 DO l=1,llm 151 156 DO ij=1,ip1jmp1 152 q(ij,l )=zq(ij,l)157 q(ij,l,iq)=zq(ij,l,iq) 153 158 ENDDO 154 159 DO ij=1,ip1jm+1,iip1 155 q(ij+iim,l)=q(ij,l) 156 ENDDO 157 ENDDO 160 q(ij+iim,l,iq)=q(ij,l,iq) 161 ENDDO 162 ENDDO 163 ! CRisi: aussi pour les fils 164 if (nqdesc(iq).gt.0) then 165 do ifils=1,nqdesc(iq) 166 iq2=iqfils(ifils,iq) 167 DO l=1,llm 168 DO ij=1,ip1jmp1 169 q(ij,l,iq2)=zq(ij,l,iq2) 170 ENDDO 171 DO ij=1,ip1jm+1,iip1 172 q(ij+iim,l,iq2)=q(ij,l,iq2) 173 ENDDO 174 ENDDO 175 enddo !do ifils=1,nqdesc(iq) 176 endif ! if (nqfils(iq).gt.0) then 177 !write(*,*) 'vlspltqs 183: fin de la routine' 158 178 159 179 RETURN 160 180 END 161 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat) 181 SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq) 182 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 183 162 184 c 163 185 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 179 201 c Arguments: 180 202 c ---------- 181 REAL masse(ip1jmp1,llm ),pente_max203 REAL masse(ip1jmp1,llm,nqtot),pente_max 182 204 REAL u_m( ip1jmp1,llm ) 183 REAL q(ip1jmp1,llm )205 REAL q(ip1jmp1,llm,nqtot) 184 206 REAL qsat(ip1jmp1,llm) 207 INTEGER iq ! CRisi 185 208 c 186 209 c Local … … 195 218 REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm) 196 219 REAL u_mq(ip1jmp1,llm) 220 221 ! CRisi 222 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) 223 INTEGER ifils,iq2 ! CRisi 197 224 198 225 Logical first,testcpu … … 227 254 DO l = 1, llm 228 255 DO ij=iip2,ip1jm-1 229 dxqu(ij)=q(ij+1,l )-q(ij,l)256 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 230 257 c IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0' 231 c sigu(ij)=u_m(ij,l)/masse(ij,l )258 c sigu(ij)=u_m(ij,l)/masse(ij,l,iq) 232 259 ENDDO 233 260 DO ij=iip1+iip1,ip1jm,iip1 … … 281 308 DO l = 1, llm 282 309 DO ij=iip2,ip1jm-1 283 dxqu(ij)=q(ij+1,l )-q(ij,l)310 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 284 311 ENDDO 285 312 DO ij=iip1+iip1,ip1jm,iip1 … … 323 350 DO l=1,llm 324 351 DO ij=iip2,ip1jm-1 325 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l ),326 , 1.+u_m(ij,l)/masse(ij+1,l ),352 zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq), 353 , 1.+u_m(ij,l)/masse(ij+1,l,iq), 327 354 , u_m(ij,l)) 328 355 zdum(ij,l)=0.5*zdum(ij,l) 329 356 u_mq(ij,l)=cvmgp( 330 , q(ij,l )+zdum(ij,l)*dxq(ij,l),331 , q(ij+1,l )-zdum(ij,l)*dxq(ij+1,l),357 , q(ij,l,iq)+zdum(ij,l)*dxq(ij,l), 358 , q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l), 332 359 , u_m(ij,l)) 333 360 u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l) … … 341 368 DO ij=iip2,ip1jm-1 342 369 IF (u_m(ij,l).gt.0.) THEN 343 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l )370 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq) 344 371 u_mq(ij,l)=u_m(ij,l)* 345 $ min(q(ij,l )+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))372 $ min(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l)) 346 373 ELSE 347 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l )374 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq) 348 375 u_mq(ij,l)=u_m(ij,l)* 349 $ min(q(ij+1,l )-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))376 $ min(q(ij+1,l,iq)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l)) 350 377 ENDIF 351 378 ENDDO … … 416 443 i=ijq-(j-1)*iip1 417 444 c accumulation pour les mailles completements advectees 418 do while(zu_m.gt.masse(ijq,l)) 419 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 420 zu_m=zu_m-masse(ijq,l) 445 do while(zu_m.gt.masse(ijq,l,iq)) 446 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) 447 & *masse(ijq,l,iq) 448 zu_m=zu_m-masse(ijq,l,iq) 421 449 i=mod(i-2+iim,iim)+1 422 450 ijq=(j-1)*iip1+i … … 424 452 c ajout de la maille non completement advectee 425 453 u_mq(ij,l)=u_mq(ij,l)+zu_m* 426 & (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l)) 454 & (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) 455 & *dxq(ijq,l)) 427 456 ELSE 428 457 ijq=ij+1 429 458 i=ijq-(j-1)*iip1 430 459 c accumulation pour les mailles completements advectees 431 do while(-zu_m.gt.masse(ijq,l)) 432 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 433 zu_m=zu_m+masse(ijq,l) 460 do while(-zu_m.gt.masse(ijq,l,iq)) 461 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) 462 & *masse(ijq,l,iq) 463 zu_m=zu_m+masse(ijq,l,iq) 434 464 i=mod(i,iim)+1 435 465 ijq=(j-1)*iip1+i 436 466 ENDDO 437 467 c ajout de la maille non completement advectee 438 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l )-439 & 0.5*(1.+zu_m/masse(ijq,l ))*dxq(ijq,l))468 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- 469 & 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l)) 440 470 ENDIF 441 471 ENDDO … … 454 484 ENDDO 455 485 486 ! CRisi: appel récursif de l'advection sur les fils. 487 ! Il faut faire ça avant d'avoir mis à jour q et masse 488 !write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq) 489 490 if (nqfils(iq).gt.0) then 491 do ifils=1,nqdesc(iq) 492 iq2=iqfils(ifils,iq) 493 DO l=1,llm 494 DO ij=iip2,ip1jm 495 ! On a besoin de q et masse seulement entre iip2 et ip1jm 496 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 497 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 498 enddo 499 enddo 500 enddo !do ifils=1,nqdesc(iq) 501 do ifils=1,nqfils(iq) 502 iq2=iqfils(ifils,iq) 503 call vlx(Ratio,pente_max,masseq,u_mq,iq2) 504 enddo !do ifils=1,nqfils(iq) 505 endif !if (nqfils(iq).gt.0) then 506 ! end CRisi 456 507 457 508 c calcul des tendances … … 459 510 DO l=1,llm 460 511 DO ij=iip2+1,ip1jm 461 new_m=masse(ij,l )+u_m(ij-1,l)-u_m(ij,l)462 q(ij,l )=(q(ij,l)*masse(ij,l)+512 new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l) 513 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ 463 514 & u_mq(ij-1,l)-u_mq(ij,l)) 464 515 & /new_m 465 masse(ij,l )=new_m516 masse(ij,l,iq)=new_m 466 517 ENDDO 467 518 c Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 468 519 DO ij=iip1+iip1,ip1jm,iip1 469 q(ij-iim,l)=q(ij,l) 470 masse(ij-iim,l)=masse(ij,l) 471 ENDDO 472 ENDDO 520 q(ij-iim,l,iq)=q(ij,l,iq) 521 masse(ij-iim,l,iq)=masse(ij,l,iq) 522 ENDDO 523 ENDDO 524 525 ! retablir les fils en rapport de melange par rapport a l'air: 526 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 527 ! puis on boucle en longitude 528 if (nqdesc(iq).gt.0) then 529 do ifils=1,nqdesc(iq) 530 iq2=iqfils(ifils,iq) 531 DO l=1,llm 532 DO ij=iip2+1,ip1jm 533 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 534 enddo 535 DO ij=iip1+iip1,ip1jm,iip1 536 q(ij-iim,l,iq2)=q(ij,l,iq2) 537 enddo ! DO ij=ijb+iip1-1,ije,iip1 538 enddo !DO l=1,llm 539 enddo !do ifils=1,nqdesc(iq) 540 endif !if (nqfils(iq).gt.0) then 473 541 474 542 c CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) … … 478 546 RETURN 479 547 END 480 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat) 548 SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq) 549 USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 481 550 c 482 551 c Auteurs: P.Le Van, F.Hourdin, F.Forget … … 502 571 c Arguments: 503 572 c ---------- 504 REAL masse(ip1jmp1,llm ),pente_max573 REAL masse(ip1jmp1,llm,nqtot),pente_max 505 574 REAL masse_adv_v( ip1jm,llm) 506 REAL q(ip1jmp1,llm )575 REAL q(ip1jmp1,llm,nqtot) 507 576 REAL qsat(ip1jmp1,llm) 577 INTEGER iq ! CRisi 508 578 c 509 579 c Local … … 529 599 SAVE sinlon,coslon,sinlondlon,coslondlon 530 600 SAVE airej2,airejjm 601 602 REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi 603 INTEGER ifils,iq2 ! CRisi 531 604 c 532 605 c … … 567 640 568 641 DO i = 1, iim 569 airescb(i) = aire(i+ iip1) * q(i+ iip1,l )570 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l )642 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq) 643 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq) 571 644 ENDDO 572 645 qpns = SSUM( iim, airescb ,1 ) / airej2 … … 576 649 577 650 DO ij=1,ip1jm 578 dyqv(ij)=q(ij,l )-q(ij+iip1,l)651 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq) 579 652 adyqv(ij)=abs(dyqv(ij)) 580 653 ENDDO … … 591 664 592 665 DO ij=1,iip1 593 dyq(ij,l)=qpns-q(ij+iip1,l )594 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l )-qpsn666 dyq(ij,l)=qpns-q(ij+iip1,l,iq) 667 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn 595 668 ENDDO 596 669 … … 710 783 DO ij=1,ip1jm 711 784 IF( masse_adv_v(ij,l).GT.0. ) THEN 712 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l ) + 713 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))) 785 qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l,iq ) + 786 , dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l) 787 , /masse(ij+iip1,l,iq))) 714 788 ELSE 715 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l ) - dyq(ij,l) *716 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l )) )789 qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l,iq) - dyq(ij,l) * 790 , 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) ) 717 791 ENDIF 718 792 qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l) … … 721 795 722 796 797 ! CRisi: appel récursif de l'advection sur les fils. 798 ! Il faut faire ça avant d'avoir mis à jour q et masse 799 !write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq) 800 801 if (nqfils(iq).gt.0) then 802 do ifils=1,nqdesc(iq) 803 iq2=iqfils(ifils,iq) 804 DO l=1,llm 805 DO ij=1,ip1jmp1 806 masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 807 Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 808 enddo 809 enddo 810 enddo !do ifils=1,nqdesc(iq) 811 812 do ifils=1,nqfils(iq) 813 iq2=iqfils(ifils,iq) 814 !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2 815 call vly(Ratio,pente_max,masseq,qbyv,iq2) 816 enddo !do ifils=1,nqfils(iq) 817 endif !if (nqfils(iq).gt.0) then 818 723 819 DO l=1,llm 724 820 DO ij=iip2,ip1jm 725 newmasse=masse(ij,l )821 newmasse=masse(ij,l,iq) 726 822 & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l) 727 q(ij,l )=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))728 & /newmasse729 masse(ij,l )=newmasse823 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) 824 & -qbyv(ij-iip1,l))/newmasse 825 masse(ij,l,iq)=newmasse 730 826 ENDDO 731 827 c.-. ancienne version … … 733 829 convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln 734 830 DO ij = 1,iip1 735 newmasse=masse(ij,l )+convmpn*aire(ij)736 q(ij,l )=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/831 newmasse=masse(ij,l,iq)+convmpn*aire(ij) 832 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convpn*aire(ij))/ 737 833 & newmasse 738 masse(ij,l )=newmasse834 masse(ij,l,iq)=newmasse 739 835 ENDDO 740 836 convps = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols 741 837 convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols 742 838 DO ij = ip1jm+1,ip1jmp1 743 newmasse=masse(ij,l )+convmps*aire(ij)744 q(ij,l )=(q(ij,l)*masse(ij,l)+convps*aire(ij))/839 newmasse=masse(ij,l,iq)+convmps*aire(ij) 840 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convps*aire(ij))/ 745 841 & newmasse 746 masse(ij,l )=newmasse842 masse(ij,l,iq)=newmasse 747 843 ENDDO 748 844 c.-. fin ancienne version … … 757 853 c DO ij = 1,iip1 758 854 c q(ij,l)=newq 759 c masse(ij,l )=newmasse*aire(ij)855 c masse(ij,l,iq)=newmasse*aire(ij) 760 856 c ENDDO 761 857 c convps=-SSUM(iim,qbyv(ip1jm-iim,l),1) … … 767 863 c DO ij = ip1jm+1,ip1jmp1 768 864 c q(ij,l)=newq 769 c masse(ij,l )=newmasse*aire(ij)865 c masse(ij,l,iq)=newmasse*aire(ij) 770 866 c ENDDO 771 867 c._. fin nouvelle version 772 868 ENDDO 773 869 870 !write(*,*) 'vly 866' 871 872 ! retablir les fils en rapport de melange par rapport a l'air: 873 if (nqdesc(iq).gt.0) then 874 do ifils=1,nqdesc(iq) 875 iq2=iqfils(ifils,iq) 876 DO l=1,llm 877 DO ij=1,ip1jmp1 878 q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2) 879 enddo 880 enddo 881 enddo !do ifils=1,nqdesc(iq) 882 endif !if (nqfils(iq).gt.0) then 883 !write(*,*) 'vly 879' 884 774 885 RETURN 775 886 END
Note: See TracChangeset
for help on using the changeset viewer.