Ignore:
Timestamp:
Apr 21, 2016 11:20:47 AM (5 years ago)
Author:
suehring
Message:

Fixed bugs concerning advection flags, variable descriptions added in declaration block

File:
1 edited

Legend:

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

    r1846 r1886  
    1919! Current revisions:
    2020! -----------------
    21 !
     21! Bugfix: setting advection flags near walls
     22! reformulated index values for nzb_v_inner
     23! variable discriptions added in declaration block
    2224!
    2325! Former revisions:
     
    198200    IMPLICIT NONE
    199201
    200     INTEGER(iwp) ::  bh      !<
    201     INTEGER(iwp) ::  blx     !<
    202     INTEGER(iwp) ::  bly     !<
    203     INTEGER(iwp) ::  bxl     !<
    204     INTEGER(iwp) ::  bxr     !<
    205     INTEGER(iwp) ::  byn     !<
    206     INTEGER(iwp) ::  bys     !<
    207     INTEGER(iwp) ::  ch      !<
    208     INTEGER(iwp) ::  cwx     !<
    209     INTEGER(iwp) ::  cwy     !<
    210     INTEGER(iwp) ::  cxl     !<
    211     INTEGER(iwp) ::  cxr     !<
    212     INTEGER(iwp) ::  cyn     !<
    213     INTEGER(iwp) ::  cys     !<
    214     INTEGER(iwp) ::  gls     !<
    215     INTEGER(iwp) ::  i       !<
    216     INTEGER(iwp) ::  ii      !<
    217     INTEGER(iwp) ::  inc     !<
    218     INTEGER(iwp) ::  j       !<
    219     INTEGER(iwp) ::  k       !<
    220     INTEGER(iwp) ::  l       !<
    221     INTEGER(iwp) ::  nxl_l   !<
    222     INTEGER(iwp) ::  nxr_l   !<
    223     INTEGER(iwp) ::  nyn_l   !<
    224     INTEGER(iwp) ::  nys_l   !<
    225     INTEGER(iwp) ::  nzb_si  !<
    226     INTEGER(iwp) ::  nzt_l   !<
    227     INTEGER(iwp) ::  vi      !<
    228 
    229     INTEGER(iwp), DIMENSION(:), ALLOCATABLE   ::  vertical_influence  !<
    230 
    231     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_nl  !<
    232     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_nr  !<
    233     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_sl  !<
    234     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_sr  !<
    235     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_l     !<
    236     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_n     !<
    237     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_r     !<
    238     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_s     !<
    239     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_local  !<
    240     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_tmp    !<
    241 
    242     LOGICAL :: flag_set = .FALSE.  !<
    243 
    244     REAL(wp) ::  dx_l          !<
    245     REAL(wp) ::  dy_l          !<
    246     REAL(wp) ::  dz_stretched  !<
    247 
    248     REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  topo_height  !<
     202    INTEGER(iwp) ::  bh      !< temporary vertical index of building height
     203    INTEGER(iwp) ::  blx     !< grid point number of building size along x
     204    INTEGER(iwp) ::  bly     !< grid point number of building size along y
     205    INTEGER(iwp) ::  bxl     !< index for left building wall
     206    INTEGER(iwp) ::  bxr     !< index for right building wall
     207    INTEGER(iwp) ::  byn     !< index for north building wall
     208    INTEGER(iwp) ::  bys     !< index for south building wall
     209    INTEGER(iwp) ::  ch      !< temporary vertical index for canyon height
     210    INTEGER(iwp) ::  cwx     !< grid point number of canyon size along x
     211    INTEGER(iwp) ::  cwy     !< grid point number of canyon size along y
     212    INTEGER(iwp) ::  cxl     !< index for left canyon wall
     213    INTEGER(iwp) ::  cxr     !< index for right canyon wall
     214    INTEGER(iwp) ::  cyn     !< index for north canyon wall
     215    INTEGER(iwp) ::  cys     !< index for south canyon wall
     216    INTEGER(iwp) ::  gls     !< number of lateral ghost points at total model
     217                             !< domain boundaries required for multigrid solver
     218    INTEGER(iwp) ::  i       !< index variable along x
     219    INTEGER(iwp) ::  ii      !< loop variable for reading topography file
     220    INTEGER(iwp) ::  inc     !< incremental parameter for coarsening grid level
     221    INTEGER(iwp) ::  j       !< index variable along y
     222    INTEGER(iwp) ::  k       !< index variable along z
     223    INTEGER(iwp) ::  l       !< loop variable
     224    INTEGER(iwp) ::  nxl_l   !< index of left PE boundary for multigrid level
     225    INTEGER(iwp) ::  nxr_l   !< index of right PE boundary for multigrid level
     226    INTEGER(iwp) ::  nyn_l   !< index of north PE boundary for multigrid level
     227    INTEGER(iwp) ::  nys_l   !< index of south PE boundary for multigrid level
     228    INTEGER(iwp) ::  nzb_si  !< dummy index for local nzb_s_inner
     229    INTEGER(iwp) ::  nzt_l   !< index of top PE boundary for multigrid level
     230    INTEGER(iwp) ::  vi      !< dummy for vertical influence
     231
     232    INTEGER(iwp), DIMENSION(:), ALLOCATABLE   ::                               &
     233                     vertical_influence  !< number of vertical grid points above
     234                                         !< obstacle where adjustment of near-
     235                                         !< wall mixing length is required
     236                                         
     237    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_nl  !< index of
     238                                         !< north-left corner location to limit
     239                                         !< near-wall mixing length
     240    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_nr  !< north-right
     241    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_sl  !< south-left
     242    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  corner_sr  !< south-right
     243    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_l     !< distance to
     244                                                             !< adjacent left-facing
     245                                                             !< wall
     246    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_n     !< north-facing
     247    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_r     !< right-facing
     248    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  wall_s     !< right-facing
     249    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_local  !< index for topography
     250                                                             !< top at cell-center
     251    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_tmp    !< dummy to calculate
     252                                                             !< topography indices
     253                                                             !< on u- and v-grid
     254
     255    LOGICAL  :: flag_set = .FALSE.  !< steering variable for advection flags
     256
     257    REAL(wp) ::  dx_l          !< grid spacing along x on different multigrid level
     258    REAL(wp) ::  dy_l          !< grid spacing along y on different multigrid level
     259    REAL(wp) ::  dz_stretched  !< stretched vertical grid spacing
     260
     261    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  topo_height  !< input variable for
     262                                                           !< topography height
    249263
    250264   
     
    908922          ENDDO
    909923       ENDDO
    910        nzb_v_inner = nzb_tmp(nys-nbgp:nyn+nbgp,nxl-nbgp:nxr+nbgp)
     924       nzb_v_inner = nzb_tmp(nysg:nyng,nxlg:nxrg)
    911925
    912926!
     
    12191233    wall_flags_00 = 0
    12201234
    1221     IF ( scalar_advec == 'ws-scheme' .OR.                                     &
     1235    IF ( scalar_advec == 'ws-scheme' .OR.                                      &
    12221236         scalar_advec == 'ws-scheme-mono' )  THEN
    12231237!
     
    12321246!--             scalar - x-direction
    12331247!--             WS1 (0), WS3 (1), WS5 (2)
    1234                 IF ( k <= nzb_s_inner(j,i+1) .OR.                              &
    1235                          ( ( inflow_l .OR. outflow_l .OR. nest_bound_l )       &
     1248                IF ( ( k <= nzb_s_inner(j,i+1) .OR. k <= nzb_s_inner(j,i+2)    &   
     1249                  .OR. k <= nzb_s_inner(j,i-1) )                               &
     1250                    .OR. ( ( inflow_l .OR. outflow_l .OR. nest_bound_l )       &
    12361251                           .AND. i == nxl   )    .OR.                          &
    12371252                         ( ( inflow_r .OR. outflow_r .OR. nest_bound_r )       &
     
    12391254                THEN
    12401255                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 0 )
    1241                 ELSEIF ( k <= nzb_s_inner(j,i+2) .OR. k <= nzb_s_inner(j,i-1)  &
     1256                ELSEIF ( ( k <= nzb_s_inner(j,i+3) .AND. k > nzb_s_inner(j,i+1)&
     1257                                                   .AND. k > nzb_s_inner(j,i+2)&
     1258                                                   .AND. k > nzb_s_inner(j,i-1)&
     1259                         )                       .OR.                          &
     1260                         ( k <= nzb_s_inner(j,i-2) .AND. k > nzb_s_inner(j,i+1)&
     1261                                                   .AND. k > nzb_s_inner(j,i+2)&
     1262                                                   .AND. k > nzb_s_inner(j,i-1)&
     1263                         )                                                     &
    12421264                                                 .OR.                          &
    12431265                         ( ( inflow_r .OR. outflow_r .OR. nest_bound_r )       &
     
    12471269                THEN
    12481270                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 1 )
    1249                 ELSE
     1271                ELSEIF ( k > nzb_s_inner(j,i+1) .AND. k > nzb_s_inner(j,i+2)   &
     1272                   .AND. k > nzb_s_inner(j,i+3) .AND. k > nzb_s_inner(j,i-1)   &
     1273                   .AND. k > nzb_s_inner(j,i-2) )                              &
     1274                THEN
    12501275                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 2 )
    12511276                ENDIF
     
    12531278!--             scalar - y-direction
    12541279!--             WS1 (3), WS3 (4), WS5 (5)
    1255                 IF ( k <= nzb_s_inner(j+1,i) .OR.                              &
     1280                IF ( ( k <= nzb_s_inner(j+1,i)  .OR. k <= nzb_s_inner(j+2,i)   &   
     1281                                                .OR. k <= nzb_s_inner(j-1,i) ) &
     1282                                                 .OR.                          &
    12561283                         ( ( inflow_s .OR. outflow_s .OR. nest_bound_s )       &
    12571284                           .AND. j == nys   )    .OR.                          &
     
    12621289!
    12631290!--             WS3
    1264                 ELSEIF ( k <= nzb_s_inner(j+2,i) .OR. k <= nzb_s_inner(j-1,i)  &
    1265                                                  .OR.                          &
     1291                ELSEIF ( ( k <= nzb_s_inner(j+3,i) .AND. k > nzb_s_inner(j+1,i)&
     1292                                                   .AND. k > nzb_s_inner(j+2,i)&
     1293                                                   .AND. k > nzb_s_inner(j-1,i)&
     1294                         )                           .OR.                      &
     1295                         ( k <= nzb_s_inner(j-2,i) .AND. k > nzb_s_inner(j+1,i)&
     1296                                                   .AND. k > nzb_s_inner(j+2,i)&
     1297                                                   .AND. k > nzb_s_inner(j-1,i)&
     1298                         )                                                     &
     1299                                                     .OR.                      &
    12661300                         ( ( inflow_s .OR. outflow_s .OR. nest_bound_s )       &
    12671301                           .AND. j == nysv  )    .OR.                          &
     
    12721306!
    12731307!--             WS5
    1274                 ELSE
     1308                ELSEIF ( k > nzb_s_inner(j+1,i) .AND. k > nzb_s_inner(j+2,i)   &
     1309                   .AND. k > nzb_s_inner(j+3,i) .AND. k > nzb_s_inner(j-1,i)   &
     1310                   .AND. k > nzb_s_inner(j-2,i) )                              &
     1311                THEN
    12751312                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 5 )
    12761313                ENDIF
     
    12881325                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 8 )
    12891326                ENDIF
     1327
    12901328             ENDDO
    12911329          ENDDO
     
    13121350!--             u component - x-direction
    13131351!--             WS1 (9), WS3 (10), WS5 (11)
    1314                 IF ( k <= nzb_u_inner(j,i+1) .OR.                              &
     1352                IF ( k <= nzb_u_inner(j,i+1)     .OR.                          &
    13151353                         ( ( inflow_l .OR. outflow_l .OR. nest_bound_l )       &
    13161354                           .AND. i <= nxlu  )    .OR.                          &
     
    13191357                THEN
    13201358                    wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 9 )
    1321                 ELSEIF ( k <= nzb_u_inner(j,i+2) .OR. k <= nzb_u_inner(j,i-1)  &
    1322                                                  .OR.                          &
     1359                ELSEIF ( ( k <= nzb_u_inner(j,i+2) .AND.                       &
     1360                           k >  nzb_u_inner(j,i+1) ) .OR.                      &
     1361                           k <= nzb_u_inner(j,i-1)                             &
     1362                                                     .OR.                      &
    13231363                         ( ( inflow_r .OR. outflow_r .OR. nest_bound_r )       &
    13241364                           .AND. i == nxr-1 )    .OR.                          &
     
    13301370!--                Clear flag for WS1
    13311371                   wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 9 )
    1332                 ELSE
     1372                ELSEIF ( k > nzb_u_inner(j,i+1) .AND. k > nzb_u_inner(j,i+2)   &
     1373                                                .AND. k > nzb_u_inner(j,i-1) ) &
     1374                THEN   
    13331375                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 11 )
    13341376!
     
    13461388                THEN
    13471389                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 12 )
    1348                 ELSEIF ( k <= nzb_u_inner(j+2,i) .OR. k <= nzb_u_inner(j-1,i)  &
    1349                                                  .OR.                          &
     1390                ELSEIF ( ( k <= nzb_u_inner(j+2,i) .AND.                       &
     1391                           k >  nzb_u_inner(j+1,i) ) .OR.                      &
     1392                           k <= nzb_u_inner(j-1,i)                             &
     1393                                                     .OR.                      &
    13501394                         ( ( inflow_s .OR. outflow_s .OR. nest_bound_s )       &
    13511395                           .AND. j == nysv  )    .OR.                          &
     
    13571401!--                Clear flag for WS1
    13581402                   wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 12 )
    1359                 ELSE
     1403                ELSEIF ( k > nzb_u_inner(j+1,i) .AND. k > nzb_u_inner(j+2,i)   &
     1404                                                .AND. k > nzb_u_inner(j-1,i) ) &
     1405                THEN
    13601406                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 14 )
    13611407!
     
    14021448!
    14031449!--             WS3
    1404                 ELSEIF ( k <= nzb_v_inner(j,i+2) .OR. k <= nzb_v_inner(j,i-1)  &
     1450                ELSEIF ( ( k <= nzb_v_inner(j,i+2) .AND.                       &
     1451                           k >  nzb_v_inner(j,i+1) ) .OR.                      &
     1452                           k <= nzb_v_inner(j,i-1)                             &
    14051453                                                 .OR.                          &
    14061454                         ( ( inflow_r .OR. outflow_r .OR. nest_bound_r )       &
     
    14131461!--                Clear flag for WS1
    14141462                   wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 18 )
    1415                 ELSE
     1463                ELSEIF ( k > nzb_v_inner(j,i+1) .AND. k > nzb_v_inner(j,i+2)   &
     1464                                                .AND. k > nzb_v_inner(j,i-1) ) &
     1465                THEN
    14161466                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 20 )
    14171467!
     
    14291479                THEN
    14301480                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 21 )
    1431                 ELSEIF ( k <= nzb_v_inner(j+2,i) .OR. k <= nzb_v_inner(j-1,i)  &
    1432                                                  .OR.                          &
     1481                ELSEIF ( ( k <= nzb_v_inner(j+2,i) .AND.                       &
     1482                           k >  nzb_v_inner(j+1,i) ) .OR.                      &
     1483                           k <= nzb_v_inner(j-1,i)                             &
     1484                                                     .OR.                      &
    14331485                         ( ( inflow_s .OR. outflow_s .OR. nest_bound_s )       &
    14341486                           .AND. j == nysv+1)    .OR.                          &
     
    14401492!--                Clear flag for WS1
    14411493                   wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 21 )
    1442                 ELSE
     1494                ELSEIF ( k > nzb_v_inner(j+1,i) .AND. k > nzb_v_inner(j+2,i)   &
     1495                                                .AND. k > nzb_v_inner(j-1,i) ) &
     1496                THEN
    14431497                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 23 )
    14441498!
     
    14821536                THEN
    14831537                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 27 )
    1484                 ELSEIF ( k <= nzb_w_inner(j,i+2) .OR. k <= nzb_w_inner(j,i-1)  &
    1485                                                  .OR.                          &
     1538                ELSEIF ( ( k <= nzb_w_inner(j,i+2) .AND.                       &
     1539                           k >  nzb_w_inner(j,i+1) ) .OR.                      &
     1540                           k <= nzb_w_inner(j,i-1)                             &
     1541                                                     .OR.                      &
    14861542                         ( ( inflow_r .OR. outflow_r .OR. nest_bound_r )       &
    14871543                           .AND. i == nxr-1 )    .OR.                          &
     
    14931549!--                Clear flag for WS1
    14941550                   wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 27 )
    1495                 ELSE
     1551                ELSEIF ( k > nzb_w_inner(j,i+1) .AND. k > nzb_w_inner(j,i+2)   &
     1552                                                .AND. k > nzb_w_inner(j,i-1) ) &
     1553                THEN
    14961554                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i),29 )
    14971555!
     
    15091567                THEN
    15101568                   wall_flags_0(k,j,i) = IBSET( wall_flags_0(k,j,i), 30 )
    1511                 ELSEIF ( k <= nzb_w_inner(j+2,i) .OR. k <= nzb_w_inner(j-1,i)  &
    1512                                                  .OR.                          &
     1569                ELSEIF ( ( k <= nzb_w_inner(j+2,i) .AND.                       &
     1570                           k >  nzb_w_inner(j+1,i) ) .OR.                      &
     1571                           k <= nzb_w_inner(j-1,i)                             &
     1572                                                     .OR.                      &
    15131573                         ( ( inflow_s .OR. outflow_s .OR. nest_bound_s )       &
    15141574                           .AND. j == nysv  )    .OR.                          &
     
    15201580!--                Clear flag for WS1
    15211581                   wall_flags_0(k,j,i) = IBCLR( wall_flags_0(k,j,i), 30 )
    1522                 ELSE
     1582                ELSEIF ( k > nzb_w_inner(j+1,i) .AND. k > nzb_w_inner(j+2,i)   &
     1583                                                .AND. k > nzb_w_inner(j-1,i) ) &
     1584                THEN
    15231585                   wall_flags_00(k,j,i) = IBSET( wall_flags_00(k,j,i), 0 )
    15241586!
Note: See TracChangeset for help on using the changeset viewer.