CCPP SciDoc v7.0.x  v7.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
cu_gf_driver.F90
1
3
6
7 ! DH* TODO: replace constants with arguments to cu_gf_driver_run
8 !use physcons , g => con_g, cp => con_cp, xlv => con_hvap, r_v => con_rv
9 use machine , only: kind_phys
11 use cu_gf_sh , only: cu_gf_sh_run
12
13 implicit none
14
15 private
16
18
19contains
20
31 subroutine cu_gf_driver_init(imfshalcnv, imfshalcnv_gf, imfdeepcnv, &
32 imfdeepcnv_gf,mpirank, mpiroot, errmsg, errflg)
33
34 implicit none
35
36 integer, intent(in) :: imfshalcnv, imfshalcnv_gf
37 integer, intent(in) :: imfdeepcnv, imfdeepcnv_gf
38 integer, intent(in) :: mpirank
39 integer, intent(in) :: mpiroot
40 character(len=*), intent( out) :: errmsg
41 integer, intent( out) :: errflg
42
43 ! initialize ccpp error handling variables
44 errmsg = ''
45 errflg = 0
46
47 end subroutine cu_gf_driver_init
48
49!
50! t2di is temp after advection, but before physics
51! t = current temp (t2di + physics up to now)
52!===================
53
59 subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart, gf_coldstart, &
60 cactiv,cactiv_m,g,cp,xlv,r_v,forcet,forceqv_spechum,phil,raincv, &
61 qv_spechum,t,cld1d,us,vs,t2di,w,qv2di_spechum,p2di,psuri, &
62 hbot,htop,kcnv,xland,hfx2,qfx2,aod_gf,cliw,clcw, &
63 pbl,ud_mf,dd_mf,dt_mf,cnvw_moist,cnvc,imfshalcnv, &
64 flag_for_scnv_generic_tend,flag_for_dcnv_generic_tend, &
65 dtend,dtidx,ntqv,ntiw,ntcw,index_of_temperature,index_of_x_wind, &
66 index_of_y_wind,index_of_process_scnv,index_of_process_dcnv, &
67 fhour,fh_dfi_radar,ix_dfi_radar,num_dfi_radar,cap_suppress, &
68 dfi_radar_max_intervals,ldiag3d,qci_conv,do_cap_suppress, &
69 maxupmf,maxMF,do_mynnedmf,ichoice_in,ichoicem_in,ichoice_s_in, &
70 spp_cu_deep,spp_wts_cu_deep,nchem,chem3d,fscav,wetdpc_deep, &
71 do_smoke_transport,kdt,errmsg,errflg)
72!-------------------------------------------------------------
73 implicit none
74 integer, parameter :: maxiens=1
75 integer, parameter :: maxens=1
76 integer, parameter :: maxens2=1
77 integer, parameter :: maxens3=16
78 integer, parameter :: ensdim=16
79 integer :: imid_gf=1 ! gf congest conv.
80 integer, parameter :: ideep=1
81 integer :: ichoice=0 ! 0 2 5 13 8
82 integer :: ichoicem=13 ! 0 2 5 13
83 integer :: ichoice_s=3 ! 0 1 2 3
84 integer, intent(in) :: spp_cu_deep ! flag for using SPP perturbations
85 real(kind_phys), dimension(:,:), optional, intent(in) :: &
86 & spp_wts_cu_deep
87 real(kind=kind_phys) :: spp_wts_cu_deep_tmp
88
89 logical, intent(in) :: do_cap_suppress, do_smoke_transport
90 real(kind=kind_phys), parameter :: aodc0=0.14
91 real(kind=kind_phys), parameter :: aodreturn=30.
92 real(kind=kind_phys) :: dts,fpi,fp
93 integer, parameter :: dicycle=0 ! diurnal cycle flag
94 integer, parameter :: dicycle_m=0 !- diurnal cycle flag
95 integer :: ishallow_g3 ! depend on imfshalcnv
96!-------------------------------------------------------------
97 integer :: its,ite, jts,jte, kts,kte
98 integer, intent(in ) :: im,km,ntracer,nchem,kdt
99 integer, intent(in ) :: ichoice_in,ichoicem_in,ichoice_s_in
100 logical, intent(in ) :: flag_init, flag_restart, do_mynnedmf, gf_coldstart
101 logical, intent(in ) :: flag_for_scnv_generic_tend,flag_for_dcnv_generic_tend
102 real (kind=kind_phys), intent(in) :: g,cp,xlv,r_v
103 logical, intent(in ) :: ldiag3d
104
105 real(kind=kind_phys), intent(inout), optional :: dtend(:,:,:)
106!$acc declare copy(dtend)
107 integer, intent(in) :: dtidx(:,:), &
108 index_of_x_wind, index_of_y_wind, index_of_temperature, &
109 index_of_process_scnv, index_of_process_dcnv, ntqv, ntcw, ntiw
110!$acc declare copyin(dtidx)
111 real(kind=kind_phys), dimension( : , : ), intent(in ), optional :: forcet,forceqv_spechum
112 real(kind=kind_phys), dimension( : , : ), intent(in ) :: w,phil
113 real(kind=kind_phys), dimension( : , : ), intent(inout ) :: t,us,vs
114 real(kind=kind_phys), dimension( : , : ), intent(inout ), optional :: qci_conv
115 real(kind=kind_phys), dimension( : , : ), intent(out ) :: cnvw_moist,cnvc
116 real(kind=kind_phys), dimension( : , : ), intent(inout ) :: cliw, clcw
117!$acc declare copyin(forcet,forceqv_spechum,w,phil)
118!$acc declare copy(t,us,vs,qci_conv,cliw, clcw)
119!$acc declare copyout(cnvw_moist,cnvc)
120
121 real(kind=kind_phys), allocatable :: clcw_save(:,:), cliw_save(:,:)
122
123 integer, intent(in) :: dfi_radar_max_intervals
124 real(kind=kind_phys), intent(in) :: fhour, fh_dfi_radar(:)
125 integer, intent(in) :: num_dfi_radar, ix_dfi_radar(:)
126 real(kind=kind_phys), intent(in), optional :: cap_suppress(:,:)
127!$acc declare copyin(fh_dfi_radar,ix_dfi_radar,cap_suppress)
128
129 integer, dimension (:), intent(out) :: hbot,htop,kcnv
130 integer, dimension (:), intent(in) :: xland
131 real(kind=kind_phys), dimension (:), intent(in) :: pbl
132 real(kind=kind_phys), dimension (:), intent(in) :: maxmf
133!$acc declare copyout(hbot,htop,kcnv)
134!$acc declare copyin(xland,pbl)
135 integer, dimension (im) :: tropics
136!$acc declare create(tropics)
137! ruc variable
138 real(kind=kind_phys), dimension (:), intent(in) :: hfx2,qfx2,psuri
139 real(kind=kind_phys), dimension (:,:), intent(out) :: dd_mf,dt_mf
140 real(kind=kind_phys), dimension (:,:), intent(out), optional :: ud_mf
141 real(kind=kind_phys), dimension (:), intent(out) :: raincv,cld1d
142 real(kind=kind_phys), dimension (:), intent(out), optional :: maxupmf
143 real(kind=kind_phys), dimension (:,:), intent(in) :: t2di,p2di
144!$acc declare copyin(hfx2,qfx2,psuri,t2di,p2di)
145!$acc declare copyout(ud_mf,dd_mf,dt_mf,raincv,cld1d)
146 ! Specific humidity from FV3
147 real(kind=kind_phys), dimension (:,:), intent(in) :: qv2di_spechum
148 real(kind=kind_phys), dimension (:,:), intent(inout) :: qv_spechum
149 real(kind=kind_phys), dimension (:), intent(inout), optional :: aod_gf
150!$acc declare copyin(qv2di_spechum) copy(qv_spechum,aod_gf)
151 ! Local water vapor mixing ratios and cloud water mixing ratios
152 real(kind=kind_phys), dimension (im,km) :: qv2di, qv, forceqv, cnvw
153!$acc declare create(qv2di, qv, forceqv, cnvw)
154 !
155 real(kind=kind_phys), dimension(:),intent(in) :: garea
156!$acc declare copyin(garea)
157 real(kind=kind_phys), intent(in ) :: dt
158
159 integer, intent(in ) :: imfshalcnv
160 integer, dimension(:), intent(inout), optional :: cactiv,cactiv_m
161 real(kind_phys), dimension(:), intent(in) :: fscav
162!$acc declare copyin(fscav)
163 real(kind_phys), dimension(:,:,:), intent(inout), optional :: chem3d
164 real(kind_phys), dimension(:,:), intent(inout), optional :: wetdpc_deep
165!$acc declare copy(cactiv,cactiv_m,chem3d,wetdpc_deep)
166
167 character(len=*), intent(out) :: errmsg
168 integer, intent(out) :: errflg
169
170! local variables
171 integer, dimension(im) :: k22_shallow,kbcon_shallow,ktop_shallow
172 real(kind=kind_phys), dimension (im) :: rand_mom,rand_vmas
173 real(kind=kind_phys), dimension (im,4) :: rand_clos
174 real(kind=kind_phys), dimension (im,km,11) :: gdc,gdc2
175 real(kind=kind_phys), dimension (im) :: ht
176 real(kind=kind_phys), dimension (im) :: ccn_gf,ccn_m
177 real(kind=kind_phys) :: ccnclean
178 real(kind=kind_phys), dimension (im) :: dx
179 real(kind=kind_phys), dimension (im) :: frhm,frhd
180 real(kind=kind_phys), dimension (im,km) :: outt,outq,outqc,phh,subm,cupclw,cupclws
181 real(kind=kind_phys), dimension (im,km) :: dhdt,zu,zus,zd,phf,zum,zdm,outum,outvm
182 real(kind=kind_phys), dimension (im,km) :: outts,outqs,outqcs,outu,outv,outus,outvs
183 real(kind=kind_phys), dimension (im,km) :: outtm,outqm,outqcm,submm,cupclwm
184 real(kind=kind_phys), dimension (im,km) :: cnvwt,cnvwts,cnvwtm
185 real(kind=kind_phys), dimension (im,km) :: hco,hcdo,zdo,zdd,hcom,hcdom,zdom
186 real(kind=kind_phys), dimension (km) :: zh
187 real(kind=kind_phys), dimension (im) :: tau_ecmwf,edt,edtm,edtd,ter11,aa0,xlandi
188 real(kind=kind_phys), dimension (im) :: pret,prets,pretm,hexec
189 real(kind=kind_phys), dimension (im,10) :: forcing,forcing2
190 real(kind=kind_phys), dimension (im,nchem) :: wetdpc_mid
191
192 integer, dimension (im) :: kbcon, ktop,ierr,ierrs,ierrm,kpbli
193 integer, dimension (im) :: k22s,kbcons,ktops,k22,jmin,jminm
194 integer, dimension (im) :: kbconm,ktopm,k22m
195!$acc declare create(k22_shallow,kbcon_shallow,ktop_shallow,rand_mom,rand_vmas, &
196!$acc rand_clos,gdc,gdc2,ht,ccn_gf,ccn_m,dx,frhm,frhd,wetdpc_mid, &
197!$acc outt,outq,outqc,phh,subm,cupclw,cupclws, &
198!$acc dhdt,zu,zus,zd,phf,zum,zdm,outum,outvm, &
199!$acc outts,outqs,outqcs,outu,outv,outus,outvs, &
200!$acc outtm,outqm,outqcm,submm,cupclwm, &
201!$acc cnvwt,cnvwts,cnvwtm,hco,hcdo,zdo,zdd,hcom,hcdom,zdom, &
202!$acc tau_ecmwf,edt,edtm,edtd,ter11,aa0,xlandi, &
203!$acc pret,prets,pretm,hexec,forcing,forcing2,wetdpc_mid, &
204!$acc kbcon, ktop,ierr,ierrs,ierrm,kpbli, &
205!$acc k22s,kbcons,ktops,k22,jmin,jminm,kbconm,ktopm,k22m)
206
207 integer :: iens,ibeg,iend,jbeg,jend,n
208 integer :: ibegh,iendh,jbegh,jendh
209 integer :: ibegc,iendc,jbegc,jendc,kstop
210 real(kind=kind_phys), dimension(im,km) :: rho_dryar
211!$acc declare create(rho_dryar)
212 real(kind=kind_phys) :: pten,pqen,paph,zrho,pahfs,pqhfl,zkhvfl,pgeoh
213 integer, parameter :: ipn = 0
214
215!
216! basic environmental input includes moisture convergence (mconv)
217! omega (omeg), windspeed (us,vs), and a flag (ierr) to turn off
218! convection for this call only and at that particular gridpoint
219!
220 real(kind=kind_phys), dimension (im,km) :: qcheck,zo,t2d,q2d,po,p2d,rhoi,clw_ten
221 real(kind=kind_phys), dimension (im,km) :: tn,qo,tshall,qshall,dz8w,omeg
222 real(kind=kind_phys), dimension (im) :: z1,psur,cuten,cutens,cutenm
223 real(kind=kind_phys), dimension (im) :: umean,vmean,pmean,mc_thresh
224 real(kind=kind_phys), dimension (im) :: xmbs,xmbs2,xmb,xmbm,xmb_dumm,mconv
225!$acc declare create(qcheck,zo,t2d,q2d,po,p2d,rhoi,clw_ten,tn,qo,tshall,qshall,dz8w,omeg, &
226!$acc z1,psur,cuten,cutens,cutenm,umean,vmean,pmean,mc_thresh, &
227!$acc xmbs,xmbs2,xmb,xmbm,xmb_dumm,mconv)
228
229 integer :: i,j,k,icldck,ipr,jpr,jpr_deep,ipr_deep,uidx,vidx,tidx,qidx
230 integer :: itf,jtf,ktf,iss,jss,nbegin,nend,cliw_idx,clcw_idx
231 integer :: high_resolution
232 real(kind=kind_phys) :: clwtot,clwtot1,excess,tcrit,tscl_kf,dp,dq,sub_spread,subcenter
233 real(kind=kind_phys) :: dsubclw,dsubclws,dsubclwm,dtime_max,ztm,ztq,hfm,qfm,rkbcon,rktop
234 real(kind=kind_phys), dimension(km) :: massflx,trcflx_in1,clw_in1,po_cup
235! real(kind=kind_phys), dimension(km) :: trcflx_in2,clw_in2,clw_ten2
236 real(kind=kind_phys), dimension (im) :: flux_tun,tun_rad_mid,tun_rad_shall,tun_rad_deep
237!$acc declare create(flux_tun,tun_rad_mid,tun_rad_shall,tun_rad_deep)
238 character*50 :: ierrc(im),ierrcm(im)
239 character*50 :: ierrcs(im)
240! ruc variable
241! hfx2 -- sensible heat flux (k m/s), positive upward from sfc
242! qfx2 -- latent heat flux (kg/kg m/s), positive upward from sfc
243! gf needs them in w/m2. define hfx and qfx after simple unit conversion
244 real(kind=kind_phys), dimension (im) :: hfx,qfx
245!$acc declare create(hfx,qfx)
246 real(kind=kind_phys) tem,tem1,tf,tcr,tcrf,psum
247 real(kind=kind_phys) :: cliw_shal,clcw_shal,tem_shal, cliw_both, weight_sum
248 real(kind=kind_phys) :: cliw_deep,clcw_deep,tem_deep, clcw_both
249 integer :: cliw_deep_idx, clcw_deep_idx, cliw_shal_idx, clcw_shal_idx
250
251 real(kind=kind_phys) :: cap_suppress_j(im)
252!$acc declare create(cap_suppress_j)
253 integer :: itime, do_cap_suppress_here
254 logical :: exit_func
255
256 !parameter (tf=243.16, tcr=270.16, tcrf=1.0/(tcr-tf)) ! FV3 original
257 !parameter (tf=263.16, tcr=273.16, tcrf=1.0/(tcr-tf))
258 !parameter (tf=233.16, tcr=263.16, tcrf=1.0/(tcr-tf))
259 parameter(tf=258.16, tcr=273.16, tcrf=1.0/(tcr-tf)) ! as fim, HCB tuning
260 ! initialize ccpp error handling variables
261 errmsg = ''
262 errflg = 0
263
264 ichoice = ichoice_in
265 ichoicem = ichoicem_in
266 ichoice_s = ichoice_s_in
267 if(do_cap_suppress) then
268!$acc serial
269 do itime=1,num_dfi_radar
270 if(ix_dfi_radar(itime)<1) cycle
271 if(fhour<fh_dfi_radar(itime)) cycle
272 if(fhour>=fh_dfi_radar(itime+1)) cycle
273 exit
274 enddo
275!$acc end serial
276 endif
277 if(do_cap_suppress .and. itime<=num_dfi_radar) then
278 do_cap_suppress_here = 1
279!$acc kernels
280 cap_suppress_j(:) = cap_suppress(:,itime)
281!$acc end kernels
282 else
283 do_cap_suppress_here = 0
284!$acc kernels
285 cap_suppress_j(:) = 0
286!$acc end kernels
287 endif
288
289 if(ldiag3d) then
290 if(flag_for_dcnv_generic_tend) then
291 cliw_deep_idx=0
292 clcw_deep_idx=0
293 else
294 cliw_deep_idx=dtidx(100+ntiw,index_of_process_dcnv)
295 clcw_deep_idx=dtidx(100+ntcw,index_of_process_dcnv)
296 endif
297 if(flag_for_scnv_generic_tend) then
298 cliw_shal_idx=0
299 clcw_shal_idx=0
300 else
301 cliw_shal_idx=dtidx(100+ntiw,index_of_process_scnv)
302 clcw_shal_idx=dtidx(100+ntcw,index_of_process_scnv)
303 endif
304 if(cliw_deep_idx>=1 .or. clcw_deep_idx>=1 .or. &
305 cliw_shal_idx>=1 .or. clcw_shal_idx>=1) then
306 allocate(clcw_save(im,km), cliw_save(im,km))
307!$acc enter data create(clcw_save,cliw_save)
308!$acc kernels
309 clcw_save(:,:)=clcw(:,:)
310 cliw_save(:,:)=cliw(:,:)
311!$acc end kernels
312 endif
313 endif
314
315!
316! Scale specific humidity to dry mixing ratio
317!
318!$acc kernels
319 ! state in before physics
320 qv2di = qv2di_spechum/(1.0_kind_phys-qv2di_spechum)
321 ! forcing by dynamics, based on state in
322 forceqv = forceqv_spechum/(1.0_kind_phys-qv2di_spechum)
323 ! current state (updated by preceeding physics)
324 qv = qv_spechum/(1.0_kind_phys-qv_spechum)
325!
326!
327! these should be coming in from outside
328!
329! cactiv(:) = 0
330 if (spp_cu_deep == 0) then
331 rand_mom(:) = 0.
332 rand_vmas(:) = 0.
333 rand_clos(:,:) = 0.
334 else
335 do i=1,im
336 spp_wts_cu_deep_tmp=min(max(-1.0_kind_phys, spp_wts_cu_deep(i,1)),1.0_kind_phys)
337 rand_mom(i) = spp_wts_cu_deep_tmp
338 rand_vmas(i) = spp_wts_cu_deep_tmp
339 rand_clos(i,:) = spp_wts_cu_deep_tmp
340 end do
341 end if
342!$acc end kernels
343!
344 its=1
345 ite=im
346 itf=ite
347 jts=1
348 jte=1
349 jtf=jte
350 kts=1
351 kte=km
352 ktf=kte-1
353!$acc kernels
354!
355 tropics(:)=0
356!
358!
359 tun_rad_shall(:)=.01
360 tun_rad_mid(:)=.3 !.02
361 tun_rad_deep(:)=.3 !.065
362 edt(:)=0.
363 edtm(:)=0.
364 edtd(:)=0.
365 zdd(:,:)=0.
366 flux_tun(:)=5.
367! dx for scale awareness
368!$acc end kernels
369
370 if (imfshalcnv == 3) then
371 ishallow_g3 = 1
372 else
373 ishallow_g3 = 0
374 end if
375 high_resolution=0
376 subcenter=0.
377 iens=1
378!
379! these can be set for debugging
380!
381 ipr=0
382 jpr=0
383 ipr_deep=0
384 jpr_deep= 0 !53322 ! 528196 !0 ! 1136 !0 !421755 !3536
385!
386!
387 ibeg=its
388 iend=ite
389 tcrit=258.
390
391 ztm=0.
392 ztq=0.
393 hfm=0.
394 qfm=0.
395!$acc kernels
396 ud_mf(:,:) =0.
397 dd_mf(:,:) =0.
398 dt_mf(:,:) =0.
399 tau_ecmwf(:)=0.
400!$acc end kernels
401!
402 j=1
403!$acc kernels
404 ht(:)=phil(:,1)/g
405!$acc loop private(zh)
406 do i=its,ite
407 cld1d(i)=0.
408 zo(i,:)=phil(i,:)/g
409 dz8w(i,1)=zo(i,2)-zo(i,1)
410 zh(1)=0.
411 kpbli(i)=2
412 do k=kts+1,ktf
413 dz8w(i,k)=zo(i,k+1)-zo(i,k)
414 enddo
415!$acc loop seq
416 do k=kts+1,ktf
417 zh(k)=zh(k-1)+dz8w(i,k-1)
418 if(zh(k).gt.pbl(i))then
419 kpbli(i)=max(2,k)
420 exit
421 endif
422 enddo
423 enddo
424!$acc end kernels
425
426!$acc kernels
427 do i= its,itf
428 forcing(i,:)=0.
429 forcing2(i,:)=0.
430 ccn_gf(i) = 0.
431 ccn_m(i) = 0.
432
433 ! set aod and ccn
434 if ((flag_init .and. .not.flag_restart) .or. gf_coldstart) then
435 aod_gf(i)=aodc0
436 else
437 if((cactiv(i).eq.0) .and. (cactiv_m(i).eq.0))then
438 if(aodc0>aod_gf(i)) aod_gf(i)=aod_gf(i)+((aodc0-aod_gf(i))*(dt/(aodreturn*60)))
439 if(aod_gf(i)>aodc0) aod_gf(i)=aodc0
440 endif
441 endif
442
443 ccn_gf(i)=max(5., (aod_gf(i)/0.0027)**(1/0.640))
444 ccn_m(i)=ccn_gf(i)
445
446 ccnclean=max(5., (aodc0/0.0027)**(1/0.640))
447
448 hbot(i) =kte
449 htop(i) =kts
450 raincv(i)=0.
451 xlandi(i)=real(xland(i))
452! if(abs(xlandi(i)-1.).le.1.e-3) tun_rad_shall(i)=.15
453! if(abs(xlandi(i)-1.).le.1.e-3) flux_tun(i)=1.5
454 enddo
455 do i= its,itf
456 mconv(i)=0.
457 enddo
458 do k=kts,kte
459 do i= its,itf
460 omeg(i,k)=0.
461 zu(i,k)=0.
462 zum(i,k)=0.
463 zus(i,k)=0.
464 zd(i,k)=0.
465 zdm(i,k)=0.
466 enddo
467 enddo
468
469 psur(:)=0.01*psuri(:)
470 do i=its,itf
471 ter11(i)=max(0.,ht(i))
472 enddo
473 do k=kts,kte
474 do i=its,ite
475 cnvw(i,k)=0.
476 cnvc(i,k)=0.
477 gdc(i,k,1)=0.
478 gdc(i,k,2)=0.
479 gdc(i,k,3)=0.
480 gdc(i,k,4)=0.
481 gdc(i,k,7)=0.
482 gdc(i,k,8)=0.
483 gdc(i,k,9)=0.
484 gdc(i,k,10)=0.
485 gdc2(i,k,1)=0.
486 enddo
487 enddo
488 ierr(:)=0
489 ierrm(:)=0
490 ierrs(:)=0
491 cuten(:)=0.
492 cutenm(:)=0.
493 cutens(:)=0.
494!$acc end kernels
495 ierrc(:)=" "
496!$acc kernels
497
498
499 kbcon(:)=0
500 kbcons(:)=0
501 kbconm(:)=0
502
503 ktop(:)=0
504 ktops(:)=0
505 ktopm(:)=0
506
507 xmb(:)=0.
508 xmb_dumm(:)=0.
509 xmbm(:)=0.
510 xmbs(:)=0.
511 xmbs2(:)=0.
512
513 k22s(:)=0
514 k22m(:)=0
515 k22(:)=0
516
517 jmin(:)=0
518 jminm(:)=0
519
520 pret(:)=0.
521 prets(:)=0.
522 pretm(:)=0.
523
524 umean(:)=0.
525 vmean(:)=0.
526 pmean(:)=0.
527
528 cupclw(:,:)=0.
529 cupclwm(:,:)=0.
530 cupclws(:,:)=0.
531
532 cnvwt(:,:)=0.
533 cnvwts(:,:)=0.
534 cnvwtm(:,:)=0.
535
536 hco(:,:)=0.
537 hcom(:,:)=0.
538 hcdo(:,:)=0.
539 hcdom(:,:)=0.
540
541 outt(:,:)=0.
542 outts(:,:)=0.
543 outtm(:,:)=0.
544
545 outu(:,:)=0.
546 outus(:,:)=0.
547 outum(:,:)=0.
548
549 outv(:,:)=0.
550 outvs(:,:)=0.
551 outvm(:,:)=0.
552
553 outq(:,:)=0.
554 outqs(:,:)=0.
555 outqm(:,:)=0.
556
557 outqc(:,:)=0.
558 outqcs(:,:)=0.
559 outqcm(:,:)=0.
560
561 subm(:,:)=0.
562 dhdt(:,:)=0.
563
564 frhm(:)=0.
565 frhd(:)=0.
566
567 do k=kts,ktf
568 do i=its,itf
569 p2d(i,k)=0.01*p2di(i,k)
570 po(i,k)=p2d(i,k) !*.01
571 rhoi(i,k) = 100.*p2d(i,k)/(287.04*(t2di(i,k)*(1.+0.608*qv2di(i,k))))
572 qcheck(i,k)=qv(i,k)
573 tn(i,k)=t(i,k)!+forcet(i,k)*dt
574 qo(i,k)=max(1.e-16,qv(i,k))!+forceqv(i,k)*dt
575 t2d(i,k)=t2di(i,k)-forcet(i,k)*dt
576 q2d(i,k)=max(1.e-16,qv2di(i,k)-forceqv(i,k)*dt)
577 if(qo(i,k).lt.1.e-16)qo(i,k)=1.e-16
578 tshall(i,k)=t2d(i,k)
579 qshall(i,k)=q2d(i,k)
580 enddo
581 enddo
582!$acc end kernels
583123 format(1x,i2,1x,2(1x,f8.0),1x,2(1x,f8.3),3(1x,e13.5))
584!$acc kernels
585 do i=its,itf
586 do k=kts,kpbli(i)
587 tshall(i,k)=t(i,k)
588 qshall(i,k)=max(1.e-16,qv(i,k))
589 enddo
590 enddo
591!
592! converting hfx2 and qfx2 to w/m2
593! hfx=cp*rho*hfx2
594! qfx=xlv*qfx2
595 do i=its,itf
596 hfx(i)=hfx2(i)*cp*rhoi(i,1)
597 qfx(i)=qfx2(i)*xlv*rhoi(i,1)
598 dx(i) = sqrt(garea(i))
599 mc_thresh(i)=3.25/dx(i)
600 enddo
601
602 do i=its,itf
603 do k=kts,kpbli(i)
604 tn(i,k)=t(i,k)
605 qo(i,k)=max(1.e-16,qv(i,k))
606 enddo
607 enddo
608 nbegin=0
609 nend=0
610 do i=its,itf
611 do k=kts,kpbli(i)
612 dhdt(i,k)=cp*(forcet(i,k)+(t(i,k)-t2di(i,k))/dt) + &
613 xlv*(forceqv(i,k)+(qv(i,k)-qv2di(i,k))/dt)
614! tshall(i,k)=t(i,k)
615! qshall(i,k)=qv(i,k)
616 enddo
617 enddo
618!$acc loop collapse(2) independent private(dp)
619 do k= kts+1,ktf-1
620 do i = its,itf
621 if((p2d(i,1)-p2d(i,k)).gt.150.and.p2d(i,k).gt.300)then
622 dp=-.5*(p2d(i,k+1)-p2d(i,k-1))
623!$acc atomic
624 umean(i)=umean(i)+us(i,k)*dp
625!$acc atomic
626 vmean(i)=vmean(i)+vs(i,k)*dp
627!$acc atomic
628 pmean(i)=pmean(i)+dp
629 endif
630 enddo
631 enddo
632 do i = its,itf
633 psum=0.
634 do k=kts,ktf-3
635 if (clcw(i,k) .gt. -999.0 .and. clcw(i,k+1) .gt. -999.0 )then
636 dp=(p2d(i,k)-p2d(i,k+1))
637 psum=psum+dp
638 clwtot = cliw(i,k) + clcw(i,k)
639 if(clwtot.lt.1.e-32)clwtot=0.
640 forcing(i,7)=forcing(i,7)+clwtot*dp
641 endif
642 enddo
643 if(psum.gt.0)forcing(i,7)=forcing(i,7)/psum
644 forcing2(i,7)=forcing(i,7)
645 enddo
646 do k=kts,ktf-1
647 do i = its,itf
648 omeg(i,k)= w(i,k) !-g*rhoi(i,k)*w(i,k)
649 enddo
650 enddo
651 do i = its,itf
652 if(mconv(i).lt.0.)mconv(i)=0.
653 if((dx(i)<6500.).and.do_mynnedmf.and.(maxmf(i).gt.0.))ierr(i)=555
654 enddo
655!$acc end kernels
656 if (dx(its)<6500.) then
657 imid_gf=0
658 endif
659!
660!---- call cumulus parameterization
661!
662 if(ishallow_g3.eq.1)then
663
664!$acc kernels
665 do i=its,ite
666 ierrs(i)=0
667 ierrm(i)=0
668 enddo
669!$acc end kernels
670!
672!
673 call cu_gf_sh_run (us,vs, &
674! input variables, must be supplied
675 zo,t2d,q2d,ter11,tshall,qshall,p2d,psur,dhdt,kpbli, &
676 rhoi,hfx,qfx,xlandi,ichoice_s,tcrit,dt, &
677! input variables. ierr should be initialized to zero or larger than zero for
678! turning off shallow convection for grid points
679 zus,xmbs,kbcons,ktops,k22s,ierrs,ierrcs, &
680! output tendencies
681 outts,outqs,outqcs,outus,outvs,cnvwt,prets,cupclws, &
682! dimesnional variables
683 itf,ktf,its,ite, kts,kte,ipr,tropics)
684
685!$acc kernels
686 do i=its,itf
687 if(xmbs(i).gt.0.)then
688 cutens(i)=1.
689 if (dx(i)<6500.) then
690 ierrm(i)=555
691 ierr(i)=555
692 endif
693 endif
694 enddo
695!$acc end kernels
697 call neg_check('shallow',ipn,dt,qcheck,outqs,outts,outus,outvs, &
698 outqcs,prets,its,ite,kts,kte,itf,ktf,ktops)
699 endif
700
701 ipr=0
702 jpr_deep=0 !340765
704 if(imid_gf == 1)then
705 call cu_gf_deep_run( &
706 itf,ktf,its,ite, kts,kte &
707 ,dicycle_m &
708 ,ichoicem &
709 ,ipr &
710 ,ccn_m &
711 ,ccnclean &
712 ,dt &
713 ,imid_gf &
714 ,kpbli &
715 ,dhdt &
716 ,xlandi &
717 ,zo &
718 ,forcing &
719 ,t2d &
720 ,q2d &
721 ,ter11 &
722 ,tshall &
723 ,qshall &
724 ,p2d &
725 ,psur &
726 ,us &
727 ,vs &
728 ,rhoi &
729 ,hfx &
730 ,qfx &
731 ,dx &
732 ,mconv &
733 ,omeg &
734 ,cactiv_m &
735 ,cnvwtm &
736 ,zum &
737 ,zdm & ! hli
738 ,zdd &
739 ,edtm &
740 ,edtd & ! hli
741 ,xmbm &
742 ,xmb_dumm &
743 ,xmbs &
744 ,pretm &
745 ,outum &
746 ,outvm &
747 ,outtm &
748 ,outqm &
749 ,outqcm &
750 ,kbconm &
751 ,ktopm &
752 ,cupclwm &
753 ,frhm &
754 ,ierrm &
755 ,ierrcm &
756 ,nchem &
757 ,fscav &
758 ,chem3d &
759 ,wetdpc_mid &
760 ,do_smoke_transport &
761! the following should be set to zero if not available
762 ,rand_mom & ! for stochastics mom, if temporal and spatial patterns exist
763 ,rand_vmas & ! for stochastics vertmass, if temporal and spatial patterns exist
764 ,rand_clos & ! for stochastics closures, if temporal and spatial patterns exist
765 ,spp_cu_deep & ! flag to what you want perturbed
766 ! 1 = momentum transport
767 ! 2 = normalized vertical mass flux profile
768 ! 3 = closures
769 ! more is possible, talk to developer or
770 ! implement yourself. pattern is expected to be
771 ! betwee -1 and +1
772 ,do_cap_suppress_here,cap_suppress_j &
773 ,k22m &
774 ,jminm,kdt,mc_thresh)
775!$acc kernels
776 do i=its,itf
777 do k=kts,ktf
778 qcheck(i,k)=qv(i,k) +outqs(i,k)*dt
779 enddo
780 enddo
781!$acc end kernels
783 call neg_check('mid',ipn,dt,qcheck,outqm,outtm,outum,outvm, &
784 outqcm,pretm,its,ite,kts,kte,itf,ktf,ktopm)
785 endif
787 if(ideep.eq.1)then
788 call cu_gf_deep_run( &
789 itf,ktf,its,ite, kts,kte &
790
791 ,dicycle &
792 ,ichoice &
793 ,ipr &
794 ,ccn_gf &
795 ,ccnclean &
796 ,dt &
797 ,0 &
798
799 ,kpbli &
800 ,dhdt &
801 ,xlandi &
802
803 ,zo &
804 ,forcing2 &
805 ,t2d &
806 ,q2d &
807 ,ter11 &
808 ,tn &
809 ,qo &
810 ,p2d &
811 ,psur &
812 ,us &
813 ,vs &
814 ,rhoi &
815 ,hfx &
816 ,qfx &
817 ,dx &
818 ,mconv &
819 ,omeg &
820 ,cactiv &
821 ,cnvwt &
822 ,zu &
823 ,zd &
824 ,zdm & ! hli
825 ,edt &
826 ,edtm & ! hli
827 ,xmb &
828 ,xmbm &
829 ,xmbs &
830 ,pret &
831 ,outu &
832 ,outv &
833 ,outt &
834 ,outq &
835 ,outqc &
836 ,kbcon &
837 ,ktop &
838 ,cupclw &
839 ,frhd &
840 ,ierr &
841 ,ierrc &
842 ,nchem &
843 ,fscav &
844 ,chem3d &
845 ,wetdpc_deep &
846 ,do_smoke_transport &
847! the following should be set to zero if not available
848 ,rand_mom & ! for stochastics mom, if temporal and spatial patterns exist
849 ,rand_vmas & ! for stochastics vertmass, if temporal and spatial patterns exist
850 ,rand_clos & ! for stochastics closures, if temporal and spatial patterns exist
851 ,spp_cu_deep & ! flag to what you want perturbed
852 ! 1 = momentum transport
853 ! 2 = normalized vertical mass flux profile
854 ! 3 = closures
855 ! more is possible, talk to developer or
856 ! implement yourself. pattern is expected to be
857 ! betwee -1 and +1
858 ,do_cap_suppress_here,cap_suppress_j &
859 ,k22 &
860 ,jmin,kdt,mc_thresh)
861 jpr=0
862 ipr=0
863!$acc kernels
864 do i=its,itf
865 do k=kts,ktf
866 qcheck(i,k)=qv(i,k) +(outqs(i,k)+outqm(i,k))*dt
867 enddo
868 enddo
869!$acc end kernels
871 call neg_check('deep',ipn,dt,qcheck,outq,outt,outu,outv, &
872 outqc,pret,its,ite,kts,kte,itf,ktf,ktop)
873!
874 endif
875!$acc kernels
876 do i=its,itf
877 kcnv(i)=0
878 if(pretm(i).gt.0.)then
879 kcnv(i)= 1 !jmin(i)
880 cutenm(i)=1.
881 else
882 kbconm(i)=0
883 ktopm(i)=0
884 cutenm(i)=0.
885 endif ! pret > 0
886
887 maxupmf(i)=0.
888 if(forcing2(i,6).gt.0.)then
889 maxupmf(i)=maxval(xmb(i)*zu(i,kts:ktf)/forcing2(i,6))
890 endif
891 if (xland(i)==0)then ! cu precip rate (mm/h)
892 if((maxupmf(i).lt.0.1) .or. (pret(i)*3600.lt.0.05)) pret(i)=0.
893 endif
894 if(pret(i).gt.0.)then
895 cuten(i)=1.
896 cutenm(i)=0.
897 pretm(i)=0.
898 kcnv(i)= 1 !jmin(i)
899 ktopm(i)=0
900 kbconm(i)=0
901 else
902 kbcon(i)=0
903 ktop(i)=0
904 cuten(i)=0.
905 endif ! pret > 0
906 enddo
907!$acc end kernels
908!
909!$acc parallel loop private(kstop,dtime_max,massflx,trcflx_in1,clw_in1,po_cup)
910 do i=its,itf
911 massflx(:)=0.
912 trcflx_in1(:)=0.
913 clw_in1(:)=0.
914 do k=kts,ktf
915 clw_ten(i, k)=0.
916 enddo
917 po_cup(:)=0.
918 kstop=kts
919 if(ktopm(i).gt.kts .or. ktop(i).gt.kts)kstop=max(ktopm(i),ktop(i))
920 if(ktops(i).gt.kts)kstop=max(kstop,ktops(i))
921 if(kstop.gt.2)then
922 htop(i)=kstop
923 if(kbcon(i).gt.2 .or. kbconm(i).gt.2)then
924 hbot(i)=max(kbconm(i),kbcon(i)) !jmin(i)
925 endif
926
927 dtime_max=dt
928 forcing2(i,3)=0.
929 do k=kts,kstop
930 cnvc(i,k) = 0.04 * log(1. + 675. * zu(i,k) * xmb(i)) + &
931 0.04 * log(1. + 675. * zum(i,k) * xmbm(i)) + &
932 0.04 * log(1. + 675. * zus(i,k) * xmbs(i))
933 cnvc(i,k) = min(cnvc(i,k), 0.6)
934 cnvc(i,k) = max(cnvc(i,k), 0.0)
935 cnvw(i,k)=cnvwt(i,k)*xmb(i)*dt+cnvwts(i,k)*xmbs(i)*dt+cnvwtm(i,k)*xmbm(i)*dt
936 ud_mf(i,k)=cuten(i)*zu(i,k)*xmb(i)*dt
937 dd_mf(i,k)=cuten(i)*zd(i,k)*edt(i)*xmb(i)*dt
938 t(i,k)=t(i,k)+dt*(cutens(i)*outts(i,k)+cutenm(i)*outtm(i,k)+outt(i,k)*cuten(i))
939 qv(i,k)=max(1.e-16,qv(i,k)+dt*(cutens(i)*outqs(i,k)+cutenm(i)*outqm(i,k)+outq(i,k)*cuten(i)))
940 gdc(i,k,7)=sqrt(us(i,k)**2 +vs(i,k)**2)
941 us(i,k)=us(i,k)+outu(i,k)*cuten(i)*dt +outum(i,k)*cutenm(i)*dt +outus(i,k)*cutens(i)*dt
942 vs(i,k)=vs(i,k)+outv(i,k)*cuten(i)*dt +outvm(i,k)*cutenm(i)*dt +outvs(i,k)*cutens(i)*dt
943
944 gdc(i,k,1)= max(0.,tun_rad_shall(i)*cupclws(i,k)*cutens(i)) ! my mod
945 !gdc2(i,k,1)=max(0.,tun_rad_deep(i)*(cupclwm(i,k)*cutenm(i)+cupclw(i,k)*cuten(i)))
946 gdc2(i,k,1)=max(0.,tun_rad_mid(i)*cupclwm(i,k)*cutenm(i)+frhd(i)*cupclw(i,k)*cuten(i)+tun_rad_shall(i)*cupclws(i,k)*cutens(i))
947 !gdc2(i,k,1) = min(0.1, max(0.01, tun_rad_mid(i)*frhm(i)))*cupclwm(i,k)*cutenm(i) + min(0.1, max(0.01, tun_rad_deep(i)*(frhd(i))))*cupclw(i,k)*cuten(i) + tun_rad_shall(i)*cupclws(i,k)*cutens(i)
948 qci_conv(i,k)=gdc2(i,k,1)
949 gdc(i,k,2)=(outt(i,k))*86400.
950 gdc(i,k,3)=(outtm(i,k))*86400.
951 gdc(i,k,4)=(outts(i,k))*86400.
952 gdc(i,k,7)=-(gdc(i,k,7)-sqrt(us(i,k)**2 +vs(i,k)**2))/dt
953 !gdc(i,k,8)=(outq(i,k))*86400.*xlv/cp
954 gdc(i,k,8)=(outqm(i,k)+outqs(i,k)+outq(i,k))*86400.*xlv/cp
955 gdc(i,k,9)=gdc(i,k,2)+gdc(i,k,3)+gdc(i,k,4)
956
958 dp=100.*(p2d(i,k)-p2d(i,k+1))
959 dtime_max=min(dtime_max,.5*dp)
960 po_cup(k)=.5*(p2d(i,k)+p2d(i,k+1))
961 if (clcw(i,k) .gt. -999.0 .and. clcw(i,k+1) .gt. -999.0 )then
962 clwtot = cliw(i,k) + clcw(i,k)
963 if(clwtot.lt.1.e-32)clwtot=0.
964 clwtot1= cliw(i,k+1) + clcw(i,k+1)
965 if(clwtot1.lt.1.e-32)clwtot1=0.
966 clw_in1(k)=clwtot
967 massflx(k)=-(xmb(i) *( zu(i,k)- edt(i)* zd(i,k))) &
968 -(xmbm(i)*(zdm(i,k)-edtm(i)*zdm(i,k))) &
969 -(xmbs(i)*zus(i,k))
970 trcflx_in1(k)=massflx(k)*.5*(clwtot+clwtot1)
971 forcing2(i,3)=forcing2(i,3)+clwtot
972 endif
973 enddo
974
975 massflx(1)=0.
976 trcflx_in1(1)=0.
977 call fct1d3 (kstop,kte,dtime_max,po_cup, &
978 clw_in1,massflx,trcflx_in1,clw_ten(i,:),g)
979
980 do k=1,kstop
981 tem = dt*(outqcs(i,k)*cutens(i)+outqc(i,k)*cuten(i) &
982 +outqcm(i,k)*cutenm(i) &
983 +clw_ten(i,k) &
984 )
985 tem1 = max(0.0, min(1.0, (tcr-t(i,k))*tcrf))
986 if (clcw(i,k) .gt. -999.0) then
987 cliw(i,k) = max(0.,cliw(i,k) + tem * tem1) ! ice
988 clcw(i,k) = max(0.,clcw(i,k) + tem *(1.0-tem1)) ! water
989 else
990 cliw(i,k) = max(0.,cliw(i,k) + tem)
991 endif
992
993 enddo
994
995 gdc(i,1,10)=forcing(i,1)
996 gdc(i,2,10)=forcing(i,2)
997 gdc(i,3,10)=forcing(i,3)
998 gdc(i,4,10)=forcing(i,4)
999 gdc(i,5,10)=forcing(i,5)
1000 gdc(i,6,10)=forcing(i,6)
1001 gdc(i,7,10)=forcing(i,7)
1002 gdc(i,8,10)=forcing(i,8)
1003 gdc(i,10,10)=xmb(i)
1004 gdc(i,11,10)=xmbm(i)
1005 gdc(i,12,10)=xmbs(i)
1006 gdc(i,13,10)=hfx(i)
1007 gdc(i,15,10)=qfx(i)
1008 gdc(i,16,10)=pret(i)*3600.
1009
1010
1011 if(ktop(i).gt.2 .and.pret(i).gt.0.)dt_mf(i,ktop(i)-1)=ud_mf(i,ktop(i))
1012 endif
1013 enddo
1014!$acc end parallel
1015!$acc kernels
1016 do i=its,itf
1017 if(pret(i).gt.0.)then
1018 cactiv(i)=1
1019 raincv(i)=.001*(cutenm(i)*pretm(i)+cutens(i)*prets(i)+cuten(i)*pret(i))*dt
1020 else
1021 cactiv(i)=0
1022 if(pretm(i).gt.0)raincv(i)=.001*cutenm(i)*pretm(i)*dt
1023 endif ! pret > 0
1024
1025 if(pretm(i).gt.0)then
1026 cactiv_m(i)=1
1027 else
1028 cactiv_m(i)=0
1029 endif
1030
1031 ! Unify ccn
1032 if(ccn_m(i).lt.ccn_gf(i))then
1033 ccn_gf(i)=ccn_m(i)
1034 endif
1035
1036 if(ccn_gf(i)<0) ccn_gf(i)=0
1037
1038 ! Convert ccn back to aod
1039 aod_gf(i)=0.0027*(ccn_gf(i)**0.64)
1040 if(aod_gf(i)<0.007)then
1041 aod_gf(i)=0.007
1042 ccn_gf(i)=(aod_gf(i)/0.0027)**(1/0.640)
1043 elseif(aod_gf(i)>aodc0)then
1044 aod_gf(i)=aodc0
1045 ccn_gf(i)=(aod_gf(i)/0.0027)**(1/0.640)
1046 endif
1047 enddo
1048!$acc end kernels
1049 100 continue
1050!
1051! Scale dry mixing ratios for water wapor and cloud water to specific humidy / moist mixing ratios
1052!
1053!$acc kernels
1054 qv_spechum = qv/(1.0_kind_phys+qv)
1055 cnvw_moist = cnvw/(1.0_kind_phys+qv)
1056!$acc end kernels
1057!
1058! Diagnostic tendency updates
1059!
1060 if(ldiag3d) then
1061 if(ishallow_g3.eq.1 .and. .not.flag_for_scnv_generic_tend) then
1062 uidx=dtidx(index_of_x_wind,index_of_process_scnv)
1063 vidx=dtidx(index_of_y_wind,index_of_process_scnv)
1064 tidx=dtidx(index_of_temperature,index_of_process_scnv)
1065 qidx=dtidx(100+ntqv,index_of_process_scnv)
1066 if(uidx>=1) then
1067!$acc kernels
1068 do k=kts,ktf
1069 dtend(:,k,uidx) = dtend(:,k,uidx) + cutens(:)*outus(:,k) * dt
1070 enddo
1071!$acc end kernels
1072 endif
1073 if(vidx>=1) then
1074!$acc kernels
1075 do k=kts,ktf
1076 dtend(:,k,vidx) = dtend(:,k,vidx) + cutens(:)*outvs(:,k) * dt
1077 enddo
1078!$acc end kernels
1079 endif
1080 if(tidx>=1) then
1081!$acc kernels
1082 do k=kts,ktf
1083 dtend(:,k,tidx) = dtend(:,k,tidx) + cutens(:)*outts(:,k) * dt
1084 enddo
1085!$acc end kernels
1086 endif
1087 if(qidx>=1) then
1088!$acc kernels
1089 do k=kts,ktf
1090 do i=its,itf
1091 tem = cutens(i)*outqs(i,k)* dt
1092 tem = tem/(1.0_kind_phys+tem)
1093 dtend(i,k,qidx) = dtend(i,k,qidx) + tem
1094 enddo
1095 enddo
1096!$acc end kernels
1097 endif
1098 endif
1099 if((ideep.eq.1. .or. imid_gf.eq.1) .and. .not.flag_for_dcnv_generic_tend) then
1100 uidx=dtidx(index_of_x_wind,index_of_process_dcnv)
1101 vidx=dtidx(index_of_y_wind,index_of_process_dcnv)
1102 tidx=dtidx(index_of_temperature,index_of_process_dcnv)
1103 if(uidx>=1) then
1104!$acc kernels
1105 do k=kts,ktf
1106 dtend(:,k,uidx) = dtend(:,k,uidx) + (cuten*outu(:,k)+cutenm*outum(:,k)) * dt
1107 enddo
1108!$acc end kernels
1109 endif
1110 if(vidx>=1) then
1111!$acc kernels
1112 do k=kts,ktf
1113 dtend(:,k,vidx) = dtend(:,k,vidx) + (cuten*outv(:,k)+cutenm*outvm(:,k)) * dt
1114 enddo
1115!$acc end kernels
1116 endif
1117 if(tidx>=1) then
1118!$acc kernels
1119 do k=kts,ktf
1120 dtend(:,k,tidx) = dtend(:,k,tidx) + (cuten*outt(:,k)+cutenm*outtm(:,k)) * dt
1121 enddo
1122!$acc end kernels
1123 endif
1124
1125 qidx=dtidx(100+ntqv,index_of_process_dcnv)
1126 if(qidx>=1) then
1127!$acc kernels
1128 do k=kts,ktf
1129 do i=its,itf
1130 tem = (cuten(i)*outq(i,k) + cutenm(i)*outqm(i,k))* dt
1131 tem = tem/(1.0_kind_phys+tem)
1132 dtend(i,k,qidx) = dtend(i,k,qidx) + tem
1133 enddo
1134 enddo
1135!$acc end kernels
1136 endif
1137 endif
1138 if(allocated(clcw_save)) then
1139!$acc parallel loop collapse(2) private(tem_shal,tem_deep,tem,tem1,weight_sum,cliw_both,clcw_both)
1140 do k=kts,ktf
1141 do i=its,itf
1142 tem_shal = dt*(outqcs(i,k)*cutens(i)+outqcm(i,k)*cutenm(i))
1143 tem_deep = dt*(outqc(i,k)*cuten(i)+clw_ten(i,k))
1144 tem = tem_shal+tem_deep
1145 tem1 = max(0.0, min(1.0, (tcr-t(i,k))*tcrf))
1146 weight_sum = abs(tem_shal)+abs(tem_deep)
1147 if(weight_sum<1e-12) then
1148 cycle
1149 endif
1150
1151 if (clcw_save(i,k) .gt. -999.0) then
1152 cliw_both = max(0.,cliw_save(i,k) + tem * tem1) - cliw_save(i,k)
1153 clcw_both = max(0.,clcw_save(i,k) + tem) - clcw_save(i,k)
1154 else if(cliw_idx>=1) then
1155 cliw_both = max(0.,cliw_save(i,k) + tem) - cliw_save(i,k)
1156 clcw_both = 0
1157 endif
1158 if(cliw_deep_idx>=1) then
1159 dtend(i,k,cliw_deep_idx) = dtend(i,k,cliw_deep_idx) + abs(tem_deep)/weight_sum*cliw_both
1160 endif
1161 if(clcw_deep_idx>=1) then
1162 dtend(i,k,clcw_deep_idx) = dtend(i,k,clcw_deep_idx) + abs(tem_deep)/weight_sum*clcw_both
1163 endif
1164 if(cliw_shal_idx>=1) then
1165 dtend(i,k,cliw_shal_idx) = dtend(i,k,cliw_shal_idx) + abs(tem_shal)/weight_sum*cliw_both
1166 endif
1167 if(clcw_shal_idx>=1) then
1168 dtend(i,k,clcw_shal_idx) = dtend(i,k,clcw_shal_idx) + abs(tem_shal)/weight_sum*clcw_both
1169 endif
1170 enddo
1171 enddo
1172!$acc end parallel
1173 endif
1174 endif
1175 end subroutine cu_gf_driver_run
1177end module cu_gf_driver
subroutine fct1d3(ktop, n, dt, z, tracr, massflx, trflx_in, dellac, g)
Calculates tracer fluxes due to subsidence, only up-stream differencing is currently used but flux co...
subroutine cu_gf_deep_run(itf, ktf, its, ite, kts, kte, dicycle, ichoice, ipr, ccn, ccnclean, dtime, imid, kpbl, dhdt, xland, zo, forcing, t, q, z1, tn, qo, po, psur, us, vs, rho, hfx, qfx, dx, mconv, omeg, csum, cnvwt, zuo, zdo, zdm, edto, edtm, xmb_out, xmbm_in, xmbs_in, pre, outu, outv, outt, outq, outqc, kbcon, ktop, cupclw, frh_out, ierr, ierrc, nchem, fscav, chem3d, wetdpc_deep, do_smoke_transport, rand_mom, rand_vmas, rand_clos, nranflag, do_capsuppress, cap_suppress_j, k22, jmin, kdt, mc_thresh)
Driver for the deep or congestus GF routine.
subroutine neg_check(name, j, dt, q, outq, outt, outu, outv, outqc, pret, its, ite, kts, kte, itf, ktf, ktop)
Checks for negative or excessive tendencies and corrects in a mass conversing way by adjusting the cl...
subroutine, public cu_gf_driver_init(imfshalcnv, imfshalcnv_gf, imfdeepcnv, imfdeepcnv_gf, mpirank, mpiroot, errmsg, errflg)
subroutine, public cu_gf_driver_run(ntracer, garea, im, km, dt, flag_init, flag_restart, gf_coldstart, cactiv, cactiv_m, g, cp, xlv, r_v, forcet, forceqv_spechum, phil, raincv, qv_spechum, t, cld1d, us, vs, t2di, w, qv2di_spechum, p2di, psuri, hbot, htop, kcnv, xland, hfx2, qfx2, aod_gf, cliw, clcw, pbl, ud_mf, dd_mf, dt_mf, cnvw_moist, cnvc, imfshalcnv, flag_for_scnv_generic_tend, flag_for_dcnv_generic_tend, dtend, dtidx, ntqv, ntiw, ntcw, index_of_temperature, index_of_x_wind, index_of_y_wind, index_of_process_scnv, index_of_process_dcnv, fhour, fh_dfi_radar, ix_dfi_radar, num_dfi_radar, cap_suppress, dfi_radar_max_intervals, ldiag3d, qci_conv, do_cap_suppress, maxupmf, maxmf, do_mynnedmf, ichoice_in, ichoicem_in, ichoice_s_in, spp_cu_deep, spp_wts_cu_deep, nchem, chem3d, fscav, wetdpc_deep, do_smoke_transport, kdt, errmsg, errflg)
This is the Grell-Freitas convection scheme driver module.
subroutine cu_gf_sh_run(us, vs, zo, t, q, z1, tn, qo, po, psur, dhdt, kpbl, rho, hfx, qfx, xland, ichoice, tcrit, dtime, zuo, xmb_out, kbcon, ktop, k22, ierr, ierrc, outt, outq, outqc, outu, outv, cnvwt, pre, cupclw, itf, ktf, its, ite, kts, kte, ipr, tropics)
Definition cu_gf_sh.F90:71
This module contains the Grell_Freitas deep convection scheme.
Definition cu_gf_deep.F90:5
This module contains the scale-aware Grell-Freitas cumulus scheme driver.
This module contains the Grell-Freitas shallow convection scheme.
Definition cu_gf_sh.F90:5