source: palm/trunk/SOURCE/production_e.f90 @ 1011

Last change on this file since 1011 was 1008, checked in by franke, 12 years ago

last commit documented

  • Property svn:keywords set to Id
File size: 51.9 KB
Line 
1 MODULE production_e_mod
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6!
7!
8! Former revisions:
9! -----------------
10! $Id: production_e.f90 1008 2012-09-19 14:49:14Z raasch $
11!
12! 1007 2012-09-19 14:30:36Z franke
13! Bugfix: calculation of buoyancy production has to consider the liquid water
14! mixing ratio in case of cloud droplets
15!
16! 940 2012-07-09 14:31:00Z raasch
17! TKE production by buoyancy can be switched off in case of runs with pure
18! neutral stratification
19!
20! 759 2011-09-15 13:58:31Z raasch
21! initialization of u_0, v_0
22!
23! 667 2010-12-23 12:06:00Z suehring/gryschka
24! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng
25!
26! 449 2010-02-02 11:23:59Z raasch
27! test output from rev 410 removed
28!
29! 388 2009-09-23 09:40:33Z raasch
30! Bugfix: wrong sign in buoyancy production of ocean part in case of not using
31!         the reference density (only in 3D routine production_e)
32! Bugfix to avoid zero division by km_neutral
33!
34! 208 2008-10-20 06:02:59Z raasch
35! Bugfix concerning the calculation of velocity gradients at vertical walls
36! in case of diabatic conditions
37!
38! 187 2008-08-06 16:25:09Z letzel
39! Change: add 'minus' sign to fluxes obtained from subroutine wall_fluxes_e for
40! consistency with subroutine wall_fluxes
41!
42! 124 2007-10-19 15:47:46Z raasch
43! Bugfix: calculation of density flux in the ocean now starts from nzb+1
44!
45! 108 2007-08-24 15:10:38Z letzel
46! Bugfix: wrong sign removed from the buoyancy production term in the case
47! use_reference = .T.,
48! u_0 and v_0 are calculated for nxr+1, nyn+1 also (otherwise these values are
49! not available in case of non-cyclic boundary conditions)
50! Bugfix for ocean density flux at bottom
51!
52! 97 2007-06-21 08:23:15Z raasch
53! Energy production by density flux (in ocean) added
54! use_pt_reference renamed use_reference
55!
56! 75 2007-03-22 09:54:05Z raasch
57! Wall functions now include diabatic conditions, call of routine wall_fluxes_e,
58! reference temperature pt_reference can be used in buoyancy term,
59! moisture renamed humidity
60!
61! 37 2007-03-01 08:33:54Z raasch
62! Calculation extended for gridpoint nzt, extended for given temperature /
63! humidity fluxes at the top, wall-part is now executed in case that a
64! Prandtl-layer is switched on (instead of surfaces fluxes switched on)
65!
66! RCS Log replace by Id keyword, revision history cleaned up
67!
68! Revision 1.21  2006/04/26 12:45:35  raasch
69! OpenMP parallelization of production_e_init
70!
71! Revision 1.1  1997/09/19 07:45:35  raasch
72! Initial revision
73!
74!
75! Description:
76! ------------
77! Production terms (shear + buoyancy) of the TKE
78! WARNING: the case with prandtl_layer = F and use_surface_fluxes = T is
79!          not considered well!
80!------------------------------------------------------------------------------!
81
82    USE wall_fluxes_mod
83
84    PRIVATE
85    PUBLIC production_e, production_e_init
86
87    LOGICAL, SAVE ::  first_call = .TRUE.
88
89    REAL, DIMENSION(:,:), ALLOCATABLE, SAVE ::  u_0, v_0
90
91    INTERFACE production_e
92       MODULE PROCEDURE production_e
93       MODULE PROCEDURE production_e_ij
94    END INTERFACE production_e
95   
96    INTERFACE production_e_init
97       MODULE PROCEDURE production_e_init
98    END INTERFACE production_e_init
99 
100 CONTAINS
101
102
103!------------------------------------------------------------------------------!
104! Call for all grid points
105!------------------------------------------------------------------------------!
106    SUBROUTINE production_e
107
108       USE arrays_3d
109       USE cloud_parameters
110       USE control_parameters
111       USE grid_variables
112       USE indices
113       USE statistics
114
115       IMPLICIT NONE
116
117       INTEGER ::  i, j, k
118
119       REAL    ::  def, dudx, dudy, dudz, dvdx, dvdy, dvdz, dwdx, dwdy, dwdz, &
120                   k1, k2, km_neutral, theta, temp
121
122!       REAL, DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  usvs, vsus, wsus, wsvs
123       REAL, DIMENSION(nzb:nzt+1) ::   usvs, vsus, wsus, wsvs
124
125!
126!--    First calculate horizontal momentum flux u'v', w'v', v'u', w'u' at
127!--    vertical walls, if neccessary
128!--    So far, results are slightly different from the ij-Version.
129!--    Therefore, ij-Version is called further below within the ij-loops.
130!       IF ( topography /= 'flat' )  THEN
131!          CALL wall_fluxes_e( usvs, 1.0, 0.0, 0.0, 0.0, wall_e_y )
132!          CALL wall_fluxes_e( wsvs, 0.0, 0.0, 1.0, 0.0, wall_e_y )
133!          CALL wall_fluxes_e( vsus, 0.0, 1.0, 0.0, 0.0, wall_e_x )
134!          CALL wall_fluxes_e( wsus, 0.0, 0.0, 0.0, 1.0, wall_e_x )
135!       ENDIF
136
137
138       DO  i = nxl, nxr
139
140!
141!--       Calculate TKE production by shear
142          DO  j = nys, nyn
143             DO  k = nzb_diff_s_outer(j,i), nzt
144
145                dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
146                dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
147                                 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
148                dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
149                                 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
150
151                dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
152                                 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
153                dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
154                dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
155                                 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
156
157                dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
158                                 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
159                dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
160                                 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
161                dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
162
163                def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
164                      dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
165                      dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
166
167                IF ( def < 0.0 )  def = 0.0
168
169                tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
170
171             ENDDO
172          ENDDO
173
174          IF ( prandtl_layer )  THEN
175
176!
177!--          Position beneath wall
178!--          (2) - Will allways be executed.
179!--          'bottom and wall: use u_0,v_0 and wall functions'
180             DO  j = nys, nyn
181
182                IF ( ( wall_e_x(j,i) /= 0.0 ) .OR. ( wall_e_y(j,i) /= 0.0 ) ) &
183                THEN
184
185                   k = nzb_diff_s_inner(j,i) - 1
186                   dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
187                   dudz = 0.5 * ( u(k+1,j,i) + u(k+1,j,i+1) - &
188                                  u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
189                   dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy
190                   dvdz = 0.5 * ( v(k+1,j,i) + v(k+1,j+1,i) - &
191                                  v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
192                   dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
193
194                   IF ( wall_e_y(j,i) /= 0.0 )  THEN
195!
196!--                   Inconsistency removed: as the thermal stratification is
197!--                   not taken into account for the evaluation of the wall
198!--                   fluxes at vertical walls, the eddy viscosity km must not
199!--                   be used for the evaluation of the velocity gradients dudy
200!--                   and dwdy
201!--                   Note: The validity of the new method has not yet been
202!--                         shown, as so far no suitable data for a validation
203!--                         has been available
204                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
205                                          usvs, 1.0, 0.0, 0.0, 0.0 )
206                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
207                                          wsvs, 0.0, 0.0, 1.0, 0.0 )
208                      km_neutral = kappa * ( usvs(k)**2 + wsvs(k)**2 )**0.25 * &
209                                   0.5 * dy 
210                      IF ( km_neutral > 0.0 )  THEN
211                         dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
212                         dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
213                      ELSE
214                         dudy = 0.0
215                         dwdy = 0.0
216                      ENDIF
217                   ELSE
218                      dudy = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
219                                      u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
220                      dwdy = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
221                                      w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
222                   ENDIF
223
224                   IF ( wall_e_x(j,i) /= 0.0 )  THEN
225!
226!--                   Inconsistency removed: as the thermal stratification is
227!--                   not taken into account for the evaluation of the wall
228!--                   fluxes at vertical walls, the eddy viscosity km must not
229!--                   be used for the evaluation of the velocity gradients dvdx
230!--                   and dwdx
231!--                   Note: The validity of the new method has not yet been
232!--                         shown, as so far no suitable data for a validation
233!--                         has been available
234                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
235                                          vsus, 0.0, 1.0, 0.0, 0.0 )
236                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
237                                          wsus, 0.0, 0.0, 0.0, 1.0 )
238                      km_neutral = kappa * ( vsus(k)**2 + wsus(k)**2 )**0.25 * &
239                                   0.5 * dx
240                      IF ( km_neutral > 0.0 )  THEN
241                         dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
242                         dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
243                      ELSE
244                         dvdx = 0.0
245                         dwdx = 0.0
246                      ENDIF
247                   ELSE
248                      dvdx = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
249                                      v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
250                      dwdx = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
251                                      w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
252                   ENDIF
253
254                   def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
255                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
256                         dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
257
258                   IF ( def < 0.0 )  def = 0.0
259
260                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
261
262
263!
264!--                (3) - will be executed only, if there is at least one level
265!--                between (2) and (4), i.e. the topography must have a
266!--                minimum height of 2 dz. Wall fluxes for this case have
267!--                already been calculated for (2).
268!--                'wall only: use wall functions'
269
270                   DO  k = nzb_diff_s_inner(j,i), nzb_diff_s_outer(j,i)-2
271
272                      dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
273                      dudz = 0.5 * ( u(k+1,j,i) + u(k+1,j,i+1) - &
274                                     u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
275                      dvdy =       ( v(k,j+1,i) - v(k,j,i)     ) * ddy
276                      dvdz = 0.5 * ( v(k+1,j,i) + v(k+1,j+1,i) - &
277                                     v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
278                      dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
279
280                      IF ( wall_e_y(j,i) /= 0.0 )  THEN
281!
282!--                      Inconsistency removed: as the thermal stratification
283!--                      is not taken into account for the evaluation of the
284!--                      wall fluxes at vertical walls, the eddy viscosity km
285!--                      must not be used for the evaluation of the velocity
286!--                      gradients dudy and dwdy
287!--                      Note: The validity of the new method has not yet
288!--                            been shown, as so far no suitable data for a
289!--                            validation has been available
290                         km_neutral = kappa * ( usvs(k)**2 + & 
291                                                wsvs(k)**2 )**0.25 * 0.5 * dy
292                         IF ( km_neutral > 0.0 )  THEN
293                            dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
294                            dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
295                         ELSE
296                            dudy = 0.0
297                            dwdy = 0.0
298                         ENDIF
299                      ELSE
300                         dudy = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
301                                         u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
302                         dwdy = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
303                                         w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
304                      ENDIF
305
306                      IF ( wall_e_x(j,i) /= 0.0 )  THEN
307!
308!--                      Inconsistency removed: as the thermal stratification
309!--                      is not taken into account for the evaluation of the
310!--                      wall fluxes at vertical walls, the eddy viscosity km
311!--                      must not be used for the evaluation of the velocity
312!--                      gradients dvdx and dwdx
313!--                      Note: The validity of the new method has not yet
314!--                            been shown, as so far no suitable data for a
315!--                            validation has been available
316                         km_neutral = kappa * ( vsus(k)**2 + & 
317                                                wsus(k)**2 )**0.25 * 0.5 * dx
318                         IF ( km_neutral > 0.0 )  THEN
319                            dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
320                            dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
321                         ELSE
322                            dvdx = 0.0
323                            dwdx = 0.0
324                         ENDIF
325                      ELSE
326                         dvdx = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
327                                         v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
328                         dwdx = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
329                                         w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
330                      ENDIF
331
332                      def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
333                           dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 +  &
334                           dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
335
336                      IF ( def < 0.0 )  def = 0.0
337
338                      tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
339
340                   ENDDO
341
342                ENDIF
343
344             ENDDO
345
346!
347!--          (4) - will allways be executed.
348!--          'special case: free atmosphere' (as for case (0))
349             DO  j = nys, nyn
350
351                IF ( ( wall_e_x(j,i) /= 0.0 ) .OR. ( wall_e_y(j,i) /= 0.0 ) ) &
352                THEN
353
354                   k = nzb_diff_s_outer(j,i)-1
355
356                   dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
357                   dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
358                                    u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
359                   dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
360                                    u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
361
362                   dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
363                                    v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
364                   dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
365                   dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
366                                    v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
367
368                   dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
369                                    w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
370                   dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
371                                    w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
372                   dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
373
374                   def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
375                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
376                         dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
377
378                   IF ( def < 0.0 )  def = 0.0
379
380                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
381
382                ENDIF
383
384             ENDDO
385
386!
387!--          Position without adjacent wall
388!--          (1) - will allways be executed.
389!--          'bottom only: use u_0,v_0'
390             DO  j = nys, nyn
391
392                IF ( ( wall_e_x(j,i) == 0.0 ) .AND. ( wall_e_y(j,i) == 0.0 ) ) &
393                THEN
394
395                   k = nzb_diff_s_inner(j,i)-1
396
397                   dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
398                   dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
399                                    u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
400                   dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
401                                    u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
402
403                   dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
404                                    v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
405                   dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
406                   dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
407                                    v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
408
409                   dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
410                                    w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
411                   dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
412                                    w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
413                   dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
414
415                   def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
416                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
417                         dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
418
419                   IF ( def < 0.0 )  def = 0.0
420
421                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
422
423                ENDIF
424
425             ENDDO
426
427          ELSEIF ( use_surface_fluxes )  THEN
428
429             DO  j = nys, nyn
430
431                k = nzb_diff_s_outer(j,i)-1
432
433                dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
434                dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
435                                 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
436                dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
437                                 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
438
439                dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
440                                 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
441                dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
442                dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
443                                 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
444
445                dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
446                                 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
447                dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
448                                 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
449                dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
450
451                def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
452                      dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
453                      dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
454
455                IF ( def < 0.0 )  def = 0.0
456
457                tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
458
459             ENDDO
460
461          ENDIF
462
463!
464!--       If required, calculate TKE production by buoyancy
465          IF ( .NOT. neutral )  THEN
466
467             IF ( .NOT. humidity )  THEN
468
469                IF ( use_reference )  THEN
470
471                   IF ( ocean )  THEN
472!
473!--                   So far in the ocean no special treatment of density flux
474!--                   in the bottom and top surface layer
475                      DO  j = nys, nyn
476                         DO  k = nzb_s_inner(j,i)+1, nzt
477                            tend(k,j,i) = tend(k,j,i) +                     &
478                                          kh(k,j,i) * g / rho_reference *   &
479                                          ( rho(k+1,j,i) - rho(k-1,j,i) ) * &
480                                          dd2zu(k)
481                         ENDDO
482                      ENDDO
483
484                   ELSE
485
486                      DO  j = nys, nyn
487                         DO  k = nzb_diff_s_inner(j,i), nzt_diff
488                            tend(k,j,i) = tend(k,j,i) -                   &
489                                          kh(k,j,i) * g / pt_reference *  &
490                                          ( pt(k+1,j,i) - pt(k-1,j,i) ) * &
491                                          dd2zu(k)
492                         ENDDO
493
494                         IF ( use_surface_fluxes )  THEN
495                            k = nzb_diff_s_inner(j,i)-1
496                            tend(k,j,i) = tend(k,j,i) + g / pt_reference * &
497                                                        shf(j,i)
498                         ENDIF
499
500                         IF ( use_top_fluxes )  THEN
501                            k = nzt
502                            tend(k,j,i) = tend(k,j,i) + g / pt_reference * &
503                                                        tswst(j,i)
504                         ENDIF
505                      ENDDO
506
507                   ENDIF
508
509                ELSE
510
511                   IF ( ocean )  THEN
512!
513!--                   So far in the ocean no special treatment of density flux
514!--                   in the bottom and top surface layer
515                      DO  j = nys, nyn
516                         DO  k = nzb_s_inner(j,i)+1, nzt
517                            tend(k,j,i) = tend(k,j,i) +                     &
518                                          kh(k,j,i) * g / rho(k,j,i) *      &
519                                          ( rho(k+1,j,i) - rho(k-1,j,i) ) * &
520                                          dd2zu(k)
521                         ENDDO
522                      ENDDO
523
524                   ELSE
525
526                      DO  j = nys, nyn
527                         DO  k = nzb_diff_s_inner(j,i), nzt_diff
528                            tend(k,j,i) = tend(k,j,i) -                   &
529                                          kh(k,j,i) * g / pt(k,j,i) *     &
530                                          ( pt(k+1,j,i) - pt(k-1,j,i) ) * &
531                                          dd2zu(k)
532                         ENDDO
533
534                         IF ( use_surface_fluxes )  THEN
535                            k = nzb_diff_s_inner(j,i)-1
536                            tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * &
537                                                        shf(j,i)
538                         ENDIF
539
540                         IF ( use_top_fluxes )  THEN
541                            k = nzt
542                            tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * &
543                                                        tswst(j,i)
544                         ENDIF
545                      ENDDO
546
547                   ENDIF
548
549                ENDIF
550
551             ELSE
552
553                DO  j = nys, nyn
554
555                   DO  k = nzb_diff_s_inner(j,i), nzt_diff
556
557                      IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
558                         k1 = 1.0 + 0.61 * q(k,j,i)
559                         k2 = 0.61 * pt(k,j,i)
560                         tend(k,j,i) = tend(k,j,i) - kh(k,j,i) *               &
561                                         g / vpt(k,j,i) *                      &
562                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +  &
563                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )    &
564                                         ) * dd2zu(k)
565                      ELSE IF ( cloud_physics )  THEN
566                         IF ( ql(k,j,i) == 0.0 )  THEN
567                            k1 = 1.0 + 0.61 * q(k,j,i)
568                            k2 = 0.61 * pt(k,j,i)
569                         ELSE
570                            theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
571                            temp  = theta * t_d_pt(k)
572                            k1 = ( 1.0 - q(k,j,i) + 1.61 *                 &
573                                       ( q(k,j,i) - ql(k,j,i) ) *          &
574                                 ( 1.0 + 0.622 * l_d_r / temp ) ) /        &
575                                 ( 1.0 + 0.622 * l_d_r * l_d_cp *          &
576                                 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
577                            k2 = theta * ( l_d_cp / temp * k1 - 1.0 )
578                         ENDIF
579                         tend(k,j,i) = tend(k,j,i) - kh(k,j,i) *               &
580                                         g / vpt(k,j,i) *                      &
581                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +  &
582                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )    &
583                                         ) * dd2zu(k)
584                      ELSE IF ( cloud_droplets )  THEN
585                         k1 = 1.0 + 0.61 * q(k,j,i) - ql(k,j,i)
586                         k2 = 0.61 * pt(k,j,i)
587                         tend(k,j,i) = tend(k,j,i) -                          & 
588                                       kh(k,j,i) * g / vpt(k,j,i) *           &
589                                       ( k1 * ( pt(k+1,j,i)- pt(k-1,j,i) ) +  &
590                                         k2 * ( q(k+1,j,i) -  q(k-1,j,i) ) -  &
591                                         pt(k,j,i) * ( ql(k+1,j,i) -          &
592                                         ql(k-1,j,i) ) ) * dd2zu(k)
593                      ENDIF
594
595                   ENDDO
596
597                ENDDO
598
599                IF ( use_surface_fluxes )  THEN
600
601                   DO  j = nys, nyn
602
603                      k = nzb_diff_s_inner(j,i)-1
604
605                      IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
606                         k1 = 1.0 + 0.61 * q(k,j,i)
607                         k2 = 0.61 * pt(k,j,i)
608                      ELSE IF ( cloud_physics )  THEN
609                         IF ( ql(k,j,i) == 0.0 )  THEN
610                            k1 = 1.0 + 0.61 * q(k,j,i)
611                            k2 = 0.61 * pt(k,j,i)
612                         ELSE
613                            theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
614                            temp  = theta * t_d_pt(k)
615                            k1 = ( 1.0 - q(k,j,i) + 1.61 *                 &
616                                       ( q(k,j,i) - ql(k,j,i) ) *          &
617                                 ( 1.0 + 0.622 * l_d_r / temp ) ) /        &
618                                 ( 1.0 + 0.622 * l_d_r * l_d_cp *          &
619                                 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
620                            k2 = theta * ( l_d_cp / temp * k1 - 1.0 )
621                         ENDIF
622                      ELSE IF ( cloud_droplets )  THEN
623                         k1 = 1.0 + 0.61 * q(k,j,i) - ql(k,j,i)
624                         k2 = 0.61 * pt(k,j,i)
625                      ENDIF
626
627                      tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
628                                            ( k1* shf(j,i) + k2 * qsws(j,i) )
629                   ENDDO
630
631                ENDIF
632
633                IF ( use_top_fluxes )  THEN
634
635                   DO  j = nys, nyn
636
637                      k = nzt
638
639                      IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
640                         k1 = 1.0 + 0.61 * q(k,j,i)
641                         k2 = 0.61 * pt(k,j,i)
642                      ELSE IF ( cloud_physics )  THEN
643                         IF ( ql(k,j,i) == 0.0 )  THEN
644                            k1 = 1.0 + 0.61 * q(k,j,i)
645                            k2 = 0.61 * pt(k,j,i)
646                         ELSE
647                            theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
648                            temp  = theta * t_d_pt(k)
649                            k1 = ( 1.0 - q(k,j,i) + 1.61 *                 &
650                                       ( q(k,j,i) - ql(k,j,i) ) *          &
651                                 ( 1.0 + 0.622 * l_d_r / temp ) ) /        &
652                                 ( 1.0 + 0.622 * l_d_r * l_d_cp *          &
653                                 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
654                            k2 = theta * ( l_d_cp / temp * k1 - 1.0 )
655                         ENDIF
656                      ELSE IF ( cloud_droplets )  THEN
657                         k1 = 1.0 + 0.61 * q(k,j,i) - ql(k,j,i)
658                         k2 = 0.61 * pt(k,j,i)
659                      ENDIF
660
661                      tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
662                                            ( k1* tswst(j,i) + k2 * qswst(j,i) )
663                   ENDDO
664
665                ENDIF
666
667             ENDIF
668
669          ENDIF
670
671       ENDDO
672
673    END SUBROUTINE production_e
674
675
676!------------------------------------------------------------------------------!
677! Call for grid point i,j
678!------------------------------------------------------------------------------!
679    SUBROUTINE production_e_ij( i, j )
680
681       USE arrays_3d
682       USE cloud_parameters
683       USE control_parameters
684       USE grid_variables
685       USE indices
686       USE statistics
687
688       IMPLICIT NONE
689
690       INTEGER ::  i, j, k
691
692       REAL    ::  def, dudx, dudy, dudz, dvdx, dvdy, dvdz, dwdx, dwdy, dwdz, &
693                   k1, k2, km_neutral, theta, temp
694
695       REAL, DIMENSION(nzb:nzt+1) ::  usvs, vsus, wsus, wsvs
696
697!
698!--    Calculate TKE production by shear
699       DO  k = nzb_diff_s_outer(j,i), nzt
700
701          dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
702          dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
703                           u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
704          dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
705                           u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
706
707          dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
708                           v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
709          dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
710          dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
711                           v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
712
713          dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
714                           w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
715          dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
716                           w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
717          dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
718
719          def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 )                       &
720                + dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + dvdz**2 &
721                + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
722
723          IF ( def < 0.0 )  def = 0.0
724
725          tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
726
727       ENDDO
728
729       IF ( prandtl_layer )  THEN
730
731          IF ( ( wall_e_x(j,i) /= 0.0 ) .OR. ( wall_e_y(j,i) /= 0.0 ) )  THEN
732
733!
734!--          Position beneath wall
735!--          (2) - Will allways be executed.
736!--          'bottom and wall: use u_0,v_0 and wall functions'
737             k = nzb_diff_s_inner(j,i)-1
738
739             dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
740             dudz = 0.5 * ( u(k+1,j,i) + u(k+1,j,i+1) - &
741                            u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
742             dvdy =       ( v(k,j+1,i) - v(k,j,i)     ) * ddy
743             dvdz = 0.5 * ( v(k+1,j,i) + v(k+1,j+1,i) - &
744                            v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
745             dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
746
747             IF ( wall_e_y(j,i) /= 0.0 )  THEN
748!
749!--             Inconsistency removed: as the thermal stratification
750!--             is not taken into account for the evaluation of the
751!--             wall fluxes at vertical walls, the eddy viscosity km
752!--             must not be used for the evaluation of the velocity
753!--             gradients dudy and dwdy
754!--             Note: The validity of the new method has not yet
755!--                   been shown, as so far no suitable data for a
756!--                   validation has been available
757                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
758                                    usvs, 1.0, 0.0, 0.0, 0.0 )
759                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
760                                    wsvs, 0.0, 0.0, 1.0, 0.0 )
761                km_neutral = kappa * ( usvs(k)**2 + wsvs(k)**2 )**0.25 * &
762                             0.5 * dy
763                IF ( km_neutral > 0.0 )  THEN
764                   dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
765                   dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
766                ELSE
767                   dudy = 0.0
768                   dwdy = 0.0
769                ENDIF
770             ELSE
771                dudy = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
772                                u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
773                dwdy = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
774                                w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
775             ENDIF
776
777             IF ( wall_e_x(j,i) /= 0.0 )  THEN
778!
779!--             Inconsistency removed: as the thermal stratification
780!--             is not taken into account for the evaluation of the
781!--             wall fluxes at vertical walls, the eddy viscosity km
782!--             must not be used for the evaluation of the velocity
783!--             gradients dvdx and dwdx
784!--             Note: The validity of the new method has not yet
785!--                   been shown, as so far no suitable data for a
786!--                   validation has been available
787                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
788                                    vsus, 0.0, 1.0, 0.0, 0.0 )
789                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
790                                    wsus, 0.0, 0.0, 0.0, 1.0 )
791                km_neutral = kappa * ( vsus(k)**2 + wsus(k)**2 )**0.25 * & 
792                             0.5 * dx
793                IF ( km_neutral > 0.0 )  THEN
794                   dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
795                   dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
796                ELSE
797                   dvdx = 0.0
798                   dwdx = 0.0
799                ENDIF
800             ELSE
801                dvdx = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
802                                v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
803                dwdx = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
804                                w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
805             ENDIF
806
807             def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
808                   dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
809                   dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
810
811             IF ( def < 0.0 )  def = 0.0
812
813             tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
814
815!
816!--          (3) - will be executed only, if there is at least one level
817!--          between (2) and (4), i.e. the topography must have a
818!--          minimum height of 2 dz. Wall fluxes for this case have
819!--          already been calculated for (2).
820!--          'wall only: use wall functions'
821             DO  k = nzb_diff_s_inner(j,i), nzb_diff_s_outer(j,i)-2
822
823                dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
824                dudz = 0.5 * ( u(k+1,j,i) + u(k+1,j,i+1) - &
825                               u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
826                dvdy =       ( v(k,j+1,i) - v(k,j,i)     ) * ddy
827                dvdz = 0.5 * ( v(k+1,j,i) + v(k+1,j+1,i) - &
828                               v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
829                dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
830
831                IF ( wall_e_y(j,i) /= 0.0 )  THEN
832!
833!--                Inconsistency removed: as the thermal stratification
834!--                is not taken into account for the evaluation of the
835!--                wall fluxes at vertical walls, the eddy viscosity km
836!--                must not be used for the evaluation of the velocity
837!--                gradients dudy and dwdy
838!--                Note: The validity of the new method has not yet
839!--                      been shown, as so far no suitable data for a
840!--                      validation has been available
841                   km_neutral = kappa * ( usvs(k)**2 + & 
842                                          wsvs(k)**2 )**0.25 * 0.5 * dy
843                   IF ( km_neutral > 0.0 )  THEN
844                      dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
845                      dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
846                   ELSE
847                      dudy = 0.0
848                      dwdy = 0.0
849                   ENDIF
850                ELSE
851                   dudy = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
852                                   u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
853                   dwdy = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
854                                   w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
855                ENDIF
856
857                IF ( wall_e_x(j,i) /= 0.0 )  THEN
858!
859!--                Inconsistency removed: as the thermal stratification
860!--                is not taken into account for the evaluation of the
861!--                wall fluxes at vertical walls, the eddy viscosity km
862!--                must not be used for the evaluation of the velocity
863!--                gradients dvdx and dwdx
864!--                Note: The validity of the new method has not yet
865!--                      been shown, as so far no suitable data for a
866!--                      validation has been available
867                   km_neutral = kappa * ( vsus(k)**2 + & 
868                                          wsus(k)**2 )**0.25 * 0.5 * dx
869                   IF ( km_neutral > 0.0 )  THEN
870                      dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
871                      dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
872                   ELSE
873                      dvdx = 0.0
874                      dwdx = 0.0
875                   ENDIF
876                ELSE
877                   dvdx = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
878                                   v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
879                   dwdx = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
880                                   w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
881                ENDIF
882
883                def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
884                      dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
885                      dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
886
887                IF ( def < 0.0 )  def = 0.0
888
889                tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
890
891             ENDDO
892
893!
894!--          (4) - will allways be executed.
895!--          'special case: free atmosphere' (as for case (0))
896             k = nzb_diff_s_outer(j,i)-1
897
898             dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
899             dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
900                              u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
901             dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
902                              u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
903
904             dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
905                              v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
906             dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
907             dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
908                              v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
909
910             dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
911                              w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
912             dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
913                              w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
914             dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
915
916             def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
917                   dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
918                   dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
919
920             IF ( def < 0.0 )  def = 0.0
921
922             tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
923
924          ELSE
925
926!
927!--          Position without adjacent wall
928!--          (1) - will allways be executed.
929!--          'bottom only: use u_0,v_0'
930             k = nzb_diff_s_inner(j,i)-1
931
932             dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
933             dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
934                              u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
935             dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
936                              u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
937
938             dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
939                              v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
940             dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
941             dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
942                              v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
943
944             dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
945                              w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
946             dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
947                              w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
948             dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
949
950             def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 )                       &
951                   + dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + dvdz**2 &
952                   + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
953
954             IF ( def < 0.0 )  def = 0.0
955
956             tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
957
958          ENDIF
959
960       ELSEIF ( use_surface_fluxes )  THEN
961
962          k = nzb_diff_s_outer(j,i)-1
963
964          dudx  =        ( u(k,j,i+1) - u(k,j,i)     ) * ddx
965          dudy  = 0.25 * ( u(k,j+1,i) + u(k,j+1,i+1) - &
966                           u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
967          dudz  = 0.5  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
968                           u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
969
970          dvdx  = 0.25 * ( v(k,j,i+1) + v(k,j+1,i+1) - &
971                           v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
972          dvdy  =        ( v(k,j+1,i) - v(k,j,i)     ) * ddy
973          dvdz  = 0.5  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
974                           v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
975
976          dwdx  = 0.25 * ( w(k,j,i+1) + w(k-1,j,i+1) - &
977                           w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
978          dwdy  = 0.25 * ( w(k,j+1,i) + w(k-1,j+1,i) - &
979                           w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
980          dwdz  =        ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
981
982          def = 2.0 * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
983                dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
984                dvdz**2 + 2.0 * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
985
986          IF ( def < 0.0 )  def = 0.0
987
988          tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
989
990       ENDIF
991
992!
993!--    If required, calculate TKE production by buoyancy
994       IF ( .NOT. neutral )  THEN
995
996          IF ( .NOT. humidity )  THEN
997
998             IF ( use_reference )  THEN
999
1000                IF ( ocean )  THEN
1001!
1002!--                So far in the ocean no special treatment of density flux in
1003!--                the bottom and top surface layer
1004                   DO  k = nzb_s_inner(j,i)+1, nzt
1005                      tend(k,j,i) = tend(k,j,i) +                   &
1006                                    kh(k,j,i) * g / rho_reference * &
1007                                    ( rho(k+1,j,i) - rho(k-1,j,i) ) * dd2zu(k)
1008                   ENDDO
1009
1010                ELSE
1011
1012                   DO  k = nzb_diff_s_inner(j,i), nzt_diff
1013                      tend(k,j,i) = tend(k,j,i) -                  &
1014                                    kh(k,j,i) * g / pt_reference * &
1015                                    ( pt(k+1,j,i) - pt(k-1,j,i) ) * dd2zu(k)
1016                   ENDDO
1017
1018                   IF ( use_surface_fluxes )  THEN
1019                      k = nzb_diff_s_inner(j,i)-1
1020                      tend(k,j,i) = tend(k,j,i) + g / pt_reference * shf(j,i)
1021                   ENDIF
1022
1023                   IF ( use_top_fluxes )  THEN
1024                      k = nzt
1025                      tend(k,j,i) = tend(k,j,i) + g / pt_reference * tswst(j,i)
1026                   ENDIF
1027
1028                ENDIF
1029
1030             ELSE
1031
1032                IF ( ocean )  THEN
1033!
1034!--                So far in the ocean no special treatment of density flux in
1035!--                the bottom and top surface layer
1036                   DO  k = nzb_s_inner(j,i)+1, nzt
1037                      tend(k,j,i) = tend(k,j,i) +                &
1038                                    kh(k,j,i) * g / rho(k,j,i) * &
1039                                    ( rho(k+1,j,i) - rho(k-1,j,i) ) * dd2zu(k)
1040                   ENDDO
1041
1042                ELSE
1043
1044                   DO  k = nzb_diff_s_inner(j,i), nzt_diff
1045                      tend(k,j,i) = tend(k,j,i) -               &
1046                                    kh(k,j,i) * g / pt(k,j,i) * &
1047                                    ( pt(k+1,j,i) - pt(k-1,j,i) ) * dd2zu(k)
1048                   ENDDO
1049
1050                   IF ( use_surface_fluxes )  THEN
1051                      k = nzb_diff_s_inner(j,i)-1
1052                      tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * shf(j,i)
1053                   ENDIF
1054
1055                   IF ( use_top_fluxes )  THEN
1056                      k = nzt
1057                      tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * tswst(j,i)
1058                   ENDIF
1059
1060                ENDIF
1061
1062             ENDIF
1063
1064          ELSE
1065
1066             DO  k = nzb_diff_s_inner(j,i), nzt_diff
1067
1068                IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets )  THEN
1069                   k1 = 1.0 + 0.61 * q(k,j,i)
1070                   k2 = 0.61 * pt(k,j,i)
1071                   tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * g / vpt(k,j,i) *   &
1072                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + &
1073                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )   &
1074                                         ) * dd2zu(k)
1075                ELSE IF ( cloud_physics )  THEN
1076                   IF ( ql(k,j,i) == 0.0 )  THEN
1077                      k1 = 1.0 + 0.61 * q(k,j,i)
1078                      k2 = 0.61 * pt(k,j,i)
1079                   ELSE
1080                      theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1081                      temp  = theta * t_d_pt(k)
1082                      k1 = ( 1.0 - q(k,j,i) + 1.61 *                 &
1083                                 ( q(k,j,i) - ql(k,j,i) ) *          &
1084                           ( 1.0 + 0.622 * l_d_r / temp ) ) /        &
1085                           ( 1.0 + 0.622 * l_d_r * l_d_cp *          &
1086                           ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1087                      k2 = theta * ( l_d_cp / temp * k1 - 1.0 )
1088                   ENDIF
1089                   tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * g / vpt(k,j,i) *   &
1090                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + &
1091                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )   &
1092                                         ) * dd2zu(k)
1093                ELSE IF ( cloud_droplets )  THEN
1094                   k1 = 1.0 + 0.61 * q(k,j,i) - ql(k,j,i)
1095                   k2 = 0.61 * pt(k,j,i)
1096                   tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * g / vpt(k,j,i) *  &
1097                                     ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +    &
1098                                       k2 * ( q(k+1,j,i) - q(k-1,j,i) ) -    &
1099                                       pt(k,j,i) * ( ql(k+1,j,i) -           &
1100                                                     ql(k-1,j,i) ) ) * dd2zu(k)
1101                ENDIF
1102             ENDDO
1103
1104             IF ( use_surface_fluxes )  THEN
1105                k = nzb_diff_s_inner(j,i)-1
1106
1107                IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets )  THEN
1108                   k1 = 1.0 + 0.61 * q(k,j,i)
1109                   k2 = 0.61 * pt(k,j,i)
1110                ELSE IF ( cloud_physics )  THEN
1111                   IF ( ql(k,j,i) == 0.0 )  THEN
1112                      k1 = 1.0 + 0.61 * q(k,j,i)
1113                      k2 = 0.61 * pt(k,j,i)
1114                   ELSE
1115                      theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1116                      temp  = theta * t_d_pt(k)
1117                      k1 = ( 1.0 - q(k,j,i) + 1.61 *                 &
1118                                 ( q(k,j,i) - ql(k,j,i) ) *          &
1119                           ( 1.0 + 0.622 * l_d_r / temp ) ) /        &
1120                           ( 1.0 + 0.622 * l_d_r * l_d_cp *          &
1121                           ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1122                      k2 = theta * ( l_d_cp / temp * k1 - 1.0 )
1123                   ENDIF
1124                ELSE IF ( cloud_droplets )  THEN
1125                   k1 = 1.0 + 0.61 * q(k,j,i) - ql(k,j,i)
1126                   k2 = 0.61 * pt(k,j,i)
1127                ENDIF
1128
1129                tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
1130                                            ( k1* shf(j,i) + k2 * qsws(j,i) )
1131             ENDIF
1132
1133             IF ( use_top_fluxes )  THEN
1134                k = nzt
1135
1136                IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets )  THEN
1137                   k1 = 1.0 + 0.61 * q(k,j,i)
1138                   k2 = 0.61 * pt(k,j,i)
1139                ELSE IF ( cloud_physics )  THEN
1140                   IF ( ql(k,j,i) == 0.0 )  THEN
1141                      k1 = 1.0 + 0.61 * q(k,j,i)
1142                      k2 = 0.61 * pt(k,j,i)
1143                   ELSE
1144                      theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1145                      temp  = theta * t_d_pt(k)
1146                      k1 = ( 1.0 - q(k,j,i) + 1.61 *                 &
1147                                 ( q(k,j,i) - ql(k,j,i) ) *          &
1148                           ( 1.0 + 0.622 * l_d_r / temp ) ) /        &
1149                           ( 1.0 + 0.622 * l_d_r * l_d_cp *          &
1150                           ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1151                      k2 = theta * ( l_d_cp / temp * k1 - 1.0 )
1152                   ENDIF
1153                ELSE IF ( cloud_droplets )  THEN
1154                   k1 = 1.0 + 0.61 * q(k,j,i) - ql(k,j,i)
1155                   k2 = 0.61 * pt(k,j,i)
1156                ENDIF
1157
1158                tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
1159                                            ( k1* tswst(j,i) + k2 * qswst(j,i) )
1160             ENDIF
1161
1162          ENDIF
1163
1164       ENDIF
1165
1166    END SUBROUTINE production_e_ij
1167
1168
1169    SUBROUTINE production_e_init
1170
1171       USE arrays_3d
1172       USE control_parameters
1173       USE grid_variables
1174       USE indices
1175
1176       IMPLICIT NONE
1177
1178       INTEGER ::  i, j, ku, kv
1179
1180       IF ( prandtl_layer )  THEN
1181
1182          IF ( first_call )  THEN
1183             ALLOCATE( u_0(nysg:nyng,nxlg:nxrg), v_0(nysg:nyng,nxlg:nxrg) )
1184             u_0 = 0.0   ! just to avoid access of uninitialized memory
1185             v_0 = 0.0   ! within exchange_horiz_2d
1186             first_call = .FALSE.
1187          ENDIF
1188
1189!
1190!--       Calculate a virtual velocity at the surface in a way that the
1191!--       vertical velocity gradient at k = 1 (u(k+1)-u_0) matches the
1192!--       Prandtl law (-w'u'/km). This gradient is used in the TKE shear
1193!--       production term at k=1 (see production_e_ij).
1194!--       The velocity gradient has to be limited in case of too small km
1195!--       (otherwise the timestep may be significantly reduced by large
1196!--       surface winds).
1197!--       Upper bounds are nxr+1 and nyn+1 because otherwise these values are
1198!--       not available in case of non-cyclic boundary conditions.
1199!--       WARNING: the exact analytical solution would require the determination
1200!--                of the eddy diffusivity by km = u* * kappa * zp / phi_m.
1201          !$OMP PARALLEL DO PRIVATE( ku, kv )
1202          DO  i = nxl, nxr+1
1203             DO  j = nys, nyn+1
1204
1205                ku = nzb_u_inner(j,i)+1
1206                kv = nzb_v_inner(j,i)+1
1207
1208                u_0(j,i) = u(ku+1,j,i) + usws(j,i) * ( zu(ku+1) - zu(ku-1) ) / &
1209                                 ( 0.5 * ( km(ku,j,i) + km(ku,j,i-1) ) +       &
1210                                   1.0E-20 )
1211!                                  ( us(j,i) * kappa * zu(1) )
1212                v_0(j,i) = v(kv+1,j,i) + vsws(j,i) * ( zu(kv+1) - zu(kv-1) ) / &
1213                                 ( 0.5 * ( km(kv,j,i) + km(kv,j-1,i) ) +       &
1214                                   1.0E-20 )
1215!                                  ( us(j,i) * kappa * zu(1) )
1216
1217                IF ( ABS( u(ku+1,j,i) - u_0(j,i) )  > &
1218                     ABS( u(ku+1,j,i) - u(ku-1,j,i) ) )  u_0(j,i) = u(ku-1,j,i)
1219                IF ( ABS( v(kv+1,j,i) - v_0(j,i) )  > &
1220                     ABS( v(kv+1,j,i) - v(kv-1,j,i) ) )  v_0(j,i) = v(kv-1,j,i)
1221
1222             ENDDO
1223          ENDDO
1224
1225          CALL exchange_horiz_2d( u_0 )
1226          CALL exchange_horiz_2d( v_0 )
1227
1228       ENDIF
1229
1230    END SUBROUTINE production_e_init
1231
1232 END MODULE production_e_mod
Note: See TracBrowser for help on using the repository browser.