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

Last change on this file since 1257 was 1257, checked in by raasch, 10 years ago

New:
---

openACC porting of timestep calculation
(modules, timestep, time_integration)

Changed:


openACC loop directives and vector clauses removed (because they do not give any performance improvement with PGI
compiler versions > 13.6)
(advec_ws, buoyancy, coriolis, diffusion_e, diffusion_s, diffusion_u, diffusion_v, diffusion_w, diffusivities, exchange_horiz, fft_xy, pres, production_e, transpose, tridia_solver, wall_fluxes)

openACC loop independent clauses added
(boundary_conds, prandtl_fluxes, pres)

openACC declare create statements moved after FORTRAN declaration statement
(diffusion_u, diffusion_v, diffusion_w, fft_xy, poisfft, production_e, tridia_solver)

openACC end parallel replaced by end parallel loop
(flow_statistics, pres)

openACC "kernels do" replaced by "kernels loop"
(prandtl_fluxes)

output format for theta* changed to avoid output of *
(run_control)

Errors:


bugfix for calculation of advective timestep (old version may cause wrong timesteps in case of
vertixcally stretched grids)
Attention: standard run-control output has changed!
(timestep)

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