1 !WRF:MODEL_LAYER:PHYSICS
4 MODULE module_ctrans_grell
8 !USE module_ctrans_aqchem
10 ! USE module_state_description
12 ! REAL :: WTM(NUMCHEM_radm)
13 ! DATA WTM / 64.,96.,46.,30.,48.,63.,34.,44.,30.,48.,62., &
14 ! 76.,46.,60.,17.,108.,62.,121.,44.,72.,114.,30., &
15 ! 28.,28.,42.,56.,92.,106.,75.,147.,47.,79.,72., &
16 ! 58.,72.,87.,119.,108.,68.,17.,33. /
20 !-------------------------------------------------------------
21 SUBROUTINE GRELLDRVCT(DT,itimestep,DX, &
22 id,config_flags,rho_phy,RAINCV,chem, &
23 U,V,t_phy,moist,dz8w,p_phy, &
24 XLV,CP,G,r_v,z,cu_co_ten, &
26 ids,ide, jds,jde, kds,kde, &
27 ims,ime, jms,jme, kms,kme, &
28 its,ite, jts,jte, kts,kte )
30 USE module_state_description
31 !-------------------------------------------------------------
33 !-------------------------------------------------------------
34 INTEGER, INTENT(IN ) :: &
36 ids,ide, jds,jde, kds,kde, &
37 ims,ime, jms,jme, kms,kme, &
38 its,ite, jts,jte, kts,kte
41 INTEGER, INTENT(IN ) :: ITIMESTEP
43 REAL, INTENT(IN ) :: XLV, R_v
44 REAL, INTENT(IN ) :: CP,G
46 REAL, DIMENSION( ims:ime , kms:kme , jms:jme,num_moist ) , &
48 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
58 ! on output for control only, purely diagnostic
60 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
66 REAL, INTENT(IN ) :: DT, DX
68 REAL, DIMENSION( ims:ime , kms:kme , jms:jme, num_chem ), &
73 REAL, DIMENSION( ims:ime , jms:jme ), &
77 real, dimension (its:ite,kts:kte) :: &
79 real, dimension (its:ite) :: &
83 ! basic environmental input includes moisture convergence (mconv)
84 ! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
85 ! convection for this call only and at that particular gridpoint
87 real, dimension (its:ite,kts:kte) :: &
88 T,TN,q,qo,PO,P,US,VS,hstary
89 real, dimension (its:ite,kts:kte,num_chem) :: &
91 real, dimension (its:ite) :: &
93 integer, dimension (its:ite) :: &
95 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
97 INTEGER :: nv,i,j,k,ICLDCK,ipr,jpr,npr
98 REAL :: tcrit,dp,dq,epsilc
99 INTEGER :: itf,jtf,ktf,iopt
104 ! if(itimestep.lt.34.or.itimestep.gt.36)ipr=0
105 ! if(itimestep.lt.34.or.itimestep.gt.36)jpr=0
120 ! if(raincv(i,j).gt.0.)then
130 if(j.eq.jpr)print *,'dt = ',dt
133 PSUR(I)=p_phy(I,kts,J)*.01
137 ! rainrate is input for this transport/wet-deposition routine
139 pret(i)=raincv(i,j)/dt
140 if(pret(i).le.0.)aaeq(i)=20.
144 po(i,k)=p_phy(i,k,j)*.01
149 q(I,K)=moist(i,k,j,p_qv)
150 IF(Q(I,K).LT.1.E-08)Q(I,K)=1.E-08
156 tracer(i,k,nv)=max(epsilc,chem(i,k,j,nv))
164 ! hstary(i,k)=hstar4(nv)*exp(dhr(nv)*(1./t(i,k)-1./298.))
165 if(i.eq.ipr.and.j.eq.jpr)then
166 print *,k,pret(i),tracer(i,k,npr),p(i,k),z(i,k,j)
172 !---- CALL CUMULUS PARAMETERIZATION
174 CALL CUP_ct(ktop,tracer,j,AAEQ,T,Q,TER11,PRET,P,tracert, &
175 hstary,DT,PSUR,US,VS,tcrit, &
176 xlv,r_v,cp,g,ipr,jpr,npr,num_chem, &
177 ids,ide, jds,jde, kds,kde, &
178 ims,ime, jms,jme, kms,kme, &
179 its,ite, jts,jte, kts,kte )
183 if(pret(i).le.0.)then
190 CALL neg_check_ct(pret,ktop,epsilc,dt,tracer,tracert,iopt,num_chem, &
191 its,ite,kts,kte,itf,ktf,ipr,jpr,npr,j)
194 if(pret(i).gt.0.)then
196 chem(i,k,j,nv)=max(epsilc,chem(i,k,j,nv)+tracert(i,k,nv)*dt)
198 cu_co_ten(i,k,j)=tracert(i,k,npr)*dt
199 if(i.eq.ipr.and.j.eq.jpr)print *,k,chem(i,k,j,nv),cu_co_ten(i,k,j)
205 if(nv.eq.npr)cu_co_ten(i,k,j)=0.
214 END SUBROUTINE GRELLDRVCT
217 SUBROUTINE CUP_ct(ktop,tracer,J,AAEQ,T,Q,Z1, &
218 PRE,P,tracert,hstary,DTIME,PSUR,US,VS,TCRIT, &
219 xl,rv,cp,g,ipr,jpr,npr,num_chem, &
220 ids,ide, jds,jde, kds,kde, &
221 ims,ime, jms,jme, kms,kme, &
222 its,ite, jts,jte, kts,kte )
228 num_chem,ids,ide, jds,jde, kds,kde, &
229 ims,ime, jms,jme, kms,kme, &
230 its,ite, jts,jte, kts,kte,ipr,jpr,npr
231 integer, intent (in ) :: &
236 !tracert = output temp tendency (per s)
238 real, dimension (its:ite,kts:kte,num_chem) &
239 ,intent (inout ) :: &
241 real, dimension (its:ite) &
242 ,intent (inout ) :: &
244 integer, dimension (its:ite) &
245 ,intent (inout ) :: &
247 integer, dimension (its:ite) :: &
250 ! basic environmental input includes moisture convergence (mconv)
251 ! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
252 ! convection for this call only and at that particular gridpoint
254 real, dimension (its:ite,kts:kte) &
257 real, dimension (its:ite,kts:kte) &
260 real, dimension (its:ite) &
267 dtime,tcrit,xl,cp,rv,g
270 real, dimension (its:ite,1:3) :: &
275 !***************** the following are your basic environmental
276 ! variables. They carry a "_cup" if they are
277 ! on model cloud levels (staggered). They carry
278 ! an "o"-ending (z becomes zo), if they are the forced
279 ! variables. They are preceded by x (z becomes xz)
280 ! to indicate modification by some typ of cloud
282 ! z = heights of model levels
283 ! q = environmental mixing ratio
284 ! qes = environmental saturation mixing ratio
285 ! t = environmental temp
286 ! p = environmental pressure
287 ! he = environmental moist static energy
288 ! hes = environmental saturation moist static energy
289 ! z_cup = heights of model cloud levels
290 ! q_cup = environmental q on model cloud levels
291 ! qes_cup = saturation q on model cloud levels
292 ! t_cup = temperature (Kelvin) on model cloud levels
293 ! p_cup = environmental pressure
294 ! he_cup = moist static energy on model cloud levels
295 ! hes_cup = saturation moist static energy on model cloud levels
296 ! gamma_cup = gamma on model cloud levels
299 ! hcd = moist static energy in downdraft
300 ! zd normalized downdraft mass flux
302 ! entr = entrainment rate
303 ! zd = downdraft normalized mass flux
304 ! entr= entrainment rate
305 ! hcd = h in model cloud
307 ! zd = normalized downdraft mass flux
308 ! gamma_cup = gamma on model cloud levels
309 ! mentr_rate = entrainment rate
310 ! qcd = cloud q (including liquid water) after entrainment
311 ! qrch = saturation q in cloud
312 ! pwd = evaporate at that level
313 ! pwev = total normalized integrated evaoprate (I2)
314 ! entr= entrainment rate
315 ! z1 = terrain elevation
316 ! entr = downdraft entrainment rate
317 ! jmin = downdraft originating level
318 ! kdet = level above ground where downdraft start detraining
319 ! psur = surface pressure
320 ! z1 = terrain elevation
321 ! zd = downdraft normalized mass flux
322 ! zu = updraft normalized mass flux
323 ! mbdt = arbitrary numerical parameter
324 ! dtime = dt over which forcing is applied
325 ! kbcon = LFC of parcel from k22
326 ! k22 = updraft originating level
328 ! ktop = cloud top (output)
329 ! xmb = total base mass flux
330 ! hc = cloud moist static energy
331 ! hkb = moist static energy at originating level
332 ! mentr_rate = entrainment rate
334 real, dimension (its:ite,kts:kte) :: &
335 he,hes,qes,z,pwdper, &
337 qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup, &
339 dby,qc,qrcd,pwd,pw,hcd,qcd,dbyd,hc,qrc,zu,zd,clw_all, &
341 ! cd = detrainment function for updraft
342 ! cdd = detrainment function for downdraft
344 cd,cdd,scr1,DELLAH,DELLAQ,DELLAT,DELLAQC
348 real, dimension (its:ite) :: &
350 XMB,PWAV,PWEV,BU,cap_max,cap_max_increment
351 real, dimension (its:ite,kts:kte,num_chem) :: &
352 tr_c,tr_up,tr_dd,tre_cup,tr_pw,tr_pwd
353 real, dimension (its:ite,num_chem) :: &
355 integer, dimension (its:ite) :: &
356 kzdown,KDET,K22,KB,JMIN,kstabi,kstabm, & !-lxz
362 day,dz,mbdt,entr_rate,radius,entrd_rate,mentr_rate,mentrd_rate, &
363 zcutdown,edtmax,edtmin,depth_min,zkbmax,z_detr,zktop, &
366 integer :: itf,jtf,ktf
375 !--- specify entrainmentrate and detrainmentrate
379 !--- gross entrainment rate (these may be changed later on in the
380 !--- program, depending what your detrainment is!!)
384 !--- entrainment of mass
389 !--- initial detrainmentrates
393 cd(i,k)=0.1*entr_rate
399 !--- max/min allowed value for epsilon (ratio downdraft base mass flux/updraft
405 !--- minimum depth (m), clouds must have
409 !--- maximum depth (mb) of capping
410 !--- inversion (larger cap = no convection)
413 !sms$to_local(grid_dh: <1, mix :size>, <2, mjx :size>) begin
416 cap_max_increment(i)=0.
420 if(aaeq(i).ne.0.)then
428 !--- max height(m) above ground where updraft air can originate
432 !--- height(m) above which no downdrafts are allowed to originate
436 !--- depth(m) over which downdraft detrains all its mass
442 !--- calculate moist static energy, heights, qes
444 call cup_env(z,qes,he,hes,t,q,p,z1, &
445 psur,ierr,tcrit,0,xl,cp, &
446 ids,ide, jds,jde, kds,kde, &
447 ims,ime, jms,jme, kms,kme, &
448 its,ite, jts,jte, kts,kte)
450 !--- environmental values on cloud levels
452 call cup_env_clev(t,qes,q,he,hes,z,p,qes_cup,q_cup,he_cup, &
453 hes_cup,z_cup,p_cup,gamma_cup,t_cup,psur, &
455 ids,ide, jds,jde, kds,kde, &
456 ims,ime, jms,jme, kms,kme, &
457 its,ite, jts,jte, kts,kte)
458 call cup_env_clev_tr(tracer,tre_cup,num_chem,ierr, &
459 ids,ide, jds,jde, kds,kde, &
460 ims,ime, jms,jme, kms,kme, &
461 its,ite, jts,jte, kts,kte)
466 if(z_cup(i,k).gt.zkbmax+z1(i))then
474 !--- level where detrainment for downdraft starts
477 if(z_cup(i,k).gt.z_detr+z1(i))then
489 !------- DETERMINE LEVEL WITH HIGHEST MOIST STATIC ENERGY CONTENT - K22
491 CALL cup_MAXIMI(HE_CUP,3,KBMAX,K22,ierr, &
492 ids,ide, jds,jde, kds,kde, &
493 ims,ime, jms,jme, kms,kme, &
494 its,ite, jts,jte, kts,kte)
496 IF(ierr(I).eq.0.)THEN
497 IF(K22(I).GE.KBMAX(i))ierr(i)=2
501 !--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
503 call cup_kbcon(cap_max_increment,1,k22,kbcon,he_cup,hes_cup, &
504 ierr,kbmax,p_cup,cap_max, &
505 ids,ide, jds,jde, kds,kde, &
506 ims,ime, jms,jme, kms,kme, &
507 its,ite, jts,jte, kts,kte)
509 !--- increase detrainment in stable layers
511 CALL cup_minimi(HEs_cup,Kbcon,kstabm,kstabi,ierr, &
512 ids,ide, jds,jde, kds,kde, &
513 ims,ime, jms,jme, kms,kme, &
514 its,ite, jts,jte, kts,kte)
516 IF(ierr(I).eq.0.)THEN
517 if(kstabm(i)-1.gt.kstabi(i))then
518 do k=kstabi(i),kstabm(i)-1
519 cd(i,k)=cd(i,k-1)+1.5*entr_rate
520 if(cd(i,k).gt.10.0*entr_rate)cd(i,k)=10.0*entr_rate
526 !--- calculate incloud moist static energy
528 call cup_up_he(k22,hkb,z_cup,cd,mentr_rate,he_cup,hc, &
529 kbcon,ierr,dby,he,hes_cup, &
530 ids,ide, jds,jde, kds,kde, &
531 ims,ime, jms,jme, kms,kme, &
532 its,ite, jts,jte, kts,kte)
534 !--- DETERMINE CLOUD TOP - KTOP
536 call cup_ktop(1,dby,kbcon,ktop,ierr, &
537 ids,ide, jds,jde, kds,kde, &
538 ims,ime, jms,jme, kms,kme, &
539 its,ite, jts,jte, kts,kte)
543 zktop=(z_cup(i,ktop(i))-z1(i))*.6
544 zktop=min(zktop+z1(i),zcutdown+z1(i))
546 if(z_cup(i,k).gt.zktop)then
554 !--- DOWNDRAFT ORIGINATING LEVEL - JMIN
556 call cup_minimi(HEs_cup,K22,kzdown,JMIN,ierr, &
557 ids,ide, jds,jde, kds,kde, &
558 ims,ime, jms,jme, kms,kme, &
559 its,ite, jts,jte, kts,kte)
561 IF(ierr(I).eq.0.)THEN
563 !--- check whether it would have buoyancy, if there where
564 !--- no entrainment/detrainment
567 if(jmin(i)-1.lt.KDET(I))kdet(i)=jmin(i)-1
568 if(jmin(i).ge.Ktop(I)-1)jmin(i)=ktop(i)-2
570 hcd(i,ki)=hes_cup(i,ki)
571 DZ=Z_cup(i,Ki+1)-Z_cup(i,Ki)
572 dh=dz*(HCD(i,Ki)-hes_cup(i,ki))
576 hcd(i,k)=hes_cup(i,jmin(i))
577 DZ=Z_cup(i,K+1)-Z_cup(i,K)
578 dh=dh+dz*(HCD(i,K)-hes_cup(i,k))
583 else if(jmin(i).le.3)then
597 ! - Must have at least depth_min m between cloud convective base
601 IF(ierr(I).eq.0.)THEN
602 IF(-z_cup(I,KBCON(I))+z_cup(I,KTOP(I)).LT.depth_min)then
609 !c--- normalized updraft mass flux profile
611 call cup_up_nms(zu,z_cup,mentr_rate,cd,kbcon,ktop,ierr,k22, &
612 ids,ide, jds,jde, kds,kde, &
613 ims,ime, jms,jme, kms,kme, &
614 its,ite, jts,jte, kts,kte)
616 !c--- normalized downdraft mass flux profile,also work on bottom detrainment
619 call cup_dd_nms(zd,z_cup,cdd,mentrd_rate,jmin,ierr, &
621 ids,ide, jds,jde, kds,kde, &
622 ims,ime, jms,jme, kms,kme, &
623 its,ite, jts,jte, kts,kte)
625 !--- downdraft moist static energy
627 call cup_dd_he(hes_cup,zd,hcd,z_cup,cdd,mentrd_rate, &
628 jmin,ierr,he,dbyd,he_cup, &
629 ids,ide, jds,jde, kds,kde, &
630 ims,ime, jms,jme, kms,kme, &
631 its,ite, jts,jte, kts,kte)
633 !--- calculate moisture properties of downdraft
635 call cup_dd_moisture(zd,hcd,hes_cup,qcd,qes_cup, &
636 pwd,q_cup,z_cup,cdd,mentrd_rate,jmin,ierr,gamma_cup, &
637 pwev,bu,qrcd,q,he,t_cup,2,xl, &
638 ids,ide, jds,jde, kds,kde, &
639 ims,ime, jms,jme, kms,kme, &
640 its,ite, jts,jte, kts,kte)
642 !--- calculate moisture properties of updraft
644 call cup_up_moisture(ierr,z_cup,qc,qrc,pw,pwav, &
645 kbcon,ktop,cd,dby,mentr_rate,clw_all, &
646 q,GAMMA_cup,zu,qes_cup,k22,q_cup,xl, &
647 ids,ide, jds,jde, kds,kde, &
648 ims,ime, jms,jme, kms,kme, &
649 its,ite, jts,jte, kts,kte)
651 !--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
653 call cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, &
654 pwev,edtmax,edtmin,3,edtc, &
655 ids,ide, jds,jde, kds,kde, &
656 ims,ime, jms,jme, kms,kme, &
657 its,ite, jts,jte, kts,kte)
664 ! massflux from precip and normalized cloud properties
669 if(ierr(i).gt.0)pre(i)=0.
671 xmb(i)=pre(i)/(pwav(i)+edt(i)*pwev(i))
673 !--- percent of that that is evaporated (pwd is negative)
675 if(i.eq.ipr.and.j.eq.jpr)then
676 print *,'xmb,edt,pwav = ',xmb(i),edt(i),pwav(i)
677 print *,'k,pwdper(i,k),pw,pwd(i,k)',z1(i)
680 pwdper(i,k)=-edt(i)*pwd(i,k)/pwav(i)
681 if(i.eq.ipr.and.j.eq.jpr)then
682 print *,k,pwdper(i,k),pw(i,k),pwd(i,k)
687 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
689 !!!!! NOW WE HAVE EVREYTHING TO CALCULATE TRACER TRANSPORT AND WET DEPOSITION !!!
691 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
693 !--- calculate incloud tracer distribution
695 if(j.eq.jpr)print *,'calling up_tracer'
696 call cup_up_tracer(ierr,tcrit,t,pre,z_cup,p,tracer,tre_cup,tr_up,tr_pw, &
697 tr_c,hstary,pw,clw_all,kbcon,ktop,cd,mentr_rate,zu,k22,&
698 num_chem,ids,ide, jds,jde, kds,kde, &
699 ims,ime, jms,jme, kms,kme, &
700 its,ite, jts,jte, kts,kte,ipr,jpr,j,npr)
701 if(j.eq.jpr)print *,'called up_tracer'
702 call cup_dd_tracer(ierr,z_cup,qrcd,tracer,tre_cup,tr_up,tr_dd, &
703 tr_pw,tr_pwd,jmin,cdd,mentrd_rate,zd,pwdper,k22, &
704 num_chem,ids,ide, jds,jde, kds,kde, &
705 ims,ime, jms,jme, kms,kme, &
706 its,ite, jts,jte, kts,kte)
707 if(j.eq.jpr)print *,'called dd_tracer'
713 print *,'in 250 loop ',edt(ipr),ierr(ipr)
714 ! if(ierr(i).eq.0.or.ierr(i).eq.3)then
715 print *,k22(I),kbcon(i),ktop(i),jmin(i)
718 print *,k,z(i,k),he(i,k),hes(i,k)
721 print *,zu(i,k),zd(i,k),pw(i,k),pwd(i,k)
723 print *,'tr_up(i,k,6),tr_dd(i,k,6),tr_pw(i,k,6),tr_pwd(i,k,6)'
725 print *,tr_up(i,k,npr),tr_dd(i,k,npr),tr_pw(i,k,npr),tr_pwd(i,k,npr)
730 !--- calculate transport tendencies
732 !--- 1. in bottom layer
734 call cup_dellabot_tr(ipr,jpr,tre_cup,ierr,z_cup,p,tr_dd,edt, &
735 zd,cdd,tracer,tracert,j,mentrd_rate,z,g,xmb, &
736 num_chem,ids,ide, jds,jde, kds,kde, &
737 ims,ime, jms,jme, kms,kme, &
738 its,ite, jts,jte, kts,kte)
740 !--- 2. everywhere else
743 call cup_dellas_tr(ierr,z_cup,p_cup,tr_dd,edt,zd,cdd, &
744 tracer,tracert,j,mentrd_rate,zu,g,xmb, &
745 cd,tr_up,ktop,k22,kbcon,mentr_rate,jmin,tre_cup,kdet, &
746 k22,ipr,jpr,npr,'deep',num_chem, &
747 ids,ide, jds,jde, kds,kde, &
748 ims,ime, jms,jme, kms,kme, &
749 its,ite, jts,jte, kts,kte )
753 print *,k,tracer(i,k,npr),tracert(i,k,npr)
757 ! may need more below for wet deposition......
760 ! call cup_output_wd ( &
761 ! ids,ide, jds,jde, kds,kde, &
762 ! ims,ime, jms,jme, kms,kme, &
763 ! its,ite, jts,jte, kts,kte)
765 END SUBROUTINE CUP_CT
767 SUBROUTINE cup_dellabot_tr(ipr,jpr,tre_cup,ierr,z_cup,p_cup, &
768 tr_dd,edt,zd,cdd,tracer,tracert,j,mentrd_rate,z,g,xmb, &
769 num_chem,ids,ide, jds,jde, kds,kde, &
770 ims,ime, jms,jme, kms,kme, &
771 its,ite, jts,jte, kts,kte )
777 num_chem,ids,ide, jds,jde, kds,kde, &
778 ims,ime, jms,jme, kms,kme, &
779 its,ite, jts,jte, kts,kte
780 integer, intent (in ) :: &
783 ! ierr error value, maybe modified in this routine
785 real, dimension (its:ite,kts:kte,1:num_chem) &
788 real, dimension (its:ite,kts:kte,1:num_chem) &
791 real, dimension (its:ite,kts:kte) &
794 real, dimension (its:ite) &
800 integer, dimension (its:ite) &
804 ! local variables in this routine
808 real detdo,detdo1,detdo2,entdo,dp,dz,subin, &
811 integer :: itf, ktf, nv, npr
817 if(j.eq.jpr)print *,'in cup dellabot '
820 if(ierr(i).ne.0)go to 100
821 dz=z_cup(i,2)-z_cup(i,1)
822 DP=100.*(p_cup(i,1)-P_cup(i,2))
823 detdo1=edt(i)*zd(i,2)*CDD(i,1)*DZ
824 detdo2=edt(i)*zd(i,1)
825 entdo=edt(i)*zd(i,2)*mentrd_rate*dz
826 subin=-EDT(I)*zd(i,2)
827 detdo=detdo1+detdo2-entdo+subin
829 tracert(I,1,nv)=(detdo1*.5*(tr_dd(i,1,nv)+tr_dd(i,2,nv)) &
830 +detdo2*tr_dd(i,1,nv) &
831 +subin*tre_cup(i,2,nv) &
832 -entdo*tracer(i,1,nv))*g/dp*xmb(i)
834 if(j.eq.jpr.and.i.eq.ipr)print *,'in cup dellabot ',tracert(I,1,npr), &
835 detdo1,detdo2,subin,entdo,tr_dd(i,1,npr),tr_dd(i,2,npr),tracer(i,1,npr)
838 END SUBROUTINE cup_dellabot_tr
841 SUBROUTINE cup_dellas_tr(ierr,z_cup,p_cup,tr_dd,edt,zd,cdd, &
842 tracer,tracert,j,mentrd_rate,zu,g,xmb, &
843 cd,tr_up,ktop,k22,kbcon,mentr_rate,jmin,tre_cup,kdet,kpbl, &
844 ipr,jpr,npr,name,num_chem, &
845 ids,ide, jds,jde, kds,kde, &
846 ims,ime, jms,jme, kms,kme, &
847 its,ite, jts,jte, kts,kte )
853 num_chem,ids,ide, jds,jde, kds,kde, &
854 ims,ime, jms,jme, kms,kme, &
855 its,ite, jts,jte, kts,kte
856 integer, intent (in ) :: &
859 ! ierr error value, maybe modified in this routine
861 real, dimension (its:ite,kts:kte,1:num_chem) &
862 ,intent (inout ) :: &
864 real, dimension (its:ite,kts:kte,1:num_chem) &
866 tr_up,tr_dd,tre_cup,tracer
867 real, dimension (its:ite,kts:kte) &
869 z_cup,p_cup,zd,cdd,cd,zu
870 real, dimension (its:ite) &
875 g,mentrd_rate,mentr_rate
876 integer, dimension (its:ite) &
878 kbcon,ktop,k22,jmin,kdet,kpbl
879 integer, dimension (its:ite) &
882 character *(*), intent (in) :: &
885 ! local variables in this routine
889 real detdo1,detdo2,entdo,dp,dz,subin,detdo,entup, &
890 detup,subdown,entdoj,entupk,detupk,totmas
900 print *,'in dellas kpbl(i),k22(i),kbcon(i),ktop(i),jmin(i)'
901 print *,kpbl(i),k22(i),kbcon(i),ktop(i),jmin(i)
913 IF(ierr(i).ne.0)GO TO 100
914 IF(K.Gt.KTOP(I))GO TO 100
916 !--- SPECIFY DETRAINMENT OF DOWNDRAFT, HAS TO BE CONSISTENT
917 !--- WITH ZD CALCULATIONS IN SOUNDD.
919 DZ=Z_cup(I,K+1)-Z_cup(I,K)
920 detdo=edt(i)*CDD(i,K)*DZ*ZD(i,k+1)
921 entdo=edt(i)*mentrd_rate*dz*zd(i,k+1)
922 subin=zu(i,k+1)-zd(i,k+1)*edt(i)
925 if(k.ge.kbcon(i).and.k.lt.ktop(i))then
926 entup=mentr_rate*dz*zu(i,k)
927 detup=CD(i,K+1)*DZ*ZU(i,k)
929 subdown=(zu(i,k)-zd(i,k)*edt(i))
935 entdoj=edt(i)*zd(i,k)
938 if(k.eq.k22(i)-1)then
946 if(k.eq.ktop(i)-0)then
950 if(k.lt.kbcon(i))then
954 !C--- CHANGED DUE TO SUBSIDENCE AND ENTRAINMENT
956 totmas=subin-subdown+detup-entup-entdo+ &
957 detdo-entupk-entdoj+detupk
958 if(j.eq.jpr.and.i.eq.ipr)print *,'k,totmas,sui,sud = ',k, &
960 ! if(j.eq.jpr.and.i.eq.ipr)print *,'updr stuff = ',detup,
961 ! 1 entup,entupk,detupk
962 ! if(j.eq.jpr.and.i.eq.ipr)print *,'dddr stuff = ',entdo,
964 if(abs(totmas).gt.1.e-6)then
965 print *,'*********************',i,j,k,totmas,name
966 print *,kpbl(i),k22(i),kbcon(i),ktop(i)
967 !c print *,'updr stuff = ',subin,
968 !c 1 subdown,detup,entup,entupk,detupk
969 !c print *,'dddr stuff = ',entdo,
971 CALL wrf_error_fatal ( 'cup_dellas_tr: TOTMAS > CRITICAL VALUE')
973 dp=100.*(p_cup(i,k-1)-p_cup(i,k))
975 ! tracert(i,k,nv)=(subin*tre_cup(i,k+1,nv) &
976 ! -subdown*tre_cup(i,k,nv) &
977 tracert(i,k,nv)=(subin*tracer(i,k+1,nv) &
978 -subdown*tracer(i,k,nv) &
979 +detup*.5*(tr_up(i,K+1,nv)+tr_up(i,K,nv)) &
980 +detdo*.5*(tr_dd(i,K+1,nv)+tr_dd(i,K,nv)) &
981 -entup*tracer(i,k,nv) &
982 -entdo*tracer(i,k,nv) &
983 -entupk*tre_cup(i,k22(i),nv) &
984 -entdoj*tre_cup(i,jmin(i),nv) &
985 +detupk*tr_up(i,ktop(i),nv) &
988 if(i.eq.ipr.and.j.eq.jpr)then
989 print *,k,tracert(i,k,npr),subin*tre_cup(i,k+1,npr),subdown*tre_cup(i,k,npr), &
990 detdo*.5*(tr_dd(i,K+1,npr)+tr_dd(i,K,npr))
991 print *,k,detup*.5*(tr_up(i,K+1,npr)+tr_up(i,K,npr)),detupk*tr_up(i,ktop(i),npr), &
992 entup*tracer(i,k,npr),entdo*tracer(i,k,npr)
993 print *,k,entupk*tre_cup(i,k,npr),detupk,tr_up(i,ktop(i),npr)
998 END SUBROUTINE cup_dellas_tr
999 SUBROUTINE cup_env_clev_tr(tracer,tre_cup,num_chem,ierr, &
1000 ids,ide, jds,jde, kds,kde, &
1001 ims,ime, jms,jme, kms,kme, &
1002 its,ite, jts,jte, kts,kte)
1006 num_chem,ids,ide, jds,jde, kds,kde, &
1007 ims,ime, jms,jme, kms,kme, &
1008 its,ite, jts,jte, kts,kte
1009 integer, dimension (its:ite) &
1013 real, dimension (its:ite,kts:kte,1:num_chem) &
1016 real, dimension (its:ite,kts:kte,1:num_chem) &
1020 ! local variables in this routine
1030 if(ierr(i).eq.0)then
1031 tre_cup(i,k,nv)=.5*(tracer(i,k-1,nv)+tracer(i,k,nv))
1038 if(ierr(i).eq.0)then
1039 tre_cup(i,kts,nv)=tracer(i,kts,nv)
1045 END subroutine cup_env_clev_tr
1048 SUBROUTINE cup_up_tracer(ierr,tcrit,t,pre,z_cup,p,tracer,tre_cup,tr_up, &
1049 tr_pw,tr_c,hstary,cupclw,clw_all,kbcon,ktop,cd,mentr_rate,zu,k22, &
1050 num_cc,ids,ide, jds,jde, kds,kde, &
1051 ims,ime, jms,jme, kms,kme, &
1052 its,ite, jts,jte, kts,kte,ipr,jpr,j,npr)
1053 USE module_configure
1054 USE module_state_description
1055 USE module_ctrans_aqchem
1057 ! Aqeuous species pointers INCLUDE File
1059 !...........PARAMETERS and their descriptions:
1061 INTEGER NGAS ! number of gas phase species for AQCHEM
1062 PARAMETER ( NGAS = 11 )
1064 INTEGER NAER ! number of aerosol species for AQCHEM
1065 PARAMETER ( NAER = 23 )
1067 !...pointers for the AQCHEM array GAS
1069 INTEGER LSO2 ! local pointer to SO2
1070 PARAMETER ( LSO2 = 1 )
1072 INTEGER LHNO3 ! local pointer to HNO3
1073 PARAMETER ( LHNO3 = 2 )
1075 INTEGER LN2O5 ! local pointer to N2O5
1076 PARAMETER ( LN2O5 = 3 )
1077 INTEGER LCO2 ! local pointer to CO2
1078 PARAMETER ( LCO2 = 4 )
1080 INTEGER LNH3 ! local pointer to NH3
1081 PARAMETER ( LNH3 = 5 )
1083 INTEGER LH2O2 ! local pointer to H2O2
1084 PARAMETER ( LH2O2 = 6 )
1086 INTEGER LO3 ! local pointer to O3
1087 PARAMETER ( LO3 = 7 )
1089 INTEGER LFOA ! local pointer to FOA
1090 PARAMETER ( LFOA = 8 )
1092 INTEGER LMHP ! local pointer to MHP
1093 PARAMETER ( LMHP = 9 )
1095 INTEGER LPAA ! local pointer to PAA
1096 PARAMETER ( LPAA = 10 )
1098 INTEGER LH2SO4 ! local pointer to H2SO4
1099 PARAMETER ( LH2SO4 = 11 )
1101 !...pointers for the AQCHEM array AEROSOL
1103 INTEGER LSO4AKN ! local pointer to SO4I aerosol
1104 PARAMETER ( LSO4AKN = 1 )
1106 INTEGER LSO4ACC ! local pointer to SO4 aerosol
1107 PARAMETER ( LSO4ACC = 2 )
1109 INTEGER LNH4AKN ! local pointer to NH4I aerosol
1110 PARAMETER ( LNH4AKN = 3 )
1112 INTEGER LNH4ACC ! local pointer to NH4 aerosol
1113 PARAMETER ( LNH4ACC = 4 )
1115 INTEGER LNO3AKN ! local pointer to NO3I aerosol
1116 PARAMETER ( LNO3AKN = 5 )
1118 INTEGER LNO3ACC ! local pointer to NO3 aerosol
1119 PARAMETER ( LNO3ACC = 6 )
1121 INTEGER LNO3COR ! local pointer to course aerosol nitrate
1122 PARAMETER ( LNO3COR = 7 )
1124 INTEGER LORGAKN ! local pointer to organic I aerosol
1125 PARAMETER ( LORGAKN = 8 )
1127 INTEGER LORGACC ! local pointer to organic aerosol
1128 PARAMETER ( LORGACC = 9 )
1130 INTEGER LPRIAKN ! local pointer to primary I aerosol
1131 PARAMETER ( LPRIAKN = 10 )
1133 INTEGER LPRIACC ! local pointer to primary aerosol
1134 PARAMETER ( LPRIACC = 11 )
1136 INTEGER LPRICOR ! local pointer to primary I aerosol
1137 PARAMETER ( LPRICOR = 12 )
1139 INTEGER LCACO3 ! local pointer to CaCO3 aerosol
1140 PARAMETER ( LCACO3 = 13 )
1142 INTEGER LMGCO3 ! local pointer to MgCO3 aerosol
1143 PARAMETER ( LMGCO3 = 14 )
1145 INTEGER LNACL ! local pointer to NaCl aerosol
1146 PARAMETER ( LNACL = 15 )
1148 INTEGER LA3FE ! local pointer to Fe+++ aerosol
1149 PARAMETER ( LA3FE = 16 )
1151 INTEGER LB2MN ! local pointer to Mn++ aerosol
1152 PARAMETER ( LB2MN = 17 )
1154 INTEGER LKCL ! local pointer to NaCl aerosol
1155 PARAMETER ( LKCL = 18 )
1157 INTEGER LNUMAKN ! local pointer to # Aitken aerosol
1158 PARAMETER ( LNUMAKN = 19 )
1160 INTEGER LNUMACC ! local pointer to # accumulation aerosol
1161 PARAMETER ( LNUMACC = 20 )
1163 INTEGER LNUMCOR ! local pointer to # coarse aerosol
1164 PARAMETER ( LNUMCOR = 21 )
1166 INTEGER LSRFAKN ! local pointer to sfc area Aitken aerosol
1167 PARAMETER ( LSRFAKN = 22 )
1169 INTEGER LSRFACC ! local pntr to sfc area accumulation aerosol
1170 PARAMETER ( LSRFACC = 23 )
1177 ! only local wrf dimensions are need as of now in this routine
1181 num_cc,ids,ide, jds,jde, kds,kde, &
1182 ims,ime, jms,jme, kms,kme, &
1183 its,ite, jts,jte, kts,kte,ipr,jpr,j,npr
1184 real, dimension (its:ite,kts:kte) &
1186 z_cup,cd,zu,p,hstary,t
1187 real, dimension (its:ite,kts:kte) &
1188 ,intent (inout ) :: &
1190 real, dimension (its:ite,kts:kte,1:num_chem) &
1191 ,intent (inout ) :: &
1193 real, dimension (its:ite,kts:kte,1:num_chem) &
1196 real, dimension (its:ite) &
1200 ! entr= entrainment rate
1204 integer, dimension (its:ite) &
1207 ! ierr error value, maybe modified in this routine
1209 integer, dimension (its:ite) &
1210 ,intent (inout) :: &
1212 ! local variables in this routine
1214 real :: conc_equi,conc_mxr,partialp,taucld
1219 dh,qrch,c0,dz,radius,airm,dens
1223 ! aerosol scavenging coeffs for aitken mode
1225 real alfa0,alfa2,alfa3
1227 ! hpwdep h+ deposition
1228 real, dimension (ngas) :: gas,gaswdep
1229 real, dimension (naer) :: aerosol,aerwdep
1245 !--- no precip for small clouds
1247 if(mentr_rate.gt.0.)then
1248 radius=.2/mentr_rate
1249 if(radius.lt.900.)c0=0.
1250 ! if(radius.lt.900.)iall=0
1256 tr_up(i,k,nv)=tre_cup(i,k,nv)
1263 if(ierr(i).eq.0.)then
1264 do k=k22(i),kbcon(i)-1
1265 tr_up(i,k,nv)=tre_cup(i,k22(i),nv)
1270 if(j.eq.jpr)print *,'p_so2,o_o3 = ',p_so2,p_o3
1271 DO 100 k=kts+1,kte-1
1275 IF(ierr(i).ne.0)GO TO 100
1276 IF(K.Lt.KBCON(I))GO TO 100
1277 IF(K.Gt.KTOP(I)+1)GO TO 100
1278 DZ=Z_cup(i,K)-Z_cup(i,K-1)
1279 if(cupclw(i,k).le.0.)cupclw(i,k)=0.
1280 if(clw_all(i,k).le.0.)clw_all(i,k)=0.
1282 !------ 1. steady state plume equation, for what could
1283 !------ be in cloud before anything happens (kg/kg)
1284 !------ tr_up would be the concentration if tr would be conserved
1288 if(i.eq.ipr.and.j.eq.jpr.and.nv.eq.npr)print *,k,tr_up(i,K-1,nv),tr_up(i,K,nv),tr_pw(i,k-1,nv),clw_all(i,k),cupclw(i,k)
1289 tr_up(i,K,nv)=(tr_up(i,K-1,nv)*(1.-.5*CD(i,K)*DZ)+mentr_rate* &
1290 DZ*tracer(i,K-1,nv))/(1.+mentr_rate*DZ-.5*cd(i,k)*dz)
1293 ! sources or sinks due to aq chem
1296 dens=1000.*p(i,k)*100./t(i,k)/287./28.9628
1298 !...gas concentrations (ppm)
1301 GAS( LFOA ) = 0.0 ! ???
1302 GAS( LMHP ) = 0.0 ! ???
1304 GAS( LSO2 ) = tr_up(i,k,p_so2)
1305 GAS( LH2SO4 ) = tr_up(i,k,p_sulf)
1306 GAS( LNH3 ) = tr_up(i,k,p_nh3)
1307 GAS( LH2O2 ) = tr_up(i,k,p_h2o2)
1309 GAS( LO3 ) = tr_up(i,k,p_o3)
1310 GAS( LPAA ) = tr_up(i,k,p_paa)
1311 GAS( LHNO3 ) = tr_up(i,k,p_hno3)
1312 GAS( LN2O5 ) = tr_up(i,k,p_n2o5)
1313 !...convert to mol/mol
1316 GAS( IGAS ) = GAS( IGAS ) * 1.0E-6
1319 !...aerosol concentrations (ug/m3)
1321 ! AEROSOL( LSO4ACC ) = 20.0
1322 ! AEROSOL( LNH4ACC ) = 6.65
1323 ! AEROSOL( LNO3ACC ) = 10.0
1324 ! AEROSOL( LNACL ) = 1.71
1325 !! AEROSOL( LA3FE ) = 0.5
1326 ! AEROSOL( LB2MN ) = 0.02
1327 ! AEROSOL( LNO3COR ) = 0.0
1328 AEROSOL( LORGACC ) = 0.0
1329 AEROSOL( LPRIACC ) = 0.0
1330 ! AEROSOL( LCACO3 ) = 3.05
1331 ! AEROSOL( LMGCO3 ) = 0.0
1333 AEROSOL( LSO4ACC ) = tr_up(i,k,p_so4aj)
1334 AEROSOL( LNH4ACC ) = tr_up(i,k,p_nh4aj)
1335 AEROSOL( LNO3ACC ) = tr_up(i,k,p_no3aj)
1336 AEROSOL( LNACL ) = 0.
1337 AEROSOL( LA3FE ) = .5
1338 AEROSOL( LB2MN ) = .02
1339 AEROSOL( LNO3COR ) = 0.
1340 ! AEROSOL( LORGACC ) = tr_up(i,k,) + tr_up(i,k,) + tr_up(i,k,)
1341 ! AEROSOL( LPRIACC ) = tr_up(i,k,) + tr_up(i,k,)
1342 AEROSOL( LCACO3 ) = 0.
1343 AEROSOL( LMGCO3 ) = 0.
1346 !...convert to mol/mol
1350 ! AEROSOL( IAER ) = AEROSOL( IAER ) * 1.0E-6 * CTHK1
1351 ! & / ( SGRAERMW( IAER ) * AIRM )
1354 AEROSOL( IAER ) = AEROSOL( IAER ) * 1.0E-6
1356 ! first clw is water, second is total
1361 ! if(clw_all(i,k).gt.1.e-12)then
1362 ! if(cupclw(i,k).gt.1.e-12)then
1363 ! CALL AQCHEM (t(i,k),p(i,k)*100.,taucld,cupclw(i,k)/3600., &
1364 ! clw_all(i,k)*dens,clw_all(i,k)*dens,airm,ALFA0,ALFA2,ALFA3,GAS, &
1365 ! AEROSOL, GASWDEP, AERWDEP, HPWDEP )
1373 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1375 ! FOLLOWING FOR WET DEPOSITION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1376 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1380 tr_pw(i,k,nv)=c0*dz*tr_C(I,K,nv)*zu(i,k)
1381 if(tr_c(i,k,nv).le.0.)then
1386 !--- iall.eq.1, if all cloudwater goes to rain
1390 tr_pw(i,k,nv)=(tr_c(I,K,nv)-QRCH)*zu(i,k)
1391 if(tr_pw(i,k,nv).lt.0.)tr_pw(i,k,nv)=0.
1395 !----- set next level
1396 ! tr_up(I,K,nv)=tr_c(I,K,nv)+qrch
1397 tr_up(i,k,p_so2)=gas(lso2)*1.e6
1398 tr_up(i,k,p_sulf)=gas(lh2so4)*1.e6
1399 tr_up(i,k,p_nh3)=gas(lnh3)*1.e6
1400 tr_up(i,k,p_h2o2)=gas(lh2o2)*1.e6
1402 tr_up(i,k,p_o3)=gas(lo3)*1.e6
1403 tr_up(i,k,p_paa)=gas(lpaa)*1.e6
1404 tr_up(i,k,p_hno3)=gas(lhno3)*1.e6
1405 tr_up(i,k,p_n2o5)=gas(ln2o5)*1.e6
1406 tr_up(i,k,p_so4aj)=AEROSOL( LSO4ACC )*1.e6
1407 tr_up(i,k,p_nh4aj)=AEROSOL( LNH4ACC )*1.e6
1408 tr_up(i,k,p_no3aj)=AEROSOL( LNO3ACC ) *1.e6
1410 tr_pw(i,k,p_so2)=gaswdep(lso2)*1.e6
1411 tr_pw(i,k,p_sulf)=gaswdep(lh2so4)*1.e6
1412 tr_pw(i,k,p_nh3)=gaswdep(lnh3)*1.e6
1413 tr_pw(i,k,p_h2o2)=gaswdep(lh2o2)*1.e6
1415 tr_pw(i,k,p_o3)=gaswdep(lo3)*1.e6
1416 tr_pw(i,k,p_paa)=gaswdep(lpaa)*1.e6
1417 tr_pw(i,k,p_hno3)=gaswdep(lhno3)*1.e6
1418 tr_pw(i,k,p_n2o5)=gaswdep(ln2o5)*1.e6
1419 tr_pw(i,k,p_so4aj)=AERwdep( LSO4ACC )*1.e6
1420 tr_pw(i,k,p_nh4aj)=AERwdep( LNH4ACC )*1.e6
1421 tr_pw(i,k,p_no3aj)=AERwdep( LNO3ACC ) *1.e6
1422 if(i.eq.ipr.and.j.eq.jpr)then
1423 write(6,*)'a',tr_up(i,k,npr),tracer(i,K-1,npr),tr_pw(i,k,npr)
1429 END subroutine cup_up_tracer
1433 SUBROUTINE cup_dd_tracer(ierr,z_cup,qrcd,tracer,tre_cup,tr_up,tr_dd, &
1434 tr_pw,tr_pwd,jmin,cdd,entr,zd,pwdper,k22, &
1435 numch,ids,ide, jds,jde, kds,kde, &
1436 ims,ime, jms,jme, kms,kme, &
1437 its,ite, jts,jte, kts,kte)
1438 USE module_configure
1439 USE module_state_description
1445 ! only local wrf dimensions are need as of now in this routine
1449 numch,ids,ide, jds,jde, kds,kde, &
1450 ims,ime, jms,jme, kms,kme, &
1451 its,ite, jts,jte, kts,kte
1452 real, dimension (its:ite,kts:kte) &
1454 pwdper,zd,cdd,qrcd,z_cup
1455 real, dimension (its:ite,kts:kte,1:num_chem) &
1456 ,intent (inout ) :: &
1458 real, dimension (its:ite,kts:kte,1:num_chem) &
1460 tre_cup,tracer,tr_pw
1461 real, dimension (its:ite,1:num_chem) :: pwav
1463 ! entr= entrainment rate
1467 integer, dimension (its:ite) &
1470 ! ierr error value, maybe modified in this routine
1472 integer, dimension (its:ite) &
1473 ,intent (inout) :: &
1475 ! local variables in this routine
1481 dh,qrch,c0,dz,radius
1484 logical iaer (num_chem)
1487 iaer(p_so4aj) = .true.
1488 iaer(p_nh4aj) = .true.
1489 iaer(p_no3aj) = .true.
1504 IF(ierr(I).eq.0)then
1506 pwav(i,nv)=pwav(i,nv)+tr_pw(i,k,nv)
1512 !--- in downdraft, do only transport of tracers, other
1513 !--- than evaporation of part of the rainwater (see below)
1517 IF(ierr(I).eq.0)then
1519 !--- assume no gas takeup by rain during falling
1524 tr_dd(i,jmin(i),nv)=tre_cup(i,jmin(i),nv)
1526 do ki=jmin(i)-1,1,-1
1527 DZ=Z_cup(i,Ki+1)-Z_cup(i,Ki)
1529 tr_pwd(i,jmin(i),nv)=0.
1530 tr_dd(i,Ki,nv)=(tr_dd(i,Ki+1,nv)*(1.-.5*CDD(i,Ki)*DZ) &
1531 +entr*DZ*tracer(i,Ki,nv) &
1532 )/(1.+entr*DZ-.5*CDD(i,Ki)*DZ)
1534 !--- if tracer conserved
1538 !--- part of dissolved liquid phase material that is being evaporated
1539 ! need percentage of rainwater that evaporates at level
1543 ! tr_pwd(i,ki,nv)=pwdper(i,ki)*pwav(i,nv)
1547 tr_pwd(i,ki,nv)=pwdper(i,ki)*pwav(i,nv)
1549 tr_dd(i,ki,nv)=qrch+tr_pwd(i,ki,nv)
1552 !--- end loop over nv
1557 END subroutine cup_dd_tracer
1562 SUBROUTINE neg_check_ct(pret,ktop,epsilc,dt,q,outq,iopt,num_chem, &
1563 its,ite,kts,kte,itf,ktf,ipr,jpr,npr,j)
1565 INTEGER, INTENT(IN ) :: iopt,num_chem,its,ite,kts,kte,itf,ktf,ipr,jpr,npr,j
1567 real, dimension (its:ite,kts:kte,num_chem ) , &
1570 real, dimension (its:ite ) , &
1573 integer, dimension (its:ite ) , &
1579 real :: tracermin,tracermax,thresh,qmem,qmemf,qmem2,qtest,qmem1
1581 ! check whether routine produces negative q's. This can happen, since
1582 ! tendencies are calculated based on forced q's. This should have no
1583 ! influence on conservation properties, it scales linear through all
1584 ! tendencies. Use iopt=0 to test for each tracer seperately, iopt=1
1585 ! for a more severe limitation...
1592 if(pret(i).le.0.)go to 100
1593 tracermin=q(i,kts,nv)
1594 tracermax=q(i,kts,nv)
1596 tracermin=min(tracermin,q(i,k,nv))
1597 tracermax=max(tracermax,q(i,k,nv))
1599 tracermin=max(tracermin,thresh)
1602 ! first check for minimum restriction
1610 ! only necessary if there is a tendency
1613 qtest=q(i,k,nv)+outq(i,k,nv)*dt
1614 if(qtest.lt.tracermin)then
1616 ! qmem2 would be the maximum allowable tendency
1619 qmem2=(tracermin-q(i,k,nv))/dt
1620 qmemf=min(qmemf,qmem2/qmem1)
1621 if(qmemf.gt.1.)print *,'something wrong in negct_1',qmem2,qmem1
1622 if(i.eq.ipr.and.j.eq.jpr.and.nv.eq.npr)then
1623 print *,k,qtest,qmem2,qmem1,qmemf
1630 outq(i,k,nv)=outq(i,k,nv)*qmemf
1642 ! only necessary if there is a tendency
1645 qtest=q(i,k,nv)+outq(i,k,nv)*dt
1646 if(qtest.gt.tracermax)then
1648 ! qmem2 would be the maximum allowable tendency
1651 qmem2=(tracermax-q(i,k,nv))/dt
1652 qmemf=min(qmemf,qmem2/qmem1)
1653 if(qmemf.gt.1.)print *,'something wrong in negct_2',qmem2,qmem1
1654 if(i.eq.ipr.and.j.eq.jpr.and.nv.eq.npr)then
1655 print *,'2',k,qtest,qmem2,qmem1,qmemf
1662 outq(i,k,nv)=outq(i,k,nv)*qmemf
1669 elseif(iopt.eq.1)then
1679 ! only necessary if tendency is larger than zero
1682 qtest=q(i,k,nv)+outq(i,k,nv)*dt
1683 if(qtest.lt.thresh)then
1685 ! qmem2 would be the maximum allowable tendency
1688 qmem2=(thresh-q(i,k,nv))/dt
1689 qmemf=min(qmemf,qmem2/qmem1)
1697 outq(i,k,nv)=outq(i,k,nv)*qmemf
1703 END SUBROUTINE neg_check_ct
1706 !-------------------------------------------------------
1707 END MODULE module_ctrans_grell