Changeset 3542


Ignore:
Timestamp:
Nov 20, 2018 5:04:13 PM (3 years ago)
Author:
suehring
Message:

Revise ghost point exchange in netcdf-data input; new routine for ghost point exchange of 1-Byte Integer; Remove tabs in chemistry model which prevent compilation with gfortran and debug options

Location:
palm/trunk/SOURCE
Files:
6 edited

Legend:

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

    r3524 r3542  
    2222! Current revisions:
    2323! -----------------
    24 !
     24! Remove tabs
    2525!
    2626! Former revisions:
     
    295295    ! DEPAC landuse classes as defined in LOTOS-EUROS model v2.1                             
    296296    !
    297     INTEGER(iwp)  ::  ilu_grass              = 1       
    298     INTEGER(iwp)  ::  ilu_arable             = 2       
     297    INTEGER(iwp)  ::  ilu_grass              = 1       
     298    INTEGER(iwp)  ::  ilu_arable             = 2       
    299299    INTEGER(iwp)  ::  ilu_permanent_crops    = 3         
    300300    INTEGER(iwp)  ::  ilu_coniferous_forest  = 4         
    301301    INTEGER(iwp)  ::  ilu_deciduous_forest   = 5         
    302     INTEGER(iwp)  ::  ilu_water_sea          = 6       
    303     INTEGER(iwp)  ::  ilu_urban              = 7       
     302    INTEGER(iwp)  ::  ilu_water_sea          = 6       
     303    INTEGER(iwp)  ::  ilu_urban              = 7       
    304304    INTEGER(iwp)  ::  ilu_other              = 8 
    305305    INTEGER(iwp)  ::  ilu_desert             = 9 
     
    313313    !--------------------------------------------------------------------------
    314314    ! NH3/SO2 ratio regimes:
    315     INTEGER, PARAMETER  ::  iratns_low  = 1       ! low ratio NH3/SO2
    316     INTEGER, PARAMETER  ::  iratns_high = 2       ! high ratio NH3/SO2
     315    INTEGER, PARAMETER  ::  iratns_low  = 1       ! low ratio NH3/SO2
     316    INTEGER, PARAMETER  ::  iratns_high = 2       ! high ratio NH3/SO2
    317317    INTEGER, PARAMETER  ::  iratns_very_low = 3   ! very low ratio NH3/SO2
    318318    ! Default:
     
    42094209      INTEGER(iwp)              , INTENT(in)       :: day_of_year      ! day of year, 1 ... 365 (366)
    42104210      REAL(kind=wp)             , INTENT(in)       :: lat                   ! latitude Northern hemisphere (degrees) (DEPAC cannot be used for S. hemisphere)
    4211       REAL(kind=wp)            , INTENT(in)        :: t                ! temperature (C)
     4211      REAL(kind=wp)            , INTENT(in)        :: t                ! temperature (C)
    42124212      ! NB discussion issue is temp T_2m or T_surf or T_leaf?
    42134213      REAL(kind=wp)             , INTENT(in)       :: ust              ! friction velocity (m/s)
     
    46154615
    46164616      ! input/output variables:
    4617       INTEGER(iwp),           INTENT(in) :: icmp           ! component index
    4618       CHARACTER(len=*),       INTENT(in) :: compnam        ! component name
    4619       INTEGER(iwp),           INTENT(in) :: lu             ! land use type , lu = 1,...,nlu
     4617      INTEGER(iwp),           INTENT(in) :: icmp        ! component index
     4618      CHARACTER(len=*),       INTENT(in) :: compnam     ! component name
     4619      INTEGER(iwp),           INTENT(in) :: lu          ! land use type , lu = 1,...,nlu
    46204620      LOGICAL,                INTENT(in) :: LAI_present
    4621       REAL(kind=wp),          INTENT(in) :: lai            ! one-sided leaf area index
    4622       REAL(kind=wp),          INTENT(in) :: glrad          ! global radiation (W/m2)
    4623       REAL(kind=wp),          INTENT(in) :: sinphi         ! sin of solar elevation angle
    4624       REAL(kind=wp),          INTENT(in) :: t              ! temperature (C)
    4625       REAL(kind=wp),          INTENT(in) :: rh             ! relative humidity (%)
    4626       REAL(kind=wp),          INTENT(in) :: diffc              ! diffusion coefficient of the gas involved
    4627       REAL(kind=wp),          INTENT(out):: gstom              ! stomatal conductance (m/s)
    4628       REAL(kind=wp), OPTIONAL,INTENT(in) :: p              ! pressure (Pa)
     4621      REAL(kind=wp),          INTENT(in) :: lai         ! one-sided leaf area index
     4622      REAL(kind=wp),          INTENT(in) :: glrad       ! global radiation (W/m2)
     4623      REAL(kind=wp),          INTENT(in) :: sinphi      ! sin of solar elevation angle
     4624      REAL(kind=wp),          INTENT(in) :: t           ! temperature (C)
     4625      REAL(kind=wp),          INTENT(in) :: rh          ! relative humidity (%)
     4626      REAL(kind=wp),          INTENT(in) :: diffc       ! diffusion coefficient of the gas involved
     4627      REAL(kind=wp),          INTENT(out):: gstom       ! stomatal conductance (m/s)
     4628      REAL(kind=wp), OPTIONAL,INTENT(in) :: p           ! pressure (Pa)
    46294629
    46304630
  • palm/trunk/SOURCE/exchange_horiz_2d.f90

    r3183 r3542  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! - New routine for exchange of 8-bit integer arrays
     23! - Set Neumann conditions also at radiation boundary
    2324!
    2425! Former revisions:
     
    213214
    214215
    215 
    216216!------------------------------------------------------------------------------!
    217217! Description:
    218218! ------------
    219219!> Exchange of lateral (ghost) boundaries (parallel computers) and cyclic
    220 !> boundary conditions, respectively, for 2D integer arrays.
    221 !------------------------------------------------------------------------------!
    222  
    223  SUBROUTINE exchange_horiz_2d_int( ar, nys_l, nyn_l, nxl_l, nxr_l, nbgp_local )
     220!> boundary conditions, respectively, for 2D 8-bit integer arrays.
     221!------------------------------------------------------------------------------!
     222 SUBROUTINE exchange_horiz_2d_byte( ar, nys_l, nyn_l, nxl_l, nxr_l, nbgp_local )
    224223
    225224
    226225    USE control_parameters,                                                    &
    227226        ONLY:  bc_dirichlet_l, bc_dirichlet_n, bc_dirichlet_r,                 &
    228                bc_dirichlet_s, bc_lr_cyc, bc_ns_cyc, bc_radiation_l,           &
     227               bc_dirichlet_s, bc_radiation_l, bc_radiation_n, bc_radiation_r, &
     228               bc_radiation_s, bc_lr_cyc, bc_ns_cyc, bc_radiation_l,           &
    229229               bc_radiation_n, bc_radiation_r, bc_radiation_s, grid_level
    230230       
     
    245245    INTEGER(iwp) ::  nbgp_local  !< number of ghost layers to be exchanged
    246246
     247    INTEGER(KIND=1), DIMENSION(nys_l-nbgp_local:nyn_l+nbgp_local,              &
     248                               nxl_l-nbgp_local:nxr_l+nbgp_local) ::  ar  !< treated array
     249
     250    CALL cpu_log( log_point_s(13), 'exchange_horiz_2d', 'start' )
     251
     252#if defined( __parallel )
     253
     254!
     255!-- Exchange of lateral boundary values for parallel computers
     256    IF ( pdims(1) == 1 )  THEN
     257
     258!
     259!--    One-dimensional decomposition along y, boundary values can be exchanged
     260!--    within the PE memory
     261       ar(:,nxl_l-nbgp_local:nxl_l-1) = ar(:,nxr_l-nbgp_local+1:nxr_l)
     262       ar(:,nxr_l+1:nxr_l+nbgp_local) = ar(:,nxl_l:nxl_l+nbgp_local-1)
     263
     264    ELSE
     265!
     266!--    Send left boundary, receive right one
     267       CALL MPI_SENDRECV( ar(nys_l-nbgp_local,nxl_l),   1,                     &
     268                          type_y_byte, pleft,  0,                              &
     269                          ar(nys_l-nbgp_local,nxr_l+1), 1,                     &
     270                          type_y_byte, pright, 0,                              &
     271                          comm2d, status, ierr )
     272!
     273!--    Send right boundary, receive left one
     274       CALL MPI_SENDRECV( ar(nys_l-nbgp_local,nxr_l+1-nbgp_local), 1,          &
     275                          type_y_byte, pright, 1,                              &
     276                          ar(nys_l-nbgp_local,nxl_l-nbgp_local),   1,          &
     277                          type_y_byte, pleft,  1,                              &
     278                          comm2d, status, ierr )                         
     279
     280    ENDIF
     281
     282    IF ( pdims(2) == 1 )  THEN
     283!
     284!--    One-dimensional decomposition along x, boundary values can be exchanged
     285!--    within the PE memory
     286       ar(nys_l-nbgp_local:nys_l-1,:) = ar(nyn_l+1-nbgp_local:nyn_l,:)
     287       ar(nyn_l+1:nyn_l+nbgp_local,:) = ar(nys_l:nys_l-1+nbgp_local,:)
     288
     289
     290    ELSE
     291!
     292!--    Send front boundary, receive rear one
     293       CALL MPI_SENDRECV( ar(nys_l,nxl_l-nbgp_local),   1,                    &
     294                          type_x_byte, psouth, 0,                             &
     295                          ar(nyn_l+1,nxl_l-nbgp_local), 1,                    &
     296                          type_x_byte, pnorth, 0,                             &
     297                          comm2d, status, ierr )                         
     298
     299!
     300!--    Send rear boundary, receive front one
     301       CALL MPI_SENDRECV( ar(nyn_l+1-nbgp_local,nxl_l-nbgp_local), 1,         &
     302                          type_x_byte, pnorth, 1,                             &
     303                          ar(nys_l-nbgp_local,nxl_l-nbgp_local),   1,         &
     304                          type_x_byte, psouth, 1,                             &
     305                          comm2d, status, ierr )
     306
     307    ENDIF
     308
     309#else
     310
     311!
     312!-- Lateral boundary conditions in the non-parallel case
     313    IF ( bc_lr_cyc )  THEN
     314       ar(:,nxl_l-nbgp_local:nxl_l-1) = ar(:,nxr_l-nbgp_local+1:nxr_l)
     315       ar(:,nxr_l+1:nxr_l+nbgp_local) = ar(:,nxl_l:nxl_l+nbgp_local-1)
     316    ENDIF
     317
     318    IF ( bc_ns_cyc )  THEN
     319       ar(nys_l-nbgp_local:nys_l-1,:) = ar(nyn_l+1-nbgp_local:nyn_l,:)
     320       ar(nyn_l+1:nyn_l+nbgp_local,:) = ar(nys_l:nys_l-1+nbgp_local,:)
     321    ENDIF
     322
     323#endif
     324!
     325!-- Neumann-conditions at inflow/outflow/nested boundaries
     326    IF ( bc_dirichlet_l  .OR.  bc_radiation_l )  THEN
     327       DO  i = nbgp_local, 1, -1
     328         ar(:,nxl_l-i) = ar(:,nxl_l)
     329       ENDDO
     330    ENDIF
     331    IF ( bc_dirichlet_r  .OR.  bc_radiation_r  )  THEN
     332       DO  i = 1, nbgp_local
     333          ar(:,nxr_l+i) = ar(:,nxr_l)
     334       ENDDO
     335    ENDIF
     336    IF ( bc_dirichlet_s  .OR.  bc_radiation_s  )  THEN
     337       DO  i = nbgp_local, 1, -1
     338         ar(nys_l-i,:) = ar(nys_l,:)
     339       ENDDO
     340    ENDIF
     341    IF ( bc_dirichlet_n  .OR.  bc_radiation_n  )  THEN
     342       DO  i = 1, nbgp_local
     343         ar(nyn_l+i,:) = ar(nyn_l,:)
     344       ENDDO
     345    ENDIF
     346
     347    CALL cpu_log( log_point_s(13), 'exchange_horiz_2d', 'stop' )
     348
     349 END SUBROUTINE exchange_horiz_2d_byte
     350 
     351
     352!------------------------------------------------------------------------------!
     353! Description:
     354! ------------
     355!> Exchange of lateral (ghost) boundaries (parallel computers) and cyclic
     356!> boundary conditions, respectively, for 2D 32-bit integer arrays.
     357!------------------------------------------------------------------------------!
     358 SUBROUTINE exchange_horiz_2d_int( ar, nys_l, nyn_l, nxl_l, nxr_l, nbgp_local )
     359
     360
     361    USE control_parameters,                                                    &
     362        ONLY:  bc_dirichlet_l, bc_dirichlet_n, bc_dirichlet_r,                 &
     363               bc_dirichlet_s, bc_radiation_l, bc_radiation_n, bc_radiation_r, &
     364               bc_radiation_s, bc_lr_cyc, bc_ns_cyc, bc_radiation_l,           &
     365               bc_radiation_n, bc_radiation_r, bc_radiation_s, grid_level
     366       
     367    USE cpulog,                                                                &
     368        ONLY:  cpu_log, log_point_s
     369               
     370    USE kinds
     371   
     372    USE pegrid
     373
     374    IMPLICIT NONE
     375
     376    INTEGER(iwp) ::  i           !< dummy index to zero-gradient conditions at in/outflow boundaries
     377    INTEGER(iwp) ::  nxl_l       !< local index bound at current grid level, left side
     378    INTEGER(iwp) ::  nxr_l       !< local index bound at current grid level, right side
     379    INTEGER(iwp) ::  nyn_l       !< local index bound at current grid level, north side
     380    INTEGER(iwp) ::  nys_l       !< local index bound at current grid level, south side
     381    INTEGER(iwp) ::  nbgp_local  !< number of ghost layers to be exchanged
     382
    247383    INTEGER(iwp), DIMENSION(nys_l-nbgp_local:nyn_l+nbgp_local,                 &
    248384                            nxl_l-nbgp_local:nxr_l+nbgp_local) ::  ar  !< treated array
     
    324460!
    325461!-- Neumann-conditions at inflow/outflow/nested boundaries
    326     IF ( bc_dirichlet_l )  THEN
     462    IF ( bc_dirichlet_l  .OR.  bc_radiation_l )  THEN
    327463       DO  i = nbgp_local, 1, -1
    328464         ar(:,nxl_l-i) = ar(:,nxl_l)
    329465       ENDDO
    330466    ENDIF
    331     IF ( bc_dirichlet_r )  THEN
     467    IF ( bc_dirichlet_r  .OR.  bc_radiation_r  )  THEN
    332468       DO  i = 1, nbgp_local
    333469          ar(:,nxr_l+i) = ar(:,nxr_l)
    334470       ENDDO
    335471    ENDIF
    336     IF ( bc_dirichlet_s )  THEN
     472    IF ( bc_dirichlet_s  .OR.  bc_radiation_s  )  THEN
    337473       DO  i = nbgp_local, 1, -1
    338474         ar(nys_l-i,:) = ar(nys_l,:)
    339475       ENDDO
    340476    ENDIF
    341     IF ( bc_dirichlet_n )  THEN
     477    IF ( bc_dirichlet_n  .OR.  bc_radiation_n  )  THEN
    342478       DO  i = 1, nbgp_local
    343479         ar(nyn_l+i,:) = ar(nyn_l,:)
  • palm/trunk/SOURCE/init_pegrid.f90

    r3347 r3542  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! Introduce new MPI-datatype for ghostpoint exchange of 2D 8-bit Integer arrays
    2323!
    2424! Former revisions:
     
    11101110!
    11111111!-- Define new MPI derived datatypes for the exchange of ghost points in
    1112 !-- x- and y-direction for 2D-INTEGER arrays (line) - on normal grid
     1112!-- x- and y-direction for 2D-INTEGER arrays (line) - on normal grid.
     1113!-- Define types for 32-bit and 8-bit Integer. The 8-bit Integer are only
     1114!-- required on normal grid, while 32-bit Integer may be also required on
     1115!-- coarser grid level in case of multigrid solver.
     1116!
     1117!-- 8-bit Integer
     1118    CALL MPI_TYPE_VECTOR( nxr-nxl+1+2*nbgp, nbgp, ngp_y, MPI_BYTE,             &
     1119                          type_x_byte, ierr )
     1120    CALL MPI_TYPE_COMMIT( type_x_byte, ierr )
     1121
     1122    CALL MPI_TYPE_VECTOR( nbgp, ngp_y, ngp_y, MPI_BYTE,                        &
     1123                          type_y_byte, ierr )
     1124    CALL MPI_TYPE_COMMIT( type_y_byte, ierr )
     1125!
     1126!-- 32-bit Integer
    11131127    ALLOCATE( type_x_int(0:maximum_grid_level),                                &
    11141128              type_y_int(0:maximum_grid_level) )
    1115 
     1129             
    11161130    CALL MPI_TYPE_VECTOR( nxr-nxl+1+2*nbgp, nbgp, ngp_y, MPI_INTEGER,          &
    11171131                          type_x_int(0), ierr )
     
    12111225
    12121226!--       For 2D-exchange of INTEGER arrays on coarser grid level, where 2 ghost
    1213 !--       points need to be exchanged.
    1214           CALL MPI_TYPE_VECTOR( nxr_l-nxl_l+5, 2, nyn_l-nys_l+5, MPI_INTEGER,          &
     1227!--       points need to be exchanged. Only required for 32-bit Integer arrays.
     1228          CALL MPI_TYPE_VECTOR( nxr_l-nxl_l+5, 2, nyn_l-nys_l+5, MPI_INTEGER,  &
    12151229                                type_x_int(i), ierr )
    12161230          CALL MPI_TYPE_COMMIT( type_x_int(i), ierr )
    12171231
    12181232
    1219           CALL MPI_TYPE_VECTOR( 2, nyn_l-nys_l+5, nyn_l-nys_l+5, MPI_INTEGER,          &
     1233          CALL MPI_TYPE_VECTOR( 2, nyn_l-nys_l+5, nyn_l-nys_l+5, MPI_INTEGER,  &
    12201234                                type_y_int(i), ierr )
    12211235          CALL MPI_TYPE_COMMIT( type_y_int(i), ierr )
  • palm/trunk/SOURCE/lpm_exchange_horiz.f90

    r3065 r3542  
    152152! Description:
    153153! ------------
    154 ! Exchange of particles between the subdomains.
     154!> Exchange of particles between the subdomains.
    155155!------------------------------------------------------------------------------!
    156156 MODULE lpm_exchange_horiz_mod
  • palm/trunk/SOURCE/modules.f90

    r3529 r3542  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! +type_x_byte, type_y_byte
    2323!
    2424! Former revisions:
     
    20242024    INTEGER(iwp), DIMENSION(MPI_STATUS_SIZE,100) ::  wait_stat  !< MPI status variable used in various MPI calls
    20252025   
     2026    INTEGER(iwp) ::  type_x_byte !< derived MPI datatype for 2-D 8-bit integer ghost-point exchange - north / south
     2027    INTEGER(iwp) ::  type_y_byte !< derived MPI datatype for 2-D integer ghost-point exchange - left / right
     2028   
    20262029    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  ngp_xz      !< number of ghost points in xz-plane on different multigrid level
    20272030    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  ngp_xz_int  !< number of ghost points in xz-plane on different multigrid level
  • palm/trunk/SOURCE/netcdf_data_input_mod.f90

    r3529 r3542  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! Revise ghost point exchange and resizing of input variables
    2323!
    2424! Former revisions:
     
    267267        ONLY:  cpu_log, log_point_s
    268268
     269    USE indices,                                                               &
     270        ONLY:  nbgp
     271
    269272    USE kinds
    270273
     
    15431546
    15441547       USE indices,                                                            &
    1545            ONLY:  nbgp, nx, nxl, nxlg, nxr, nxrg, ny, nyn, nyng, nys, nysg
     1548           ONLY:  nbgp, nx, nxl, nxr,ny, nyn, nys
    15461549
    15471550
     
    15551558       INTEGER(iwp) ::  num_vars  !< number of variables in input file
    15561559       INTEGER(iwp) ::  nz_soil   !< number of soil layers in file
    1557 
    1558        INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg) ::  var_exchange_int !< dummy variables used to exchange 32-bit Integer arrays
    1559        INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE  ::  var_dum_int_3d !< dummy variables used to exchange real arrays
    1560 
    1561        REAL(wp), DIMENSION(nysg:nyng,nxlg:nxrg) ::  var_exchange_real !< dummy variables used to exchange real arrays
    1562 
    1563        REAL(wp), DIMENSION(:,:,:),   ALLOCATABLE ::  var_dum_real_3d !< dummy variables used to exchange real arrays
    1564        REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  var_dum_real_4d !< dummy variables used to exchange real arrays
    15651560
    15661561!
     
    16741669!--    applied. This case, no one of the following variables is used anyway.
    16751670       IF (  .NOT. land_surface  .AND.  .NOT. urban_surface )  RETURN
    1676 !
    1677 !--    Initialize dummy arrays used for ghost-point exchange
    1678        var_exchange_int  = 0
    1679        var_exchange_real = 0.0_wp
    16801671
    16811672#if defined ( __netcdf )
     
    21252116       CALL cpu_log( log_point_s(82), 'NetCDF input', 'stop' )
    21262117!
    2127 !--    Exchange 1 ghost points for surface variables. Please note, ghost point
    2128 !--    exchange for 3D parameter lists should be revised by using additional
    2129 !--    MPI datatypes or rewriting exchange_horiz.
    2130 !--    Moreover, varialbes will be resized in the following, including ghost
    2131 !--    points.
    2132 !--    Start with 2D Integer variables. Please note, for 8-bit integer
    2133 !--    variables must be swapt to 32-bit integer before calling exchange_horiz.
     2118!--    Exchange ghost points for surface variables. Therefore, resize
     2119!--    variables.
    21342120       IF ( albedo_type_f%from_file )  THEN
    2135           var_exchange_int                  = INT( albedo_type_f%fill, KIND = 1 )
    2136           var_exchange_int(nys:nyn,nxl:nxr) =                                  &
    2137                             INT( albedo_type_f%var(nys:nyn,nxl:nxr), KIND = 4 )
    2138           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2139           DEALLOCATE( albedo_type_f%var )
    2140           ALLOCATE( albedo_type_f%var(nysg:nyng,nxlg:nxrg) )
    2141           albedo_type_f%var = INT( var_exchange_int, KIND = 1 )
     2121          CALL resize_array_2d_int8( albedo_type_f%var, nys, nyn, nxl, nxr )
     2122          CALL exchange_horiz_2d_byte( albedo_type_f%var, nys, nyn, nxl, nxr,  &
     2123                                       nbgp )
    21422124       ENDIF
    21432125       IF ( pavement_type_f%from_file )  THEN
    2144           var_exchange_int                  = INT( pavement_type_f%fill, KIND = 1 )
    2145           var_exchange_int(nys:nyn,nxl:nxr) =                                  &
    2146                           INT( pavement_type_f%var(nys:nyn,nxl:nxr), KIND = 4 )
    2147           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2148           DEALLOCATE( pavement_type_f%var )
    2149           ALLOCATE( pavement_type_f%var(nysg:nyng,nxlg:nxrg) )
    2150           pavement_type_f%var = INT( var_exchange_int, KIND = 1 )
     2126          CALL resize_array_2d_int8( pavement_type_f%var, nys, nyn, nxl, nxr )
     2127          CALL exchange_horiz_2d_byte( pavement_type_f%var, nys, nyn, nxl, nxr,&
     2128                                       nbgp )
    21512129       ENDIF
    21522130       IF ( soil_type_f%from_file  .AND.  ALLOCATED( soil_type_f%var_2d ) )  THEN
    2153           var_exchange_int                  = INT( soil_type_f%fill, KIND = 1 )
    2154           var_exchange_int(nys:nyn,nxl:nxr) =                                  &
    2155                             INT( soil_type_f%var_2d(nys:nyn,nxl:nxr), KIND = 4 )
    2156           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2157           DEALLOCATE( soil_type_f%var_2d )
    2158           ALLOCATE( soil_type_f%var_2d(nysg:nyng,nxlg:nxrg) )
    2159           soil_type_f%var_2d = INT( var_exchange_int, KIND = 1 )
     2131          CALL resize_array_2d_int8( soil_type_f%var_2d, nys, nyn, nxl, nxr )
     2132          CALL exchange_horiz_2d_byte( soil_type_f%var_2d, nys, nyn, nxl, nxr, &
     2133                                       nbgp )
    21602134       ENDIF
    21612135       IF ( vegetation_type_f%from_file )  THEN
    2162           var_exchange_int                  = INT( vegetation_type_f%fill, KIND = 1 )
    2163           var_exchange_int(nys:nyn,nxl:nxr) =                                  &
    2164                         INT( vegetation_type_f%var(nys:nyn,nxl:nxr), KIND = 4 )
    2165           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2166           DEALLOCATE( vegetation_type_f%var )
    2167           ALLOCATE( vegetation_type_f%var(nysg:nyng,nxlg:nxrg) )
    2168           vegetation_type_f%var = INT( var_exchange_int, KIND = 1 )
     2136          CALL resize_array_2d_int8( vegetation_type_f%var, nys, nyn, nxl, nxr )
     2137          CALL exchange_horiz_2d_byte( vegetation_type_f%var, nys, nyn, nxl,   &
     2138                                       nxr, nbgp )
    21692139       ENDIF
    21702140       IF ( water_type_f%from_file )  THEN
    2171           var_exchange_int                  = INT( water_type_f%fill, KIND = 1 )
    2172           var_exchange_int(nys:nyn,nxl:nxr) =                                  &
    2173                          INT( water_type_f%var(nys:nyn,nxl:nxr), KIND = 4 )
    2174           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2175           DEALLOCATE( water_type_f%var )
    2176           ALLOCATE( water_type_f%var(nysg:nyng,nxlg:nxrg) )
    2177           water_type_f%var = INT( var_exchange_int, KIND = 1 )
    2178        ENDIF
    2179 !
    2180 !--    Exchange 1 ghost point for 3/4-D variables. For the sake of simplicity,
    2181 !--    loop further dimensions to use 2D exchange routines.
    2182 !--    This should be revised later by introducing new MPI datatypes.
     2141          CALL resize_array_2d_int8( water_type_f%var, nys, nyn, nxl, nxr )
     2142          CALL exchange_horiz_2d_byte( water_type_f%var, nys, nyn, nxl, nxr,   &
     2143                                       nbgp )
     2144       ENDIF
     2145!
     2146!--    Exchange ghost points for 3/4-D variables. For the sake of simplicity,
     2147!--    loop further dimensions to use 2D exchange routines. Unfortunately this
     2148!--    is necessary, else new MPI-data types need to be introduced just for
     2149!--    2 variables.
    21832150       IF ( soil_type_f%from_file  .AND.  ALLOCATED( soil_type_f%var_3d ) )    &
    21842151       THEN
    2185           ALLOCATE( var_dum_int_3d(0:nz_soil,nys:nyn,nxl:nxr) )
    2186           var_dum_int_3d = soil_type_f%var_3d
    2187           DEALLOCATE( soil_type_f%var_3d )
    2188           ALLOCATE( soil_type_f%var_3d(0:nz_soil,nysg:nyng,nxlg:nxrg) )
    2189           soil_type_f%var_3d = soil_type_f%fill
    2190 
     2152          CALL resize_array_3d_int8( soil_type_f%var_3d, 0, nz_soil,           &
     2153                                     nys, nyn, nxl, nxr )
    21912154          DO  k = 0, nz_soil
    2192              var_exchange_int(nys:nyn,nxl:nxr) = var_dum_int_3d(k,nys:nyn,nxl:nxr)
    2193              CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2194              soil_type_f%var_3d(k,:,:) = INT( var_exchange_int(:,:), KIND = 1 )
     2155             CALL exchange_horiz_2d_int(                                       & 
     2156                        soil_type_f%var_3d(k,:,:), nys, nyn, nxl, nxr, nbgp )
    21952157          ENDDO
    2196           DEALLOCATE( var_dum_int_3d )
    21972158       ENDIF
    21982159
    21992160       IF ( surface_fraction_f%from_file )  THEN
    2200           ALLOCATE( var_dum_real_3d(0:surface_fraction_f%nf-1,nys:nyn,nxl:nxr) )
    2201           var_dum_real_3d = surface_fraction_f%frac
    2202           DEALLOCATE( surface_fraction_f%frac )
    2203           ALLOCATE( surface_fraction_f%frac(0:surface_fraction_f%nf-1,         &
    2204                                             nysg:nyng,nxlg:nxrg) )
    2205           surface_fraction_f%frac = surface_fraction_f%fill
    2206 
     2161          CALL resize_array_3d_real( surface_fraction_f%frac,                  &
     2162                                     0, surface_fraction_f%nf-1,               &
     2163                                     nys, nyn, nxl, nxr )
    22072164          DO  k = 0, surface_fraction_f%nf-1
    2208              var_exchange_real(nys:nyn,nxl:nxr) = var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2209              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2210              surface_fraction_f%frac(k,:,:) = var_exchange_real(:,:)
     2165             CALL exchange_horiz_2d( surface_fraction_f%frac(k,:,:), nbgp )
    22112166          ENDDO
    2212           DEALLOCATE( var_dum_real_3d )
    2213        ENDIF
    2214 
    2215        IF ( building_pars_f%from_file )  THEN
    2216           ALLOCATE( var_dum_real_3d(0:building_pars_f%np-1,nys:nyn,nxl:nxr) )
    2217           var_dum_real_3d = building_pars_f%pars_xy
    2218           DEALLOCATE( building_pars_f%pars_xy )
    2219           ALLOCATE( building_pars_f%pars_xy(0:building_pars_f%np-1,            &
    2220                                             nysg:nyng,nxlg:nxrg) )
    2221           building_pars_f%pars_xy = building_pars_f%fill
     2167       ENDIF
     2168
     2169       IF ( building_pars_f%from_file )  THEN         
     2170          CALL resize_array_3d_real( building_pars_f%pars_xy,                  &
     2171                                     0, building_pars_f%np-1,                  &
     2172                                     nys, nyn, nxl, nxr )
    22222173          DO  k = 0, building_pars_f%np-1
    2223              var_exchange_real(nys:nyn,nxl:nxr) =                              &
    2224                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2225              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2226              building_pars_f%pars_xy(k,:,:) = var_exchange_real(:,:)
     2174             CALL exchange_horiz_2d( building_pars_f%pars_xy(k,:,:), nbgp )
    22272175          ENDDO
    2228           DEALLOCATE( var_dum_real_3d )
    2229        ENDIF
    2230 
    2231        IF ( albedo_pars_f%from_file )  THEN
    2232           ALLOCATE( var_dum_real_3d(0:albedo_pars_f%np-1,nys:nyn,nxl:nxr) )
    2233           var_dum_real_3d = albedo_pars_f%pars_xy
    2234           DEALLOCATE( albedo_pars_f%pars_xy )
    2235           ALLOCATE( albedo_pars_f%pars_xy(0:albedo_pars_f%np-1,                &
    2236                                           nysg:nyng,nxlg:nxrg) )
    2237           albedo_pars_f%pars_xy = albedo_pars_f%fill
     2176       ENDIF
     2177
     2178       IF ( albedo_pars_f%from_file )  THEN         
     2179          CALL resize_array_3d_real( albedo_pars_f%pars_xy,                    &
     2180                                     0, albedo_pars_f%np-1,                    &
     2181                                     nys, nyn, nxl, nxr )
    22382182          DO  k = 0, albedo_pars_f%np-1
    2239              var_exchange_real(nys:nyn,nxl:nxr) =                              &
    2240                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2241              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2242              albedo_pars_f%pars_xy(k,:,:) = var_exchange_real(:,:)
     2183             CALL exchange_horiz_2d( albedo_pars_f%pars_xy(k,:,:), nbgp )
    22432184          ENDDO
    2244           DEALLOCATE( var_dum_real_3d )
    2245        ENDIF
    2246 
    2247        IF ( pavement_pars_f%from_file )  THEN
    2248           ALLOCATE( var_dum_real_3d(0:pavement_pars_f%np-1,nys:nyn,nxl:nxr) )
    2249           var_dum_real_3d = pavement_pars_f%pars_xy
    2250           DEALLOCATE( pavement_pars_f%pars_xy )
    2251           ALLOCATE( pavement_pars_f%pars_xy(0:pavement_pars_f%np-1,            &
    2252                                             nysg:nyng,nxlg:nxrg) )
    2253           pavement_pars_f%pars_xy = pavement_pars_f%fill
     2185       ENDIF
     2186
     2187       IF ( pavement_pars_f%from_file )  THEN         
     2188          CALL resize_array_3d_real( pavement_pars_f%pars_xy,                  &
     2189                                     0, pavement_pars_f%np-1,                  &
     2190                                     nys, nyn, nxl, nxr )
    22542191          DO  k = 0, pavement_pars_f%np-1
    2255              var_exchange_real(nys:nyn,nxl:nxr) =                              &
    2256                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2257              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2258              pavement_pars_f%pars_xy(k,:,:) = var_exchange_real(:,:)
     2192             CALL exchange_horiz_2d( pavement_pars_f%pars_xy(k,:,:), nbgp )
    22592193          ENDDO
    2260           DEALLOCATE( var_dum_real_3d )
    22612194       ENDIF
    22622195
    22632196       IF ( vegetation_pars_f%from_file )  THEN
    2264           ALLOCATE( var_dum_real_3d(0:vegetation_pars_f%np-1,nys:nyn,nxl:nxr) )
    2265           var_dum_real_3d = vegetation_pars_f%pars_xy
    2266           DEALLOCATE( vegetation_pars_f%pars_xy )
    2267           ALLOCATE( vegetation_pars_f%pars_xy(0:vegetation_pars_f%np-1,        &
    2268                                             nysg:nyng,nxlg:nxrg) )
    2269           vegetation_pars_f%pars_xy = vegetation_pars_f%fill
     2197          CALL resize_array_3d_real( vegetation_pars_f%pars_xy,                &
     2198                                     0, vegetation_pars_f%np-1,                &
     2199                                     nys, nyn, nxl, nxr )
    22702200          DO  k = 0, vegetation_pars_f%np-1
    2271              var_exchange_real(nys:nyn,nxl:nxr) =                              &
    2272                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2273              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2274              vegetation_pars_f%pars_xy(k,:,:) = var_exchange_real(:,:)
     2201             CALL exchange_horiz_2d( vegetation_pars_f%pars_xy(k,:,:), nbgp )
    22752202          ENDDO
    2276           DEALLOCATE( var_dum_real_3d )
    22772203       ENDIF
    22782204
    22792205       IF ( water_pars_f%from_file )  THEN
    2280           ALLOCATE( var_dum_real_3d(0:water_pars_f%np-1,nys:nyn,nxl:nxr) )
    2281           var_dum_real_3d = water_pars_f%pars_xy
    2282           DEALLOCATE( water_pars_f%pars_xy )
    2283           ALLOCATE( water_pars_f%pars_xy(0:water_pars_f%np-1,                  &
    2284                                          nysg:nyng,nxlg:nxrg) )
    2285           water_pars_f%pars_xy = water_pars_f%fill
     2206          CALL resize_array_3d_real( water_pars_f%pars_xy,                     &
     2207                                     0, water_pars_f%np-1,                     &
     2208                                     nys, nyn, nxl, nxr )
    22862209          DO  k = 0, water_pars_f%np-1
    2287              var_exchange_real(nys:nyn,nxl:nxr) =                              &
    2288                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2289              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2290              water_pars_f%pars_xy(k,:,:) = var_exchange_real(:,:)
     2210             CALL exchange_horiz_2d( water_pars_f%pars_xy(k,:,:), nbgp )
    22912211          ENDDO
    2292           DEALLOCATE( var_dum_real_3d )
    22932212       ENDIF
    22942213
    22952214       IF ( root_area_density_lsm_f%from_file )  THEN
    2296           ALLOCATE( var_dum_real_3d(0:root_area_density_lsm_f%nz-1,nys:nyn,nxl:nxr) )
    2297           var_dum_real_3d = root_area_density_lsm_f%var
    2298           DEALLOCATE( root_area_density_lsm_f%var )
    2299           ALLOCATE( root_area_density_lsm_f%var(0:root_area_density_lsm_f%nz-1,&
    2300                                                 nysg:nyng,nxlg:nxrg) )
    2301           root_area_density_lsm_f%var = root_area_density_lsm_f%fill
    2302 
     2215          CALL resize_array_3d_real( root_area_density_lsm_f%var,              &
     2216                                     0, root_area_density_lsm_f%nz-1,          &
     2217                                     nys, nyn, nxl, nxr )
    23032218          DO  k = 0, root_area_density_lsm_f%nz-1
    2304              var_exchange_real(nys:nyn,nxl:nxr) =                              &
    2305                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2306              CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2307              root_area_density_lsm_f%var(k,:,:) = var_exchange_real(:,:)
     2219             CALL exchange_horiz_2d( root_area_density_lsm_f%var(k,:,:), nbgp )
    23082220          ENDDO
    2309           DEALLOCATE( var_dum_real_3d )
    23102221       ENDIF
    23112222
    23122223       IF ( soil_pars_f%from_file )  THEN
    23132224          IF ( soil_pars_f%lod == 1 )  THEN
    2314 
    2315              ALLOCATE( var_dum_real_3d(0:soil_pars_f%np-1,nys:nyn,nxl:nxr) )
    2316              var_dum_real_3d = soil_pars_f%pars_xy
    2317              DEALLOCATE( soil_pars_f%pars_xy )
    2318              ALLOCATE( soil_pars_f%pars_xy(0:soil_pars_f%np-1,                 &
    2319                                             nysg:nyng,nxlg:nxrg) )
    2320              soil_pars_f%pars_xy = soil_pars_f%fill
    2321 
     2225         
     2226             CALL resize_array_3d_real( soil_pars_f%pars_xy,                   &
     2227                                        0, soil_pars_f%np-1,                   &
     2228                                        nys, nyn, nxl, nxr )
    23222229             DO  k = 0, soil_pars_f%np-1
    2323                 var_exchange_real(nys:nyn,nxl:nxr) =                           &
    2324                                               var_dum_real_3d(k,nys:nyn,nxl:nxr)
    2325                 CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2326                 soil_pars_f%pars_xy(k,:,:) = var_exchange_real(:,:)
     2230                CALL exchange_horiz_2d( soil_pars_f%pars_xy(k,:,:), nbgp )
    23272231             ENDDO
    2328              DEALLOCATE( var_dum_real_3d )
     2232             
    23292233          ELSEIF ( soil_pars_f%lod == 2 )  THEN
    2330              ALLOCATE( var_dum_real_4d(0:soil_pars_f%np-1,                     &
    2331                                        0:soil_pars_f%nz-1,                     &
    2332                                        nys:nyn,nxl:nxr) )
    2333              var_dum_real_4d = soil_pars_f%pars_xyz
    2334              DEALLOCATE( soil_pars_f%pars_xyz )
    2335              ALLOCATE( soil_pars_f%pars_xyz(0:soil_pars_f%np-1,                &
    2336                                             0:soil_pars_f%nz-1,                &
    2337                                             nysg:nyng,nxlg:nxrg) )
    2338              soil_pars_f%pars_xyz = soil_pars_f%fill
     2234             CALL resize_array_4d_real( soil_pars_f%pars_xyz,                  &
     2235                                        0, soil_pars_f%np-1,                   &
     2236                                        0, soil_pars_f%nz-1,                   &
     2237                                        nys, nyn, nxl, nxr )
    23392238
    23402239             DO  k2 = 0, soil_pars_f%nz-1
    23412240                DO  k = 0, soil_pars_f%np-1
    2342                    var_exchange_real(nys:nyn,nxl:nxr) =                        &
    2343                                            var_dum_real_4d(k,k2,nys:nyn,nxl:nxr)
    2344                    CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2345 
    2346                    soil_pars_f%pars_xyz(k,k2,:,:) = var_exchange_real(:,:)
     2241                   CALL exchange_horiz_2d( soil_pars_f%pars_xyz(k,k2,:,:),     &
     2242                                           nbgp )
    23472243                ENDDO
    23482244             ENDDO
    2349              DEALLOCATE( var_dum_real_4d )
    2350           ENDIF
    2351        ENDIF
    2352 
    2353        IF ( pavement_subsurface_pars_f%from_file )  THEN
    2354           ALLOCATE( var_dum_real_4d(0:pavement_subsurface_pars_f%np-1,         &
    2355                                     0:pavement_subsurface_pars_f%nz-1,         &
    2356                                     nys:nyn,nxl:nxr) )
    2357           var_dum_real_4d = pavement_subsurface_pars_f%pars_xyz
    2358           DEALLOCATE( pavement_subsurface_pars_f%pars_xyz )
    2359           ALLOCATE( pavement_subsurface_pars_f%pars_xyz                        &
    2360                                           (0:pavement_subsurface_pars_f%np-1,  &
    2361                                            0:pavement_subsurface_pars_f%nz-1,  &
    2362                                            nysg:nyng,nxlg:nxrg) )
    2363           pavement_subsurface_pars_f%pars_xyz = pavement_subsurface_pars_f%fill
     2245          ENDIF
     2246       ENDIF
     2247
     2248       IF ( pavement_subsurface_pars_f%from_file )  THEN         
     2249          CALL resize_array_4d_real( pavement_subsurface_pars_f%pars_xyz,      &
     2250                                     0, pavement_subsurface_pars_f%np-1,       &
     2251                                     0, pavement_subsurface_pars_f%nz-1,       &
     2252                                     nys, nyn, nxl, nxr )
    23642253
    23652254          DO  k2 = 0, pavement_subsurface_pars_f%nz-1
    23662255             DO  k = 0, pavement_subsurface_pars_f%np-1
    2367                 var_exchange_real(nys:nyn,nxl:nxr) =                           &
    2368                                           var_dum_real_4d(k,k2,nys:nyn,nxl:nxr)
    2369                 CALL exchange_horiz_2d( var_exchange_real, nbgp )
    2370                 pavement_subsurface_pars_f%pars_xyz(k,k2,:,:) =                &
    2371                                                         var_exchange_real(:,:)
     2256                CALL exchange_horiz_2d(                                        &
     2257                           pavement_subsurface_pars_f%pars_xyz(k,k2,:,:), nbgp )
    23722258             ENDDO
    23732259          ENDDO
    2374           DEALLOCATE( var_dum_real_4d )
    2375        ENDIF
    2376 
    2377 !
    2378 !--    In case of non-cyclic boundary conditions, set Neumann conditions at the
    2379 !--    lateral boundaries.
    2380        IF ( .NOT. bc_ns_cyc )  THEN
    2381           IF ( nys == 0  )  THEN
    2382              IF ( albedo_type_f%from_file )                                    &
    2383                 albedo_type_f%var(-1,:) = albedo_type_f%var(0,:)
    2384              IF ( pavement_type_f%from_file )                                  &
    2385                 pavement_type_f%var(-1,:) = pavement_type_f%var(0,:)
    2386              IF ( soil_type_f%from_file )  THEN
    2387                 IF ( ALLOCATED( soil_type_f%var_2d ) )  THEN
    2388                    soil_type_f%var_2d(-1,:) = soil_type_f%var_2d(0,:)
    2389                 ELSE
    2390                    soil_type_f%var_3d(:,-1,:) = soil_type_f%var_3d(:,0,:)
    2391                 ENDIF
    2392              ENDIF
    2393              IF ( vegetation_type_f%from_file )                                &
    2394                 vegetation_type_f%var(-1,:) = vegetation_type_f%var(0,:)
    2395              IF ( water_type_f%from_file )                                     &
    2396                 water_type_f%var(-1,:) = water_type_f%var(0,:)
    2397              IF ( surface_fraction_f%from_file )                               &
    2398                 surface_fraction_f%frac(:,-1,:) = surface_fraction_f%frac(:,0,:)
    2399              IF ( building_pars_f%from_file )                                  &
    2400                 building_pars_f%pars_xy(:,-1,:) = building_pars_f%pars_xy(:,0,:)
    2401              IF ( albedo_pars_f%from_file )                                    &
    2402                 albedo_pars_f%pars_xy(:,-1,:) = albedo_pars_f%pars_xy(:,0,:)
    2403              IF ( pavement_pars_f%from_file )                                  &
    2404                 pavement_pars_f%pars_xy(:,-1,:) = pavement_pars_f%pars_xy(:,0,:)
    2405              IF ( vegetation_pars_f%from_file )                                &
    2406                 vegetation_pars_f%pars_xy(:,-1,:) =                            &
    2407                                                vegetation_pars_f%pars_xy(:,0,:)
    2408              IF ( water_pars_f%from_file )                                     &
    2409                 water_pars_f%pars_xy(:,-1,:) = water_pars_f%pars_xy(:,0,:)
    2410              IF ( root_area_density_lsm_f%from_file )                          &
    2411                 root_area_density_lsm_f%var(:,-1,:) =                          &
    2412                                             root_area_density_lsm_f%var(:,0,:)
    2413              IF ( soil_pars_f%from_file )  THEN
    2414                 IF ( soil_pars_f%lod == 1 )  THEN
    2415                    soil_pars_f%pars_xy(:,-1,:) = soil_pars_f%pars_xy(:,0,:)
    2416                 ELSE
    2417                    soil_pars_f%pars_xyz(:,:,-1,:) = soil_pars_f%pars_xyz(:,:,0,:)
    2418                 ENDIF
    2419              ENDIF
    2420              IF ( pavement_subsurface_pars_f%from_file )                       &
    2421                 pavement_subsurface_pars_f%pars_xyz(:,:,-1,:) =                &
    2422                                    pavement_subsurface_pars_f%pars_xyz(:,:,0,:)
    2423           ENDIF
    2424 
    2425           IF ( nyn == ny )  THEN
    2426              IF ( albedo_type_f%from_file )                                    &
    2427                 albedo_type_f%var(ny+1,:) = albedo_type_f%var(ny,:)
    2428              IF ( pavement_type_f%from_file )                                  &
    2429                 pavement_type_f%var(ny+1,:) = pavement_type_f%var(ny,:)
    2430              IF ( soil_type_f%from_file )  THEN
    2431                 IF ( ALLOCATED( soil_type_f%var_2d ) )  THEN
    2432                    soil_type_f%var_2d(ny+1,:) = soil_type_f%var_2d(ny,:)
    2433                 ELSE
    2434                    soil_type_f%var_3d(:,ny+1,:) = soil_type_f%var_3d(:,ny,:)
    2435                 ENDIF
    2436              ENDIF
    2437              IF ( vegetation_type_f%from_file )                                &
    2438                 vegetation_type_f%var(ny+1,:) = vegetation_type_f%var(ny,:)
    2439              IF ( water_type_f%from_file )                                     &
    2440                 water_type_f%var(ny+1,:) = water_type_f%var(ny,:)
    2441              IF ( surface_fraction_f%from_file )                               &
    2442                 surface_fraction_f%frac(:,ny+1,:) =                            &
    2443                                              surface_fraction_f%frac(:,ny,:)
    2444              IF ( building_pars_f%from_file )                                  &
    2445                 building_pars_f%pars_xy(:,ny+1,:) =                            &
    2446                                              building_pars_f%pars_xy(:,ny,:)
    2447              IF ( albedo_pars_f%from_file )                                    &
    2448                 albedo_pars_f%pars_xy(:,ny+1,:) = albedo_pars_f%pars_xy(:,ny,:)
    2449              IF ( pavement_pars_f%from_file )                                  &
    2450                 pavement_pars_f%pars_xy(:,ny+1,:) =                            &
    2451                                              pavement_pars_f%pars_xy(:,ny,:)
    2452              IF ( vegetation_pars_f%from_file )                                &
    2453                 vegetation_pars_f%pars_xy(:,ny+1,:) =                          &
    2454                                                vegetation_pars_f%pars_xy(:,ny,:)
    2455              IF ( water_pars_f%from_file )                                     &
    2456                 water_pars_f%pars_xy(:,ny+1,:) = water_pars_f%pars_xy(:,ny,:)
    2457              IF ( root_area_density_lsm_f%from_file )                          &
    2458                 root_area_density_lsm_f%var(:,ny+1,:) =                        &
    2459                                             root_area_density_lsm_f%var(:,ny,:)
    2460              IF ( soil_pars_f%from_file )  THEN
    2461                 IF ( soil_pars_f%lod == 1 )  THEN
    2462                    soil_pars_f%pars_xy(:,ny+1,:) = soil_pars_f%pars_xy(:,ny,:)
    2463                 ELSE
    2464                    soil_pars_f%pars_xyz(:,:,ny+1,:) =                          &
    2465                                               soil_pars_f%pars_xyz(:,:,ny,:)
    2466                 ENDIF
    2467              ENDIF
    2468              IF ( pavement_subsurface_pars_f%from_file )                       &
    2469                 pavement_subsurface_pars_f%pars_xyz(:,:,ny+1,:) =              &
    2470                                    pavement_subsurface_pars_f%pars_xyz(:,:,ny,:)
    2471           ENDIF
    2472        ENDIF
    2473 
    2474        IF ( .NOT. bc_lr_cyc )  THEN
    2475           IF ( nxl == 0 )  THEN
    2476             IF ( albedo_type_f%from_file )                                     &
    2477                 albedo_type_f%var(:,-1) = albedo_type_f%var(:,0)
    2478              IF ( pavement_type_f%from_file )                                  &
    2479                 pavement_type_f%var(:,-1) = pavement_type_f%var(:,0)
    2480              IF ( soil_type_f%from_file )  THEN
    2481                 IF ( ALLOCATED( soil_type_f%var_2d ) )  THEN
    2482                    soil_type_f%var_2d(:,-1) = soil_type_f%var_2d(:,0)
    2483                 ELSE
    2484                    soil_type_f%var_3d(:,:,-1) = soil_type_f%var_3d(:,:,0)
    2485                 ENDIF
    2486              ENDIF
    2487              IF ( vegetation_type_f%from_file )                                &
    2488                 vegetation_type_f%var(:,-1) = vegetation_type_f%var(:,0)
    2489              IF ( water_type_f%from_file )                                     &
    2490                 water_type_f%var(:,-1) = water_type_f%var(:,0)
    2491              IF ( surface_fraction_f%from_file )                               &
    2492                 surface_fraction_f%frac(:,:,-1) = surface_fraction_f%frac(:,:,0)
    2493              IF ( building_pars_f%from_file )                                  &
    2494                 building_pars_f%pars_xy(:,:,-1) = building_pars_f%pars_xy(:,:,0)
    2495              IF ( albedo_pars_f%from_file )                                    &
    2496                 albedo_pars_f%pars_xy(:,:,-1) = albedo_pars_f%pars_xy(:,:,0)
    2497              IF ( pavement_pars_f%from_file )                                  &
    2498                 pavement_pars_f%pars_xy(:,:,-1) = pavement_pars_f%pars_xy(:,:,0)
    2499              IF ( vegetation_pars_f%from_file )                                &
    2500                 vegetation_pars_f%pars_xy(:,:,-1) =                            &
    2501                                                vegetation_pars_f%pars_xy(:,:,0)
    2502              IF ( water_pars_f%from_file )                                     &
    2503                 water_pars_f%pars_xy(:,:,-1) = water_pars_f%pars_xy(:,:,0)
    2504              IF ( root_area_density_lsm_f%from_file )                          &
    2505                 root_area_density_lsm_f%var(:,:,-1) =                          &
    2506                                             root_area_density_lsm_f%var(:,:,0)
    2507              IF ( soil_pars_f%from_file )  THEN
    2508                 IF ( soil_pars_f%lod == 1 )  THEN
    2509                    soil_pars_f%pars_xy(:,:,-1) = soil_pars_f%pars_xy(:,:,0)
    2510                 ELSE
    2511                    soil_pars_f%pars_xyz(:,:,:,-1) = soil_pars_f%pars_xyz(:,:,:,0)
    2512                 ENDIF
    2513              ENDIF
    2514              IF ( pavement_subsurface_pars_f%from_file )                       &
    2515                 pavement_subsurface_pars_f%pars_xyz(:,:,:,-1) =                &
    2516                                     pavement_subsurface_pars_f%pars_xyz(:,:,:,0)
    2517           ENDIF
    2518 
    2519           IF ( nxr == nx )  THEN
    2520              IF ( albedo_type_f%from_file )                                    &
    2521                 albedo_type_f%var(:,nx+1) = albedo_type_f%var(:,nx)
    2522              IF ( pavement_type_f%from_file )                                  &
    2523                 pavement_type_f%var(:,nx+1) = pavement_type_f%var(:,nx)
    2524              IF ( soil_type_f%from_file )  THEN
    2525                 IF ( ALLOCATED( soil_type_f%var_2d ) )  THEN
    2526                    soil_type_f%var_2d(:,nx+1) = soil_type_f%var_2d(:,nx)
    2527                 ELSE
    2528                    soil_type_f%var_3d(:,:,nx+1) = soil_type_f%var_3d(:,:,nx)
    2529                 ENDIF
    2530              ENDIF
    2531              IF ( vegetation_type_f%from_file )                                &
    2532                 vegetation_type_f%var(:,nx+1) = vegetation_type_f%var(:,nx)
    2533              IF ( water_type_f%from_file )                                     &
    2534                 water_type_f%var(:,nx+1) = water_type_f%var(:,nx)
    2535              IF ( surface_fraction_f%from_file )                               &
    2536                 surface_fraction_f%frac(:,:,nx+1) =                            &
    2537                                              surface_fraction_f%frac(:,:,nx)
    2538              IF ( building_pars_f%from_file )                                  &
    2539                 building_pars_f%pars_xy(:,:,nx+1) =                            &
    2540                                              building_pars_f%pars_xy(:,:,nx)
    2541              IF ( albedo_pars_f%from_file )                                    &
    2542                 albedo_pars_f%pars_xy(:,:,nx+1) = albedo_pars_f%pars_xy(:,:,nx)
    2543              IF ( pavement_pars_f%from_file )                                  &
    2544                 pavement_pars_f%pars_xy(:,:,nx+1) =                            &
    2545                                              pavement_pars_f%pars_xy(:,:,nx)
    2546              IF ( vegetation_pars_f%from_file )                                &
    2547                 vegetation_pars_f%pars_xy(:,:,nx+1) =                          &
    2548                                                vegetation_pars_f%pars_xy(:,:,nx)
    2549              IF ( water_pars_f%from_file )                                     &
    2550                 water_pars_f%pars_xy(:,:,nx+1) = water_pars_f%pars_xy(:,:,nx)
    2551              IF ( root_area_density_lsm_f%from_file )                          &
    2552                 root_area_density_lsm_f%var(:,:,nx+1) =                        &
    2553                                             root_area_density_lsm_f%var(:,:,nx)
    2554              IF ( soil_pars_f%from_file )  THEN
    2555                 IF ( soil_pars_f%lod == 1 )  THEN
    2556                    soil_pars_f%pars_xy(:,:,nx+1) = soil_pars_f%pars_xy(:,:,nx)
    2557                 ELSE
    2558                    soil_pars_f%pars_xyz(:,:,:,nx+1) =                          &
    2559                                               soil_pars_f%pars_xyz(:,:,:,nx)
    2560                 ENDIF
    2561              ENDIF
    2562              IF ( pavement_subsurface_pars_f%from_file )                       &
    2563                 pavement_subsurface_pars_f%pars_xyz(:,:,:,nx+1) =              &
    2564                                    pavement_subsurface_pars_f%pars_xyz(:,:,:,nx)
    2565           ENDIF
    25662260       ENDIF
    25672261
     
    27092403       INTEGER(iwp) ::  num_vars      !< number of variables in netcdf input file
    27102404       INTEGER(iwp) ::  skip_n_rows   !< counting variable to skip rows while reading topography file
    2711 
    2712        INTEGER(iwp), DIMENSION(nys-nbgp:nyn+nbgp,nxl-nbgp:nxr+nbgp) ::  var_exchange_int !< dummy variables used to exchange 32-bit Integer arrays
    27132405
    27142406       REAL(wp) ::  dum           !< dummy variable to skip columns while reading topography file
     
    29352627!--    lateral boundaries.
    29362628       IF ( building_id_f%from_file )  THEN
    2937           var_exchange_int                  = building_id_f%fill
    2938           var_exchange_int(nys:nyn,nxl:nxr) = building_id_f%var(nys:nyn,nxl:nxr)
    2939           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2940           DEALLOCATE( building_id_f%var )
    2941           ALLOCATE( building_id_f%var(nys-nbgp:nyn+nbgp,nxl-nbgp:nxr+nbgp) )
    2942           building_id_f%var = var_exchange_int
    2943 
    2944           IF ( .NOT. bc_ns_cyc )  THEN
    2945              IF ( nys == 0  )  building_id_f%var(-1,:)   = building_id_f%var(0,:)
    2946              IF ( nyn == ny )  building_id_f%var(ny+1,:) = building_id_f%var(ny,:)
    2947           ENDIF
    2948           IF ( .NOT. bc_lr_cyc )  THEN
    2949              IF ( nxl == 0  )  building_id_f%var(:,-1)   = building_id_f%var(:,0)
    2950              IF ( nxr == nx )  building_id_f%var(:,nx+1) = building_id_f%var(:,nx)
    2951           ENDIF
     2629          CALL resize_array_2d_int32( building_id_f%var, nys, nyn, nxl, nxr )
     2630          CALL exchange_horiz_2d_int( building_id_f%var, nys, nyn, nxl, nxr,   &
     2631                                      nbgp )
    29522632       ENDIF
    29532633
    29542634       IF ( building_type_f%from_file )  THEN
    2955           var_exchange_int                  = INT( building_type_f%fill, KIND = 4 )
    2956           var_exchange_int(nys:nyn,nxl:nxr) =                                  &
    2957                           INT( building_type_f%var(nys:nyn,nxl:nxr), KIND = 4 )
    2958           CALL exchange_horiz_2d_int( var_exchange_int, nys, nyn, nxl, nxr, nbgp )
    2959           DEALLOCATE( building_type_f%var )
    2960           ALLOCATE( building_type_f%var(nys-nbgp:nyn+nbgp,nxl-nbgp:nxr+nbgp) )
    2961           building_type_f%var = INT( var_exchange_int, KIND = 1 )
    2962 
    2963           IF ( .NOT. bc_ns_cyc )  THEN
    2964              IF ( nys == 0  )  building_type_f%var(-1,:)   = building_type_f%var(0,:)
    2965              IF ( nyn == ny )  building_type_f%var(ny+1,:) = building_type_f%var(ny,:)
    2966           ENDIF
    2967           IF ( .NOT. bc_lr_cyc )  THEN
    2968              IF ( nxl == 0  )  building_type_f%var(:,-1)   = building_type_f%var(:,0)
    2969              IF ( nxr == nx )  building_type_f%var(:,nx+1) = building_type_f%var(:,nx)
    2970           ENDIF
     2635          CALL resize_array_2d_int8( building_type_f%var, nys, nyn, nxl, nxr )
     2636          CALL exchange_horiz_2d_byte( building_type_f%var, nys, nyn, nxl, nxr,   &
     2637                                       nbgp )
    29712638       ENDIF
    29722639
     
    44774144! Description:
    44784145! ------------
     4146!> Resize 8-bit 2D Integer array: (nys:nyn,nxl:nxr) -> (nysg:nyng,nxlg:nxrg)
     4147!------------------------------------------------------------------------------!
     4148    SUBROUTINE resize_array_2d_int8( var, js, je, is, ie )
     4149   
     4150       IMPLICIT NONE
     4151
     4152       INTEGER(iwp) ::  je !< upper index bound along y direction
     4153       INTEGER(iwp) ::  js !< lower index bound along y direction
     4154       INTEGER(iwp) ::  ie !< upper index bound along x direction
     4155       INTEGER(iwp) ::  is !< lower index bound along x direction
     4156       
     4157       INTEGER(KIND=1), DIMENSION(:,:), ALLOCATABLE ::  var     !< treated variable
     4158       INTEGER(KIND=1), DIMENSION(:,:), ALLOCATABLE ::  var_tmp !< temporary copy
     4159!
     4160!--    Allocate temporary variable
     4161       ALLOCATE( var_tmp(js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4162!
     4163!--    Temporary copy of the variable
     4164       var_tmp(js:je,is:ie) = var(js:je,is:ie)
     4165!
     4166!--    Resize the array
     4167       DEALLOCATE( var )
     4168       ALLOCATE( var(js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4169!
     4170!--    Transfer temporary copy back to original array
     4171       var(js:je,is:ie) = var_tmp(js:je,is:ie)
     4172
     4173    END SUBROUTINE resize_array_2d_int8
     4174   
     4175!------------------------------------------------------------------------------!
     4176! Description:
     4177! ------------
     4178!> Resize 32-bit 2D Integer array: (nys:nyn,nxl:nxr) -> (nysg:nyng,nxlg:nxrg)
     4179!------------------------------------------------------------------------------!
     4180    SUBROUTINE resize_array_2d_int32( var, js, je, is, ie )
     4181
     4182       IMPLICIT NONE
     4183       
     4184       INTEGER(iwp) ::  je !< upper index bound along y direction
     4185       INTEGER(iwp) ::  js !< lower index bound along y direction
     4186       INTEGER(iwp) ::  ie !< upper index bound along x direction
     4187       INTEGER(iwp) ::  is !< lower index bound along x direction
     4188
     4189       INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  var     !< treated variable
     4190       INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  var_tmp !< temporary copy
     4191!
     4192!--    Allocate temporary variable
     4193       ALLOCATE( var_tmp(js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4194!
     4195!--    Temporary copy of the variable
     4196       var_tmp(js:je,is:ie) = var(js:je,is:ie)
     4197!
     4198!--    Resize the array
     4199       DEALLOCATE( var )
     4200       ALLOCATE( var(js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4201!
     4202!--    Transfer temporary copy back to original array
     4203       var(js:je,is:ie) = var_tmp(js:je,is:ie)
     4204
     4205    END SUBROUTINE resize_array_2d_int32
     4206   
     4207!------------------------------------------------------------------------------!
     4208! Description:
     4209! ------------
     4210!> Resize 8-bit 3D Integer array: (:,nys:nyn,nxl:nxr) -> (:,nysg:nyng,nxlg:nxrg)
     4211!------------------------------------------------------------------------------!
     4212    SUBROUTINE resize_array_3d_int8( var, ks, ke, js, je, is, ie )
     4213
     4214       IMPLICIT NONE
     4215
     4216       INTEGER(iwp) ::  je !< upper index bound along y direction
     4217       INTEGER(iwp) ::  js !< lower index bound along y direction
     4218       INTEGER(iwp) ::  ie !< upper index bound along x direction
     4219       INTEGER(iwp) ::  is !< lower index bound along x direction
     4220       INTEGER(iwp) ::  ke !< upper bound of treated array in z-direction 
     4221       INTEGER(iwp) ::  ks !< lower bound of treated array in z-direction 
     4222       
     4223       INTEGER(KIND=1), DIMENSION(:,:,:), ALLOCATABLE ::  var     !< treated variable
     4224       INTEGER(KIND=1), DIMENSION(:,:,:), ALLOCATABLE ::  var_tmp !< temporary copy
     4225!
     4226!--    Allocate temporary variable
     4227       ALLOCATE( var_tmp(ks:ke,js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4228!
     4229!--    Temporary copy of the variable
     4230       var_tmp(ks:ke,js:je,is:ie) = var(ks:ke,js:je,is:ie)
     4231!
     4232!--    Resize the array
     4233       DEALLOCATE( var )
     4234       ALLOCATE( var(ks:ke,js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4235!
     4236!--    Transfer temporary copy back to original array
     4237       var(ks:ke,js:je,is:ie) = var_tmp(ks:ke,js:je,is:ie)
     4238
     4239    END SUBROUTINE resize_array_3d_int8
     4240   
     4241!------------------------------------------------------------------------------!
     4242! Description:
     4243! ------------
     4244!> Resize 3D Real array: (:,nys:nyn,nxl:nxr) -> (:,nysg:nyng,nxlg:nxrg)
     4245!------------------------------------------------------------------------------!
     4246    SUBROUTINE resize_array_3d_real( var, ks, ke, js, je, is, ie )
     4247
     4248       IMPLICIT NONE
     4249
     4250       INTEGER(iwp) ::  je !< upper index bound along y direction
     4251       INTEGER(iwp) ::  js !< lower index bound along y direction
     4252       INTEGER(iwp) ::  ie !< upper index bound along x direction
     4253       INTEGER(iwp) ::  is !< lower index bound along x direction
     4254       INTEGER(iwp) ::  ke !< upper bound of treated array in z-direction 
     4255       INTEGER(iwp) ::  ks !< lower bound of treated array in z-direction 
     4256       
     4257       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  var     !< treated variable
     4258       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  var_tmp !< temporary copy
     4259!
     4260!--    Allocate temporary variable
     4261       ALLOCATE( var_tmp(ks:ke,js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4262!
     4263!--    Temporary copy of the variable
     4264       var_tmp(ks:ke,js:je,is:ie) = var(ks:ke,js:je,is:ie)
     4265!
     4266!--    Resize the array
     4267       DEALLOCATE( var )
     4268       ALLOCATE( var(ks:ke,js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4269!
     4270!--    Transfer temporary copy back to original array
     4271       var(ks:ke,js:je,is:ie) = var_tmp(ks:ke,js:je,is:ie)
     4272
     4273    END SUBROUTINE resize_array_3d_real
     4274   
     4275!------------------------------------------------------------------------------!
     4276! Description:
     4277! ------------
     4278!> Resize 4D Real array: (:,:,nys:nyn,nxl:nxr) -> (:,nysg:nyng,nxlg:nxrg)
     4279!------------------------------------------------------------------------------!
     4280    SUBROUTINE resize_array_4d_real( var, k1s, k1e, k2s, k2e, js, je, is, ie )
     4281
     4282       IMPLICIT NONE
     4283       
     4284       INTEGER(iwp) ::  je  !< upper index bound along y direction
     4285       INTEGER(iwp) ::  js  !< lower index bound along y direction
     4286       INTEGER(iwp) ::  ie  !< upper index bound along x direction
     4287       INTEGER(iwp) ::  is  !< lower index bound along x direction
     4288       INTEGER(iwp) ::  k1e !< upper bound of treated array in z-direction 
     4289       INTEGER(iwp) ::  k1s !< lower bound of treated array in z-direction
     4290       INTEGER(iwp) ::  k2e !< upper bound of treated array along parameter space 
     4291       INTEGER(iwp) ::  k2s !< lower bound of treated array along parameter space 
     4292       
     4293       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  var     !< treated variable
     4294       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  var_tmp !< temporary copy
     4295!
     4296!--    Allocate temporary variable
     4297       ALLOCATE( var_tmp(k1s:k1e,k2s:k2e,js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4298!
     4299!--    Temporary copy of the variable
     4300       var_tmp(k1s:k1e,k2s:k2e,js:je,is:ie) = var(k1s:k1e,k2s:k2e,js:je,is:ie)
     4301!
     4302!--    Resize the array
     4303       DEALLOCATE( var )
     4304       ALLOCATE( var(k1s:k1e,k2s:k2e,js-nbgp:je+nbgp,is-nbgp:ie+nbgp) )
     4305!
     4306!--    Transfer temporary copy back to original array
     4307       var(k1s:k1e,k2s:k2e,js:je,is:ie) = var_tmp(k1s:k1e,k2s:k2e,js:je,is:ie)
     4308
     4309    END SUBROUTINE resize_array_4d_real
     4310   
     4311!------------------------------------------------------------------------------!
     4312! Description:
     4313! ------------
    44794314!> Vertical interpolation and extrapolation of 1D variables.
    44804315!------------------------------------------------------------------------------!
Note: See TracChangeset for help on using the changeset viewer.