Changeset 2127 for trunk/LMDZ.GENERIC/libf/phystd/thermcell_dq.F90
- Timestamp:
- Apr 29, 2019, 10:07:47 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/phystd/thermcell_dq.F90
r2102 r2127 2 2 ! 3 3 ! 4 SUBROUTINE thermcell_dq(ngrid,nlay, impl,ptimestep,fm,entr,detr,masse,&5 q,dq,qa,lmin ,lev_out)4 SUBROUTINE thermcell_dq(ngrid,nlay,ptimestep,fm,entr,detr,masse, & 5 q,dq,qa,lmin) 6 6 7 7 8 !============================================================================== 9 ! Calcul du transport verticale dans la couche limite en presence10 ! de"thermiques" explicitement representes11 ! calcul du dq/dt une fois qu'on connait les ascendances12 ! 8 !=============================================================================== 9 ! Purpose: Calcul du transport verticale dans la couche limite en presence de 10 ! "thermiques" explicitement representes 11 ! Calcul du dq/dt une fois qu'on connait les ascendances 12 ! 13 13 ! Modif 2013/01/04 (FH hourdin@lmd.jussieu.fr) 14 ! Introduction of an implicit computation of vertical advection in 15 ! the environment of thermal plumes in thermcell_dq 16 ! impl = 0 : explicit, 1 : implicit, -1 : old version 17 ! 18 ! Modif 2018/11/05 (AB alexandre.boissinot@lmd.jussieu.fr) 14 ! Introduction of an implicit computation of vertical advection in the environ- 15 ! ment of thermal plumes in thermcell_dq 19 16 ! 20 ! 21 !============================================================================== 17 ! Modif 2019/04 (AB alexandre.boissinot@lmd.jussieu.fr) 18 ! dqimpl = 1 : implicit scheme 19 ! dqimpl = 0 : explicit scheme 20 ! 21 !=============================================================================== 22 22 23 23 USE print_control_mod, ONLY: prt_level 24 USe thermcell_mod, ONLY: dqimpl 24 25 25 26 IMPLICIT NONE 26 27 27 28 28 !============================================================================== 29 !=============================================================================== 29 30 ! Declaration 30 !============================================================================== 31 !=============================================================================== 31 32 32 ! inputs:33 ! 33 ! Inputs: 34 ! ------- 34 35 35 36 INTEGER ngrid, nlay 36 INTEGER impl37 37 INTEGER lmin(ngrid) 38 INTEGER lev_out ! niveau pour les print39 38 40 39 REAL ptimestep … … 44 43 REAL detr(ngrid,nlay) 45 44 REAL q(ngrid,nlay) 45 46 ! Outputs: 47 ! -------- 48 49 REAL dq(ngrid,nlay) 46 50 REAL qa(ngrid,nlay) 47 51 48 ! outputs: 49 ! -------- 50 51 REAL dq(ngrid,nlay) 52 53 ! local: 54 ! ------ 52 ! Local: 53 ! ------ 55 54 56 55 INTEGER ig, l … … 63 62 REAL zzm 64 63 65 CHARACTER (LEN=20) :: modname 66 CHARACTER (LEN=80) :: abort_message 64 !=============================================================================== 65 ! Initialization 66 !=============================================================================== 67 67 68 !============================================================================== 69 ! Initialization 70 !============================================================================== 68 qold(:,:) = q(:,:) 71 69 72 qold = q 70 !=============================================================================== 71 ! Tracer variation computation 72 !=============================================================================== 73 73 74 modname = 'thermcell_dq' 75 76 IF (impl.lt.0) THEN 77 print *, 'OLD EXPLICIT SCHEME IS USED' 78 CALL thermcell_dq_o(ngrid,nlay,impl,ptimestep,fm,entr, & 79 & masse,q,dq,qa,lev_out) 80 RETURN 81 ENDIF 82 83 !------------------------------------------------------------------------------ 74 !------------------------------------------------------------------------------- 84 75 ! CFL criterion computation for advection in downdraft 85 !------------------------------------------------------------------------------ 76 !------------------------------------------------------------------------------- 86 77 87 78 cfl = 0. … … 103 94 print *, 'entr,detr', entr(ig,l-1), detr(ig,l-1) 104 95 print *, 'fm-', fm(ig,l-1) 105 abort_message = 'entr dt > m, 1st' 106 CALL abort_physic(modname,abort_message,1) 96 CALL abort 107 97 ENDIF 108 98 ENDDO 109 99 ENDDO 110 100 111 !------------------------------------------------------------------------------ 101 !------------------------------------------------------------------------------- 112 102 ! Computation of tracer concentrations in the ascending plume 113 !------------------------------------------------------------------------------ 103 !------------------------------------------------------------------------------- 114 104 115 105 DO ig=1,ngrid … … 121 111 DO ig=1,ngrid 122 112 DO l=lmin(ig)+1,nlay 123 if ((fm(ig,l+1)+detr(ig,l))*ptimestep.gt.1.e-5*masse(ig,l)) then113 IF ((fm(ig,l+1)+detr(ig,l))*ptimestep.gt.1.e-6*masse(ig,l)) THEN 124 114 qa(ig,l) = (fm(ig,l) * qa(ig,l-1) + entr(ig,l) * q(ig,l)) & 125 115 & / (fm(ig,l+1) + detr(ig,l)) 126 else116 ELSE 127 117 qa(ig,l) = q(ig,l) 128 endif118 ENDIF 129 119 130 120 ! IF (qa(ig,l).lt.0.) THEN … … 140 130 ENDDO 141 131 142 !------------------------------------------------------------------------------ 143 ! Plume vertical flux of q144 !------------------------------------------------------------------------------ 132 !------------------------------------------------------------------------------- 133 ! Plume vertical flux of tracer 134 !------------------------------------------------------------------------------- 145 135 146 136 DO l=2,nlay-1 … … 151 141 fqa(:,nlay) = 0. 152 142 153 !------------------------------------------------------------------------------ 143 !------------------------------------------------------------------------------- 154 144 ! Trace species evolution 155 !------------------------------------------------------------------------------ 145 !------------------------------------------------------------------------------- 156 146 157 IF ( impl==0) THEN158 dol=1,nlay-1147 IF (dqimpl==0) THEN 148 DO l=1,nlay-1 159 149 q(:,l) = q(:,l) + (fqa(:,l) - fqa(:,l+1) - fm(:,l) * q(:,l) & 160 150 & + fm(:,l+1) * q(:,l+1)) * ptimestep / masse(:,l) 161 enddo162 ELSE 163 dol=nlay-1,1,-1151 ENDDO 152 ELSEIF (dqimpl==1) THEN 153 DO l=nlay-1,1,-1 164 154 q(:,l) = ( q(:,l) + ptimestep / masse(:,l) & 165 155 & * ( fqa(:,l) - fqa(:,l+1) + fm(:,l+1) * q(:,l+1) ) ) & 166 156 & / ( 1. + fm(:,l) * ptimestep / masse(:,l) ) 167 157 ENDDO 158 ELSE 159 print *, 'ERROR: No corresponding scheme for mixing computations!' 160 print *, ' dqimpl must be equal to 1, 0 or -1 but' 161 print *, 'dqimpl =', dqimpl 162 call abort 168 163 ENDIF 169 164 170 !============================================================================== 165 !=============================================================================== 171 166 ! Tendencies 172 !============================================================================== 167 !=============================================================================== 173 168 174 169 DO l=1,nlay … … 182 177 RETURN 183 178 END 184 185 186 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!187 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!189 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!190 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!191 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!192 193 194 Subroutine thermcell_dq_o(ngrid,nlay,impl,ptimestep,fm,entr,masse, &195 q,dq,qa,lev_out)196 197 198 !==============================================================================199 !200 ! Calcul du transport verticale dans la couche limite en presence201 ! de "thermiques" explicitement representes202 ! calcul du dq/dt une fois qu'on connait les ascendances203 !204 !==============================================================================205 206 USE print_control_mod, ONLY: prt_level207 208 implicit none209 210 211 !==============================================================================212 ! Declaration213 !==============================================================================214 215 integer ngrid,nlay,impl216 217 real ptimestep218 real masse(ngrid,nlay),fm(ngrid,nlay+1)219 real entr(ngrid,nlay)220 real q(ngrid,nlay)221 real dq(ngrid,nlay)222 integer lev_out ! niveau pour les print223 224 real qa(ngrid,nlay),detr(ngrid,nlay),wqd(ngrid,nlay+1)225 226 real zzm227 228 integer ig,l229 real cfl230 231 real qold(ngrid,nlay)232 real ztimestep233 integer niter,iter234 CHARACTER (LEN=20) :: modname='thermcell_dq'235 CHARACTER (LEN=80) :: abort_message236 237 238 239 ! Calcul du critere CFL pour l'advection dans la subsidence240 cfl = 0.241 do l=1,nlay242 do ig=1,ngrid243 zzm=masse(ig,l)/ptimestep244 cfl=max(cfl,fm(ig,l)/zzm)245 if (entr(ig,l).gt.zzm) then246 print*,'entr*dt>m,2',l,entr(ig,l)*ptimestep,masse(ig,l)247 abort_message = 'entr dt > m, 2nd'248 CALL abort_physic (modname,abort_message,1)249 endif250 enddo251 enddo252 253 !IM 090508 print*,'CFL CFL CFL CFL ',cfl254 255 #undef CFL256 #ifdef CFL257 ! On subdivise le calcul en niter pas de temps.258 niter=int(cfl)+1259 #else260 niter=1261 #endif262 263 ztimestep=ptimestep/niter264 qold=q265 266 do iter=1,niter267 if (prt_level.ge.1) print*,'Q2 THERMCEL_DQ 0'268 269 ! calcul du detrainement270 do l=1,nlay271 do ig=1,ngrid272 detr(ig,l)=fm(ig,l)-fm(ig,l+1)+entr(ig,l)273 ! print*,'Q2 DQ ',detr(ig,l),fm(ig,l),entr(ig,l)274 !test275 if (detr(ig,l).lt.0.) then276 entr(ig,l)=entr(ig,l)-detr(ig,l)277 detr(ig,l)=0.278 ! print*,'detr2<0!!!','ig=',ig,'l=',l,'f=',fm(ig,l),279 ! s 'f+1=',fm(ig,l+1),'e=',entr(ig,l),'d=',detr(ig,l)280 endif281 282 ! if (fm(ig,l+1).lt.0.) then283 ! print*,'fm2<0!!!'284 ! endif285 286 ! if (entr(ig,l).lt.0.) then287 ! print*,'entr2<0!!!'288 ! endif289 enddo290 enddo291 292 ! calcul de la valeur dans les ascendances293 do ig=1,ngrid294 qa(ig,1)=q(ig,1)295 enddo296 297 do l=2,nlay298 do ig=1,ngrid299 if ((fm(ig,l+1)+detr(ig,l))*ztimestep.gt.1.e-5*masse(ig,l)) then300 qa(ig,l) = (fm(ig,l)*qa(ig,l-1)+entr(ig,l)*q(ig,l)) &301 & / (fm(ig,l+1)+detr(ig,l))302 else303 qa(ig,l)=q(ig,l)304 endif305 306 if (qa(ig,l).lt.0.) then307 ! print*,'qa<0!!!'308 endif309 310 if (q(ig,l).lt.0.) then311 ! print*,'q<0!!!'312 endif313 enddo314 enddo315 316 ! Calcul du flux subsident317 318 do l=2,nlay319 do ig=1,ngrid320 #undef centre321 #ifdef centre322 wqd(ig,l)=fm(ig,l)*0.5*(q(ig,l-1)+q(ig,l))323 #else324 325 #define plusqueun326 #ifdef plusqueun327 ! Schema avec advection sur plus qu'une maille.328 zzm=masse(ig,l)/ztimestep329 if (fm(ig,l)>zzm) then330 wqd(ig,l)=zzm*q(ig,l)+(fm(ig,l)-zzm)*q(ig,l+1)331 else332 wqd(ig,l)=fm(ig,l)*q(ig,l)333 endif334 #else335 wqd(ig,l)=fm(ig,l)*q(ig,l)336 #endif337 #endif338 339 if (wqd(ig,l).lt.0.) then340 ! print*,'wqd<0!!!'341 endif342 enddo343 enddo344 345 do ig=1,ngrid346 wqd(ig,1)=0.347 wqd(ig,nlay+1)=0.348 enddo349 350 ! Calcul des tendances351 do l=1,nlay352 do ig=1,ngrid353 q(ig,l)=q(ig,l)+(detr(ig,l)*qa(ig,l)-entr(ig,l)*q(ig,l) &354 & -wqd(ig,l)+wqd(ig,l+1)) &355 & *ztimestep/masse(ig,l)356 ! if (dq(ig,l).lt.0.) then357 ! print*,'dq<0!!!'358 ! endif359 enddo360 enddo361 enddo362 363 ! Calcul des tendances364 do l=1,nlay365 do ig=1,ngrid366 dq(ig,l) = (q(ig,l) - qold(ig,l)) / ptimestep367 q(ig,l) = qold(ig,l)368 enddo369 enddo370 371 372 return373 end
Note: See TracChangeset
for help on using the changeset viewer.