Ignore:
Timestamp:
May 30, 2017 5:47:52 PM (7 years ago)
Author:
suehring
Message:

Adjustments according new topography and surface-modelling concept implemented

File:
1 edited

Legend:

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

    r2119 r2232  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! Adjustments to new topography and surface concept
    2323!
    2424! Former revisions:
     
    129129
    130130       USE arrays_3d,                                                          &
    131            ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw,        &
     131           ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, l_wall, tend, zu, zw,&
    132132                  drho_air, rho_air_zw
    133133           
     
    140140           
    141141       USE indices,                                                            &
    142            ONLY:  nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_s_inner,&
    143                   nzt
     142           ONLY:  nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzb_max,    &
     143                  nzt, wall_flags_0
    144144           
    145145       USE kinds
     
    151151           ONLY:  use_sgs_for_particles, wang_kernel
    152152
     153       USE surface_mod,                                                        &
     154          ONLY :  bc_h
     155
    153156       IMPLICIT NONE
    154157
    155        INTEGER(iwp) ::  i              !<
    156        INTEGER(iwp) ::  j              !<
    157        INTEGER(iwp) ::  k              !<
     158       INTEGER(iwp) ::  i              !< running index x direction
     159       INTEGER(iwp) ::  j              !< running index y direction
     160       INTEGER(iwp) ::  k              !< running index z direction
     161       INTEGER(iwp) ::  m              !< running index surface elements
     162 
    158163       REAL(wp)     ::  dvar_dz        !<
     164       REAL(wp)     ::  flag           !< flag to mask topography
    159165       REAL(wp)     ::  l_stable       !<
    160166       REAL(wp)     ::  var_reference  !<
     
    177183          DO  i = nxl, nxr
    178184             DO  j = nys, nyn
    179                 DO  k = nzb_s_inner(j,i)+1, nzt
     185                DO  k = nzb+1, nzt
    180186!
    181187!--                Calculate the mixing length (for dissipation)
     
    191197!--                Adjustment of the mixing length
    192198                   IF ( wall_adjustment )  THEN
    193                       l(k,j)  = MIN( wall_adjustment_factor *          &
    194                                      ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     199                      l(k,j)  = MIN( wall_adjustment_factor * l_wall(k,j,i),   &
    195200                                     l_grid(k), l_stable )
    196                       ll(k,j) = MIN( wall_adjustment_factor *          &
    197                                      ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     201                      ll(k,j) = MIN( wall_adjustment_factor * l_wall(k,j,i),   &
    198202                                     l_grid(k) )
    199203                   ELSE
     
    208212!--          Calculate the tendency terms
    209213             DO  j = nys, nyn
    210                 DO  k = nzb_s_inner(j,i)+1, nzt
    211 
    212                     dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * &
     214                DO  k = nzb+1, nzt
     215!
     216!--                Predetermine flag to mask topography
     217                   flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     218
     219                   dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * &
    213220                                       e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j)
    214221
    215                     tend(k,j,i) = tend(k,j,i)                                  &
     222                   tend(k,j,i) = tend(k,j,i)                                   &
    216223                                        + (                                    &
    217224                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
    218225                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
    219                                           ) * ddx2                             &
     226                                          ) * ddx2  * flag                     &
    220227                                        + (                                    &
    221228                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
    222229                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
    223                                           ) * ddy2                             &
     230                                          ) * ddy2  * flag                     &
    224231                                        + (                                    &
    225232               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
     
    227234             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
    228235                                                             * rho_air_zw(k-1) &
    229                                           ) * ddzw(k) * drho_air(k)            &
    230                              - dissipation(k,j)
     236                                          ) * ddzw(k) * drho_air(k) * flag     &
     237                             - dissipation(k,j) * flag
    231238
    232239                ENDDO
     
    239246                  collision_turbulence )  THEN
    240247                DO  j = nys, nyn
    241                    DO  k = nzb_s_inner(j,i)+1, nzt
    242                       diss(k,j,i) = dissipation(k,j)
     248                   DO  k = nzb+1, nzt
     249                      diss(k,j,i) = dissipation(k,j) *                         &
     250                                        MERGE( 1.0_wp, 0.0_wp,                 &
     251                                               BTEST( wall_flags_0(k,j,i), 0 ) )
    243252                   ENDDO
    244253                ENDDO
     
    251260          DO  i = nxl, nxr
    252261             DO  j = nys, nyn
    253                 DO  k = nzb_s_inner(j,i)+1, nzt
     262                DO  k = nzb+1, nzt
    254263!
    255264!--                Calculate the mixing length (for dissipation)
     
    265274!--                Adjustment of the mixing length
    266275                   IF ( wall_adjustment )  THEN
    267                       l(k,j)  = MIN( wall_adjustment_factor *          &
    268                                      ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     276                      l(k,j)  = MIN( wall_adjustment_factor * l_wall(k,j,i),   &
    269277                                     l_grid(k), l_stable )
    270                       ll(k,j) = MIN( wall_adjustment_factor *          &
    271                                      ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     278                      ll(k,j) = MIN( wall_adjustment_factor * l_wall(k,j,i),   &
    272279                                     l_grid(k) )
    273280                   ELSE
     
    282289!--          Calculate the tendency terms
    283290             DO  j = nys, nyn
    284                 DO  k = nzb_s_inner(j,i)+1, nzt
    285 
    286                     dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) ) * &
     291                DO  k = nzb+1, nzt
     292!
     293!--                Predetermine flag to mask topography
     294                   flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     295
     296                   dissipation(k,j) = ( 0.19_wp + 0.74_wp * l(k,j) / ll(k,j) )   *&
    287297                                             e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j)
    288298
    289                     tend(k,j,i) = tend(k,j,i)                                  &
     299                   tend(k,j,i) = tend(k,j,i)                                   &
    290300                                        + (                                    &
    291301                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
    292302                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
    293                                           ) * ddx2                             &
     303                                          ) * ddx2  * flag                     &
    294304                                        + (                                    &
    295305                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
    296306                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
    297                                           ) * ddy2                             &
     307                                          ) * ddy2  * flag                     &
    298308                                        + (                                    &
    299309               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
     
    301311             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
    302312                                                             * rho_air_zw(k-1) &
    303                                           ) * ddzw(k) * drho_air(k)            &
    304                              - dissipation(k,j)
     313                                          ) * ddzw(k) * drho_air(k) * flag     &
     314                             - dissipation(k,j) * flag
    305315
    306316                ENDDO
     
    313323                  collision_turbulence )  THEN
    314324                DO  j = nys, nyn
    315                    DO  k = nzb_s_inner(j,i)+1, nzt
    316                       diss(k,j,i) = dissipation(k,j)
     325                   DO  k = nzb+1, nzt
     326                      diss(k,j,i) = dissipation(k,j) *                         &
     327                                        MERGE( 1.0_wp, 0.0_wp,                 &
     328                                               BTEST( wall_flags_0(k,j,i), 0 ) )
    317329                   ENDDO
    318330                ENDDO
     
    324336
    325337!
    326 !--    Boundary condition for dissipation
     338!--    Neumann boundary condition for dissipation diss(nzb,:,:) = diss(nzb+1,:,:)
    327339       IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.  &
    328340            collision_turbulence )  THEN
    329           DO  i = nxl, nxr
    330              DO  j = nys, nyn
    331                 diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i)
    332              ENDDO
    333           ENDDO
     341!
     342!--       Upward facing surfaces
     343          DO  m = 1, bc_h(0)%ns
     344             i = bc_h(0)%i(m)           
     345             j = bc_h(0)%j(m)
     346             k = bc_h(0)%k(m)
     347             diss(k-1,j,i) = diss(k,j,i)
     348          ENDDO
     349!
     350!--       Downward facing surfaces
     351          DO  m = 1, bc_h(1)%ns
     352             i = bc_h(1)%i(m)           
     353             j = bc_h(1)%j(m)
     354             k = bc_h(1)%k(m)
     355             diss(k+1,j,i) = diss(k,j,i)
     356          ENDDO
     357
    334358       ENDIF
    335359
     
    345369
    346370       USE arrays_3d,                                                          &
    347            ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, tend, zu, zw,        &
     371           ONLY:  dd2zu, ddzu, ddzw, diss, e, km, l_grid, l_wall, tend, zu, zw,&
    348372                  drho_air, rho_air_zw
    349373         
     
    356380           
    357381       USE indices,                                                            &
    358            ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_s_inner, nzt
     382           ONLY:  nxlg, nxrg, nyng, nysg, nzb, nzb_max, nzt, wall_flags_0
    359383           
    360384       USE kinds
     
    366390           ONLY:  use_sgs_for_particles, wang_kernel
    367391
     392       USE surface_mod,                                                        &
     393          ONLY :  bc_h
     394
    368395       IMPLICIT NONE
    369396
    370        INTEGER(iwp) ::  i              !<
    371        INTEGER(iwp) ::  j              !<
    372        INTEGER(iwp) ::  k              !<
     397       INTEGER(iwp) ::  i              !< running index x direction
     398       INTEGER(iwp) ::  j              !< running index y direction
     399       INTEGER(iwp) ::  k              !< running index z direction
     400       INTEGER(iwp) ::  m              !< running index surface elements
     401       INTEGER(iwp) ::  surf_e         !< End index of surface elements at (j,i)-gridpoint
     402       INTEGER(iwp) ::  surf_s         !< Start index of surface elements at (j,i)-gridpoint
     403
    373404       REAL(wp)     ::  dvar_dz        !<
     405       REAL(wp)     ::  flag           !< flag to mask topography
    374406       REAL(wp)     ::  l_stable       !<
    375407       REAL(wp)     ::  var_reference  !<
     
    384416       REAL(wp), DIMENSION(nzb+1:nzt) ::  ll           !<
    385417
    386 
    387418!
    388419!--    Calculate the mixing length (for dissipation)
    389        DO  k = nzb_s_inner(j,i)+1, nzt
     420       DO  k = nzb+1, nzt
     421!
     422!--       Predetermine flag to mask topography
     423          flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
     424
    390425          dvar_dz = atmos_ocean_sign * &
    391426                    ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
     
    404439!--       Adjustment of the mixing length
    405440          IF ( wall_adjustment )  THEN
    406              l(k)  = MIN( wall_adjustment_factor *                     &
    407                           ( zu(k) - zw(nzb_s_inner(j,i)) ), l_grid(k), &
    408                           l_stable )
    409              ll(k) = MIN( wall_adjustment_factor *                     &
    410                           ( zu(k) - zw(nzb_s_inner(j,i)) ), l_grid(k) )
     441             l(k)  = MIN( wall_adjustment_factor * l_wall(k,j,i),              &
     442                          l_grid(k), l_stable )
     443             ll(k) = MIN( wall_adjustment_factor * l_wall(k,j,i), l_grid(k) )
    411444          ELSE
    412445             l(k)  = MIN( l_grid(k), l_stable )
     
    415448!
    416449!--       Calculate the tendency term
    417           dissipation(k) = ( 0.19_wp + 0.74_wp * l(k) / ll(k) ) * e(k,j,i) * &
     450          dissipation(k) = ( 0.19_wp + 0.74_wp * l(k) / ll(k) ) * e(k,j,i) *   &
    418451                                 SQRT( e(k,j,i) ) / l(k)
    419452
    420           tend(k,j,i) = tend(k,j,i)                                           &
    421                                        + (                                    &
    422                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
    423                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
    424                                          ) * ddx2                             &
    425                                        + (                                    &
    426                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
    427                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
    428                                          ) * ddy2                             &
    429                                        + (                                    &
    430               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
    431                                                             * rho_air_zw(k)   &
    432             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
    433                                                             * rho_air_zw(k-1) &
    434                                          ) * ddzw(k) * drho_air(k)            &
    435                                        - dissipation(k)
     453          tend(k,j,i) = tend(k,j,i)                                            &
     454                                       + (                                     &
     455                         ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )   &
     456                       - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )   &
     457                                         ) * ddx2  * flag                      &
     458                                       + (                                     &
     459                         ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )   &
     460                       - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )   &
     461                                         ) * ddy2  * flag                      &
     462                                       + (                                     &
     463              ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1)  &
     464                                                            * rho_air_zw(k)    &
     465            - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)    &
     466                                                            * rho_air_zw(k-1)  &
     467                                         ) * ddzw(k) * drho_air(k) * flag      &
     468                                       - dissipation(k) * flag
    436469
    437470       ENDDO
     
    441474       IF ( use_sgs_for_particles  .OR.  wang_kernel  .OR.                     &
    442475            collision_turbulence )  THEN
    443           DO  k = nzb_s_inner(j,i)+1, nzt
    444              diss(k,j,i) = dissipation(k)
    445           ENDDO
    446 !
    447 !--       Boundary condition for dissipation
    448           diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i)
     476          DO  k = nzb+1, nzt
     477             diss(k,j,i) = dissipation(k) *                                    &
     478                                        MERGE( 1.0_wp, 0.0_wp,                 &
     479                                               BTEST( wall_flags_0(k,j,i), 0 ) )
     480          ENDDO
     481!
     482!--       Neumann boundary condition for dissipation diss(nzb,:,:) = diss(nzb+1,:,:)
     483!--       For each surface type determine start and end index (in case of elevated
     484!--       toopography several up/downward facing surfaces may exist.
     485          surf_s = bc_h(0)%start_index(j,i)   
     486          surf_e = bc_h(0)%end_index(j,i)   
     487          DO  m = surf_s, surf_e
     488             k             = bc_h(0)%k(m)
     489             diss(k-1,j,i) = diss(k,j,i)
     490          ENDDO
     491!
     492!--       Downward facing surfaces
     493          surf_s = bc_h(1)%start_index(j,i)   
     494          surf_e = bc_h(1)%end_index(j,i)   
     495          DO  m = surf_s, surf_e
     496             k             = bc_h(1)%k(m)
     497             diss(k+1,j,i) = diss(k,j,i)
     498          ENDDO
    449499       ENDIF
    450500
Note: See TracChangeset for help on using the changeset viewer.