source: palm/trunk/SOURCE/diffusion_v.f90 @ 1682

Last change on this file since 1682 was 1682, checked in by knoop, 9 years ago

Code annotations made doxygen readable

  • Property svn:keywords set to Id
File size: 27.2 KB
Line 
1!> @file diffusion_v.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-2014 Leibniz Universitaet Hannover
17!--------------------------------------------------------------------------------!
18!
19! Current revisions:
20! -----------------
21! Code annotations made doxygen readable
22!
23! Former revisions:
24! -----------------
25! $Id: diffusion_v.f90 1682 2015-10-07 23:56:08Z knoop $
26!
27! 1340 2014-03-25 19:45:13Z kanani
28! REAL constants defined as wp-kind
29!
30! 1320 2014-03-20 08:40:49Z raasch
31! ONLY-attribute added to USE-statements,
32! kind-parameters added to all INTEGER and REAL declaration statements,
33! kinds are defined in new module kinds,
34! revision history before 2012 removed,
35! comment fields (!:) to be used for variable explanations added to
36! all variable declaration statements
37!
38! 1257 2013-11-08 15:18:40Z raasch
39! openacc loop and loop vector clauses removed, declare create moved after
40! the FORTRAN declaration statement
41!
42! 1128 2013-04-12 06:19:32Z raasch
43! loop index bounds in accelerator version replaced by i_left, i_right, j_south,
44! j_north
45!
46! 1036 2012-10-22 13:43:42Z raasch
47! code put under GPL (PALM 3.9)
48!
49! 1015 2012-09-27 09:23:24Z raasch
50! accelerator version (*_acc) added
51!
52! 1001 2012-09-13 14:08:46Z raasch
53! arrays comunicated by module instead of parameter list
54!
55! 978 2012-08-09 08:28:32Z fricke
56! outflow damping layer removed
57! kmxm_x/_y and kmxp_x/_y change to kmxm and kmxp
58!
59! Revision 1.1  1997/09/12 06:24:01  raasch
60! Initial revision
61!
62!
63! Description:
64! ------------
65!> Diffusion term of the v-component
66!------------------------------------------------------------------------------!
67 MODULE diffusion_v_mod
68 
69
70    USE wall_fluxes_mod
71
72    PRIVATE
73    PUBLIC diffusion_v, diffusion_v_acc
74
75    INTERFACE diffusion_v
76       MODULE PROCEDURE diffusion_v
77       MODULE PROCEDURE diffusion_v_ij
78    END INTERFACE diffusion_v
79
80    INTERFACE diffusion_v_acc
81       MODULE PROCEDURE diffusion_v_acc
82    END INTERFACE diffusion_v_acc
83
84 CONTAINS
85
86
87!------------------------------------------------------------------------------!
88! Description:
89! ------------
90!> Call for all grid points
91!------------------------------------------------------------------------------!
92    SUBROUTINE diffusion_v
93
94       USE arrays_3d,                                                          &
95           ONLY:  ddzu, ddzw, km, tend, u, v, vsws, vswst, w
96       
97       USE control_parameters,                                                 &
98           ONLY:  constant_top_momentumflux, topography, use_surface_fluxes,   &
99                  use_top_fluxes
100       
101       USE grid_variables,                                                     &
102           ONLY:  ddx, ddy, ddy2, fxm, fxp, wall_v
103       
104       USE indices,                                                            &
105           ONLY:  nxl, nxr, nyn, nys, nysv, nzb, nzb_diff_v, nzb_v_inner,      &
106                  nzb_v_outer, nzt, nzt_diff
107       
108       USE kinds
109
110       IMPLICIT NONE
111
112       INTEGER(iwp) ::  i     !<
113       INTEGER(iwp) ::  j     !<
114       INTEGER(iwp) ::  k     !<
115       REAL(wp)     ::  kmxm  !<
116       REAL(wp)     ::  kmxp  !<
117       REAL(wp)     ::  kmzm  !<
118       REAL(wp)     ::  kmzp  !<
119
120       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  vsus  !<
121
122!
123!--    First calculate horizontal momentum flux v'u' at vertical walls,
124!--    if neccessary
125       IF ( topography /= 'flat' )  THEN
126          CALL wall_fluxes( vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp, nzb_v_inner, &
127                            nzb_v_outer, wall_v )
128       ENDIF
129
130       DO  i = nxl, nxr
131          DO  j = nysv, nyn
132!
133!--          Compute horizontal diffusion
134             DO  k = nzb_v_outer(j,i)+1, nzt
135!
136!--             Interpolate eddy diffusivities on staggered gridpoints
137                kmxp = 0.25_wp * &
138                       ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) )
139                kmxm = 0.25_wp * &
140                       ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) )
141
142                tend(k,j,i) = tend(k,j,i)                                      &
143                      & + ( kmxp * ( v(k,j,i+1) - v(k,j,i)     ) * ddx         &
144                      &   + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy         &
145                      &   - kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx             &
146                      &   - kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy             &
147                      &   ) * ddx                                              &
148                      & + 2.0_wp * (                                           &
149                      &           km(k,j,i)   * ( v(k,j+1,i) - v(k,j,i) )      &
150                      &         - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) )      &
151                      &            ) * ddy2
152             ENDDO
153
154!
155!--          Wall functions at the left and right walls, respectively
156             IF ( wall_v(j,i) /= 0.0_wp )  THEN
157
158                DO  k = nzb_v_inner(j,i)+1, nzb_v_outer(j,i)
159                   kmxp = 0.25_wp *                                            &
160                          ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) )
161                   kmxm = 0.25_wp *                                            &
162                          ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) )
163                   
164                   tend(k,j,i) = tend(k,j,i)                                   &
165                                 + 2.0_wp * (                                  &
166                                       km(k,j,i)   * ( v(k,j+1,i) - v(k,j,i) ) &
167                                     - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) &
168                                            ) * ddy2                           &
169                                 + (   fxp(j,i) * (                            &
170                                  kmxp * ( v(k,j,i+1) - v(k,j,i)     ) * ddx   &
171                                + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy   &
172                                                  )                            &
173                                     - fxm(j,i) * (                            &
174                                  kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
175                                + kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
176                                                  )                            &
177                                     + wall_v(j,i) * vsus(k,j,i)               &
178                                   ) * ddx
179                ENDDO
180             ENDIF
181
182!
183!--          Compute vertical diffusion. In case of simulating a Prandtl
184!--          layer, index k starts at nzb_v_inner+2.
185             DO  k = nzb_diff_v(j,i), nzt_diff
186!
187!--             Interpolate eddy diffusivities on staggered gridpoints
188                kmzp = 0.25_wp * &
189                       ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
190                kmzm = 0.25_wp * &
191                       ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
192
193                tend(k,j,i) = tend(k,j,i)                                      &
194                      & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1)     &
195                      &            + ( w(k,j,i) - w(k,j-1,i) ) * ddy           &
196                      &            )                                           &
197                      &   - kmzm * ( ( v(k,j,i)   - v(k-1,j,i)   ) * ddzu(k)   &
198                      &            + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy       &
199                      &            )                                           &
200                      &   ) * ddzw(k)
201             ENDDO
202
203!
204!--          Vertical diffusion at the first grid point above the surface,
205!--          if the momentum flux at the bottom is given by the Prandtl law
206!--          or if it is prescribed by the user.
207!--          Difference quotient of the momentum flux is not formed over
208!--          half of the grid spacing (2.0*ddzw(k)) any more, since the
209!--          comparison with other (LES) models showed that the values of
210!--          the momentum flux becomes too large in this case.
211!--          The term containing w(k-1,..) (see above equation) is removed here
212!--          because the vertical velocity is assumed to be zero at the surface.
213             IF ( use_surface_fluxes )  THEN
214                k = nzb_v_inner(j,i)+1
215!
216!--             Interpolate eddy diffusivities on staggered gridpoints
217                kmzp = 0.25_wp *                                               &
218                       ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
219                kmzm = 0.25_wp *                                               &
220                       ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
221
222                tend(k,j,i) = tend(k,j,i)                                      &
223                      & + ( kmzp * ( w(k,j,i) - w(k,j-1,i)     ) * ddy         &
224                      &   ) * ddzw(k)                                          &
225                      & + ( kmzp * ( v(k+1,j,i) - v(k,j,i)     ) * ddzu(k+1)   &
226                      &   + vsws(j,i)                                          &
227                      &   ) * ddzw(k)
228             ENDIF
229
230!
231!--          Vertical diffusion at the first gridpoint below the top boundary,
232!--          if the momentum flux at the top is prescribed by the user
233             IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
234                k = nzt
235!
236!--             Interpolate eddy diffusivities on staggered gridpoints
237                kmzp = 0.25_wp *                                               &
238                       ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
239                kmzm = 0.25_wp *                                               &
240                       ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
241
242                tend(k,j,i) = tend(k,j,i)                                      &
243                      & - ( kmzm *  ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy        &
244                      &   ) * ddzw(k)                                          &
245                      & + ( -vswst(j,i)                                        &
246                      &   - kmzm * ( v(k,j,i)   - v(k-1,j,i)    ) * ddzu(k)    &
247                      &   ) * ddzw(k)
248             ENDIF
249
250          ENDDO
251       ENDDO
252
253    END SUBROUTINE diffusion_v
254
255
256!------------------------------------------------------------------------------!
257! Description:
258! ------------
259!> Call for all grid points - accelerator version
260!------------------------------------------------------------------------------!
261    SUBROUTINE diffusion_v_acc
262
263       USE arrays_3d,                                                          &
264           ONLY:  ddzu, ddzw, km, tend, u, v, vsws, vswst, w
265       
266       USE control_parameters,                                                 &
267           ONLY:  constant_top_momentumflux, topography, use_surface_fluxes,   &
268                  use_top_fluxes
269       
270       USE grid_variables,                                                     &
271           ONLY:  ddx, ddy, ddy2, fxm, fxp, wall_v
272       
273       USE indices,                                                            &
274           ONLY:  i_left, i_right, j_north, j_south, nxl, nxr, nyn, nys, nzb,  &
275                  nzb_diff_v, nzb_v_inner, nzb_v_outer, nzt, nzt_diff
276       
277       USE kinds
278
279       IMPLICIT NONE
280
281       INTEGER(iwp) ::  i     !<
282       INTEGER(iwp) ::  j     !<
283       INTEGER(iwp) ::  k     !<
284       REAL(wp)     ::  kmxm  !<
285       REAL(wp)     ::  kmxp  !<
286       REAL(wp)     ::  kmzm  !<
287       REAL(wp)     ::  kmzp  !<
288
289       REAL(wp), DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  vsus  !<
290       !$acc declare create ( vsus )
291
292!
293!--    First calculate horizontal momentum flux v'u' at vertical walls,
294!--    if neccessary
295       IF ( topography /= 'flat' )  THEN
296          CALL wall_fluxes_acc( vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp,          &
297                                nzb_v_inner, nzb_v_outer, wall_v )
298       ENDIF
299
300       !$acc kernels present ( u, v, w, km, tend, vsws, vswst )                &
301       !$acc         present ( ddzu, ddzw, fxm, fxp, wall_v )                  &
302       !$acc         present ( nzb_v_inner, nzb_v_outer, nzb_diff_v )
303       DO  i = i_left, i_right
304          DO  j = j_south, j_north
305!
306!--          Compute horizontal diffusion
307             DO  k = 1, nzt
308                IF ( k > nzb_v_outer(j,i) )  THEN
309!
310!--                Interpolate eddy diffusivities on staggered gridpoints
311                   kmxp = 0.25_wp *                                            &
312                          ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) )
313                   kmxm = 0.25_wp *                                            &
314                          ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) )
315
316                   tend(k,j,i) = tend(k,j,i)                                   &
317                         & + ( kmxp * ( v(k,j,i+1) - v(k,j,i)     ) * ddx      &
318                         &   + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy      &
319                         &   - kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx          &
320                         &   - kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy          &
321                         &   ) * ddx                                           &
322                         & + 2.0_wp * (                                        &
323                         &           km(k,j,i)   * ( v(k,j+1,i) - v(k,j,i) )   &
324                         &         - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) )   &
325                         &            ) * ddy2
326                ENDIF
327             ENDDO
328
329!
330!--          Wall functions at the left and right walls, respectively
331             DO  k = 1, nzt
332                IF( k > nzb_v_inner(j,i)  .AND.  k <= nzb_v_outer(j,i)  .AND.  &
333                    wall_v(j,i) /= 0.0_wp )  THEN
334
335                   kmxp = 0.25_wp *                                            &
336                          ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) )
337                   kmxm = 0.25_wp *                                            &
338                          ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) )
339                   
340                   tend(k,j,i) = tend(k,j,i)                                   &
341                                 + 2.0_wp * (                                  &
342                                       km(k,j,i)   * ( v(k,j+1,i) - v(k,j,i) ) &
343                                     - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) &
344                                            ) * ddy2                           &
345                                 + (   fxp(j,i) * (                            &
346                                  kmxp * ( v(k,j,i+1) - v(k,j,i)     ) * ddx   &
347                                + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy   &
348                                                  )                            &
349                                     - fxm(j,i) * (                            &
350                                  kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
351                                + kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
352                                                  )                            &
353                                     + wall_v(j,i) * vsus(k,j,i)               &
354                                   ) * ddx
355                ENDIF
356             ENDDO
357
358!
359!--          Compute vertical diffusion. In case of simulating a Prandtl
360!--          layer, index k starts at nzb_v_inner+2.
361             DO  k = 1, nzt_diff
362                IF ( k >= nzb_diff_v(j,i) )  THEN
363!
364!--                Interpolate eddy diffusivities on staggered gridpoints
365                   kmzp = 0.25_wp *                                            &
366                          ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
367                   kmzm = 0.25_wp *                                            &
368                          ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
369
370                   tend(k,j,i) = tend(k,j,i)                                   &
371                         & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i)   ) * ddzu(k+1)&
372                         &            + ( w(k,j,i)   - w(k,j-1,i) ) * ddy      &
373                         &            )                                        &
374                         &   - kmzm * ( ( v(k,j,i)   - v(k-1,j,i)   ) * ddzu(k)&
375                         &            + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy    &
376                         &            )                                        &
377                         &   ) * ddzw(k)
378                ENDIF
379             ENDDO
380
381          ENDDO
382       ENDDO
383
384!
385!--    Vertical diffusion at the first grid point above the surface,
386!--    if the momentum flux at the bottom is given by the Prandtl law
387!--    or if it is prescribed by the user.
388!--    Difference quotient of the momentum flux is not formed over
389!--    half of the grid spacing (2.0*ddzw(k)) any more, since the
390!--    comparison with other (LES) models showed that the values of
391!--    the momentum flux becomes too large in this case.
392!--    The term containing w(k-1,..) (see above equation) is removed here
393!--    because the vertical velocity is assumed to be zero at the surface.
394       IF ( use_surface_fluxes )  THEN
395
396          DO  i = i_left, i_right
397             DO  j = j_south, j_north
398         
399                k = nzb_v_inner(j,i)+1
400!
401!--             Interpolate eddy diffusivities on staggered gridpoints
402                kmzp = 0.25_wp *                                               &
403                       ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
404                kmzm = 0.25_wp *                                               &
405                       ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
406
407                tend(k,j,i) = tend(k,j,i)                                      &
408                      & + ( kmzp * ( w(k,j,i) - w(k,j-1,i)     ) * ddy         &
409                      &   ) * ddzw(k)                                          &
410                      & + ( kmzp * ( v(k+1,j,i) - v(k,j,i)     ) * ddzu(k+1)   &
411                      &   + vsws(j,i)                                          &
412                      &   ) * ddzw(k)
413             ENDDO
414          ENDDO
415
416       ENDIF
417
418!
419!--    Vertical diffusion at the first gridpoint below the top boundary,
420!--    if the momentum flux at the top is prescribed by the user
421       IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
422
423          k = nzt
424
425          DO  i = i_left, i_right
426             DO  j = j_south, j_north
427
428!
429!--             Interpolate eddy diffusivities on staggered gridpoints
430                kmzp = 0.25_wp *                                               &
431                       ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
432                kmzm = 0.25_wp *                                               &
433                       ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
434
435                tend(k,j,i) = tend(k,j,i)                                      &
436                      & - ( kmzm *  ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy        &
437                      &   ) * ddzw(k)                                          &
438                      & + ( -vswst(j,i)                                        &
439                      &   - kmzm * ( v(k,j,i)   - v(k-1,j,i)    ) * ddzu(k)    &
440                      &   ) * ddzw(k)
441             ENDDO
442          ENDDO
443
444       ENDIF
445       !$acc end kernels
446
447    END SUBROUTINE diffusion_v_acc
448
449
450!------------------------------------------------------------------------------!
451! Description:
452! ------------
453!> Call for grid point i,j
454!------------------------------------------------------------------------------!
455    SUBROUTINE diffusion_v_ij( i, j )
456
457       USE arrays_3d,                                                          &
458           ONLY:  ddzu, ddzw, km, tend, u, v, vsws, vswst, w
459       
460       USE control_parameters,                                                 &
461           ONLY:  constant_top_momentumflux, use_surface_fluxes, use_top_fluxes
462       
463       USE grid_variables,                                                     &
464           ONLY:  ddx, ddy, ddy2, fxm, fxp, wall_v
465       
466       USE indices,                                                            &
467           ONLY:  nzb, nzb_diff_v, nzb_v_inner, nzb_v_outer, nzt, nzt_diff
468       
469       USE kinds
470
471       IMPLICIT NONE
472
473       INTEGER(iwp) ::  i     !<
474       INTEGER(iwp) ::  j     !<
475       INTEGER(iwp) ::  k     !<
476       REAL(wp)     ::  kmxm  !<
477       REAL(wp)     ::  kmxp  !<
478       REAL(wp)     ::  kmzm  !<
479       REAL(wp)     ::  kmzp  !<
480
481       REAL(wp), DIMENSION(nzb:nzt+1) ::  vsus  !<
482
483!
484!--    Compute horizontal diffusion
485       DO  k = nzb_v_outer(j,i)+1, nzt
486!
487!--       Interpolate eddy diffusivities on staggered gridpoints
488          kmxp = 0.25_wp * ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) )
489          kmxm = 0.25_wp * ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) )
490
491          tend(k,j,i) = tend(k,j,i)                                            &
492                      & + ( kmxp * ( v(k,j,i+1) - v(k,j,i)     ) * ddx         &
493                      &   + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy         &
494                      &   - kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx             &
495                      &   - kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy             &
496                      &   ) * ddx                                              &
497                      & + 2.0_wp * (                                           &
498                      &           km(k,j,i)   * ( v(k,j+1,i) - v(k,j,i) )      &
499                      &         - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) )      &
500                      &            ) * ddy2
501       ENDDO
502
503!
504!--    Wall functions at the left and right walls, respectively
505       IF ( wall_v(j,i) /= 0.0_wp )  THEN
506
507!
508!--       Calculate the horizontal momentum flux v'u'
509          CALL wall_fluxes( i, j, nzb_v_inner(j,i)+1, nzb_v_outer(j,i),        &
510                            vsus, 0.0_wp, 1.0_wp, 0.0_wp, 0.0_wp )
511
512          DO  k = nzb_v_inner(j,i)+1, nzb_v_outer(j,i)
513             kmxp = 0.25_wp *                                                  &
514                    ( km(k,j,i)+km(k,j,i+1)+km(k,j-1,i)+km(k,j-1,i+1) )
515             kmxm = 0.25_wp *                                                  &
516                    ( km(k,j,i)+km(k,j,i-1)+km(k,j-1,i)+km(k,j-1,i-1) )
517
518             tend(k,j,i) = tend(k,j,i)                                         &
519                                 + 2.0_wp * (                                  &
520                                       km(k,j,i)   * ( v(k,j+1,i) - v(k,j,i) ) &
521                                     - km(k,j-1,i) * ( v(k,j,i) - v(k,j-1,i) ) &
522                                            ) * ddy2                           &
523                                 + (   fxp(j,i) * (                            &
524                                  kmxp * ( v(k,j,i+1) - v(k,j,i)     ) * ddx   &
525                                + kmxp * ( u(k,j,i+1) - u(k,j-1,i+1) ) * ddy   &
526                                                  )                            &
527                                     - fxm(j,i) * (                            &
528                                  kmxm * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
529                                + kmxm * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
530                                                  )                            &
531                                     + wall_v(j,i) * vsus(k)                   &
532                                   ) * ddx
533          ENDDO
534       ENDIF
535
536!
537!--    Compute vertical diffusion. In case of simulating a Prandtl layer,
538!--    index k starts at nzb_v_inner+2.
539       DO  k = nzb_diff_v(j,i), nzt_diff
540!
541!--       Interpolate eddy diffusivities on staggered gridpoints
542          kmzp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
543          kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
544
545          tend(k,j,i) = tend(k,j,i)                                            &
546                      & + ( kmzp * ( ( v(k+1,j,i) - v(k,j,i) ) * ddzu(k+1)     &
547                      &            + ( w(k,j,i) - w(k,j-1,i) ) * ddy           &
548                      &            )                                           &
549                      &   - kmzm * ( ( v(k,j,i)   - v(k-1,j,i)   ) * ddzu(k)   &
550                      &            + ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy       &
551                      &            )                                           &
552                      &   ) * ddzw(k)
553       ENDDO
554
555!
556!--    Vertical diffusion at the first grid point above the surface, if the
557!--    momentum flux at the bottom is given by the Prandtl law or if it is
558!--    prescribed by the user.
559!--    Difference quotient of the momentum flux is not formed over half of
560!--    the grid spacing (2.0*ddzw(k)) any more, since the comparison with
561!--    other (LES) models showed that the values of the momentum flux becomes
562!--    too large in this case.
563!--    The term containing w(k-1,..) (see above equation) is removed here
564!--    because the vertical velocity is assumed to be zero at the surface.
565       IF ( use_surface_fluxes )  THEN
566          k = nzb_v_inner(j,i)+1
567!
568!--       Interpolate eddy diffusivities on staggered gridpoints
569          kmzp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
570          kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
571
572          tend(k,j,i) = tend(k,j,i)                                            &
573                      & + ( kmzp * ( w(k,j,i) - w(k,j-1,i)     ) * ddy         &
574                      &   ) * ddzw(k)                                          &
575                      & + ( kmzp * ( v(k+1,j,i) - v(k,j,i)     ) * ddzu(k+1)   &
576                      &   + vsws(j,i)                                          &
577                      &   ) * ddzw(k)
578       ENDIF
579
580!
581!--    Vertical diffusion at the first gridpoint below the top boundary,
582!--    if the momentum flux at the top is prescribed by the user
583       IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
584          k = nzt
585!
586!--       Interpolate eddy diffusivities on staggered gridpoints
587          kmzp = 0.25_wp * &
588                 ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
589          kmzm = 0.25_wp * &
590                 ( km(k,j,i)+km(k-1,j,i)+km(k,j-1,i)+km(k-1,j-1,i) )
591
592          tend(k,j,i) = tend(k,j,i)                                            &
593                      & - ( kmzm *  ( w(k-1,j,i) - w(k-1,j-1,i) ) * ddy        &
594                      &   ) * ddzw(k)                                          &
595                      & + ( -vswst(j,i)                                        &
596                      &   - kmzm * ( v(k,j,i)   - v(k-1,j,i)    ) * ddzu(k)    &
597                      &   ) * ddzw(k)
598       ENDIF
599
600    END SUBROUTINE diffusion_v_ij
601
602 END MODULE diffusion_v_mod
Note: See TracBrowser for help on using the repository browser.