My Project
Functions/Subroutines
vdif_q.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine vdif_q
 

Function/Subroutine Documentation

◆ vdif_q()

subroutine vdif_q ( )

Definition at line 46 of file vdif_q.f90.

46 
47 !------------------------------------------------------------------------------|
48  USE all_vars
49  USE mod_utils
50  USE mod_wd
51  USE mod_par
52 
53 
54 
55  IMPLICIT NONE
56  INTEGER :: I,J,K,KI
57  REAL(SP) :: CONST1,COEF1,COEF2,COEF3,COEF4,COEF5,LMAX
58  REAL(SP), DIMENSION(0:MT,KB) :: GH,SM,SH,PROD,DTEF,KN,BOYGR,A,C,VHP,VH,STF
59  REAL(SP), DIMENSION(0:MT) :: L0
60  REAL(SP) :: UTAU2
61  REAL(SP) :: WUSURF_NODE,WVSURF_NODE,WUBOT_NODE,WVBOT_NODE
62  REAL(SP) :: UU_NODE_K,VV_NODE_K,UU_NODE_KM1,VV_NODE_KM1
63 
64 !--Stability Function Coefficients-------------
65  REAL(SP), PARAMETER :: A1 = 0.92_sp
66  REAL(SP), PARAMETER :: B1 = 16.6_sp
67  REAL(SP), PARAMETER :: A2 = 0.74_sp
68  REAL(SP), PARAMETER :: B2 = 10.1_sp
69  REAL(SP), PARAMETER :: C1 = 0.08_sp
70 
71 !--Source/Sink Term Coefficients---------------
72  REAL(SP), PARAMETER :: E1 = 1.80_sp
73  REAL(SP), PARAMETER :: E2 = 1.33_sp
74  REAL(SP), PARAMETER :: SEF = 1.00_sp
75 
76 !--Von Karmans Constant------------------------
77  REAL(SP), PARAMETER :: KAPPA = 0.40_sp
78 
79 !--Gravitational Constant----------------------
80  REAL(SP), PARAMETER :: GEE = 9.806_sp
81 
82 !--Limiting Values of Q2/Q2L-------------------
83  REAL(SP), PARAMETER :: SMALL = 1.e-8_sp
84 
85 !--Coefficient of buoyancy length scale--------
86  REAL(SP), PARAMETER :: CB = 1.e-8_sp
87 
88 !--Denominator small number threshold----------
89  REAL(SP), PARAMETER :: DEN_S = 1.e-10_sp
90 
91 !--Upper bound of GH for unstable flow---------
92  REAL(SP), PARAMETER :: GH_MAX = .0233_sp
93 
94 !--Lower bound for GH for stable flow----------
95  REAL(SP), PARAMETER :: GH_MIN = -.281_sp
96 
97 
98 
99 !----------------------------------------------
100  REAL(SP), PARAMETER :: CBCNST = 100.0_sp
101  REAL(SP), PARAMETER :: SURFL = 2.e+5_sp
102  REAL(SP), PARAMETER :: SHIW = 0.0_sp
103  REAL(SP), PARAMETER :: GHC = -6.0_sp
104 
105  REAL(SP) :: KQ_TMP,KM_TMP,KH_TMP
106 
107  IF(dbg_set(dbg_sbr)) write(ipt,*) "Start: vdif_q"
108 !------------------------------------------------------------------------------|
109 
110  ! INITIALIZE MEMORY
111  boygr = 0.0_sp
112  gh = 0.0_sp
113  sm = 0.0_sp
114  sh = 0.0_sp
115  prod = 0.0_sp
116  dtef = 0.0_sp
117  kn = 0.0_sp
118  a = 0.0_sp
119  c = 0.0_sp
120  vhp = 0.0_sp
121  vh = 0.0_sp
122  stf = 0.0_sp
123  l0 = 0.0_sp
124 
125 !------------------------------------------------------------------------------|
126 ! place a threshold on the turbulence quantities following advection |
127 !------------------------------------------------------------------------------|
128 
129  DO k = 2, kbm1
130  DO i = 1, m
131  IF (q2f(i,k) <= small .OR. q2lf(i,k) <= small) THEN
132 ! Q2F(I,K) = 0.0_SP
133 ! Q2LF(I,K) = 0.0_SP
134  q2f(i,k) = small
135  q2lf(i,k) = small
136  END IF
137  END DO
138  END DO
139 
140 !------------------------------------------------------------------------------!
141 ! set up coefficients for implicit calculation of vertical diffusion !
142 !------------------------------------------------------------------------------!
143 
144  DO i=1,m
145  IF(iswetn(i) == 1)THEN
146  DO k=2,kbm1
147  a(i,k) = -0.5_sp* dti * (kq(i,k+1)+kq(i,k)+2.0_sp*umol)/ &
148  (dzz(i,k-1)*dz(i,k)*d(i)*d(i))
149  c(i,k) = -0.5_sp* dti*(kq(i,k-1)+kq(i,k)+2.0_sp*umol)/ &
150  (dzz(i,k-1)*dz(i,k-1)*d(i)*d(i))
151  END DO
152  END IF
153  END DO
154 
155 !------------------------------------------------------------------------------!
156 ! the following section solves the equation !
157 ! dti*(kq*q2')' - q2*(2.*dti*dtef+1.) = -q2b !
158 !------------------------------------------------------------------------------!
159 
160  const1 = 16.6_sp ** .6666667_sp * sef
161  DO i = 1, m
162 ! VHP(I,1) = SQRT(WUSURF(I)**2+WVSURF(I)**2) * CONST1
163 ! VH(I,1) = 0.0_SP
164 
165  wusurf_node = 0.0_sp
166  wvsurf_node = 0.0_sp
167  DO j=1,ntve(i)
168  wusurf_node = wusurf_node + wusurf(nbve(i,j))
169  wvsurf_node = wvsurf_node + wvsurf(nbve(i,j))
170  END DO
171  wusurf_node = wusurf_node/float(ntve(i))
172  wvsurf_node = wvsurf_node/float(ntve(i))
173 
174  utau2 = sqrt(wusurf_node**2+wvsurf_node**2)
175  vhp(i,1) = (15.8_sp*cbcnst)**0.6666667_sp*utau2
176  vh(i,1) = 0.0_sp
177 ! L0(I) = SURFL*UTAU2/GEE
178  l0(i) = surfl*utau2/grav_n(i)
179 ! HLC = 2.4_SP
180 ! L0(I) = HLC*HSC1(I)
181 
182 
183  wubot_node = 0.0_sp
184  wvbot_node = 0.0_sp
185  DO j=1,ntve(i)
186  wubot_node = wubot_node + wubot(nbve(i,j))
187  wvbot_node = wvbot_node + wvbot(nbve(i,j))
188  END DO
189  wubot_node = wubot_node/float(ntve(i))
190  wvbot_node = wvbot_node/float(ntve(i))
191 
192  q2f(i,kb) = sqrt(wubot_node**2+wvbot_node**2) * const1
193  END DO
194 
195  q2 = abs(q2+small)
196  q2l = abs(q2l)
197 
198 !------------------------------------------------------------------------------!
199 ! calculate boygr = -Brunt Vaisala Frequency^2 !
200 ! calculate internal wave shear energy contribution: prod = 200*(b.v.freq)**3 !
201 !------------------------------------------------------------------------------!
202 
203  DO k=2,kbm1
204  DO i=1,m
205  IF(iswetn(i) == 1)THEN
206 ! BOYGR(I,K) = GEE * (RHO1(I,K-1)-RHO1(I,K))/(DZZ(I,K-1)*D(I))
207  boygr(i,k) = grav_n(i) * (rho1(i,k-1)-rho1(i,k))/(dzz(i,k-1)*d(i))
208  prod(i,k) = km(i,k) * 0.0_sp * (.5_sp*(-boygr(i,k)+abs(boygr(i,k)))) ** 1.5_sp
209  END IF
210  END DO
211  END DO
212 
213 !------------------------------------------------------------------------------!
214 ! calculate shear production source term = prod !
215 ! calculate buoyancy production source term = kh*boygr !
216 !------------------------------------------------------------------------------!
217  DO k = 2, kbm1
218  DO i = 1, m
219  IF(iswetn(i) == 1)THEN
220 
221  uu_node_k = 0.0_sp
222  vv_node_k = 0.0_sp
223  uu_node_km1 = 0.0_sp
224  vv_node_km1 = 0.0_sp
225  DO j=1,ntve(i)
226  uu_node_k = uu_node_k + u(nbve(i,j),k)
227  vv_node_k = vv_node_k + v(nbve(i,j),k)
228  uu_node_km1 = uu_node_km1 + u(nbve(i,j),k-1)
229  vv_node_km1 = vv_node_km1 + v(nbve(i,j),k-1)
230  END DO
231  uu_node_k = uu_node_k/float(ntve(i))
232  vv_node_k = vv_node_k/float(ntve(i))
233  uu_node_km1 = uu_node_km1/float(ntve(i))
234  vv_node_km1 = vv_node_km1/float(ntve(i))
235 
236  prod(i,k) = prod(i,k) + km(i,k) * sef * &
237  ((uu_node_k-uu_node_km1)**2+(vv_node_k-vv_node_km1)**2)/ &
238  (dzz(i,k-1)*d(i))**2
239  prod(i,k) = prod(i,k) + kh(i,k) * boygr(i,k)
240  END IF
241  END DO
242  END DO
243 !------------------------------------------------------------------------------!
244 ! solve for turbulent length scale l = q2l/q2 !
245 !------------------------------------------------------------------------------!
246 
247 ! L = Q2L/Q2
248  DO k=2,kbm1
249  DO i=1,m
250  l(i,k) = q2l(i,k)/q2(i,k)
251  END DO
252  END DO
253 
254 !------------------------------------------------------------------------------!
255 ! in stably stratified regions, length scale is limited by buoyancy length !
256 ! scale, l_b = c_b*(k^.5/N). length scale limitation also puts an effective !
257 ! lower bound of -.281 on gh in stably stratified regions !
258 ! length scale near surface is modified with wind mixed length scale !
259 !------------------------------------------------------------------------------!
260 
261  DO k=2,kbm1
262  DO i=1,m
263  IF(z(i,k) > -0.5_sp)l(i,k) = max(l(i,k),kappa*l0(i))
264  IF(boygr(i,k) < 0.0_sp)THEN
265  lmax = sqrt(abs(gh_min) * q2(i,k) / (-boygr(i,k) + small) )
266  l(i,k) = min(l(i,k),lmax)
267  q2l(i,k) = q2(i,k)*l(i,k)
268  END IF
269  END DO
270  END DO
271 
272 !------------------------------------------------------------------------------!
273 ! solve for gh = (-l^2*N^2/q^2) !
274 !------------------------------------------------------------------------------!
275 
276 !! GH = (L**2/Q2)*BOYGR
277 ! GH(1:MT,1:KBM1) = (L(1:MT,1:KBM1)**2/Q2(1:MT,1:KBM1))*BOYGR(1:MT,1:KBM1)
278  gh(1:m,1:kbm1) = (l(1:m,1:kbm1)**2/q2(1:m,1:kbm1))*boygr(1:m,1:kbm1)
279 
280 !------------------------------------------------------------------------------!
281 ! limit maximum of GH in unstable regions to reasonable physical value !
282 ! limiting GH also constrains stability functions SH/SM to finite values !
283 !------------------------------------------------------------------------------!
284 
285  gh = min(gh,gh_max)
286 
287  l(:,1) = kappa*l0(:) !0.0_SP
288  l(:,kb) = 0.0_sp
289  gh(:,1) = 0.0_sp
290  gh(:,kb) = 0.0_sp
291 
292 
293 !------------------------------------------------------------------------------!
294 ! calculate eddy kinetic energy dissipation rate: dtef !
295 !------------------------------------------------------------------------------!
296 
297  stf = 1.0_sp
298 
299  IF(.not.surface_wave_mixing)THEN
300  DO k = 1,kb
301  DO i = 1,m
302  IF(gh(i,k) < 0.0_sp) stf(i,k)=1.0-0.9*(gh(i,k)/ghc)**1.5
303  IF(gh(i,k) < ghc) stf(i,k) = 0.1
304  END DO
305  END DO
306  END IF
307 
308 ! DTEF = Q2*SQRT(Q2)/(B1*Q2L + small)*STF
309  dtef = sqrt(q2)/(b1*l + small)*stf
310 
311  DO k = 2, kbm1
312  DO i = 1, m
313  vhp(i,k) = 1. / (a(i,k)+c(i,k)*(1.-vh(i,k-1))-(2.*dti*dtef(i,k)+1.))
314  vh(i,k) = a(i,k) * vhp(i,k)
315  vhp(i,k) = (-2.*dti*prod(i,k)+c(i,k)*vhp(i,k-1)-q2f(i,k))*vhp(i,k)
316  END DO
317  END DO
318 
319  DO k=1,kbm1
320  ki = kb-k
321  DO i = 1, m
322  IF(iswetn(i) == 1)THEN
323  q2f(i,ki) = vh(i,ki) * q2f(i,ki+1) + vhp(i,ki)
324  END IF
325  END DO
326  END DO
327 
328 !------------------------------------------------------------------------------!
329 ! the following section solves the equation !
330 ! dti*(kq*q2l')' - q2l*(dti*dtef+1.) = -q2lb !
331 !------------------------------------------------------------------------------!
332 
333  vh(:,1) = 0.0_sp
334  vhp(:,1) = 0.0_sp
335 
336  DO k = 2, kbm1
337  DO i = 1, m
338  IF(iswetn(i) == 1)THEN
339  dtef(i,k) = dtef(i,k) * (1.+e2*((1./abs(z(i,k)-z(i,1))+1./ &
340  abs(z(i,k)-z(i,kb)))*l(i,k)/(d(i)*kappa))**2)
341  vhp(i,k) = 1. / (a(i,k)+c(i,k)*(1.-vh(i,k-1))- &
342  (dti*dtef(i,k)+1.))
343  vh(i,k) = a(i,k) * vhp(i,k)
344  vhp(i,k) = (dti*(-prod(i,k)*l(i,k)*e1)+c(i,k)* &
345  vhp(i,k-1)-q2lf(i,k)) * vhp(i,k)
346  END IF
347  END DO
348  END DO
349 
350 
351  DO k=1,kbm1
352  ki = kb - k
353  DO i = 1, m
354  IF(iswetn(i) == 1)THEN
355  q2lf(i,ki) = vh(i,ki) * q2lf(i,ki+1) + vhp(i,ki)
356  END IF
357  END DO
358  END DO
359 
360 !------------------------------------------------------------------------------|
361 ! place a threshold on the turbulence quantities following vertical diffusion |
362 !------------------------------------------------------------------------------|
363 
364 
365  DO k = 2, kbm1
366  DO i = 1, m
367  IF (q2f(i,k) <= small .OR. q2lf(i,k) <= small) THEN
368  q2f(i,k) = small
369  q2lf(i,k) = small
370  END IF
371  END DO
372  END DO
373 
374 
375 !===========THRESHOLD ON LENGTH SCALE ALT STYLE (Active in Barotropic Case)====
376 ! DO K=2,KBM1
377 ! DO I=1,N
378 ! LMAX = SQRT(ABS(GH_MIN) * Q2F(I,K) / MAX(0.0_SP,-BOYGR(I,K)+SMALL))
379 ! L(I,K) = MIN(L(I,K),LMAX)
380 ! Q2LF(I,K) = Q2F(I,K)*L(I,K)
381 ! END DO
382 ! END DO
383 !------------------------------------------------------------------------------!
384 
385 ! L(:,1) = 0.0_SP
386 ! L(:,KB) = 0.0_SP
387 ! GH(:,1) = 0.0_SP
388 ! GH(:,KB) = 0.0_SP
389 
390 
391 !------------------------------------------------------------------------------!
392 ! calculate stability functions sh + sm using Galperin 1988 formulation !
393 !------------------------------------------------------------------------------!
394  coef4 = 18.0_sp * a1 * a1 + 9.0_sp * a1 * a2
395  coef5 = 9.0_sp * a1 * a2
396 
397  DO k = 1,kb
398  DO i = 1,m
399  coef1 = a2 * (1.0_sp-6.0_sp*a1/b1*stf(i,k))
400  coef2 = 3.0_sp * a2 * b2/stf(i,k) + 18.0_sp * a1 * a2
401  coef3 = a1 * (1.0_sp-3.0_sp*c1-6.0_sp*a1/b1*stf(i,k))
402 
403  sh(i,k) = coef1/(1.0_sp-coef2*gh(i,k))
404  sm(i,k) = (coef3+sh(i,k)*coef4*gh(i,k))/(1.-coef5*gh(i,k))
405  END DO
406  END DO
407 
408 !------------------------------------------------------------------------------!
409 ! calculate turbulent eddy viscosities/diffusivities kq,km,kh !
410 !------------------------------------------------------------------------------!
411 
412  kn = l*sqrt(q2)
413  kq = 0.5_sp*(kn*kappa*sm+kq)
414  km = 0.5_sp*(kn*sm+km)
415  kh = 0.5_sp*(kn*sh*vprnu+kh)
416 
417  DO i=1,m
418  IF(h(i) <= static_ssh_adj)THEN
419  kq_tmp = 0.0_sp
420  km_tmp = 0.0_sp
421  kh_tmp = 0.0_sp
422  DO k=2,kbm1
423  kq_tmp = kq_tmp + kq(i,k)
424  km_tmp = km_tmp + km(i,k)
425  kh_tmp = kh_tmp + kh(i,k)
426  END DO
427  kq_tmp = kq_tmp/(kbm1-1)
428  km_tmp = km_tmp/(kbm1-1)
429  kh_tmp = kh_tmp/(kbm1-1)
430  DO k=2,kbm1
431  kq(i,k) = kq_tmp
432  km(i,k) = km_tmp
433  kh(i,k) = kh_tmp
434  END DO
435  END IF
436  END DO
437 
438 
439 
440 
441  IF(dbg_set(dbg_sbr)) write(ipt,*) "End: vdif_q"
442 
real(sp), dimension(:,:), allocatable, target q2
Definition: mod_main.f90:1290
real(sp), dimension(:,:), allocatable, target km
Definition: mod_main.f90:1293
real(sp), dimension(:), allocatable, target d
Definition: mod_main.f90:1132
logical surface_wave_mixing
Definition: mod_main.f90:391
real(sp), dimension(:,:), allocatable, target q2lf
Definition: mod_main.f90:1298
real(sp), dimension(:), allocatable, target h
Definition: mod_main.f90:1131
real(sp), dimension(:,:), allocatable, target v
Definition: mod_main.f90:1269
real(sp) umol
Definition: mod_main.f90:365
logical function dbg_set(vrb)
Definition: mod_utils.f90:182
real(sp), dimension(:,:), allocatable, target rho1
Definition: mod_main.f90:1309
real(sp) dti
Definition: mod_main.f90:844
integer m
Definition: mod_main.f90:56
real(sp), dimension(:,:), allocatable, target q2l
Definition: mod_main.f90:1292
real(sp), dimension(:,:), allocatable, target u
Definition: mod_main.f90:1268
real(sp), dimension(:), allocatable, target wubot
Definition: mod_main.f90:1185
real(sp) vprnu
Definition: mod_main.f90:366
integer kb
Definition: mod_main.f90:64
real(sp), dimension(:), allocatable, target wvbot
Definition: mod_main.f90:1186
integer, dimension(:), allocatable, target ntve
Definition: mod_main.f90:1022
real(sp), dimension(:), allocatable, target wusurf
Definition: mod_main.f90:1191
real(sp), dimension(:,:), allocatable, target dzz
Definition: mod_main.f90:1093
real(sp), dimension(:,:), allocatable, target q2f
Definition: mod_main.f90:1297
real(sp), dimension(:,:), allocatable, target dz
Definition: mod_main.f90:1092
real(sp), dimension(:,:), allocatable, target l
Definition: mod_main.f90:1291
real(sp), dimension(:,:), allocatable, target kh
Definition: mod_main.f90:1294
real(sp) static_ssh_adj
Definition: mod_main.f90:209
integer, dimension(:,:), allocatable, target nbve
Definition: mod_main.f90:1034
real(sp), dimension(:,:), allocatable, target z
Definition: mod_main.f90:1090
real(sp), dimension(:), allocatable, target grav_n
Definition: mod_main.f90:1013
integer ipt
Definition: mod_main.f90:922
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
integer kbm1
Definition: mod_main.f90:65
real(sp), dimension(:,:), allocatable, target kq
Definition: mod_main.f90:1295
real(sp), dimension(:), allocatable, target wvsurf
Definition: mod_main.f90:1192
integer, dimension(:), allocatable iswetn
Definition: mod_wd.f90:51
Here is the call graph for this function:
Here is the caller graph for this function: