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

Last change on this file since 1128 was 1128, checked in by raasch, 11 years ago

asynchronous transfer of ghost point data for acc-optimized version

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