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

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

ONLY-attribute added to USE-statements,
kind-parameters added to all INTEGER and REAL declaration statements,
kinds are defined in new module kinds,
old module precision_kind is removed,
revision history before 2012 removed,
comment fields (!:) to be used for variable explanations added to all variable declaration statements

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