source: palm/trunk/SOURCE/diffusion_u.f90 @ 1691

Last change on this file since 1691 was 1691, checked in by maronga, 9 years ago

various bugfixes and modifications of the atmosphere-land-surface-radiation interaction. Completely re-written routine to calculate surface fluxes (surface_layer_fluxes.f90) that replaces prandtl_fluxes. Minor formatting corrections and renamings

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