CCPP SciDoc v7.0.0  v7.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
cires_ugwpv1_module.F90
1
3
5
6!
7! driver is called after pbl & before chem-parameterizations
8! it uses ugwp_common (like phys_cons) and some module-param od solvers/sources init-modules
9!....................................................................................
10! order = dry-adj=>conv=mp-aero=>radiation -sfc/land- chem -> vertdiff-> [rf-gws]=> ion-re
11!...................................................................................
12!
13!
14 use machine, only : kind_phys
15 use ugwp_common, only : arad, pi, pi2, hpscale, rhp, rhp2, rh4, rhp4, khp, hpskm
16 use ugwp_wmsdis_init, only : ilaunch, nslope, lhmet, lzmax, lzmin, lzstar
17 use ugwp_wmsdis_init, only : tau_min, tamp_mpa
18
19 implicit none
20 logical :: module_is_initialized
21
22 character(len=8) :: strsolver='pss-1986'
23 logical :: do_physb_gwsrcs = .false. ! control for physics-based GW-sources
24 logical :: do_rfdamp = .false. ! control for Rayleigh friction inside ugwp_driver
25 integer, parameter :: idebug_gwrms=0 ! control for diag computaions pw wind-temp GW-rms and MF fluxs
26 logical, parameter :: do_adjoro = .false.
27
28 real(kind=kind_phys), parameter :: max_kdis = 450. ! 400 m2/s
29 real(kind=kind_phys), parameter :: max_axyz = 450.e-5 ! 400 m/s/day
30 real(kind=kind_phys), parameter :: max_eps = max_kdis*4.e-4 ! max_kdis*BN2
31 real(kind=kind_phys), parameter :: maxdudt = max_axyz
32 real(kind=kind_phys), parameter :: maxdtdt = max_eps*1.e-3 ! max_kdis*BN2/cp
33 real(kind=kind_phys), parameter :: dked_min = 0.01
34 real(kind=kind_phys), parameter :: dked_max = max_kdis
35!
36!
37! Pr = Kv/Kt < 1 for upper layers; Pr_mol = 1./1.95 check it
38!
39 real(kind=kind_phys), parameter :: pr_kvkt = 1./1. ! kv/kt = 1./3.
40 real(kind=kind_phys), parameter :: pr_kdis = pr_kvkt/(1.+pr_kvkt)
41
42 real(kind=kind_phys), parameter :: ipr_ktgw =1./3., ipr_spgw=ipr_ktgw
43 real(kind=kind_phys), parameter :: ipr_turb =1./3., ipr_mol =1.95
44
45 real(kind=kind_phys), parameter :: cd_ulim = 1.0 ! critical level precision or Lz ~ 0 ~dz of model
46 real(kind=kind_phys), parameter :: linsat = 1.00
47 real(kind=kind_phys), parameter :: linsat2 = linsat*linsat
48
49 real(kind=kind_phys), parameter :: ricrit = 0.25
50 real(kind=kind_phys), parameter :: frcrit = 0.50
51
52
53 integer :: knob_ugwp_version = 1
54 integer :: knob_ugwp_solver=1 ! 1, 2, 3, 4 - (linsat, ifs_2010, ad_gfdl, dsp_dis)
55 integer, dimension(4) :: knob_ugwp_source=(/1,0,1,0/) ! [1,0,1,1] - (oro, fronts, conv, imbf-owp]
56 integer, dimension(4) :: knob_ugwp_wvspec=(/1,32,32,32/) ! number of waves for- (oro, fronts, conv, imbf-owp]
57 integer, dimension(4) :: knob_ugwp_azdir=(/2,4,4,4/) ! number of wave azimuths for-(oro, fronts, conv, imbf-owp]
58 integer, dimension(4) :: knob_ugwp_stoch=(/0,0,0,0/) ! 0 - deterministic ; 1 - stochastic
59 real(kind=kind_phys), dimension(4) :: knob_ugwp_effac=(/1.,1.,1.,1./) ! efficiency factors for- (oro, fronts, conv, imbf-owp]
60
61 integer :: knob_ugwp_doaxyz=1 ! 1 -gwdrag
62 integer :: knob_ugwp_doheat=1 ! 1 -gwheat
63 integer :: knob_ugwp_dokdis=0 ! 1 -gwmixing
64 integer :: knob_ugwp_ndx4lh = 2 ! n-number of "unresolved" "n*dx" for lh_gw
65 integer :: knob_ugwp_nslope = 1 ! spectral"growth" S-slope of GW-energy spectra mkz^S
66
67 real(kind=kind_phys) :: knob_ugwp_palaunch = 500.e2 ! fixed pressure layer in Pa for "launch" of NGWs
68 real(kind=kind_phys) :: knob_ugwp_lzmax = 12.5e3 ! 12.5 km max-VERT-WL of GW-spectra
69 real(kind=kind_phys) :: knob_ugwp_lzstar = 2.0e3 ! UTLS mstar = 6.28/lzstar 2-2.5 km
70 real(kind=kind_phys) :: knob_ugwp_lzmin = 1.5e3 ! 1.5 km min-VERT-WL of GW-spectra
71 real(kind=kind_phys) :: knob_ugwp_taumin = 0.25e-3
72 real(kind=kind_phys) :: knob_ugwp_tauamp = 7.75e-3 ! range from 30.e-3 to 3.e-3 ( space-borne values)
73 real(kind=kind_phys) :: knob_ugwp_lhmet = 200.e3 ! 200 km
74
75 logical :: knob_ugwp_tlimb = .true.
76 character(len=8) :: knob_ugwp_orosolv='pss-1986'
77
78 real(kind=kind_phys) :: kxw = 6.28/200.e3 ! single horizontal wavenumber of ugwp schemes
79!
80 integer :: ugwp_azdir
81 integer :: ugwp_stoch
82
83 integer :: ugwp_src
84 integer :: ugwp_nws
85
86 real(kind=kind_phys) :: ugwp_effac
87!
88 integer :: launch_level = 55
89!
90 namelist /cires_ugwp_nml/ knob_ugwp_solver, knob_ugwp_source,knob_ugwp_wvspec, knob_ugwp_azdir, &
91 knob_ugwp_stoch, knob_ugwp_effac,knob_ugwp_doaxyz, knob_ugwp_doheat, knob_ugwp_dokdis, &
92 knob_ugwp_ndx4lh, knob_ugwp_version, knob_ugwp_palaunch, knob_ugwp_nslope, knob_ugwp_lzmax, &
93 knob_ugwp_lzmin, knob_ugwp_lzstar, knob_ugwp_lhmet, knob_ugwp_tauamp, knob_ugwp_taumin, &
94 knob_ugwp_tlimb, knob_ugwp_orosolv
95
96!
97! allocatable arrays, initilized during "cires_ugwp_init" &
98! released during "cires_ugwp_finalize"
99!
100 real(kind=kind_phys), allocatable :: kvg(:), ktg(:), krad(:), kion(:)
101 real(kind=kind_phys), allocatable :: zkm(:), pmb(:)
102 real(kind=kind_phys), allocatable :: rfdis(:), rfdist(:)
103!
104! RF-not active now
105!
106 integer :: levs_rf
107 real(kind=kind_phys) :: pa_rf, tau_rf
108!
109! simple modulation of tau_ngw by the total rain/precip strength
110!
111 real(kind=kind_phys), parameter :: rain_max=8.e-5, rain_lat=41.0, rain_lim=1.e-5
112 real(kind=kind_phys), parameter :: w_merra = 1.0, w_nomerra = 1.-w_merra, w_rain =1.
113 real(kind=kind_phys), parameter :: mtau_rain = 1.e-3, ft_min =0.5, ft_max=2
114 real(kind=kind_phys), parameter :: tau_ngw_max = 20.e-3 ! 20 mPa
115 real(kind=kind_phys), parameter :: tau_ngw_min = .20e-3 ! .2 mPa
116!
117! Bushell et al. (2015) tau = tau_rainum (~3.8 km) x sqrt(Precip/base_rainum)
118!
119 real(kind=kind_phys), parameter :: tau_rainum = 0.7488e-3 ! 0.74 mPa
120 real(kind=kind_phys), parameter :: base_rainum = 0.1e-5 ! ~0.1 mm/day
121 real(kind=kind_phys), parameter :: pbase_um =1./sqrt(base_rainum) * tau_rainum !
122 integer, parameter :: metoum_rain = 0
123!=================================================================
124! switches that can ba activated for NGW physics include/omit
125!
126! rotational, non-hydrostatic and eddy-dissipative
127! F_coriol F_nonhyd F_kds
128!===================================================
129 real(kind=kind_phys), parameter :: f_coriol=1.0 ! Coriolis effects
130 real(kind=kind_phys), parameter :: f_nonhyd=1.0 ! Nonhydrostatic waves
131 real(kind=kind_phys), parameter :: f_kds =0.0 ! Eddy mixing due to GW-unstable below
132
133
134 contains
135!
136!-----------------------------------------------------------------------
137!
138! init of cires_ugwp (_init) called from CCPP cap file
139!
140! ---------------------------------------------------------------------------------
141! non-ccpp ....
142!
143! subroutine cires_ugwp_init_v1 (me, master, nlunit, logunit, jdat_gfs, fn_nml2, &
144! lonr, latr, levs, ak, bk, pref, dtp)
145!-----------------------------------------------------------------------------------
146
147 subroutine cires_ugwpv1_init (me, master, nlunit, logunit, jdat_gfs, con_pi, &
148 con_rerth, fn_nml2, input_nml_file, lonr, latr, levs, ak, bk, &
149 pref, dtp, errmsg, errflg)
150!
151! input_nml_file ='input.nml'=fn_nml ..... OLD_namelist and cdmvgwd(4) Corrected Bug Oct 4
152!
153 use netcdf
154 use ugwp_oro_init, only : init_oro_gws
155 use ugwp_conv_init, only : init_conv_gws
156 use ugwp_fjet_init, only : init_fjet_gws
157 use ugwp_okw_init, only : init_okw_gws
158 use ugwp_lsatdis_init, only : initsolv_lsatdis
159
160 use ugwp_wmsdis_init, only : initsolv_wmsdis
161 use ugwp_wmsdis_init, only : ilaunch, nslope, lhmet, lzmax, lzmin, lzstar
162 use ugwp_wmsdis_init, only : tau_min, tamp_mpa
163
164 implicit none
165
166 integer, intent (in) :: me
167 integer, intent (in) :: master
168 integer, intent (in) :: nlunit
169 integer, intent (in) :: logunit
170 integer, intent (in) :: lonr
171 integer, intent (in) :: levs
172 integer, intent (in) :: latr
173 integer, intent (in) :: jdat_gfs(8)
174 real(kind=kind_phys), intent (in) :: ak(levs+1), bk(levs+1), pref
175 real(kind=kind_phys), intent (in) :: dtp
176!
177! consider to retire them
178!
179 real(kind=kind_phys), intent (in) :: con_pi, con_rerth
180
181 character(len=64), intent (in) :: fn_nml2
182 character(len=*), intent (in) :: input_nml_file(:)
183
184 character(len=*), intent(out) :: errmsg
185 integer, intent(out) :: errflg
186
187! character, intent (in) :: input_nml_file
188!
189 integer :: ios
190 logical :: exists
191
192 integer :: ncid, iernc, vid, dimid, status
193 integer :: k
194 integer :: ddd_ugwp, curday_ugwp
195! integer :: version
196
197 ! Initialize CCPP error handling variables
198 errmsg = ''
199 errflg = 0
200
201#ifdef INTERNAL_FILE_NML
202 read (input_nml_file, nml = cires_ugwp_nml)
203#else
204 if (me == master) print *, trim(fn_nml2), ' GW-namelist file '
205 inquire (file =trim(fn_nml2) , exist = exists)
206!
207 if (.not. exists) then
208 write(errmsg,'(3a)') 'cires_ugwpv1_init: namelist file: ', trim(fn_nml2), ' does not exist'
209 errflg = 1
210 return
211 else
212 open (unit = nlunit, file = trim(fn_nml2), action = 'read', status = 'old', iostat = ios)
213 endif
214 rewind(nlunit)
215 read (nlunit, nml = cires_ugwp_nml)
216 close (nlunit)
217#endif
218
219 strsolver= knob_ugwp_orosolv
220
221 curday_ugwp = jdat_gfs(1)*10000 + jdat_gfs(2)*100 +jdat_gfs(3)
222 call calendar_ugwp(jdat_gfs(1), jdat_gfs(2), jdat_gfs(3), ddd_ugwp)
223
224! write version number and namelist to log file
225 if (me == master) then
226 write (logunit, *) " ================================================================== "
227 write (logunit, *) "CCPP cires_ugwp_namelist_extended_v1"
228 write (logunit, nml = cires_ugwp_nml)
229 write (logunit, *) " ================================================================== "
230
231 write (6, *) " ================================================================== "
232 write (6, *) "CCPP cires_ugwp_namelist_extended_v1"
233 write (6, nml = cires_ugwp_nml)
234 write (6, *) " ================================================================== "
235 write (6, *) "calendar_ugwp ddd_ugwp=", ddd_ugwp
236 write (6, *) "calendar_ugwp curday_ugwp=", curday_ugwp
237 write (6, *) " ================================================================== "
238 write (6, *) ddd_ugwp, ' jdat_gfs ddd of year '
239 endif
240!
241! effective kxw - resolution-aware
242!
243!
244 kxw = pi2/knob_ugwp_lhmet
245!
246!
247! init global background dissipation for ugwp -> 4d-variable for fv3wam linked with pbl-vert_diff
248!
249!
250! allocate(fcor(latr), fcor2(latr) )
251!
252 allocate( kvg(levs+1), ktg(levs+1) )
253 allocate( krad(levs+1), kion(levs+1) )
254 allocate( zkm(levs), pmb(levs) )
255
256!
257! ak -pa bk-dimensionless from surf => tol_lid_pressure =0
258!
259
260 do k=1, levs
261 pmb(k) = ak(k) + pref*bk(k) ! Pa -unit Pref = 1.e5, pmb = Pa
262 zkm(k) = -hpskm*alog(pmb(k)/pref)
263 enddo
264
265!
266! find ilaunch
267!
268 if (knob_ugwp_palaunch > 900.e2) then
269 write(errmsg,'(a,e16.7)') 'cires_ugwpv1_init: unrealistic value of knob_ugwp_palaunch', knob_ugwp_palaunch
270 errflg = 1
271 return
272 endif
273
274 do k=levs, 1, -1
275 if (pmb(k) .gt. knob_ugwp_palaunch ) exit
276 enddo
277
278 launch_level = max(k-1, 5) ! above 5-layers from the surface
279 if (me == master) then
280 print *, 'cires_ugwpv1 klev_ngw =', launch_level, nint(pmb(launch_level))
281 endif
282!
283! Part-1 :init_global_gwdis again "damn"-con_p
284!
285 call init_global_gwdis(levs, zkm, pmb, kvg, ktg, krad, kion, me, master)
286
287!
288! Part-2 :init_SOURCES_gws
289!
290
291!
292! call init-solver for "stationary" multi-wave spectra and sub-grid oro
293!
294 call init_oro_gws( knob_ugwp_wvspec(1), knob_ugwp_azdir(1), &
295 knob_ugwp_stoch(1), knob_ugwp_effac(1), lonr, kxw )
296!
297! call init-sources for "non-sationary" multi-wave spectra
298!
299 do_physb_gwsrcs=.true.
300
301 IF (do_physb_gwsrcs) THEN
302
303! if (me == master) print *, ' do_physb_gwsrcs ', do_physb_gwsrcs, ' in cires_ugwp_init_modv1 '
304 if (knob_ugwp_wvspec(4) > 0) then
305! okw
306 call init_okw_gws(knob_ugwp_wvspec(4), knob_ugwp_azdir(4), &
307 knob_ugwp_stoch(4), knob_ugwp_effac(4), &
308 lonr, kxw )
309! if (me == master) print *, ' init_okw_gws '
310 endif
311
312 if (knob_ugwp_wvspec(3) > 0) then
313! fronts
314 call init_fjet_gws(knob_ugwp_wvspec(3), knob_ugwp_azdir(3), &
315 knob_ugwp_stoch(3), knob_ugwp_effac(3), &
316 lonr, kxw )
317! if (me == master) print *, ' init_fjet_gws '
318 endif
319
320 if (knob_ugwp_wvspec(2) > 0) then
321! conv : con_pi, con_rerth,
322 call init_conv_gws(knob_ugwp_wvspec(2), knob_ugwp_azdir(2), &
323 knob_ugwp_stoch(2), knob_ugwp_effac(2), &
324 lonr, kxw )
325! if (me == master) &
326! print *, ' init_convective GWs ', knob_ugwp_wvspec(2), knob_ugwp_azdir(2)
327
328 endif
329
330 ENDIF !IF (do_physb_gwsrcs)
331
332!======================
333! Part-3 :init_SOLVERS
334! =====================
335!
336! call init-solvers for "broad" non-stationary multi-wave spectra
337!
338 if (knob_ugwp_solver==1) then
339!
340 kxw = pi2/lhmet
341 call initsolv_lsatdis(me, master, knob_ugwp_wvspec(2), knob_ugwp_azdir(2), &
342 knob_ugwp_stoch(2), knob_ugwp_effac(2), do_physb_gwsrcs, kxw )
343 endif
344 if (knob_ugwp_solver == 2) then
345!
346! re-assign from namelists
347!
348 nslope = knob_ugwp_nslope ! the GW sprctral slope at small-m
349 lzstar = knob_ugwp_lzstar
350 lzmax = knob_ugwp_lzmax
351 lzmin = knob_ugwp_lzmin
352 lhmet = knob_ugwp_lhmet
353 tamp_mpa =knob_ugwp_tauamp !amplitude for GEOS-5/MERRA-2
354 tau_min =knob_ugwp_taumin ! min of GW MF 0.25 mPa
355 ilaunch = launch_level
356
357 kxw = pi2/lhmet
358
359 call initsolv_wmsdis(me, master, knob_ugwp_wvspec(2), knob_ugwp_azdir(2), &
360 knob_ugwp_stoch(2), knob_ugwp_effac(2), do_physb_gwsrcs, kxw, knob_ugwp_version)
361
362 endif
363
364
365!======================
366 module_is_initialized = .true.
367 if (me == master) print *, ' CIRES_ugwpV1 is initialized ', module_is_initialized
368
369 end subroutine cires_ugwpv1_init
370
371
372!=============================================
373
374 subroutine cires_ugwp_advance
375!-----------------------------------------------------------------------
376! FV3-dycore and CCPP-physics has limited options to
377! add "horizontal" gradients of winds and temp-re to
378! compute GW-triggers: reserved option if it will be funded ......
379!
380! the day-to-day variable sources/spectra and diagnostics for stochastic "triggers"
381!
382! diagnose GW-source functions * FGF + OKWP + SGO/CONV from IAU-fields
383! and use for stochastic GWP-sources "memory"
384!
385! this option is not active due to "weak" flexibility
386! in communication between "ccpp/gfsphysics" and FV3-dycore
387! extension of State%in is needed to pass horizontal gradients
388! winds and temperature to compute "spontatneous" GW triggers
389!-----------------------------------------------------------------------
390 implicit none
391!
392! update GW sources and dissipation
393! a) physics-based GW triggers eliminated from cires_ugwpv1_triggers.F90
394! b) stochastic-based spectra and amplitudes is not considered
395! c) use "memory" on GW-spectra from previous time-step is not considered
396! d) update "background" dissipation of GWs as needed (option for FV3WAM)
397!
398 end subroutine cires_ugwp_advance
399
400!
401! -----------------------------------------------------------------------
402! finalize of cires_ugwp_dealloc
403! -----------------------------------------------------------------------
404
405
406 subroutine cires_ugwp_dealloc
407!
408! deallocate sources/spectra & some diagnostics need to find where "deaalocate them"
409! before "end" of the FV3GFS
410!
411 implicit none
412!
413! deallocate arrays employed in:
414! cires_ugwp_advance / cires_ugwp_driver / cires_ugwp_init
415!
416 if (allocated (kvg)) deallocate (kvg)
417 if (allocated (ktg)) deallocate (ktg)
418 if (allocated (krad)) deallocate (krad)
419 if (allocated (kion)) deallocate (kion)
420 if (allocated (zkm)) deallocate (zkm)
421 if (allocated (pmb)) deallocate (pmb)
422! if (allocated (ugwp_taulat)) deallocate(ugwp_taulat)
423! if (allocated (tau_limb)) deallocate (tau_limb)
424! if (allocated (days_limb)) deallocate(days_limb)
425
426
427 end subroutine cires_ugwp_dealloc
428
429!
430!
431 subroutine calendar_ugwp(yr, mm, dd, ddd_ugwp)
432!
433! computes day of year to get tau_limb forcing written with 1-day precision
434!
435 implicit none
436 integer, intent(in) :: yr, mm, dd
437 integer :: ddd_ugwp
438
439 integer :: iw3jdn
440 integer :: jd1, jddd
441 jd1 = iw3jdn(yr,1,1)
442 jddd = iw3jdn(yr,mm,dd)
443 ddd_ugwp = jddd-jd1+1
444
445 end subroutine calendar_ugwp
446
447
448 subroutine ngwflux_update(me, master, im, levs, kdt, ddd, curdate, &
449 tau_ddd, xlatd, sinlat,coslat, rain, tau_ngw)
450
451 use machine, only: kind_phys
452 implicit none
453!input
454
455 integer, intent(in) :: me, master !, jdat(8)
456 integer, intent(in) :: im, levs, kdt
457 integer, intent(in) :: ddd, curdate
458
459! integer, intent(in), dimension(im) :: j1_tau, j2_tau
460! real(kind=kind_phys), intent(in), dimension(im) :: ddy_j2tau, ddy_j1tau
461
462 real(kind=kind_phys), intent(in), dimension(im) :: xlatd, sinlat,coslat
463 real(kind=kind_phys), intent(in), dimension(im) :: rain, tau_ddd
464
465 real(kind=kind_phys), intent(inout), dimension(im) :: tau_ngw
466!
467! locals
468!
469
470 integer :: i, j1, j2, k, it1, it2, iday
471 real(kind=kind_phys) :: tem, tx1, tx2, w1, w2, wlat, rw1, rw2
472 real(kind=kind_phys) :: tau_rain, flat_rain, tau_3dt
473
474!
475
476! code below inside cires_tauamf_data.F90
477! it1 = 2
478! do iday=1, ntau_d2t
479! if (float(ddd) .lt. days_limb(iday) ) then
480! it2 = iday
481! exit
482! endif
483! enddo
484! it2 = min(it2,ntau_d2t)
485! it1 = max(it2-1,1)
486! if (it2 > ntau_d2t ) then
487! print *, ' it1, it2, ntau_d2t ', it1, it2, ntau_d2t
488! stop
489! endif
490! w2 = (float(ddd)-days_limb(it1))/(days_limb(it2)-days_limb(it1))
491! w1 = 1.0-w2
492! do i=1, im
493! j1 = j1_tau(i)
494! j2 = j2_tau(i)
495! tx1 = tau_limb(j1, it1)*ddy_j1tau(i)+tau_limb(j2, it1)*ddy_j2tau(i)
496! tx2 = tau_limb(j1, it2)*ddy_j1tau(i)+tau_limb(j2, it2)*ddy_j2tau(i)
497! tau_ddd(i) = tx1*w1 + w2*tx2
498!
499! add modulattion by the total "rain"-strength Yudin et al.(2020-FV3GFS) and Bushell et al. (2015-UM/METO)
500!
501 do i=1, im
502 tau_3dt = tau_ngw(i) * w_merra + w_nomerra *tau_ddd(i)
503
504 if (w_rain > 0. .and. rain(i) > 0.) then
505
506 wlat = abs(xlatd(i))
507
508 if (wlat <= rain_lat .and. rain(i) > rain_lim) then
509 flat_rain = wlat/rain_lat
510 rw1 = 0.75 * flat_rain ; rw2 = 1.-rw1
511
512 tau_rain = tau_3dt * rw1 + rw2 * mtau_rain*min(rain_max, rain(i))/rain_lim
513 tau_rain = tau_3dt*(1.-w_rain) + w_rain* tau_rain
514!
515! restict variations from the "tau_ngw" without precip-impact
516!
517! real, parameter :: ft_min =0.5*tau_g5 < tau_rain < ft_max =2. *tau_g5
518!
519 if (tau_rain < ft_min *tau_3dt) tau_rain = ft_min *tau_3dt
520 if (tau_rain > ft_max *tau_3dt) tau_rain = ft_max *tau_3dt
521
522 tau_3dt = tau_rain
523
524 endif
525 if (metoum_rain == 1) then
526 tau_rain = min( sqrt(rain(i))*pbase_um, tau_ngw_max)
527 tau_3dt = max(tau_ngw_min, tau_rain)
528 endif
529 endif
530 tau_ngw(i) = tau_3dt
531 enddo
532
533 end subroutine ngwflux_update
534!
535 end module cires_ugwpv1_module
536