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

Last change on this file since 2000 was 2000, checked in by knoop, 8 years ago

Forced header and separation lines into 80 columns

  • Property svn:keywords set to Id
File size: 89.4 KB
Line 
1!> @file production_e.f90
2!------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2016 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22! Forced header and separation lines into 80 columns
23!
24! Former revisions:
25! -----------------
26! $Id: production_e.f90 2000 2016-08-20 18:09:15Z knoop $
27!
28! 1873 2016-04-18 14:50:06Z maronga
29! Module renamed (removed _mod)
30!
31!
32! 1850 2016-04-08 13:29:27Z maronga
33! Module renamed
34!
35!
36! 1691 2015-10-26 16:17:44Z maronga
37! Renamed prandtl_layer to constant_flux_layer.
38!
39! 1682 2015-10-07 23:56:08Z knoop
40! Code annotations made doxygen readable
41!
42! 1374 2014-04-25 12:55:07Z raasch
43! nzb_s_outer removed from acc-present-list
44!
45! 1353 2014-04-08 15:21:23Z heinze
46! REAL constants provided with KIND-attribute
47!
48! 1342 2014-03-26 17:04:47Z kanani
49! REAL constants defined as wp-kind
50!
51! 1320 2014-03-20 08:40:49Z raasch
52! ONLY-attribute added to USE-statements,
53! kind-parameters added to all INTEGER and REAL declaration statements,
54! kinds are defined in new module kinds,
55! old module precision_kind is removed,
56! revision history before 2012 removed,
57! comment fields (!:) to be used for variable explanations added to
58! all variable declaration statements
59!
60! 1257 2013-11-08 15:18:40Z raasch
61! openacc loop and loop vector clauses removed, declare create moved after
62! the FORTRAN declaration statement
63!
64! 1179 2013-06-14 05:57:58Z raasch
65! use_reference renamed use_single_reference_value
66!
67! 1128 2013-04-12 06:19:32Z raasch
68! loop index bounds in accelerator version replaced by i_left, i_right, j_south,
69! j_north
70!
71! 1036 2012-10-22 13:43:42Z raasch
72! code put under GPL (PALM 3.9)
73!
74! 1015 2012-09-27 09:23:24Z raasch
75! accelerator version (*_acc) added
76!
77! 1007 2012-09-19 14:30:36Z franke
78! Bugfix: calculation of buoyancy production has to consider the liquid water
79! mixing ratio in case of cloud droplets
80!
81! 940 2012-07-09 14:31:00Z raasch
82! TKE production by buoyancy can be switched off in case of runs with pure
83! neutral stratification
84!
85! Revision 1.1  1997/09/19 07:45:35  raasch
86! Initial revision
87!
88!
89! Description:
90! ------------
91!> Production terms (shear + buoyancy) of the TKE.
92!> @warning The case with constant_flux_layer = F and use_surface_fluxes = T is
93!>          not considered well!
94!------------------------------------------------------------------------------!
95 MODULE production_e_mod
96 
97
98    USE wall_fluxes_mod,                                                       &
99        ONLY:  wall_fluxes_e, wall_fluxes_e_acc
100
101    USE kinds
102
103    PRIVATE
104    PUBLIC production_e, production_e_acc, production_e_init
105
106    LOGICAL, SAVE ::  first_call = .TRUE.  !<
107
108    REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  u_0  !<
109    REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE ::  v_0  !<
110
111    INTERFACE production_e
112       MODULE PROCEDURE production_e
113       MODULE PROCEDURE production_e_ij
114    END INTERFACE production_e
115   
116    INTERFACE production_e_acc
117       MODULE PROCEDURE production_e_acc
118    END INTERFACE production_e_acc
119
120    INTERFACE production_e_init
121       MODULE PROCEDURE production_e_init
122    END INTERFACE production_e_init
123 
124 CONTAINS
125
126
127!------------------------------------------------------------------------------!
128! Description:
129! ------------
130!> Call for all grid points
131!------------------------------------------------------------------------------!
132    SUBROUTINE production_e
133
134       USE arrays_3d,                                                          &
135           ONLY:  ddzw, dd2zu, kh, km, pt, q, ql, qsws, qswst, rho, shf,       &
136                  tend, tswst, u, v, vpt, w
137
138       USE cloud_parameters,                                                   &
139           ONLY:  l_d_cp, l_d_r, pt_d_t, t_d_pt
140
141       USE control_parameters,                                                 &
142           ONLY:  cloud_droplets, cloud_physics, constant_flux_layer, g,       &
143                  humidity, kappa, neutral, ocean, pt_reference,               &
144                  rho_reference, use_single_reference_value,                   &
145                  use_surface_fluxes, use_top_fluxes
146
147       USE grid_variables,                                                     &
148           ONLY:  ddx, dx, ddy, dy, wall_e_x, wall_e_y
149
150       USE indices,                                                            &
151           ONLY:  nxl, nxr, nys, nyn, nzb, nzb_diff_s_inner,                   &
152                   nzb_diff_s_outer, nzb_s_inner, nzt, nzt_diff
153
154       IMPLICIT NONE
155
156       INTEGER(iwp) ::  i           !<
157       INTEGER(iwp) ::  j           !<
158       INTEGER(iwp) ::  k           !<
159
160       REAL(wp)     ::  def         !<
161       REAL(wp)     ::  dudx        !<
162       REAL(wp)     ::  dudy        !<
163       REAL(wp)     ::  dudz        !<
164       REAL(wp)     ::  dvdx        !<
165       REAL(wp)     ::  dvdy        !<
166       REAL(wp)     ::  dvdz        !<
167       REAL(wp)     ::  dwdx        !<
168       REAL(wp)     ::  dwdy        !<
169       REAL(wp)     ::  dwdz        !<
170       REAL(wp)     ::  k1          !<
171       REAL(wp)     ::  k2          !<
172       REAL(wp)     ::  km_neutral  !<
173       REAL(wp)     ::  theta       !<
174       REAL(wp)     ::  temp        !<
175
176!       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  usvs, vsus, wsus, wsvs
177       REAL(wp), DIMENSION(nzb:nzt+1) ::  usvs  !<
178       REAL(wp), DIMENSION(nzb:nzt+1) ::  vsus  !<
179       REAL(wp), DIMENSION(nzb:nzt+1) ::  wsus  !<
180       REAL(wp), DIMENSION(nzb:nzt+1) ::  wsvs  !<
181
182!
183!--    First calculate horizontal momentum flux u'v', w'v', v'u', w'u' at
184!--    vertical walls, if neccessary
185!--    So far, results are slightly different from the ij-Version.
186!--    Therefore, ij-Version is called further below within the ij-loops.
187!       IF ( topography /= 'flat' )  THEN
188!          CALL wall_fluxes_e( usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, wall_e_y )
189!          CALL wall_fluxes_e( wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp, wall_e_y )
190!          CALL wall_fluxes_e( vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp, wall_e_x )
191!          CALL wall_fluxes_e( wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, wall_e_x )
192!       ENDIF
193
194
195       DO  i = nxl, nxr
196
197!
198!--       Calculate TKE production by shear
199          DO  j = nys, nyn
200             DO  k = nzb_diff_s_outer(j,i), nzt
201
202                dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
203                dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
204                                    u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
205                dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
206                                    u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
207
208                dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
209                                    v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
210                dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
211                dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
212                                    v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
213
214                dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
215                                    w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
216                dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
217                                    w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
218                dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
219
220                def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
221                      dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
222                      dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
223
224                IF ( def < 0.0_wp )  def = 0.0_wp
225
226                tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
227
228             ENDDO
229          ENDDO
230
231          IF ( constant_flux_layer )  THEN
232
233!
234!--          Position beneath wall
235!--          (2) - Will allways be executed.
236!--          'bottom and wall: use u_0,v_0 and wall functions'
237             DO  j = nys, nyn
238
239                IF ( ( wall_e_x(j,i) /= 0.0_wp ) .OR. ( wall_e_y(j,i) /= 0.0_wp ) ) &
240                THEN
241
242                   k = nzb_diff_s_inner(j,i) - 1
243                   dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
244                   dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - &
245                                     u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
246                   dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy
247                   dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - &
248                                     v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
249                   dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
250
251                   IF ( wall_e_y(j,i) /= 0.0_wp )  THEN
252!
253!--                   Inconsistency removed: as the thermal stratification is
254!--                   not taken into account for the evaluation of the wall
255!--                   fluxes at vertical walls, the eddy viscosity km must not
256!--                   be used for the evaluation of the velocity gradients dudy
257!--                   and dwdy
258!--                   Note: The validity of the new method has not yet been
259!--                         shown, as so far no suitable data for a validation
260!--                         has been available
261                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
262                                          usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp )
263                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
264                                          wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp )
265                      km_neutral = kappa * ( usvs(k)**2 + wsvs(k)**2 )**0.25_wp * &
266                                   0.5_wp * dy 
267                      IF ( km_neutral > 0.0_wp )  THEN
268                         dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
269                         dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
270                      ELSE
271                         dudy = 0.0_wp
272                         dwdy = 0.0_wp
273                      ENDIF
274                   ELSE
275                      dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
276                                         u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
277                      dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
278                                         w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
279                   ENDIF
280
281                   IF ( wall_e_x(j,i) /= 0.0_wp )  THEN
282!
283!--                   Inconsistency removed: as the thermal stratification is
284!--                   not taken into account for the evaluation of the wall
285!--                   fluxes at vertical walls, the eddy viscosity km must not
286!--                   be used for the evaluation of the velocity gradients dvdx
287!--                   and dwdx
288!--                   Note: The validity of the new method has not yet been
289!--                         shown, as so far no suitable data for a validation
290!--                         has been available
291                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
292                                          vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp )
293                      CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
294                                          wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp )
295                      km_neutral = kappa * ( vsus(k)**2 + wsus(k)**2 )**0.25_wp * &
296                                   0.5_wp * dx
297                      IF ( km_neutral > 0.0_wp )  THEN
298                         dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
299                         dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
300                      ELSE
301                         dvdx = 0.0_wp
302                         dwdx = 0.0_wp
303                      ENDIF
304                   ELSE
305                      dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
306                                         v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
307                      dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
308                                         w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
309                   ENDIF
310
311                   def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
312                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
313                         dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
314
315                   IF ( def < 0.0_wp )  def = 0.0_wp
316
317                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
318
319
320!
321!--                (3) - will be executed only, if there is at least one level
322!--                between (2) and (4), i.e. the topography must have a
323!--                minimum height of 2 dz. Wall fluxes for this case have
324!--                already been calculated for (2).
325!--                'wall only: use wall functions'
326
327                   DO  k = nzb_diff_s_inner(j,i), nzb_diff_s_outer(j,i)-2
328
329                      dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
330                      dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - &
331                                        u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
332                      dvdy =          ( v(k,j+1,i) - v(k,j,i)     ) * ddy
333                      dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - &
334                                        v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
335                      dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
336
337                      IF ( wall_e_y(j,i) /= 0.0_wp )  THEN
338!
339!--                      Inconsistency removed: as the thermal stratification
340!--                      is not taken into account for the evaluation of the
341!--                      wall fluxes at vertical walls, the eddy viscosity km
342!--                      must not be used for the evaluation of the velocity
343!--                      gradients dudy and dwdy
344!--                      Note: The validity of the new method has not yet
345!--                            been shown, as so far no suitable data for a
346!--                            validation has been available
347                         km_neutral = kappa * ( usvs(k)**2 + & 
348                                                wsvs(k)**2 )**0.25_wp * 0.5_wp * dy
349                         IF ( km_neutral > 0.0_wp )  THEN
350                            dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
351                            dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
352                         ELSE
353                            dudy = 0.0_wp
354                            dwdy = 0.0_wp
355                         ENDIF
356                      ELSE
357                         dudy = 0.25_wp * ( 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                         dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
360                                            w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
361                      ENDIF
362
363                      IF ( wall_e_x(j,i) /= 0.0_wp )  THEN
364!
365!--                      Inconsistency removed: as the thermal stratification
366!--                      is not taken into account for the evaluation of the
367!--                      wall fluxes at vertical walls, the eddy viscosity km
368!--                      must not be used for the evaluation of the velocity
369!--                      gradients dvdx and dwdx
370!--                      Note: The validity of the new method has not yet
371!--                            been shown, as so far no suitable data for a
372!--                            validation has been available
373                         km_neutral = kappa * ( vsus(k)**2 + & 
374                                                wsus(k)**2 )**0.25_wp * 0.5_wp * dx
375                         IF ( km_neutral > 0.0_wp )  THEN
376                            dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
377                            dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
378                         ELSE
379                            dvdx = 0.0_wp
380                            dwdx = 0.0_wp
381                         ENDIF
382                      ELSE
383                         dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
384                                            v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
385                         dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
386                                            w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
387                      ENDIF
388
389                      def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
390                           dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 +  &
391                           dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
392
393                      IF ( def < 0.0_wp )  def = 0.0_wp
394
395                      tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
396
397                   ENDDO
398
399                ENDIF
400
401             ENDDO
402
403!
404!--          (4) - will allways be executed.
405!--          'special case: free atmosphere' (as for case (0))
406             DO  j = nys, nyn
407
408                IF ( ( wall_e_x(j,i) /= 0.0_wp ) .OR. ( wall_e_y(j,i) /= 0.0_wp ) ) &
409                THEN
410
411                   k = nzb_diff_s_outer(j,i)-1
412
413                   dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
414                   dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
415                                       u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
416                   dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
417                                       u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
418
419                   dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
420                                       v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
421                   dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
422                   dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
423                                       v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
424
425                   dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
426                                       w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
427                   dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
428                                       w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
429                   dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
430
431                   def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
432                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
433                         dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
434
435                   IF ( def < 0.0_wp )  def = 0.0_wp
436
437                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
438
439                ENDIF
440
441             ENDDO
442
443!
444!--          Position without adjacent wall
445!--          (1) - will allways be executed.
446!--          'bottom only: use u_0,v_0'
447             DO  j = nys, nyn
448
449                IF ( ( wall_e_x(j,i) == 0.0_wp ) .AND. ( wall_e_y(j,i) == 0.0_wp ) ) &
450                THEN
451
452                   k = nzb_diff_s_inner(j,i)-1
453
454                   dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
455                   dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
456                                       u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
457                   dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
458                                       u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
459
460                   dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
461                                       v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
462                   dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
463                   dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
464                                       v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
465
466                   dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
467                                       w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
468                   dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
469                                       w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
470                   dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
471
472                   def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
473                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
474                         dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
475
476                   IF ( def < 0.0_wp )  def = 0.0_wp
477
478                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
479
480                ENDIF
481
482             ENDDO
483
484          ELSEIF ( use_surface_fluxes )  THEN
485
486             DO  j = nys, nyn
487
488                k = nzb_diff_s_outer(j,i)-1
489
490                dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
491                dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
492                                    u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
493                dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
494                                   u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
495
496                dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
497                                    v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
498                dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
499                dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
500                                    v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
501
502                dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
503                                    w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
504                dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
505                                    w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
506                dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
507
508                def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
509                      dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
510                      dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
511
512                IF ( def < 0.0_wp )  def = 0.0_wp
513
514                tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
515
516             ENDDO
517
518          ENDIF
519
520!
521!--       If required, calculate TKE production by buoyancy
522          IF ( .NOT. neutral )  THEN
523
524             IF ( .NOT. humidity )  THEN
525
526                IF ( use_single_reference_value )  THEN
527
528                   IF ( ocean )  THEN
529!
530!--                   So far in the ocean no special treatment of density flux
531!--                   in the bottom and top surface layer
532                      DO  j = nys, nyn
533                         DO  k = nzb_s_inner(j,i)+1, nzt
534                            tend(k,j,i) = tend(k,j,i) +                     &
535                                          kh(k,j,i) * g / rho_reference *   &
536                                          ( rho(k+1,j,i) - rho(k-1,j,i) ) * &
537                                          dd2zu(k)
538                         ENDDO
539                      ENDDO
540
541                   ELSE
542
543                      DO  j = nys, nyn
544                         DO  k = nzb_diff_s_inner(j,i), nzt_diff
545                            tend(k,j,i) = tend(k,j,i) -                   &
546                                          kh(k,j,i) * g / pt_reference *  &
547                                          ( pt(k+1,j,i) - pt(k-1,j,i) ) * &
548                                          dd2zu(k)
549                         ENDDO
550
551                         IF ( use_surface_fluxes )  THEN
552                            k = nzb_diff_s_inner(j,i)-1
553                            tend(k,j,i) = tend(k,j,i) + g / pt_reference * &
554                                                        shf(j,i)
555                         ENDIF
556
557                         IF ( use_top_fluxes )  THEN
558                            k = nzt
559                            tend(k,j,i) = tend(k,j,i) + g / pt_reference * &
560                                                        tswst(j,i)
561                         ENDIF
562                      ENDDO
563
564                   ENDIF
565
566                ELSE
567
568                   IF ( ocean )  THEN
569!
570!--                   So far in the ocean no special treatment of density flux
571!--                   in the bottom and top surface layer
572                      DO  j = nys, nyn
573                         DO  k = nzb_s_inner(j,i)+1, nzt
574                            tend(k,j,i) = tend(k,j,i) +                     &
575                                          kh(k,j,i) * g / rho(k,j,i) *      &
576                                          ( rho(k+1,j,i) - rho(k-1,j,i) ) * &
577                                          dd2zu(k)
578                         ENDDO
579                      ENDDO
580
581                   ELSE
582
583                      DO  j = nys, nyn
584                         DO  k = nzb_diff_s_inner(j,i), nzt_diff
585                            tend(k,j,i) = tend(k,j,i) -                   &
586                                          kh(k,j,i) * g / pt(k,j,i) *     &
587                                          ( pt(k+1,j,i) - pt(k-1,j,i) ) * &
588                                          dd2zu(k)
589                         ENDDO
590
591                         IF ( use_surface_fluxes )  THEN
592                            k = nzb_diff_s_inner(j,i)-1
593                            tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * &
594                                                        shf(j,i)
595                         ENDIF
596
597                         IF ( use_top_fluxes )  THEN
598                            k = nzt
599                            tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * &
600                                                        tswst(j,i)
601                         ENDIF
602                      ENDDO
603
604                   ENDIF
605
606                ENDIF
607
608             ELSE
609
610                DO  j = nys, nyn
611
612                   DO  k = nzb_diff_s_inner(j,i), nzt_diff
613
614                      IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
615                         k1 = 1.0_wp + 0.61_wp * q(k,j,i)
616                         k2 = 0.61_wp * pt(k,j,i)
617                         tend(k,j,i) = tend(k,j,i) - kh(k,j,i) *               &
618                                         g / vpt(k,j,i) *                      &
619                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +  &
620                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )    &
621                                         ) * dd2zu(k)
622                      ELSE IF ( cloud_physics )  THEN
623                         IF ( ql(k,j,i) == 0.0_wp )  THEN
624                            k1 = 1.0_wp + 0.61_wp * q(k,j,i)
625                            k2 = 0.61_wp * pt(k,j,i)
626                         ELSE
627                            theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
628                            temp  = theta * t_d_pt(k)
629                            k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *               &
630                                          ( q(k,j,i) - ql(k,j,i) ) *          &
631                                 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /        &
632                                 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *          &
633                                 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
634                            k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
635                         ENDIF
636                         tend(k,j,i) = tend(k,j,i) - kh(k,j,i) *               &
637                                         g / vpt(k,j,i) *                      &
638                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +  &
639                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )    &
640                                         ) * dd2zu(k)
641                      ELSE IF ( cloud_droplets )  THEN
642                         k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
643                         k2 = 0.61_wp * pt(k,j,i)
644                         tend(k,j,i) = tend(k,j,i) -                          & 
645                                       kh(k,j,i) * g / vpt(k,j,i) *           &
646                                       ( k1 * ( pt(k+1,j,i)- pt(k-1,j,i) ) +  &
647                                         k2 * ( q(k+1,j,i) -  q(k-1,j,i) ) -  &
648                                         pt(k,j,i) * ( ql(k+1,j,i) -          &
649                                         ql(k-1,j,i) ) ) * dd2zu(k)
650                      ENDIF
651
652                   ENDDO
653
654                ENDDO
655
656                IF ( use_surface_fluxes )  THEN
657
658                   DO  j = nys, nyn
659
660                      k = nzb_diff_s_inner(j,i)-1
661
662                      IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
663                         k1 = 1.0_wp + 0.61_wp * q(k,j,i)
664                         k2 = 0.61_wp * pt(k,j,i)
665                      ELSE IF ( cloud_physics )  THEN
666                         IF ( ql(k,j,i) == 0.0_wp )  THEN
667                            k1 = 1.0_wp + 0.61_wp * q(k,j,i)
668                            k2 = 0.61_wp * pt(k,j,i)
669                         ELSE
670                            theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
671                            temp  = theta * t_d_pt(k)
672                            k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *               &
673                                          ( q(k,j,i) - ql(k,j,i) ) *           &
674                                 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /      &
675                                 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *        &
676                                 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
677                            k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
678                         ENDIF
679                      ELSE IF ( cloud_droplets )  THEN
680                         k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
681                         k2 = 0.61_wp * pt(k,j,i)
682                      ENDIF
683
684                      tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
685                                            ( k1* shf(j,i) + k2 * qsws(j,i) )
686                   ENDDO
687
688                ENDIF
689
690                IF ( use_top_fluxes )  THEN
691
692                   DO  j = nys, nyn
693
694                      k = nzt
695
696                      IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
697                         k1 = 1.0_wp + 0.61_wp * q(k,j,i)
698                         k2 = 0.61_wp * pt(k,j,i)
699                      ELSE IF ( cloud_physics )  THEN
700                         IF ( ql(k,j,i) == 0.0_wp )  THEN
701                            k1 = 1.0_wp + 0.61_wp * q(k,j,i)
702                            k2 = 0.61_wp * pt(k,j,i)
703                         ELSE
704                            theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
705                            temp  = theta * t_d_pt(k)
706                            k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *               &
707                                          ( q(k,j,i) - ql(k,j,i) ) *           &
708                                 ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /      &
709                                 ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *        &
710                                 ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
711                            k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
712                         ENDIF
713                      ELSE IF ( cloud_droplets )  THEN
714                         k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
715                         k2 = 0.61_wp * pt(k,j,i)
716                      ENDIF
717
718                      tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
719                                            ( k1* tswst(j,i) + k2 * qswst(j,i) )
720                   ENDDO
721
722                ENDIF
723
724             ENDIF
725
726          ENDIF
727
728       ENDDO
729
730    END SUBROUTINE production_e
731
732
733!------------------------------------------------------------------------------!
734! Description:
735! ------------
736!> Call for all grid points - accelerator version
737!------------------------------------------------------------------------------!
738    SUBROUTINE production_e_acc
739
740       USE arrays_3d,                                                          &
741           ONLY:  ddzw, dd2zu, kh, km, pt, q, ql, qsws, qswst, rho, shf,       &
742                  tend, tswst, u, v, vpt, w
743
744       USE cloud_parameters,                                                   &
745           ONLY:  l_d_cp, l_d_r, pt_d_t, t_d_pt
746
747       USE control_parameters,                                                 &
748           ONLY:  cloud_droplets, cloud_physics, constant_flux_layer, g,       &
749                  humidity, kappa, neutral, ocean, pt_reference,               &
750                  rho_reference, topography, use_single_reference_value,       &
751                  use_surface_fluxes, use_top_fluxes
752
753       USE grid_variables,                                                     &
754           ONLY:  ddx, dx, ddy, dy, wall_e_x, wall_e_y
755
756       USE indices,                                                            &
757           ONLY:  i_left, i_right, j_north, j_south, nxl, nxr, nys, nyn, nzb,  &
758                  nzb_diff_s_inner, nzb_diff_s_outer, nzb_s_inner, nzt,        &
759                  nzt_diff
760
761       IMPLICIT NONE
762
763       INTEGER(iwp) ::  i           !<
764       INTEGER(iwp) ::  j           !<
765       INTEGER(iwp) ::  k           !<
766
767       REAL(wp)     ::  def         !<
768       REAL(wp)     ::  dudx        !<
769       REAL(wp)     ::  dudy        !<
770       REAL(wp)     ::  dudz        !<
771       REAL(wp)     ::  dvdx        !<
772       REAL(wp)     ::  dvdy        !<
773       REAL(wp)     ::  dvdz        !<
774       REAL(wp)     ::  dwdx        !<
775       REAL(wp)     ::  dwdy        !<
776       REAL(wp)     ::  dwdz        !<
777       REAL(wp)     ::  k1          !<
778       REAL(wp)     ::  k2          !<
779       REAL(wp)     ::  km_neutral  !<
780       REAL(wp)     ::  theta       !<
781       REAL(wp)     ::  temp        !<
782
783       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  usvs  !<
784       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  vsus  !<
785       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  wsus  !<
786       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  wsvs  !<
787       !$acc declare create ( usvs, vsus, wsus, wsvs )
788
789!
790!--    First calculate horizontal momentum flux u'v', w'v', v'u', w'u' at
791!--    vertical walls, if neccessary
792!--    CAUTION: results are slightly different from the ij-version!!
793!--    ij-version should be called further below within the ij-loops!!
794       IF ( topography /= 'flat' )  THEN
795          CALL wall_fluxes_e_acc( usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, wall_e_y )
796          CALL wall_fluxes_e_acc( wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp, wall_e_y )
797          CALL wall_fluxes_e_acc( vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp, wall_e_x )
798          CALL wall_fluxes_e_acc( wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp, wall_e_x )
799       ENDIF
800
801
802!
803!--    Calculate TKE production by shear
804       !$acc kernels present( ddzw, dd2zu, kh, km, nzb_diff_s_inner, nzb_diff_s_outer ) &
805       !$acc         present( nzb_s_inner, pt, q, ql, qsws, qswst, rho )                &
806       !$acc         present( shf, tend, tswst, u, v, vpt, w, wall_e_x, wall_e_y )      &
807       !$acc         copyin( u_0, v_0 )
808       DO  i = i_left, i_right
809          DO  j = j_south, j_north
810             DO  k = 1, nzt
811
812                IF ( k >= nzb_diff_s_outer(j,i) )  THEN
813
814                   dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
815                   dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
816                                       u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
817                   dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
818                                       u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
819
820                   dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
821                                       v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
822                   dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
823                   dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
824                                       v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
825
826                   dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
827                                       w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
828                   dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
829                                       w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
830                   dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
831
832                   def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
833                         dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
834                         dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
835
836                   IF ( def < 0.0_wp )  def = 0.0_wp
837
838                   tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
839
840                ENDIF
841
842             ENDDO
843          ENDDO
844       ENDDO
845
846       IF ( constant_flux_layer )  THEN
847
848!
849!--       Position beneath wall
850!--       (2) - Will allways be executed.
851!--       'bottom and wall: use u_0,v_0 and wall functions'
852          DO  i = i_left, i_right
853             DO  j = j_south, j_north
854                DO  k = 1, nzt
855
856                   IF ( ( wall_e_x(j,i) /= 0.0_wp ).OR.( wall_e_y(j,i) /= 0.0_wp ) ) &
857                   THEN
858
859                      IF ( k == nzb_diff_s_inner(j,i) - 1 )  THEN
860                         dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
861                         dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - &
862                                           u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
863                         dvdy = ( v(k,j+1,i) - v(k,j,i) ) * ddy
864                         dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - &
865                                           v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
866                         dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
867
868                         IF ( wall_e_y(j,i) /= 0.0_wp )  THEN
869!
870!--                         Inconsistency removed: as the thermal stratification is
871!--                         not taken into account for the evaluation of the wall
872!--                         fluxes at vertical walls, the eddy viscosity km must not
873!--                         be used for the evaluation of the velocity gradients dudy
874!--                         and dwdy
875!--                         Note: The validity of the new method has not yet been
876!--                               shown, as so far no suitable data for a validation
877!--                               has been available
878!                            CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
879!                                                usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp )
880!                            CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
881!                                                wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp )
882                            km_neutral = kappa *                                    &
883                                        ( usvs(k,j,i)**2 + wsvs(k,j,i)**2 )**0.25_wp * &
884                                         0.5_wp * dy
885                            IF ( km_neutral > 0.0_wp )  THEN
886                               dudy = - wall_e_y(j,i) * usvs(k,j,i) / km_neutral
887                               dwdy = - wall_e_y(j,i) * wsvs(k,j,i) / km_neutral
888                            ELSE
889                               dudy = 0.0_wp
890                               dwdy = 0.0_wp
891                            ENDIF
892                         ELSE
893                            dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
894                                               u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
895                            dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
896                                               w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
897                         ENDIF
898
899                         IF ( wall_e_x(j,i) /= 0.0_wp )  THEN
900!
901!--                         Inconsistency removed: as the thermal stratification is
902!--                         not taken into account for the evaluation of the wall
903!--                         fluxes at vertical walls, the eddy viscosity km must not
904!--                         be used for the evaluation of the velocity gradients dvdx
905!--                         and dwdx
906!--                         Note: The validity of the new method has not yet been
907!--                               shown, as so far no suitable data for a validation
908!--                               has been available
909!                            CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
910!                                                vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp )
911!                            CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
912!                                                wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp )
913                            km_neutral = kappa *                                     &
914                                         ( vsus(k,j,i)**2 + wsus(k,j,i)**2 )**0.25_wp * &
915                                         0.5_wp * dx
916                            IF ( km_neutral > 0.0_wp )  THEN
917                               dvdx = - wall_e_x(j,i) * vsus(k,j,i) / km_neutral
918                               dwdx = - wall_e_x(j,i) * wsus(k,j,i) / km_neutral
919                            ELSE
920                               dvdx = 0.0_wp
921                               dwdx = 0.0_wp
922                            ENDIF
923                         ELSE
924                            dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
925                                               v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
926                            dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
927                                               w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
928                         ENDIF
929
930                         def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
931                               dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
932                               dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
933
934                         IF ( def < 0.0_wp )  def = 0.0_wp
935
936                         tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
937
938                      ENDIF
939!
940!--                   (3) - will be executed only, if there is at least one level
941!--                   between (2) and (4), i.e. the topography must have a
942!--                   minimum height of 2 dz. Wall fluxes for this case have
943!--                   already been calculated for (2).
944!--                   'wall only: use wall functions'
945
946                      IF ( k >= nzb_diff_s_inner(j,i)  .AND.  &
947                           k <= nzb_diff_s_outer(j,i)-2 )  THEN
948
949                         dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
950                         dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - &
951                                           u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
952                         dvdy =          ( v(k,j+1,i) - v(k,j,i)     ) * ddy
953                         dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - &
954                                           v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
955                         dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
956
957                         IF ( wall_e_y(j,i) /= 0.0_wp )  THEN
958!
959!--                         Inconsistency removed: as the thermal stratification
960!--                         is not taken into account for the evaluation of the
961!--                         wall fluxes at vertical walls, the eddy viscosity km
962!--                         must not be used for the evaluation of the velocity
963!--                         gradients dudy and dwdy
964!--                         Note: The validity of the new method has not yet
965!--                               been shown, as so far no suitable data for a
966!--                               validation has been available
967                            km_neutral = kappa * ( usvs(k,j,i)**2 + &
968                                                   wsvs(k,j,i)**2 )**0.25_wp * 0.5_wp * dy
969                            IF ( km_neutral > 0.0_wp )  THEN
970                               dudy = - wall_e_y(j,i) * usvs(k,j,i) / km_neutral
971                               dwdy = - wall_e_y(j,i) * wsvs(k,j,i) / km_neutral
972                            ELSE
973                               dudy = 0.0_wp
974                               dwdy = 0.0_wp
975                            ENDIF
976                         ELSE
977                            dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
978                                               u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
979                            dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
980                                               w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
981                         ENDIF
982
983                         IF ( wall_e_x(j,i) /= 0.0_wp )  THEN
984!
985!--                         Inconsistency removed: as the thermal stratification
986!--                         is not taken into account for the evaluation of the
987!--                         wall fluxes at vertical walls, the eddy viscosity km
988!--                         must not be used for the evaluation of the velocity
989!--                         gradients dvdx and dwdx
990!--                         Note: The validity of the new method has not yet
991!--                               been shown, as so far no suitable data for a
992!--                               validation has been available
993                            km_neutral = kappa * ( vsus(k,j,i)**2 + &
994                                                   wsus(k,j,i)**2 )**0.25_wp * 0.5_wp * dx
995                            IF ( km_neutral > 0.0_wp )  THEN
996                               dvdx = - wall_e_x(j,i) * vsus(k,j,i) / km_neutral
997                               dwdx = - wall_e_x(j,i) * wsus(k,j,i) / km_neutral
998                            ELSE
999                               dvdx = 0.0_wp
1000                               dwdx = 0.0_wp
1001                            ENDIF
1002                         ELSE
1003                            dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1004                                               v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1005                            dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1006                                               w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1007                         ENDIF
1008
1009                         def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1010                              dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 +  &
1011                              dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1012
1013                         IF ( def < 0.0_wp )  def = 0.0_wp
1014
1015                         tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1016
1017                      ENDIF
1018
1019!
1020!--                   (4) - will allways be executed.
1021!--                   'special case: free atmosphere' (as for case (0))
1022                      IF ( k == nzb_diff_s_outer(j,i)-1 )  THEN
1023
1024                         dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1025                         dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1026                                             u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1027                         dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1028                                             u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
1029
1030                         dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1031                                             v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1032                         dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1033                         dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1034                                             v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
1035
1036                         dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1037                                             w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1038                         dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1039                                             w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1040                         dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1041
1042                         def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1043                               dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1044                               dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1045
1046                         IF ( def < 0.0_wp )  def = 0.0_wp
1047
1048                         tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1049
1050                      ENDIF
1051
1052                   ENDIF
1053
1054                ENDDO
1055             ENDDO
1056          ENDDO
1057
1058!
1059!--       Position without adjacent wall
1060!--       (1) - will allways be executed.
1061!--       'bottom only: use u_0,v_0'
1062          DO  i = i_left, i_right
1063             DO  j = j_south, j_north
1064                DO  k = 1, nzt
1065
1066                   IF ( ( wall_e_x(j,i) == 0.0_wp ) .AND. ( wall_e_y(j,i) == 0.0_wp ) ) &
1067                   THEN
1068
1069                      IF ( k == nzb_diff_s_inner(j,i)-1 )  THEN
1070
1071                         dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1072                         dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1073                                             u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1074                         dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1075                                             u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
1076
1077                         dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1078                                             v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1079                         dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1080                         dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1081                                             v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
1082
1083                         dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1084                                             w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1085                         dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1086                                             w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1087                         dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1088
1089                         def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1090                               dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1091                               dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1092
1093                         IF ( def < 0.0_wp )  def = 0.0_wp
1094
1095                         tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1096
1097                      ENDIF
1098
1099                   ENDIF
1100
1101                ENDDO
1102             ENDDO
1103          ENDDO
1104
1105       ELSEIF ( use_surface_fluxes )  THEN
1106
1107          DO  i = i_left, i_right
1108             DO  j = j_south, j_north
1109                 DO  k = 1, nzt
1110
1111                   IF ( k == nzb_diff_s_outer(j,i)-1 )  THEN
1112
1113                      dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1114                      dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1115                                          u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1116                      dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1117                                          u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
1118
1119                      dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1120                                          v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1121                      dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1122                      dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1123                                          v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
1124
1125                      dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1126                                          w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1127                      dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1128                                          w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1129                      dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1130
1131                      def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1132                            dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1133                            dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1134
1135                      IF ( def < 0.0_wp )  def = 0.0_wp
1136
1137                      tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1138
1139                   ENDIF
1140
1141                ENDDO
1142             ENDDO
1143          ENDDO
1144
1145       ENDIF
1146
1147!
1148!--    If required, calculate TKE production by buoyancy
1149       IF ( .NOT. neutral )  THEN
1150
1151          IF ( .NOT. humidity )  THEN
1152
1153             IF ( use_single_reference_value )  THEN
1154
1155                IF ( ocean )  THEN
1156!
1157!--                So far in the ocean no special treatment of density flux
1158!--                in the bottom and top surface layer
1159                   DO  i = i_left, i_right
1160                      DO  j = j_south, j_north
1161                         DO  k = 1, nzt
1162                            IF ( k > nzb_s_inner(j,i) )  THEN
1163                               tend(k,j,i) = tend(k,j,i) +                     &
1164                                             kh(k,j,i) * g / rho_reference *   &
1165                                             ( rho(k+1,j,i) - rho(k-1,j,i) ) * &
1166                                             dd2zu(k)
1167                            ENDIF
1168                         ENDDO
1169                      ENDDO
1170                   ENDDO
1171
1172                ELSE
1173
1174                   DO  i = i_left, i_right
1175                      DO  j = j_south, j_north
1176                         DO  k = 1, nzt_diff
1177                            IF ( k >= nzb_diff_s_inner(j,i) )  THEN
1178                               tend(k,j,i) = tend(k,j,i) -                   &
1179                                             kh(k,j,i) * g / pt_reference *  &
1180                                             ( pt(k+1,j,i) - pt(k-1,j,i) ) * &
1181                                             dd2zu(k)
1182                            ENDIF
1183
1184                            IF ( k == nzb_diff_s_inner(j,i)-1  .AND.  &
1185                                 use_surface_fluxes )  THEN
1186                               tend(k,j,i) = tend(k,j,i) + g / pt_reference * &
1187                                                           shf(j,i)
1188                            ENDIF
1189
1190                            IF ( k == nzt  .AND.  use_top_fluxes )  THEN
1191                               tend(k,j,i) = tend(k,j,i) + g / pt_reference * &
1192                                                           tswst(j,i)
1193                            ENDIF
1194                         ENDDO
1195                      ENDDO
1196                   ENDDO
1197
1198                ENDIF
1199
1200             ELSE
1201
1202                IF ( ocean )  THEN
1203!
1204!--                So far in the ocean no special treatment of density flux
1205!--                in the bottom and top surface layer
1206                   DO  i = i_left, i_right
1207                      DO  j = j_south, j_north
1208                         DO  k = 1, nzt
1209                            IF ( k > nzb_s_inner(j,i) )  THEN
1210                               tend(k,j,i) = tend(k,j,i) +                     &
1211                                             kh(k,j,i) * g / rho(k,j,i) *      &
1212                                             ( rho(k+1,j,i) - rho(k-1,j,i) ) * &
1213                                             dd2zu(k)
1214                            ENDIF
1215                         ENDDO
1216                      ENDDO
1217                   ENDDO
1218
1219                ELSE
1220
1221                   DO  i = i_left, i_right
1222                      DO  j = j_south, j_north
1223                         DO  k = 1, nzt_diff
1224                            IF( k >= nzb_diff_s_inner(j,i) )  THEN
1225                               tend(k,j,i) = tend(k,j,i) -                   &
1226                                             kh(k,j,i) * g / pt(k,j,i) *     &
1227                                             ( pt(k+1,j,i) - pt(k-1,j,i) ) * &
1228                                             dd2zu(k)
1229                            ENDIF
1230
1231                            IF (  k == nzb_diff_s_inner(j,i)-1  .AND.  &
1232                                  use_surface_fluxes )  THEN
1233                               tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * &
1234                                                           shf(j,i)
1235                            ENDIF
1236
1237                            IF ( k == nzt  .AND.  use_top_fluxes )  THEN
1238                               tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * &
1239                                                           tswst(j,i)
1240                            ENDIF
1241                         ENDDO
1242                      ENDDO
1243                   ENDDO
1244
1245                ENDIF
1246
1247             ENDIF
1248
1249          ELSE
1250!
1251!++          This part gives the PGI compiler problems in the previous loop
1252!++          even without any acc statements????
1253!             STOP '+++ production_e problems with acc-directives'
1254!             !acc loop
1255!             DO  i = nxl, nxr
1256!                DO  j = nys, nyn
1257!                   !acc loop vector
1258!                   DO  k = 1, nzt_diff
1259!
1260!                      IF ( k >= nzb_diff_s_inner(j,i) )  THEN
1261!
1262!                         IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
1263!                            k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1264!                            k2 = 0.61_wp * pt(k,j,i)
1265!                            tend(k,j,i) = tend(k,j,i) - kh(k,j,i) *               &
1266!                                            g / vpt(k,j,i) *                      &
1267!                                            ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +  &
1268!                                              k2 * ( q(k+1,j,i) - q(k-1,j,i) )    &
1269!                                            ) * dd2zu(k)
1270!                         ELSE IF ( cloud_physics )  THEN
1271!                            IF ( ql(k,j,i) == 0.0_wp )  THEN
1272!                               k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1273!                               k2 = 0.61_wp * pt(k,j,i)
1274!                            ELSE
1275!                               theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1276!                               temp  = theta * t_d_pt(k)
1277!                               k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *                 &
1278!                                             ( q(k,j,i) - ql(k,j,i) ) *          &
1279!                                    ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /        &
1280!                                    ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *          &
1281!                                    ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1282!                               k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
1283!                            ENDIF
1284!                            tend(k,j,i) = tend(k,j,i) - kh(k,j,i) *               &
1285!                                            g / vpt(k,j,i) *                      &
1286!                                            ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +  &
1287!                                              k2 * ( q(k+1,j,i) - q(k-1,j,i) )    &
1288!                                            ) * dd2zu(k)
1289!                         ELSE IF ( cloud_droplets )  THEN
1290!                            k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
1291!                            k2 = 0.61_wp * pt(k,j,i)
1292!                            tend(k,j,i) = tend(k,j,i) -                          &
1293!                                          kh(k,j,i) * g / vpt(k,j,i) *           &
1294!                                          ( k1 * ( pt(k+1,j,i)- pt(k-1,j,i) ) +  &
1295!                                            k2 * ( q(k+1,j,i) -  q(k-1,j,i) ) -  &
1296!                                            pt(k,j,i) * ( ql(k+1,j,i) -          &
1297!                                            ql(k-1,j,i) ) ) * dd2zu(k)
1298!                         ENDIF
1299!
1300!                      ENDIF
1301!
1302!                   ENDDO
1303!                ENDDO
1304!             ENDDO
1305!
1306
1307!!++          Next two loops are probably very inefficiently parallellized
1308!!++          and will require better optimization
1309!             IF ( use_surface_fluxes )  THEN
1310!
1311!                !acc loop
1312!                DO  i = nxl, nxr
1313!                   DO  j = nys, nyn
1314!                      !acc loop vector
1315!                      DO  k = 1, nzt_diff
1316!
1317!                         IF ( k == nzb_diff_s_inner(j,i)-1 )  THEN
1318!
1319!                            IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
1320!                               k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1321!                               k2 = 0.61_wp * pt(k,j,i)
1322!                            ELSE IF ( cloud_physics )  THEN
1323!                               IF ( ql(k,j,i) == 0.0_wp )  THEN
1324!                                  k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1325!                                  k2 = 0.61_wp * pt(k,j,i)
1326!                               ELSE
1327!                                  theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1328!                                  temp  = theta * t_d_pt(k)
1329!                                  k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *        &
1330!                                                ( q(k,j,i) - ql(k,j,i) ) *    &
1331!                                       ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /&
1332!                                       ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * &
1333!                                       ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1334!                                  k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
1335!                               ENDIF
1336!                            ELSE IF ( cloud_droplets )  THEN
1337!                               k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
1338!                               k2 = 0.61_wp * pt(k,j,i)
1339!                            ENDIF
1340!
1341!                            tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
1342!                                                  ( k1* shf(j,i) + k2 * qsws(j,i) )
1343!                         ENDIF
1344!
1345!                      ENDDO
1346!                   ENDDO
1347!                ENDDO
1348!
1349!             ENDIF
1350!
1351!             IF ( use_top_fluxes )  THEN
1352!
1353!                !acc loop
1354!                DO  i = nxl, nxr
1355!                   DO  j = nys, nyn
1356!                      !acc loop vector
1357!                      DO  k = 1, nzt
1358!                         IF ( k == nzt )  THEN
1359!
1360!                            IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets ) THEN
1361!                               k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1362!                               k2 = 0.61_wp * pt(k,j,i)
1363!                            ELSE IF ( cloud_physics )  THEN
1364!                               IF ( ql(k,j,i) == 0.0_wp )  THEN
1365!                                  k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1366!                                  k2 = 0.61_wp * pt(k,j,i)
1367!                               ELSE
1368!                                  theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1369!                                  temp  = theta * t_d_pt(k)
1370!                                  k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *        &
1371!                                                ( q(k,j,i) - ql(k,j,i) ) *    &
1372!                                       ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /&
1373!                                       ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp * &
1374!                                       ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1375!                                  k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
1376!                               ENDIF
1377!                            ELSE IF ( cloud_droplets )  THEN
1378!                               k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
1379!                               k2 = 0.61_wp * pt(k,j,i)
1380!                            ENDIF
1381!
1382!                            tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
1383!                                                  ( k1* tswst(j,i) + k2 * qswst(j,i) )
1384!
1385!                         ENDIF
1386!
1387!                      ENDDO
1388!                   ENDDO
1389!                ENDDO
1390!
1391!             ENDIF
1392
1393          ENDIF
1394
1395       ENDIF
1396       !$acc end kernels
1397
1398    END SUBROUTINE production_e_acc
1399
1400
1401!------------------------------------------------------------------------------!
1402! Description:
1403! ------------
1404!> Call for grid point i,j
1405!------------------------------------------------------------------------------!
1406    SUBROUTINE production_e_ij( i, j )
1407
1408       USE arrays_3d,                                                          &
1409           ONLY:  ddzw, dd2zu, kh, km, pt, q, ql, qsws, qswst, rho, shf,       &
1410                  tend, tswst, u, v, vpt, w
1411
1412       USE cloud_parameters,                                                   &
1413           ONLY:  l_d_cp, l_d_r, pt_d_t, t_d_pt
1414
1415       USE control_parameters,                                                 &
1416           ONLY:  cloud_droplets, cloud_physics, constant_flux_layer, g,       &
1417                  humidity, kappa, neutral, ocean, pt_reference,               &
1418                  rho_reference, use_single_reference_value,                   &
1419                  use_surface_fluxes, use_top_fluxes
1420
1421       USE grid_variables,                                                     &
1422           ONLY:  ddx, dx, ddy, dy, wall_e_x, wall_e_y
1423
1424       USE indices,                                                            &
1425           ONLY:  nxl, nxr, nys, nyn, nzb, nzb_diff_s_inner,                   &
1426                  nzb_diff_s_outer, nzb_s_inner, nzt, nzt_diff
1427
1428       IMPLICIT NONE
1429
1430       INTEGER(iwp) ::  i           !<
1431       INTEGER(iwp) ::  j           !<
1432       INTEGER(iwp) ::  k           !<
1433
1434       REAL(wp)     ::  def         !<
1435       REAL(wp)     ::  dudx        !<
1436       REAL(wp)     ::  dudy        !<
1437       REAL(wp)     ::  dudz        !<
1438       REAL(wp)     ::  dvdx        !<
1439       REAL(wp)     ::  dvdy        !<
1440       REAL(wp)     ::  dvdz        !<
1441       REAL(wp)     ::  dwdx        !<
1442       REAL(wp)     ::  dwdy        !<
1443       REAL(wp)     ::  dwdz        !<
1444       REAL(wp)     ::  k1          !<
1445       REAL(wp)     ::  k2          !<
1446       REAL(wp)     ::  km_neutral  !<
1447       REAL(wp)     ::  theta       !<
1448       REAL(wp)     ::  temp        !<
1449
1450       REAL(wp), DIMENSION(nzb:nzt+1) ::  usvs  !<
1451       REAL(wp), DIMENSION(nzb:nzt+1) ::  vsus  !<
1452       REAL(wp), DIMENSION(nzb:nzt+1) ::  wsus  !<
1453       REAL(wp), DIMENSION(nzb:nzt+1) ::  wsvs  !<
1454
1455!
1456!--    Calculate TKE production by shear
1457       DO  k = nzb_diff_s_outer(j,i), nzt
1458
1459          dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1460          dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1461                              u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1462          dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1463                              u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
1464
1465          dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1466                              v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1467          dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1468          dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1469                              v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
1470
1471          dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1472                              w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1473          dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1474                              w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1475          dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1476
1477          def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 )                       &
1478                + dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + dvdz**2    &
1479                + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1480
1481          IF ( def < 0.0_wp )  def = 0.0_wp
1482
1483          tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1484
1485       ENDDO
1486
1487       IF ( constant_flux_layer )  THEN
1488
1489          IF ( ( wall_e_x(j,i) /= 0.0_wp ) .OR. ( wall_e_y(j,i) /= 0.0_wp ) )  THEN
1490
1491!
1492!--          Position beneath wall
1493!--          (2) - Will allways be executed.
1494!--          'bottom and wall: use u_0,v_0 and wall functions'
1495             k = nzb_diff_s_inner(j,i)-1
1496
1497             dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
1498             dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1499                               u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
1500             dvdy =          ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1501             dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1502                               v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
1503             dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
1504
1505             IF ( wall_e_y(j,i) /= 0.0_wp )  THEN
1506!
1507!--             Inconsistency removed: as the thermal stratification
1508!--             is not taken into account for the evaluation of the
1509!--             wall fluxes at vertical walls, the eddy viscosity km
1510!--             must not be used for the evaluation of the velocity
1511!--             gradients dudy and dwdy
1512!--             Note: The validity of the new method has not yet
1513!--                   been shown, as so far no suitable data for a
1514!--                   validation has been available
1515                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
1516                                    usvs, 1.0_wp, 0.0_wp, 0.0_wp, 0.0_wp )
1517                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
1518                                    wsvs, 0.0_wp, 0.0_wp, 1.0_wp, 0.0_wp )
1519                km_neutral = kappa * ( usvs(k)**2 + wsvs(k)**2 )**0.25_wp * &
1520                             0.5_wp * dy
1521                IF ( km_neutral > 0.0_wp )  THEN
1522                   dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
1523                   dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
1524                ELSE
1525                   dudy = 0.0_wp
1526                   dwdy = 0.0_wp
1527                ENDIF
1528             ELSE
1529                dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1530                                   u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1531                dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1532                                   w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1533             ENDIF
1534
1535             IF ( wall_e_x(j,i) /= 0.0_wp )  THEN
1536!
1537!--             Inconsistency removed: as the thermal stratification
1538!--             is not taken into account for the evaluation of the
1539!--             wall fluxes at vertical walls, the eddy viscosity km
1540!--             must not be used for the evaluation of the velocity
1541!--             gradients dvdx and dwdx
1542!--             Note: The validity of the new method has not yet
1543!--                   been shown, as so far no suitable data for a
1544!--                   validation has been available
1545                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
1546                                    vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp )
1547                CALL wall_fluxes_e( i, j, k, nzb_diff_s_outer(j,i)-2, &
1548                                    wsus, 0.0_wp, 0.0_wp, 0.0_wp, 1.0_wp )
1549                km_neutral = kappa * ( vsus(k)**2 + wsus(k)**2 )**0.25_wp * & 
1550                             0.5_wp * dx
1551                IF ( km_neutral > 0.0_wp )  THEN
1552                   dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
1553                   dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
1554                ELSE
1555                   dvdx = 0.0_wp
1556                   dwdx = 0.0_wp
1557                ENDIF
1558             ELSE
1559                dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1560                                   v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1561                dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1562                                   w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1563             ENDIF
1564
1565             def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1566                   dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1567                   dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1568
1569             IF ( def < 0.0_wp )  def = 0.0_wp
1570
1571             tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1572
1573!
1574!--          (3) - will be executed only, if there is at least one level
1575!--          between (2) and (4), i.e. the topography must have a
1576!--          minimum height of 2 dz. Wall fluxes for this case have
1577!--          already been calculated for (2).
1578!--          'wall only: use wall functions'
1579             DO  k = nzb_diff_s_inner(j,i), nzb_diff_s_outer(j,i)-2
1580
1581                dudx = ( u(k,j,i+1) - u(k,j,i) ) * ddx
1582                dudz = 0.5_wp * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1583                                  u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
1584                dvdy =          ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1585                dvdz = 0.5_wp * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1586                                  v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
1587                dwdz = ( w(k,j,i) - w(k-1,j,i) ) * ddzw(k)
1588
1589                IF ( wall_e_y(j,i) /= 0.0_wp )  THEN
1590!
1591!--                Inconsistency removed: as the thermal stratification
1592!--                is not taken into account for the evaluation of the
1593!--                wall fluxes at vertical walls, the eddy viscosity km
1594!--                must not be used for the evaluation of the velocity
1595!--                gradients dudy and dwdy
1596!--                Note: The validity of the new method has not yet
1597!--                      been shown, as so far no suitable data for a
1598!--                      validation has been available
1599                   km_neutral = kappa * ( usvs(k)**2 + & 
1600                                          wsvs(k)**2 )**0.25_wp * 0.5_wp * dy
1601                   IF ( km_neutral > 0.0_wp )  THEN
1602                      dudy = - wall_e_y(j,i) * usvs(k) / km_neutral
1603                      dwdy = - wall_e_y(j,i) * wsvs(k) / km_neutral
1604                   ELSE
1605                      dudy = 0.0_wp
1606                      dwdy = 0.0_wp
1607                   ENDIF
1608                ELSE
1609                   dudy = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1610                                      u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1611                   dwdy = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1612                                      w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1613                ENDIF
1614
1615                IF ( wall_e_x(j,i) /= 0.0_wp )  THEN
1616!
1617!--                Inconsistency removed: as the thermal stratification
1618!--                is not taken into account for the evaluation of the
1619!--                wall fluxes at vertical walls, the eddy viscosity km
1620!--                must not be used for the evaluation of the velocity
1621!--                gradients dvdx and dwdx
1622!--                Note: The validity of the new method has not yet
1623!--                      been shown, as so far no suitable data for a
1624!--                      validation has been available
1625                   km_neutral = kappa * ( vsus(k)**2 + & 
1626                                          wsus(k)**2 )**0.25_wp * 0.5_wp * dx
1627                   IF ( km_neutral > 0.0_wp )  THEN
1628                      dvdx = - wall_e_x(j,i) * vsus(k) / km_neutral
1629                      dwdx = - wall_e_x(j,i) * wsus(k) / km_neutral
1630                   ELSE
1631                      dvdx = 0.0_wp
1632                      dwdx = 0.0_wp
1633                   ENDIF
1634                ELSE
1635                   dvdx = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1636                                      v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1637                   dwdx = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1638                                      w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1639                ENDIF
1640
1641                def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1642                      dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1643                      dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1644
1645                IF ( def < 0.0_wp )  def = 0.0_wp
1646
1647                tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1648
1649             ENDDO
1650
1651!
1652!--          (4) - will allways be executed.
1653!--          'special case: free atmosphere' (as for case (0))
1654             k = nzb_diff_s_outer(j,i)-1
1655
1656             dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1657             dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1658                                 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1659             dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1660                                 u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
1661
1662             dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1663                                 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1664             dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1665             dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1666                                 v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
1667
1668             dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1669                                 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1670             dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1671                                 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1672             dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1673
1674             def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +        &
1675                   dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1676                   dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1677
1678             IF ( def < 0.0_wp )  def = 0.0_wp
1679
1680             tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1681
1682          ELSE
1683
1684!
1685!--          Position without adjacent wall
1686!--          (1) - will allways be executed.
1687!--          'bottom only: use u_0,v_0'
1688             k = nzb_diff_s_inner(j,i)-1
1689
1690             dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1691             dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1692                                 u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1693             dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1694                                 u_0(j,i)   - u_0(j,i+1)   ) * dd2zu(k)
1695
1696             dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1697                                 v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1698             dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1699             dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1700                                 v_0(j,i)   - v_0(j+1,i)   ) * dd2zu(k)
1701
1702             dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1703                                 w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1704             dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1705                                 w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1706             dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1707
1708             def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 )                       &
1709                   + dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + dvdz**2 &
1710                   + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1711
1712             IF ( def < 0.0_wp )  def = 0.0_wp
1713
1714             tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1715
1716          ENDIF
1717
1718       ELSEIF ( use_surface_fluxes )  THEN
1719
1720          k = nzb_diff_s_outer(j,i)-1
1721
1722          dudx  =           ( u(k,j,i+1) - u(k,j,i)     ) * ddx
1723          dudy  = 0.25_wp * ( u(k,j+1,i) + u(k,j+1,i+1) - &
1724                              u(k,j-1,i) - u(k,j-1,i+1) ) * ddy
1725          dudz  = 0.5_wp  * ( u(k+1,j,i) + u(k+1,j,i+1) - &
1726                              u(k-1,j,i) - u(k-1,j,i+1) ) * dd2zu(k)
1727
1728          dvdx  = 0.25_wp * ( v(k,j,i+1) + v(k,j+1,i+1) - &
1729                              v(k,j,i-1) - v(k,j+1,i-1) ) * ddx
1730          dvdy  =           ( v(k,j+1,i) - v(k,j,i)     ) * ddy
1731          dvdz  = 0.5_wp  * ( v(k+1,j,i) + v(k+1,j+1,i) - &
1732                              v(k-1,j,i) - v(k-1,j+1,i) ) * dd2zu(k)
1733
1734          dwdx  = 0.25_wp * ( w(k,j,i+1) + w(k-1,j,i+1) - &
1735                              w(k,j,i-1) - w(k-1,j,i-1) ) * ddx
1736          dwdy  = 0.25_wp * ( w(k,j+1,i) + w(k-1,j+1,i) - &
1737                              w(k,j-1,i) - w(k-1,j-1,i) ) * ddy
1738          dwdz  =           ( w(k,j,i)   - w(k-1,j,i)   ) * ddzw(k)
1739
1740          def = 2.0_wp * ( dudx**2 + dvdy**2 + dwdz**2 ) +           &
1741                dudy**2 + dvdx**2 + dwdx**2 + dwdy**2 + dudz**2 + &
1742                dvdz**2 + 2.0_wp * ( dvdx*dudy + dwdx*dudz + dwdy*dvdz )
1743
1744          IF ( def < 0.0_wp )  def = 0.0_wp
1745
1746          tend(k,j,i) = tend(k,j,i) + km(k,j,i) * def
1747
1748       ENDIF
1749
1750!
1751!--    If required, calculate TKE production by buoyancy
1752       IF ( .NOT. neutral )  THEN
1753
1754          IF ( .NOT. humidity )  THEN
1755
1756             IF ( use_single_reference_value )  THEN
1757
1758                IF ( ocean )  THEN
1759!
1760!--                So far in the ocean no special treatment of density flux in
1761!--                the bottom and top surface layer
1762                   DO  k = nzb_s_inner(j,i)+1, nzt
1763                      tend(k,j,i) = tend(k,j,i) +                   &
1764                                    kh(k,j,i) * g / rho_reference * &
1765                                    ( rho(k+1,j,i) - rho(k-1,j,i) ) * dd2zu(k)
1766                   ENDDO
1767
1768                ELSE
1769
1770                   DO  k = nzb_diff_s_inner(j,i), nzt_diff
1771                      tend(k,j,i) = tend(k,j,i) -                  &
1772                                    kh(k,j,i) * g / pt_reference * &
1773                                    ( pt(k+1,j,i) - pt(k-1,j,i) ) * dd2zu(k)
1774                   ENDDO
1775
1776                   IF ( use_surface_fluxes )  THEN
1777                      k = nzb_diff_s_inner(j,i)-1
1778                      tend(k,j,i) = tend(k,j,i) + g / pt_reference * shf(j,i)
1779                   ENDIF
1780
1781                   IF ( use_top_fluxes )  THEN
1782                      k = nzt
1783                      tend(k,j,i) = tend(k,j,i) + g / pt_reference * tswst(j,i)
1784                   ENDIF
1785
1786                ENDIF
1787
1788             ELSE
1789
1790                IF ( ocean )  THEN
1791!
1792!--                So far in the ocean no special treatment of density flux in
1793!--                the bottom and top surface layer
1794                   DO  k = nzb_s_inner(j,i)+1, nzt
1795                      tend(k,j,i) = tend(k,j,i) +                &
1796                                    kh(k,j,i) * g / rho(k,j,i) * &
1797                                    ( rho(k+1,j,i) - rho(k-1,j,i) ) * dd2zu(k)
1798                   ENDDO
1799
1800                ELSE
1801
1802                   DO  k = nzb_diff_s_inner(j,i), nzt_diff
1803                      tend(k,j,i) = tend(k,j,i) -               &
1804                                    kh(k,j,i) * g / pt(k,j,i) * &
1805                                    ( pt(k+1,j,i) - pt(k-1,j,i) ) * dd2zu(k)
1806                   ENDDO
1807
1808                   IF ( use_surface_fluxes )  THEN
1809                      k = nzb_diff_s_inner(j,i)-1
1810                      tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * shf(j,i)
1811                   ENDIF
1812
1813                   IF ( use_top_fluxes )  THEN
1814                      k = nzt
1815                      tend(k,j,i) = tend(k,j,i) + g / pt(k,j,i) * tswst(j,i)
1816                   ENDIF
1817
1818                ENDIF
1819
1820             ENDIF
1821
1822          ELSE
1823
1824             DO  k = nzb_diff_s_inner(j,i), nzt_diff
1825
1826                IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets )  THEN
1827                   k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1828                   k2 = 0.61_wp * pt(k,j,i)
1829                   tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * g / vpt(k,j,i) *   &
1830                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + &
1831                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )   &
1832                                         ) * dd2zu(k)
1833                ELSE IF ( cloud_physics )  THEN
1834                   IF ( ql(k,j,i) == 0.0_wp )  THEN
1835                      k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1836                      k2 = 0.61_wp * pt(k,j,i)
1837                   ELSE
1838                      theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1839                      temp  = theta * t_d_pt(k)
1840                      k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *                 &
1841                                    ( q(k,j,i) - ql(k,j,i) ) *          &
1842                           ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /        &
1843                           ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *          &
1844                           ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1845                      k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
1846                   ENDIF
1847                   tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * g / vpt(k,j,i) *   &
1848                                         ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) + &
1849                                           k2 * ( q(k+1,j,i) - q(k-1,j,i) )   &
1850                                         ) * dd2zu(k)
1851                ELSE IF ( cloud_droplets )  THEN
1852                   k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
1853                   k2 = 0.61_wp * pt(k,j,i)
1854                   tend(k,j,i) = tend(k,j,i) - kh(k,j,i) * g / vpt(k,j,i) *  &
1855                                     ( k1 * ( pt(k+1,j,i)-pt(k-1,j,i) ) +    &
1856                                       k2 * ( q(k+1,j,i) - q(k-1,j,i) ) -    &
1857                                       pt(k,j,i) * ( ql(k+1,j,i) -           &
1858                                                     ql(k-1,j,i) ) ) * dd2zu(k)
1859                ENDIF
1860             ENDDO
1861
1862             IF ( use_surface_fluxes )  THEN
1863                k = nzb_diff_s_inner(j,i)-1
1864
1865                IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets )  THEN
1866                   k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1867                   k2 = 0.61_wp * pt(k,j,i)
1868                ELSE IF ( cloud_physics )  THEN
1869                   IF ( ql(k,j,i) == 0.0_wp )  THEN
1870                      k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1871                      k2 = 0.61_wp * pt(k,j,i)
1872                   ELSE
1873                      theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1874                      temp  = theta * t_d_pt(k)
1875                      k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *                 &
1876                                    ( q(k,j,i) - ql(k,j,i) ) *          &
1877                           ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /        &
1878                           ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *          &
1879                           ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1880                      k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
1881                   ENDIF
1882                ELSE IF ( cloud_droplets )  THEN
1883                   k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
1884                   k2 = 0.61_wp * pt(k,j,i)
1885                ENDIF
1886
1887                tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
1888                                            ( k1* shf(j,i) + k2 * qsws(j,i) )
1889             ENDIF
1890
1891             IF ( use_top_fluxes )  THEN
1892                k = nzt
1893
1894                IF ( .NOT. cloud_physics .AND. .NOT. cloud_droplets )  THEN
1895                   k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1896                   k2 = 0.61_wp * pt(k,j,i)
1897                ELSE IF ( cloud_physics )  THEN
1898                   IF ( ql(k,j,i) == 0.0_wp )  THEN
1899                      k1 = 1.0_wp + 0.61_wp * q(k,j,i)
1900                      k2 = 0.61_wp * pt(k,j,i)
1901                   ELSE
1902                      theta = pt(k,j,i) + pt_d_t(k) * l_d_cp * ql(k,j,i)
1903                      temp  = theta * t_d_pt(k)
1904                      k1 = ( 1.0_wp - q(k,j,i) + 1.61_wp *                 &
1905                                    ( q(k,j,i) - ql(k,j,i) ) *          &
1906                           ( 1.0_wp + 0.622_wp * l_d_r / temp ) ) /        &
1907                           ( 1.0_wp + 0.622_wp * l_d_r * l_d_cp *          &
1908                           ( q(k,j,i) - ql(k,j,i) ) / ( temp * temp ) )
1909                      k2 = theta * ( l_d_cp / temp * k1 - 1.0_wp )
1910                   ENDIF
1911                ELSE IF ( cloud_droplets )  THEN
1912                   k1 = 1.0_wp + 0.61_wp * q(k,j,i) - ql(k,j,i)
1913                   k2 = 0.61_wp * pt(k,j,i)
1914                ENDIF
1915
1916                tend(k,j,i) = tend(k,j,i) + g / vpt(k,j,i) * &
1917                                            ( k1* tswst(j,i) + k2 * qswst(j,i) )
1918             ENDIF
1919
1920          ENDIF
1921
1922       ENDIF
1923
1924    END SUBROUTINE production_e_ij
1925
1926
1927!------------------------------------------------------------------------------!
1928! Description:
1929! ------------
1930!> @todo Missing subroutine description.
1931!------------------------------------------------------------------------------!
1932    SUBROUTINE production_e_init
1933
1934       USE arrays_3d,                                                          &
1935           ONLY:  kh, km, u, us, usws, v, vsws, zu
1936
1937       USE control_parameters,                                                 &
1938           ONLY:  constant_flux_layer, kappa
1939
1940       USE indices,                                                            &
1941           ONLY:  nxl, nxlg, nxr, nxrg, nys, nysg, nyn, nyng, nzb_u_inner,     &
1942                  nzb_v_inner
1943
1944       IMPLICIT NONE
1945
1946       INTEGER(iwp) ::  i   !<
1947       INTEGER(iwp) ::  j   !<
1948       INTEGER(iwp) ::  ku  !<
1949       INTEGER(iwp) ::  kv  !<
1950
1951       IF ( constant_flux_layer )  THEN
1952
1953          IF ( first_call )  THEN
1954             ALLOCATE( u_0(nysg:nyng,nxlg:nxrg), v_0(nysg:nyng,nxlg:nxrg) )
1955             u_0 = 0.0_wp   ! just to avoid access of uninitialized memory
1956             v_0 = 0.0_wp   ! within exchange_horiz_2d
1957             first_call = .FALSE.
1958          ENDIF
1959
1960!
1961!--       Calculate a virtual velocity at the surface in a way that the
1962!--       vertical velocity gradient at k = 1 (u(k+1)-u_0) matches the
1963!--       Prandtl law (-w'u'/km). This gradient is used in the TKE shear
1964!--       production term at k=1 (see production_e_ij).
1965!--       The velocity gradient has to be limited in case of too small km
1966!--       (otherwise the timestep may be significantly reduced by large
1967!--       surface winds).
1968!--       Upper bounds are nxr+1 and nyn+1 because otherwise these values are
1969!--       not available in case of non-cyclic boundary conditions.
1970!--       WARNING: the exact analytical solution would require the determination
1971!--                of the eddy diffusivity by km = u* * kappa * zp / phi_m.
1972          !$OMP PARALLEL DO PRIVATE( ku, kv )
1973          DO  i = nxl, nxr+1
1974             DO  j = nys, nyn+1
1975
1976                ku = nzb_u_inner(j,i)+1
1977                kv = nzb_v_inner(j,i)+1
1978
1979                u_0(j,i) = u(ku+1,j,i) + usws(j,i) * ( zu(ku+1) - zu(ku-1) ) / &
1980                                 ( 0.5_wp * ( km(ku,j,i) + km(ku,j,i-1) ) +    &
1981                                   1.0E-20_wp )
1982!                                  ( us(j,i) * kappa * zu(1) )
1983                v_0(j,i) = v(kv+1,j,i) + vsws(j,i) * ( zu(kv+1) - zu(kv-1) ) / &
1984                                 ( 0.5_wp * ( km(kv,j,i) + km(kv,j-1,i) ) +    &
1985                                   1.0E-20_wp )
1986!                                  ( us(j,i) * kappa * zu(1) )
1987
1988                IF ( ABS( u(ku+1,j,i) - u_0(j,i) )  > &
1989                     ABS( u(ku+1,j,i) - u(ku-1,j,i) ) )  u_0(j,i) = u(ku-1,j,i)
1990                IF ( ABS( v(kv+1,j,i) - v_0(j,i) )  > &
1991                     ABS( v(kv+1,j,i) - v(kv-1,j,i) ) )  v_0(j,i) = v(kv-1,j,i)
1992
1993             ENDDO
1994          ENDDO
1995
1996          CALL exchange_horiz_2d( u_0 )
1997          CALL exchange_horiz_2d( v_0 )
1998
1999       ENDIF
2000
2001    END SUBROUTINE production_e_init
2002
2003 END MODULE production_e_mod
Note: See TracBrowser for help on using the repository browser.