Ignore:
Timestamp:
Jun 29, 2020 12:36:47 PM (4 years ago)
Author:
raasch
Message:

files re-formatted to follow the PALM coding standard

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/diffusion_u.f90

    r4360 r4583  
    11!> @file diffusion_u.f90
    2 !------------------------------------------------------------------------------!
     2!--------------------------------------------------------------------------------------------------!
    33! This file is part of the PALM model system.
    44!
    5 ! PALM is free software: you can redistribute it and/or modify it under the
    6 ! terms of the GNU General Public License as published by the Free Software
    7 ! Foundation, either version 3 of the License, or (at your option) any later
    8 ! 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/>.
     5! PALM is free software: you can redistribute it and/or modify it under the terms of the GNU General
     6! Public License as published by the Free Software Foundation, either version 3 of the License, or
     7! (at your option) any later version.
     8!
     9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
     10! implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
     11! Public License for more details.
     12!
     13! You should have received a copy of the GNU General Public License along with PALM. If not, see
     14! <http://www.gnu.org/licenses/>.
    1615!
    1716! Copyright 1997-2020 Leibniz Universitaet Hannover
    18 !------------------------------------------------------------------------------!
     17!--------------------------------------------------------------------------------------------------!
    1918!
    2019! Current revisions:
     
    2524! -----------------
    2625! $Id$
    27 ! Introduction of wall_flags_total_0, which currently sets bits based on static
    28 ! topography information used in wall_flags_static_0
    29 !
     26! file re-formatted to follow the PALM coding standard
     27!
     28! 4360 2020-01-07 11:25:50Z suehring
     29! Introduction of wall_flags_total_0, which currently sets bits based on static topography
     30! information used in wall_flags_static_0
     31!
    3032! 4329 2019-12-10 15:46:36Z motisi
    3133! Renamed wall_flags_0 to wall_flags_static_0
    32 ! 
     34!
    3335! 4182 2019-08-22 15:20:23Z scharf
    3436! Corrected "Former revisions" section
    35 ! 
     37!
    3638! 3655 2019-01-07 16:51:22Z knoop
    3739! OpenACC port for SPEC
     
    4446! ------------
    4547!> Diffusion term of the u-component
    46 !> @todo additional damping (needed for non-cyclic bc) causes bad vectorization
    47 !>       and slows down the speed on NEC about 5-10%
    48 !------------------------------------------------------------------------------!
     48!> @todo additional damping (needed for non-cyclic bc) causes bad vectorization and slows down the
     49!        speed on NEC about 5-10%
     50!--------------------------------------------------------------------------------------------------!
    4951 MODULE diffusion_u_mod
    50  
     52
    5153
    5254    PRIVATE
     
    6163
    6264
    63 !------------------------------------------------------------------------------!
     65!--------------------------------------------------------------------------------------------------!
    6466! Description:
    6567! ------------
    6668!> Call for all grid points
    67 !------------------------------------------------------------------------------!
     69!--------------------------------------------------------------------------------------------------!
    6870    SUBROUTINE diffusion_u
    6971
    70        USE arrays_3d,                                                          &
    71            ONLY:  ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw
    72        
    73        USE control_parameters,                                                 &
    74            ONLY:  constant_top_momentumflux, use_surface_fluxes,               &
    75                   use_top_fluxes
    76        
    77        USE grid_variables,                                                     &
     72       USE arrays_3d,                                                                              &
     73           ONLY:  ddzu, ddzw, drho_air, km, rho_air_zw, tend, u, v, w
     74
     75       USE control_parameters,                                                                     &
     76           ONLY:  constant_top_momentumflux, use_surface_fluxes, use_top_fluxes
     77
     78       USE grid_variables,                                                                         &
    7879           ONLY:  ddx, ddx2, ddy
    79        
    80        USE indices,                                                            &
     80
     81       USE indices,                                                                                &
    8182           ONLY:  nxlu, nxr, nyn, nys, nzb, nzt, wall_flags_total_0
    82      
     83
    8384       USE kinds
    8485
    85        USE surface_mod,                                                        &
    86            ONLY :  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, &
    87                    surf_usm_v
     86       USE surface_mod,                                                                            &
     87           ONLY :  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, surf_usm_v
    8888
    8989       IMPLICIT NONE
     
    102102       REAL(wp)     ::  kmzm          !< diffusion coefficient on bottom of the gridbox - interpolated onto xu-zw grid
    103103       REAL(wp)     ::  kmzp          !< diffusion coefficient on top of the gridbox - interpolated onto xu-zw grid
    104        REAL(wp)     ::  mask_bottom   !< flag to mask vertical upward-facing surface       
    105        REAL(wp)     ::  mask_north    !< flag to mask vertical surface north of the grid point 
    106        REAL(wp)     ::  mask_south    !< flag to mask vertical surface south of the grid point 
    107        REAL(wp)     ::  mask_top      !< flag to mask vertical downward-facing surface 
     104       REAL(wp)     ::  mask_bottom   !< flag to mask vertical upward-facing surface
     105       REAL(wp)     ::  mask_north    !< flag to mask vertical surface north of the grid point
     106       REAL(wp)     ::  mask_south    !< flag to mask vertical surface south of the grid point
     107       REAL(wp)     ::  mask_top      !< flag to mask vertical downward-facing surface
    108108
    109109
     
    125125             DO  k = nzb+1, nzt
    126126!
    127 !--             Predetermine flag to mask topography and wall-bounded grid points. 
    128 !--             It is sufficient to masked only north- and south-facing surfaces, which
    129 !--             need special treatment for the u-component.
    130                 flag       = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j,i),   1 ) ) 
     127!--             Predetermine flag to mask topography and wall-bounded grid points.
     128!--             It is sufficient to masked only north- and south-facing surfaces, which need special
     129!--             treatment for the u-component.
     130                flag       = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j,i),   1 ) )
    131131                mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j-1,i), 1 ) )
    132132                mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j+1,i), 1 ) )
    133133!
    134134!--             Interpolate eddy diffusivities on staggered gridpoints
    135                 kmyp = 0.25_wp *                                               &
    136                        ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
    137                 kmym = 0.25_wp *                                               &
    138                        ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
    139 
    140                 tend(k,j,i) = tend(k,j,i)                                      &
    141                         + 2.0_wp * (                                           &
    142                                   km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )    &
    143                                 - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )    &
    144                                    ) * ddx2 * flag                             &
    145                         +          ( mask_north * (                            &
    146                             kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy         &
    147                           + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx         &
    148                                                   )                            &
    149                                    - mask_south * (                            &
    150                             kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy             &
    151                           + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx             &
    152                                                   )                            &
    153                                    ) * ddy  * flag                             
     135                kmyp = 0.25_wp * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
     136                kmym = 0.25_wp * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
     137
     138                tend(k,j,i) = tend(k,j,i)                                                          &
     139                              + 2.0_wp * (                                                         &
     140                                        km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )                  &
     141                                      - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )                  &
     142                                         ) * ddx2 * flag                                           &
     143                              +          ( mask_north * (                                          &
     144                                  kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy                       &
     145                                + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx                       &
     146                                                        )                                          &
     147                                         - mask_south * (                                          &
     148                                  kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy                           &
     149                                + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx                           &
     150                                                        )                                          &
     151                                         ) * ddy  * flag
    154152             ENDDO
    155153!
    156 !--          Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1)
    157 !--          surfaces. Note, in the the flat case, loops won't be entered as
    158 !--          start_index > end_index. Furtermore, note, no vertical natural surfaces
    159 !--          so far.           
     154!--          Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1) surfaces.
     155!--          Note, in the the flat case, loops won't be entered as start_index > end_index.
     156!--          Furtermore, note, no vertical natural surfaces so far.
    160157!--          Default-type surfaces
    161158             DO  l = 0, 1
     
    164161                DO  m = surf_s, surf_e
    165162                   k           = surf_def_v(l)%k(m)
    166                    tend(k,j,i) = tend(k,j,i) +                                 &                   
    167                                     surf_def_v(l)%mom_flux_uv(m) * ddy
    168                 ENDDO   
     163                   tend(k,j,i) = tend(k,j,i) + surf_def_v(l)%mom_flux_uv(m) * ddy
     164                ENDDO
    169165             ENDDO
    170166!
     
    175171                DO  m = surf_s, surf_e
    176172                   k           = surf_lsm_v(l)%k(m)
    177                    tend(k,j,i) = tend(k,j,i) +                                 &                   
    178                                     surf_lsm_v(l)%mom_flux_uv(m) * ddy
    179                 ENDDO   
     173                   tend(k,j,i) = tend(k,j,i) + surf_lsm_v(l)%mom_flux_uv(m) * ddy
     174                ENDDO
    180175             ENDDO
    181176!
     
    186181                DO  m = surf_s, surf_e
    187182                   k           = surf_usm_v(l)%k(m)
    188                    tend(k,j,i) = tend(k,j,i) +                                 &                   
    189                                     surf_usm_v(l)%mom_flux_uv(m) * ddy
    190                 ENDDO   
     183                   tend(k,j,i) = tend(k,j,i) + surf_usm_v(l)%mom_flux_uv(m) * ddy
     184                ENDDO
    191185             ENDDO
    192186
    193187!
    194 !--          Compute vertical diffusion. In case of simulating a surface layer,
    195 !--          respective grid diffusive fluxes are masked (flag 8) within this
    196 !--          loop, and added further below, else, simple gradient approach is
    197 !--          applied. Model top is also mask if top-momentum flux is given.
     188!--          Compute vertical diffusion. In case of simulating a surface layer, respective grid
     189!--          diffusive fluxes are masked (flag 8) within this loop, and added further below, else,
     190!--          simple gradient approach is applied. Model top is also mask if top-momentum flux is
     191!--          given.
    198192             DO  k = nzb+1, nzt
    199193!
    200 !--             Determine flags to mask topography below and above. Flag 1 is
    201 !--             used to mask topography in general, and flag 8 implies
    202 !--             information about use_surface_fluxes. Flag 9 is used to control
    203 !--             momentum flux at model top. 
    204                 mask_bottom = MERGE( 1.0_wp, 0.0_wp,                           &
    205                                  BTEST( wall_flags_total_0(k-1,j,i), 8 ) )
    206                 mask_top    = MERGE( 1.0_wp, 0.0_wp,                           &
    207                                  BTEST( wall_flags_total_0(k+1,j,i), 8 ) ) *   &
    208                               MERGE( 1.0_wp, 0.0_wp,                           &
    209                                  BTEST( wall_flags_total_0(k+1,j,i), 9 ) )
    210                 flag        = MERGE( 1.0_wp, 0.0_wp,                           &
    211                                  BTEST( wall_flags_total_0(k,j,i), 1 ) )
     194!--             Determine flags to mask topography below and above. Flag 1 is used to mask
     195!--             topography in general, and flag 8 implies information about use_surface_fluxes.
     196!--             Flag 9 is used to control momentum flux at model top.
     197                mask_bottom = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k-1,j,i), 8 ) )
     198                mask_top    = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k+1,j,i), 8 ) ) *   &
     199                              MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k+1,j,i), 9 ) )
     200                flag        = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j,i), 1 ) )
    212201!
    213202!--             Interpolate eddy diffusivities on staggered gridpoints
    214                 kmzp = 0.25_wp *                                               &
    215                        ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
    216                 kmzm = 0.25_wp *                                               &
    217                        ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
    218 
    219                 tend(k,j,i) = tend(k,j,i)                                      &
    220                         + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)   &
    221                                    + ( w(k,j,i)   - w(k,j,i-1) ) * ddx         &
    222                                    ) * rho_air_zw(k)   * mask_top              &
    223                           - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
    224                                    + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
    225                                    ) * rho_air_zw(k-1) * mask_bottom           &
    226                           ) * ddzw(k) * drho_air(k) * flag
     203                kmzp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
     204                kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
     205
     206                tend(k,j,i) = tend(k,j,i)                                                          &
     207                              + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)                 &
     208                                         + ( w(k,j,i)   - w(k,j,i-1) ) * ddx                       &
     209                                         ) * rho_air_zw(k)   * mask_top                            &
     210                                - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)                 &
     211                                         + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx                     &
     212                                         ) * rho_air_zw(k-1) * mask_bottom                         &
     213                                ) * ddzw(k) * drho_air(k) * flag
    227214             ENDDO
    228215
    229216!
    230 !--          Vertical diffusion at the first grid point above the surface,
    231 !--          if the momentum flux at the bottom is given by the Prandtl law or
    232 !--          if it is prescribed by the user.
    233 !--          Difference quotient of the momentum flux is not formed over half
    234 !--          of the grid spacing (2.0*ddzw(k)) any more, since the comparison
    235 !--          with other (LES) models showed that the values of the momentum
    236 !--          flux becomes too large in this case.
    237 !--          The term containing w(k-1,..) (see above equation) is removed here
    238 !--          because the vertical velocity is assumed to be zero at the surface.
     217!--          Vertical diffusion at the first grid point above the surface, if the momentum flux at
     218!--          the bottom is given by the Prandtl law or if it is prescribed by the user.
     219!--          Difference quotient of the momentum flux is not formed over half of the grid spacing
     220!--          (2.0*ddzw(k)) any more, since the comparison with other (LES) models showed that the
     221!--          values of the momentum flux becomes too large in this case.
     222!--          The term containing w(k-1,..) (see above equation) is removed here because the vertical
     223!--          velocity is assumed to be zero at the surface.
    239224             IF ( use_surface_fluxes )  THEN
    240225!
     
    246231                   k   = surf_def_h(0)%k(m)
    247232
    248                    tend(k,j,i) = tend(k,j,i)                                   &
    249                         + ( - ( - surf_def_h(0)%usws(m) )                      &
    250                           ) * ddzw(k) * drho_air(k)
     233                   tend(k,j,i) = tend(k,j,i)                                                       &
     234                                 + ( - ( - surf_def_h(0)%usws(m) ) ) * ddzw(k) * drho_air(k)
    251235                ENDDO
    252236!
     
    258242                   k   = surf_def_h(1)%k(m)
    259243
    260                    tend(k,j,i) = tend(k,j,i)                                   &
    261                         + ( - surf_def_h(1)%usws(m)                            &
    262                           ) * ddzw(k) * drho_air(k)
     244                   tend(k,j,i) = tend(k,j,i)                                                       &
     245                                 + ( - surf_def_h(1)%usws(m) ) * ddzw(k) * drho_air(k)
    263246                ENDDO
    264247!
     
    270253                   k   = surf_lsm_h%k(m)
    271254
    272                    tend(k,j,i) = tend(k,j,i)                                   &
    273                         + ( - ( - surf_lsm_h%usws(m) )                         &
    274                           ) * ddzw(k) * drho_air(k)
     255                   tend(k,j,i) = tend(k,j,i)                                                       &
     256                                 + ( - ( - surf_lsm_h%usws(m) ) ) * ddzw(k) * drho_air(k)
    275257                ENDDO
    276258!
     
    282264                   k   = surf_usm_h%k(m)
    283265
    284                    tend(k,j,i) = tend(k,j,i)                                   &
    285                        + ( - ( - surf_usm_h%usws(m) )                          &
    286                          ) * ddzw(k) * drho_air(k)
     266                   tend(k,j,i) = tend(k,j,i)                                                       &
     267                                 + ( - ( - surf_usm_h%usws(m) ) ) * ddzw(k) * drho_air(k)
    287268                ENDDO
    288269
     
    297278                   k   = surf_def_h(2)%k(m)
    298279
    299                    tend(k,j,i) = tend(k,j,i)                                   &
    300                         + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k)
     280                   tend(k,j,i) = tend(k,j,i)                                                       &
     281                                 + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k)
    301282                ENDDO
    302283             ENDIF
     
    308289
    309290
    310 !------------------------------------------------------------------------------!
     291!--------------------------------------------------------------------------------------------------!
    311292! Description:
    312293! ------------
    313294!> Call for grid point i,j
    314 !------------------------------------------------------------------------------!
     295!--------------------------------------------------------------------------------------------------!
    315296    SUBROUTINE diffusion_u_ij( i, j )
    316297
    317        USE arrays_3d,                                                          &
    318            ONLY:  ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw
    319        
    320        USE control_parameters,                                                 &
    321            ONLY:  constant_top_momentumflux, use_surface_fluxes,               &
    322                   use_top_fluxes
    323        
    324        USE grid_variables,                                                     &
     298       USE arrays_3d,                                                                              &
     299           ONLY:  ddzu, ddzw, drho_air, km, tend, u, v, w, rho_air_zw
     300
     301       USE control_parameters,                                                                     &
     302           ONLY:  constant_top_momentumflux, use_surface_fluxes, use_top_fluxes
     303
     304       USE grid_variables,                                                                         &
    325305           ONLY:  ddx, ddx2, ddy
    326        
    327        USE indices,                                                            &
     306
     307       USE indices,                                                                                &
    328308           ONLY:  nzb, nzt, wall_flags_total_0
    329      
     309
    330310       USE kinds
    331311
    332        USE surface_mod,                                                        &
    333            ONLY :  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, &
    334                    surf_usm_v
     312       USE surface_mod,                                                                            &
     313           ONLY :  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, surf_usm_v
    335314
    336315       IMPLICIT NONE
     
    349328       REAL(wp)     ::  kmzm          !< diffusion coefficient on bottom of the gridbox - interpolated onto xu-zw grid
    350329       REAL(wp)     ::  kmzp          !< diffusion coefficient on top of the gridbox - interpolated onto xu-zw grid
    351        REAL(wp)     ::  mask_bottom   !< flag to mask vertical upward-facing surface       
    352        REAL(wp)     ::  mask_north    !< flag to mask vertical surface north of the grid point 
    353        REAL(wp)     ::  mask_south    !< flag to mask vertical surface south of the grid point 
    354        REAL(wp)     ::  mask_top      !< flag to mask vertical downward-facing surface 
    355 ! 
     330       REAL(wp)     ::  mask_bottom   !< flag to mask vertical upward-facing surface
     331       REAL(wp)     ::  mask_north    !< flag to mask vertical surface north of the grid point
     332       REAL(wp)     ::  mask_south    !< flag to mask vertical surface south of the grid point
     333       REAL(wp)     ::  mask_top      !< flag to mask vertical downward-facing surface
     334!
    356335!--    Compute horizontal diffusion
    357336       DO  k = nzb+1, nzt
    358337!
    359 !--       Predetermine flag to mask topography and wall-bounded grid points. 
    360 !--       It is sufficient to masked only north- and south-facing surfaces, which
    361 !--       need special treatment for the u-component.
    362           flag       = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j,i),   1 ) ) 
     338!--       Predetermine flag to mask topography and wall-bounded grid points.
     339!--       It is sufficient to masked only north- and south-facing surfaces, which need special
     340!--       treatment for the u-component.
     341          flag       = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j,i),   1 ) )
    363342          mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j-1,i), 1 ) )
    364343          mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j+1,i), 1 ) )
     
    368347          kmym = 0.25_wp * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
    369348
    370           tend(k,j,i) = tend(k,j,i)                                            &
    371                        + 2.0_wp * (                                            &
    372                                  km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )     &
    373                                - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )     &
    374                                    ) * ddx2 * flag                             &
    375                                  + (                                           &
    376                   mask_north * kmyp * ( ( u(k,j+1,i) - u(k,j,i)     ) * ddy    &
    377                                       + ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx    &
    378                                       )                                        &
    379                 - mask_south * kmym * ( ( u(k,j,i)   - u(k,j-1,i)   ) * ddy    &
    380                                       + ( v(k,j,i)   - v(k,j,i-1)   ) * ddx    &
    381                                       )                                        &
    382                                    ) * ddy  * flag
    383        ENDDO
    384 
    385 !
    386 !--    Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1)
    387 !--    surfaces. Note, in the the flat case, loops won't be entered as
    388 !--    start_index > end_index. Furtermore, note, no vertical natural surfaces
    389 !--    so far.           
     349          tend(k,j,i) = tend(k,j,i)                                                                &
     350                                + 2.0_wp * (                                                       &
     351                                         km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )                 &
     352                                       - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )                 &
     353                                           ) * ddx2 * flag                                         &
     354                                         + (                                                       &
     355                          mask_north * kmyp * ( ( u(k,j+1,i) - u(k,j,i)     ) * ddy                &
     356                                              + ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx                &
     357                                              )                                                    &
     358                        - mask_south * kmym * ( ( u(k,j,i)   - u(k,j-1,i)   ) * ddy                &
     359                                              + ( v(k,j,i)   - v(k,j,i-1)   ) * ddx                &
     360                                              )                                                    &
     361                                           ) * ddy  * flag
     362       ENDDO
     363
     364!
     365!--    Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1) surfaces. Note, in
     366!--    the the flat case, loops won't be entered as start_index > end_index. Furtermore, note, no
     367!--    vertical natural surfaces so far.
    390368!--    Default-type surfaces
    391369       DO  l = 0, 1
     
    395373             k           = surf_def_v(l)%k(m)
    396374             tend(k,j,i) = tend(k,j,i) + surf_def_v(l)%mom_flux_uv(m) * ddy
    397           ENDDO   
     375          ENDDO
    398376       ENDDO
    399377!
     
    405383             k           = surf_lsm_v(l)%k(m)
    406384             tend(k,j,i) = tend(k,j,i) + surf_lsm_v(l)%mom_flux_uv(m) * ddy
    407           ENDDO   
     385          ENDDO
    408386       ENDDO
    409387!
     
    415393             k           = surf_usm_v(l)%k(m)
    416394             tend(k,j,i) = tend(k,j,i) + surf_usm_v(l)%mom_flux_uv(m) * ddy
    417           ENDDO   
    418        ENDDO
    419 !
    420 !--    Compute vertical diffusion. In case of simulating a surface layer,
    421 !--    respective grid diffusive fluxes are masked (flag 8) within this
    422 !--    loop, and added further below, else, simple gradient approach is
    423 !--    applied. Model top is also mask if top-momentum flux is given.
     395          ENDDO
     396       ENDDO
     397!
     398!--    Compute vertical diffusion. In case of simulating a surface layer, respective grid diffusive
     399!--    fluxes are masked (flag 8) within this loop, and added further below, else, simple gradient
     400!--    approach is applied. Model top is also mask if top-momentum flux is given.
    424401       DO  k = nzb+1, nzt
    425402!
    426 !--       Determine flags to mask topography below and above. Flag 1 is
    427 !--       used to mask topography in general, and flag 8 implies
    428 !--       information about use_surface_fluxes. Flag 9 is used to control
    429 !--       momentum flux at model top.
    430           mask_bottom = MERGE( 1.0_wp, 0.0_wp,                                 &
    431                                BTEST( wall_flags_total_0(k-1,j,i), 8 ) )
    432           mask_top    = MERGE( 1.0_wp, 0.0_wp,                                 &
    433                                BTEST( wall_flags_total_0(k+1,j,i), 8 ) ) *     &
    434                         MERGE( 1.0_wp, 0.0_wp,                                 &
    435                                BTEST( wall_flags_total_0(k+1,j,i), 9 ) )
    436           flag        = MERGE( 1.0_wp, 0.0_wp,                                 &
    437                                BTEST( wall_flags_total_0(k,j,i), 1 ) )
     403!--       Determine flags to mask topography below and above. Flag 1 is used to mask topography in
     404!--       general, and flag 8 implies information about use_surface_fluxes. Flag 9 is used to
     405!--       control momentum flux at model top.
     406          mask_bottom = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k-1,j,i), 8 ) )
     407          mask_top    = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k+1,j,i), 8 ) ) *         &
     408                        MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k+1,j,i), 9 ) )
     409          flag        = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_total_0(k,j,i), 1 ) )
    438410!
    439411!--       Interpolate eddy diffusivities on staggered gridpoints
     
    441413          kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
    442414
    443           tend(k,j,i) = tend(k,j,i)                                            &
    444                         + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)   &
    445                                    + ( w(k,j,i)   - w(k,j,i-1) ) * ddx         &
    446                                    ) * rho_air_zw(k)   * mask_top              &
    447                           - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
    448                                    + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
    449                                    ) * rho_air_zw(k-1) * mask_bottom           &
     415          tend(k,j,i) = tend(k,j,i)                                                                &
     416                        + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)                       &
     417                                   + ( w(k,j,i)   - w(k,j,i-1) ) * ddx                             &
     418                                   ) * rho_air_zw(k)   * mask_top                                  &
     419                          - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)                       &
     420                                   + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx                           &
     421                                   ) * rho_air_zw(k-1) * mask_bottom                               &
    450422                          ) * ddzw(k) * drho_air(k) * flag
    451423       ENDDO
    452424
    453425!
    454 !--    Vertical diffusion at the first surface grid points, if the
    455 !--    momentum flux at the bottom is given by the Prandtl law or if it is
    456 !--    prescribed by the user.
    457 !--    Difference quotient of the momentum flux is not formed over half of
    458 !--    the grid spacing (2.0*ddzw(k)) any more, since the comparison with
    459 !--    other (LES) models showed that the values of the momentum flux becomes
    460 !--    too large in this case.
     426!--    Vertical diffusion at the first surface grid points, if the momentum flux at the bottom is
     427!--    given by the Prandtl law or if it is prescribed by the user.
     428!--    Difference quotient of the momentum flux is not formed over half of the grid spacing
     429!--    (2.0*ddzw(k)) any more, since the comparison with other (LES) models showed that the values
     430!--    of the momentum flux becomes too large in this case.
    461431       IF ( use_surface_fluxes )  THEN
    462432!
     
    468438             k   = surf_def_h(0)%k(m)
    469439
    470              tend(k,j,i) = tend(k,j,i)                                         &
    471                         + ( - ( - surf_def_h(0)%usws(m) )                      &
    472                           ) * ddzw(k) * drho_air(k)
     440             tend(k,j,i) = tend(k,j,i) + ( - ( - surf_def_h(0)%usws(m) ) ) * ddzw(k) * drho_air(k)
    473441          ENDDO
    474442!
     
    480448             k   = surf_def_h(1)%k(m)
    481449
    482              tend(k,j,i) = tend(k,j,i)                                         &
    483                         + ( - surf_def_h(1)%usws(m)                            &
    484                           ) * ddzw(k) * drho_air(k)
     450             tend(k,j,i) = tend(k,j,i) + ( - surf_def_h(1)%usws(m) ) * ddzw(k) * drho_air(k)
    485451          ENDDO
    486452!
     
    492458             k   = surf_lsm_h%k(m)
    493459
    494              tend(k,j,i) = tend(k,j,i)                                         &
    495                         + ( - ( - surf_lsm_h%usws(m) )                         &
    496                           ) * ddzw(k) * drho_air(k)
     460             tend(k,j,i) = tend(k,j,i) + ( - ( - surf_lsm_h%usws(m) ) ) * ddzw(k) * drho_air(k)
    497461          ENDDO
    498462!
     
    504468             k   = surf_usm_h%k(m)
    505469
    506              tend(k,j,i) = tend(k,j,i)                                         &
    507                        + ( - ( - surf_usm_h%usws(m) )                          &
    508                          ) * ddzw(k) * drho_air(k)
     470             tend(k,j,i) = tend(k,j,i) + ( - ( - surf_usm_h%usws(m) ) ) * ddzw(k) * drho_air(k)
    509471          ENDDO
    510472
     
    519481             k   = surf_def_h(2)%k(m)
    520482
    521              tend(k,j,i) = tend(k,j,i)                                         &
    522                            + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k)
     483             tend(k,j,i) = tend(k,j,i) + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k)
    523484          ENDDO
    524485       ENDIF
Note: See TracChangeset for help on using the changeset viewer.