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

Last change on this file since 940 was 940, checked in by raasch, 12 years ago

temperature equation can be switched off; bugfix of tridia_1dd for current Intel (12.1) compilers

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