source: palm/trunk/SOURCE/diffusion_e.f90 @ 1873

Last change on this file since 1873 was 1873, checked in by maronga, 8 years ago

revised renaming of modules

  • Property svn:keywords set to Id
File size: 25.4 KB
Line 
1!> @file diffusion_e.f90
2!--------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the terms
6! of the GNU General Public License as published by the Free Software Foundation,
7! either version 3 of the License, or (at your option) any later version.
8!
9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
10! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
12!
13! You should have received a copy of the GNU General Public License along with
14! PALM. If not, see <http://www.gnu.org/licenses/>.
15!
16! Copyright 1997-2016 Leibniz Universitaet Hannover
17!--------------------------------------------------------------------------------!
18!
19! Current revisions:
20! -----------------
21! Module renamed (removed _mod)
22!
23!
24! Former revisions:
25! -----------------
26! $Id: diffusion_e.f90 1873 2016-04-18 14:50:06Z maronga $
27!
28! 1850 2016-04-08 13:29:27Z maronga
29! Module renamed
30! Adapted for modularization of microphysics
31!
32! 1831 2016-04-07 13:15:51Z hoffmann
33! turbulence renamed collision_turbulence
34!
35! 1682 2015-10-07 23:56:08Z knoop
36! Code annotations made doxygen readable
37!
38! 1374 2014-04-25 12:55:07Z raasch
39! missing variables added to ONLY list
40! rif removed from acc-present-list
41!
42! 1340 2014-03-25 19:45:13Z kanani
43! REAL constants defined as wp-kind
44!
45! 1320 2014-03-20 08:40:49Z raasch
46! ONLY-attribute added to USE-statements,
47! kind-parameters added to all INTEGER and REAL declaration statements,
48! kinds are defined in new module kinds,
49! revision history before 2012 removed,
50! comment fields (!:) to be used for variable explanations added to
51! all variable declaration statements
52!
53! 1257 2013-11-08 15:18:40Z raasch
54! openacc loop and loop vector clauses removed
55!
56! 1179 2013-06-14 05:57:58Z raasch
57! use_reference renamed use_single_reference_value
58!
59! 1171 2013-05-30 11:27:45Z raasch
60! use_reference-case activated in accelerator version
61!
62! 1128 2013-04-12 06:19:32Z raasch
63! loop index bounds in accelerator version replaced by i_left, i_right, j_south,
64! j_north
65!
66! 1065 2012-11-22 17:42:36Z hoffmann
67! Enabled the claculation of diss in case of turbulence = .TRUE. (parameterized
68! effects of turbulence on autoconversion and accretion in two-moments cloud
69! physics scheme).
70!
71! 1036 2012-10-22 13:43:42Z raasch
72! code put under GPL (PALM 3.9)
73!
74! 1015 2012-09-27 09:23:24Z raasch
75! accelerator version (*_acc) added,
76! adjustment of mixing length to the Prandtl mixing length at first grid point
77! above ground removed
78!
79! 1010 2012-09-20 07:59:54Z raasch
80! cpp switch __nopointer added for pointer free version
81!
82! 1001 2012-09-13 14:08:46Z raasch
83! most arrays comunicated by module instead of parameter list
84!
85! 825 2012-02-19 03:03:44Z raasch
86! wang_collision_kernel renamed wang_kernel
87!
88! Revision 1.1  1997/09/19 07:40:24  raasch
89! Initial revision
90!
91!
92! Description:
93! ------------
94!> Diffusion- and dissipation terms for the TKE
95!------------------------------------------------------------------------------!
96 MODULE diffusion_e_mod
97 
98
99    PRIVATE
100    PUBLIC diffusion_e, diffusion_e_acc
101   
102
103    INTERFACE diffusion_e
104       MODULE PROCEDURE diffusion_e
105       MODULE PROCEDURE diffusion_e_ij
106    END INTERFACE diffusion_e
107 
108    INTERFACE diffusion_e_acc
109       MODULE PROCEDURE diffusion_e_acc
110    END INTERFACE diffusion_e_acc
111
112 CONTAINS
113
114
115!------------------------------------------------------------------------------!
116! Description:
117! ------------
118!> Call for all grid points
119!------------------------------------------------------------------------------!
120    SUBROUTINE diffusion_e( var, var_reference )
121
122       USE arrays_3d,                                                          &
123           ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw
124           
125       USE control_parameters,                                                 &
126           ONLY:  atmos_ocean_sign, g, use_single_reference_value, &
127                  wall_adjustment, wall_adjustment_factor
128
129       USE grid_variables,                                                     &
130           ONLY:  ddx2, ddy2
131           
132       USE indices,                                                            &
133           ONLY:  nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_s_inner,&
134                  nzt
135           
136       USE kinds
137
138       USE microphysics_mod,                                                   &
139           ONLY:  collision_turbulence
140
141       USE particle_attributes,                                                &
142           ONLY:  use_sgs_for_particles, wang_kernel
143
144       IMPLICIT NONE
145
146       INTEGER(iwp) ::  i              !<
147       INTEGER(iwp) ::  j              !<
148       INTEGER(iwp) ::  k              !<
149       REAL(wp)     ::  dvar_dz        !<
150       REAL(wp)     ::  l_stable       !<
151       REAL(wp)     ::  var_reference  !<
152
153#if defined( __nopointer )
154       REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  var  !<
155#else
156       REAL(wp), DIMENSION(:,:,:), POINTER ::  var  !<
157#endif
158       REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) ::  dissipation  !<
159       REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) ::  l            !<
160       REAL(wp), DIMENSION(nzb+1:nzt,nys:nyn) ::  ll           !<
161 
162
163!
164!--    This if clause must be outside the k-loop because otherwise
165!--    runtime errors occur with -C hopt on NEC
166       IF ( use_single_reference_value )  THEN
167
168          DO  i = nxl, nxr
169             DO  j = nys, nyn
170                DO  k = nzb_s_inner(j,i)+1, nzt
171!
172!--                Calculate the mixing length (for dissipation)
173                   dvar_dz = atmos_ocean_sign * &
174                             ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
175                   IF ( dvar_dz > 0.0_wp ) THEN
176                      l_stable = 0.76_wp * SQRT( e(k,j,i) ) / &
177                                    SQRT( g / var_reference * dvar_dz ) + 1E-5_wp
178                   ELSE
179                      l_stable = l_grid(k)
180                   ENDIF
181!
182!--                Adjustment of the mixing length
183                   IF ( wall_adjustment )  THEN
184                      l(k,j)  = MIN( wall_adjustment_factor *          &
185                                     ( zu(k) - zw(nzb_s_inner(j,i)) ), &
186                                     l_grid(k), l_stable )
187                      ll(k,j) = MIN( wall_adjustment_factor *          &
188                                     ( zu(k) - zw(nzb_s_inner(j,i)) ), &
189                                     l_grid(k) )
190                   ELSE
191                      l(k,j)  = MIN( l_grid(k), l_stable )
192                      ll(k,j) = l_grid(k)
193                   ENDIF
194
195                ENDDO
196             ENDDO
197
198!
199!--          Calculate the tendency terms
200             DO  j = nys, nyn
201                DO  k = nzb_s_inner(j,i)+1, nzt
202
203                    dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * &
204                                       e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j)
205
206                    tend(k,j,i) = tend(k,j,i)                                  &
207                                        + (                                    &
208                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
209                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
210                                          ) * ddx2                             &
211                                        + (                                    &
212                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
213                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
214                                          ) * ddy2                             &
215                                        + (                                    &
216               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
217             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
218                                          ) * ddzw(k)                          &
219                             - dissipation(k,j)
220
221                ENDDO
222             ENDDO
223
224!
225!--          Store dissipation if needed for calculating the sgs particle
226!--          velocities
227             IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.               &
228                  collision_turbulence )  THEN
229                DO  j = nys, nyn
230                   DO  k = nzb_s_inner(j,i)+1, nzt
231                      diss(k,j,i) = dissipation(k,j)
232                   ENDDO
233                ENDDO
234             ENDIF
235
236          ENDDO
237
238       ELSE
239
240          DO  i = nxl, nxr
241             DO  j = nys, nyn
242                DO  k = nzb_s_inner(j,i)+1, nzt
243!
244!--                Calculate the mixing length (for dissipation)
245                   dvar_dz = atmos_ocean_sign * &
246                             ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
247                   IF ( dvar_dz > 0.0_wp ) THEN
248                      l_stable = 0.76_wp * SQRT( e(k,j,i) ) / &
249                                           SQRT( g / var(k,j,i) * dvar_dz ) + 1E-5_wp
250                   ELSE
251                      l_stable = l_grid(k)
252                   ENDIF
253!
254!--                Adjustment of the mixing length
255                   IF ( wall_adjustment )  THEN
256                      l(k,j)  = MIN( wall_adjustment_factor *          &
257                                     ( zu(k) - zw(nzb_s_inner(j,i)) ), &
258                                     l_grid(k), l_stable )
259                      ll(k,j) = MIN( wall_adjustment_factor *          &
260                                     ( zu(k) - zw(nzb_s_inner(j,i)) ), &
261                                     l_grid(k) )
262                   ELSE
263                      l(k,j)  = MIN( l_grid(k), l_stable )
264                      ll(k,j) = l_grid(k)
265                   ENDIF
266
267                ENDDO
268             ENDDO
269
270!
271!--          Calculate the tendency terms
272             DO  j = nys, nyn
273                DO  k = nzb_s_inner(j,i)+1, nzt
274
275                    dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * &
276                                             e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j)
277
278                    tend(k,j,i) = tend(k,j,i)                                  &
279                                        + (                                    &
280                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
281                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
282                                          ) * ddx2                             &
283                                        + (                                    &
284                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
285                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
286                                          ) * ddy2                             &
287                                        + (                                    &
288               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
289             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
290                                          ) * ddzw(k)                          &
291                             - dissipation(k,j)
292
293                ENDDO
294             ENDDO
295
296!
297!--          Store dissipation if needed for calculating the sgs particle
298!--          velocities
299             IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.               &
300                  collision_turbulence )  THEN
301                DO  j = nys, nyn
302                   DO  k = nzb_s_inner(j,i)+1, nzt
303                      diss(k,j,i) = dissipation(k,j)
304                   ENDDO
305                ENDDO
306             ENDIF
307
308          ENDDO
309
310       ENDIF
311
312!
313!--    Boundary condition for dissipation
314       IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.  &
315            collision_turbulence )  THEN
316          DO  i = nxl, nxr
317             DO  j = nys, nyn
318                diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i)
319             ENDDO
320          ENDDO
321       ENDIF
322
323    END SUBROUTINE diffusion_e
324
325
326!------------------------------------------------------------------------------!
327! Description:
328! ------------
329!> Call for all grid points - accelerator version
330!------------------------------------------------------------------------------!
331    SUBROUTINE diffusion_e_acc( var, var_reference )
332
333       USE arrays_3d,                                                          &
334           ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw
335         
336       USE control_parameters,                                                 &
337           ONLY:  atmos_ocean_sign, g, use_single_reference_value,             &
338                  wall_adjustment, wall_adjustment_factor
339
340       USE grid_variables,                                                     &
341           ONLY:  ddx2, ddy2
342           
343       USE indices,                                                            &
344           ONLY:  i_left, i_right, j_north, j_south, nxlg, nxrg, nyng, nysg,   &
345                  nzb, nzb_s_inner, nzt
346           
347       USE kinds
348
349       USE microphysics_mod,                                                   &
350           ONLY:  collision_turbulence
351
352       USE particle_attributes,                                                &
353           ONLY:  use_sgs_for_particles, wang_kernel
354
355       IMPLICIT NONE
356
357       INTEGER(iwp) ::  i              !<
358       INTEGER(iwp) ::  j              !<
359       INTEGER(iwp) ::  k              !<
360       REAL(wp)     ::  dissipation    !<
361       REAL(wp)     ::  dvar_dz        !<
362       REAL(wp)     ::  l              !<
363       REAL(wp)     ::  ll             !<
364       REAL(wp)     ::  l_stable       !<
365       REAL(wp)     ::  var_reference  !<
366
367#if defined( __nopointer )
368       REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  var  !<
369#else
370       REAL(wp), DIMENSION(:,:,:), POINTER ::  var  !<
371#endif
372
373
374!
375!--    This if clause must be outside the k-loop because otherwise
376!--    runtime errors occur with -C hopt on NEC
377       IF ( use_single_reference_value )  THEN
378
379          !$acc kernels present( ddzu, ddzw, dd2zu, diss, e, km, l_grid ) &
380          !$acc         present( nzb_s_inner, tend, var, zu, zw )
381          DO  i = i_left, i_right
382             DO  j = j_south, j_north
383                DO  k = 1, nzt
384
385                   IF ( k > nzb_s_inner(j,i) )  THEN
386!
387!--                   Calculate the mixing length (for dissipation)
388                      dvar_dz = atmos_ocean_sign * &
389                                ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
390                      IF ( dvar_dz > 0.0_wp ) THEN
391                         l_stable = 0.76_wp * SQRT( e(k,j,i) ) / &
392                                       SQRT( g / var_reference * dvar_dz ) + 1E-5_wp
393                      ELSE
394                         l_stable = l_grid(k)
395                      ENDIF
396!
397!--                   Adjustment of the mixing length
398                      IF ( wall_adjustment )  THEN
399                         l  = MIN( wall_adjustment_factor *          &
400                                   ( zu(k) - zw(nzb_s_inner(j,i)) ), &
401                                   l_grid(k), l_stable )
402                         ll = MIN( wall_adjustment_factor *          &
403                                   ( zu(k) - zw(nzb_s_inner(j,i)) ), &
404                                   l_grid(k) )
405                      ELSE
406                         l  = MIN( l_grid(k), l_stable )
407                         ll = l_grid(k)
408                      ENDIF
409!
410!--                   Calculate the tendency terms
411                      dissipation = ( 0.19_wp + 0.74_wp * l / ll ) * &
412                                          e(k,j,i) * SQRT( e(k,j,i) ) / l
413
414                      tend(k,j,i) = tend(k,j,i)                                  &
415                                        + (                                    &
416                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
417                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
418                                          ) * ddx2                             &
419                                        + (                                    &
420                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
421                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
422                                          ) * ddy2                             &
423                                        + (                                    &
424               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
425             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
426                                          ) * ddzw(k)                          &
427                                  - dissipation
428
429!
430!--                   Store dissipation if needed for calculating the sgs particle
431!--                   velocities
432                      IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.      &
433                           collision_turbulence )  THEN
434                         diss(k,j,i) = dissipation
435                      ENDIF
436
437                   ENDIF
438
439                ENDDO
440             ENDDO
441          ENDDO
442          !$acc end kernels
443
444       ELSE
445
446          !$acc kernels present( ddzu, ddzw, dd2zu, diss, e, km, l_grid ) &
447          !$acc         present( nzb_s_inner, tend, var, zu, zw )
448          DO  i = i_left, i_right
449             DO  j = j_south, j_north
450                DO  k = 1, nzt
451
452                   IF ( k > nzb_s_inner(j,i) )  THEN
453!
454!--                   Calculate the mixing length (for dissipation)
455                      dvar_dz = atmos_ocean_sign * &
456                                ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
457                      IF ( dvar_dz > 0.0_wp ) THEN
458                         l_stable = 0.76_wp * SQRT( e(k,j,i) ) / &
459                                              SQRT( g / var(k,j,i) * dvar_dz ) + 1E-5_wp
460                      ELSE
461                         l_stable = l_grid(k)
462                      ENDIF
463!
464!--                   Adjustment of the mixing length
465                      IF ( wall_adjustment )  THEN
466                         l  = MIN( wall_adjustment_factor *          &
467                                   ( zu(k) - zw(nzb_s_inner(j,i)) ), &
468                                     l_grid(k), l_stable )
469                         ll = MIN( wall_adjustment_factor *          &
470                                   ( zu(k) - zw(nzb_s_inner(j,i)) ), &
471                                   l_grid(k) )
472                      ELSE
473                         l  = MIN( l_grid(k), l_stable )
474                         ll = l_grid(k)
475                      ENDIF
476!
477!--                   Calculate the tendency terms
478                      dissipation = ( 0.19_wp + 0.74_wp * l / ll ) * &
479                                          e(k,j,i) * SQRT( e(k,j,i) ) / l
480
481                      tend(k,j,i) = tend(k,j,i)                                &
482                                        + (                                    &
483                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
484                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
485                                          ) * ddx2                             &
486                                        + (                                    &
487                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
488                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
489                                          ) * ddy2                             &
490                                        + (                                    &
491               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
492             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
493                                          ) * ddzw(k)                          &
494                                  - dissipation
495
496!
497!--                   Store dissipation if needed for calculating the sgs
498!--                   particle  velocities
499                      IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.      &
500                           collision_turbulence )  THEN
501                         diss(k,j,i) = dissipation
502                      ENDIF
503
504                   ENDIF
505
506                ENDDO
507             ENDDO
508          ENDDO
509          !$acc end kernels
510
511       ENDIF
512
513!
514!--    Boundary condition for dissipation
515       IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.                     &
516            collision_turbulence )  THEN
517          !$acc kernels present( diss, nzb_s_inner )
518          DO  i = i_left, i_right
519             DO  j = j_south, j_north
520                diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i)
521             ENDDO
522          ENDDO
523          !$acc end kernels
524       ENDIF
525
526    END SUBROUTINE diffusion_e_acc
527
528
529!------------------------------------------------------------------------------!
530! Description:
531! ------------
532!> Call for grid point i,j
533!------------------------------------------------------------------------------!
534    SUBROUTINE diffusion_e_ij( i, j, var, var_reference )
535
536       USE arrays_3d,                                                          &
537           ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw
538         
539       USE control_parameters,                                                 &
540           ONLY:  atmos_ocean_sign, g, use_single_reference_value,             &
541                  wall_adjustment, wall_adjustment_factor
542
543       USE grid_variables,                                                     &
544           ONLY:  ddx2, ddy2
545           
546       USE indices,                                                            &
547           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_s_inner, nzt
548           
549       USE kinds
550
551       USE microphysics_mod,                                                   &
552           ONLY:  collision_turbulence
553
554       USE particle_attributes,                                                &
555           ONLY:  use_sgs_for_particles, wang_kernel
556
557       IMPLICIT NONE
558
559       INTEGER(iwp) ::  i              !<
560       INTEGER(iwp) ::  j              !<
561       INTEGER(iwp) ::  k              !<
562       REAL(wp)     ::  dvar_dz        !<
563       REAL(wp)     ::  l_stable       !<
564       REAL(wp)     ::  var_reference  !<
565
566#if defined( __nopointer )
567       REAL(wp), DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  var  !<
568#else
569       REAL(wp), DIMENSION(:,:,:), POINTER ::  var     !<
570#endif
571       REAL(wp), DIMENSION(nzb+1:nzt) ::  dissipation  !<
572       REAL(wp), DIMENSION(nzb+1:nzt) ::  l            !<
573       REAL(wp), DIMENSION(nzb+1:nzt) ::  ll           !<
574
575
576!
577!--    Calculate the mixing length (for dissipation)
578       DO  k = nzb_s_inner(j,i)+1, nzt
579          dvar_dz = atmos_ocean_sign * &
580                    ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
581          IF ( dvar_dz > 0.0_wp ) THEN
582             IF ( use_single_reference_value )  THEN
583                l_stable = 0.76_wp * SQRT( e(k,j,i) ) / &
584                                     SQRT( g / var_reference * dvar_dz ) + 1E-5_wp
585             ELSE
586                l_stable = 0.76_wp * SQRT( e(k,j,i) ) / &
587                                     SQRT( g / var(k,j,i) * dvar_dz ) + 1E-5_wp
588             ENDIF
589          ELSE
590             l_stable = l_grid(k)
591          ENDIF
592!
593!--       Adjustment of the mixing length
594          IF ( wall_adjustment )  THEN
595             l(k)  = MIN( wall_adjustment_factor *                     &
596                          ( zu(k) - zw(nzb_s_inner(j,i)) ), l_grid(k), &
597                          l_stable )
598             ll(k) = MIN( wall_adjustment_factor *                     &
599                          ( zu(k) - zw(nzb_s_inner(j,i)) ), l_grid(k) )
600          ELSE
601             l(k)  = MIN( l_grid(k), l_stable )
602             ll(k) = l_grid(k)
603          ENDIF
604!
605!--       Calculate the tendency term
606          dissipation(k) = ( 0.19_wp + 0.74_wp * l(k) / ll(k) ) * e(k,j,i) * &
607                                 SQRT( e(k,j,i) ) / l(k)
608
609          tend(k,j,i) = tend(k,j,i)                                           &
610                                       + (                                    &
611                         ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
612                       - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
613                                         ) * ddx2                             &
614                                       + (                                    &
615                         ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
616                       - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
617                                         ) * ddy2                             &
618                                       + (                                    &
619              ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
620            - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
621                                         ) * ddzw(k)                          &
622                                       - dissipation(k)
623
624       ENDDO
625
626!
627!--    Store dissipation if needed for calculating the sgs particle velocities
628       IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.                     &
629            collision_turbulence )  THEN
630          DO  k = nzb_s_inner(j,i)+1, nzt
631             diss(k,j,i) = dissipation(k)
632          ENDDO
633!
634!--       Boundary condition for dissipation
635          diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i)
636       ENDIF
637
638    END SUBROUTINE diffusion_e_ij
639
640 END MODULE diffusion_e_mod
Note: See TracBrowser for help on using the repository browser.