Ignore:
Timestamp:
Jul 18, 2016 12:01:49 PM (8 years ago)
Author:
suehring
Message:

PE-wise reading of topography file

File:
1 edited

Legend:

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

    r1933 r1968  
    1919! Current revisions:
    2020! -----------------
    21 !
     21! 2D-INTEGER exchange adopted for different multigrid level
    2222!
    2323! Former revisions:
     
    203203!------------------------------------------------------------------------------!
    204204 
    205  SUBROUTINE exchange_horiz_2d_int( ar )
     205 SUBROUTINE exchange_horiz_2d_int( ar, nys_l, nyn_l, nxl_l, nxr_l, nbgp_local )
    206206
    207207
    208208    USE control_parameters,                                                    &
    209         ONLY:  bc_lr_cyc, bc_ns_cyc, nest_bound_l, nest_bound_n, nest_bound_r, &
    210                nest_bound_s
     209        ONLY:  bc_lr_cyc, bc_ns_cyc, grid_level, nest_bound_l, nest_bound_n,  &
     210               nest_bound_r, nest_bound_s
    211211       
    212212    USE cpulog,                                                                &
    213213        ONLY:  cpu_log, log_point_s
    214        
    215     USE indices,                                                               &
    216         ONLY:  nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg
    217        
     214               
    218215    USE kinds
    219216   
     
    222219    IMPLICIT NONE
    223220
    224     INTEGER(iwp) ::  i
    225     INTEGER(iwp) ::  ar(nysg:nyng,nxlg:nxrg)  !<
     221    INTEGER(iwp) ::  i           !< dummy index to zero-gradient conditions at in/outflow boundaries
     222    INTEGER(iwp) ::  nxl_l       !< local index bound at current grid level, left side
     223    INTEGER(iwp) ::  nxr_l       !< local index bound at current grid level, right side
     224    INTEGER(iwp) ::  nyn_l       !< local index bound at current grid level, north side
     225    INTEGER(iwp) ::  nys_l       !< local index bound at current grid level, south side
     226    INTEGER(iwp) ::  nbgp_local  !< number of ghost layers to be exchanged
     227
     228    INTEGER(iwp), DIMENSION(nys_l-nbgp_local:nyn_l+nbgp_local,                 &
     229                            nxl_l-nbgp_local:nxr_l+nbgp_local) ::  ar  !< treated array
    226230
    227231    CALL cpu_log( log_point_s(13), 'exchange_horiz_2d', 'start' )
     
    236240!--    One-dimensional decomposition along y, boundary values can be exchanged
    237241!--    within the PE memory
    238        ar(:,nxlg:nxl-1) = ar(:,nxr-nbgp+1:nxr)
    239        ar(:,nxr+1:nxrg) = ar(:,nxl:nxl+nbgp-1)
    240 
     242       ar(:,nxl_l-nbgp_local:nxl_l-1) = ar(:,nxr_l-nbgp_local+1:nxr_l)
     243       ar(:,nxr_l+1:nxr_l+nbgp_local) = ar(:,nxl_l:nxl_l+nbgp_local-1)
    241244
    242245    ELSE
    243246!
    244247!--    Send left boundary, receive right one
    245        CALL MPI_SENDRECV( ar(nysg,nxl), 1, type_y_int, pleft,  0,             &
    246                           ar(nysg,nxr+1), 1, type_y_int, pright, 0,           &
     248       CALL MPI_SENDRECV( ar(nys_l-nbgp_local,nxl_l),   1,                     &
     249                          type_y_int(grid_level), pleft,  0,                   &
     250                          ar(nys_l-nbgp_local,nxr_l+1), 1,                     &
     251                          type_y_int(grid_level), pright, 0,                   &
    247252                          comm2d, status, ierr )
    248253!
    249254!--    Send right boundary, receive left one
    250        CALL MPI_SENDRECV( ar(nysg,nxr+1-nbgp), 1, type_y_int, pright,  1,     &
    251                           ar(nysg,nxlg), 1, type_y_int, pleft,   1,           &
    252                           comm2d, status, ierr )
     255       CALL MPI_SENDRECV( ar(nys_l-nbgp_local,nxr_l+1-nbgp_local), 1,          &
     256                          type_y_int(grid_level), pright, 1,                   &
     257                          ar(nys_l-nbgp_local,nxl_l-nbgp_local),   1,          &
     258                          type_y_int(grid_level), pleft,  1,                   &
     259                          comm2d, status, ierr )                         
    253260
    254261    ENDIF
     
    258265!--    One-dimensional decomposition along x, boundary values can be exchanged
    259266!--    within the PE memory
    260        ar(nysg:nys-1,:) = ar(nyn+1-nbgp:nyn,:)
    261        ar(nyn+1:nyng,:) = ar(nys:nys-1+nbgp,:)
     267       ar(nys_l-nbgp_local:nys_l-1,:) = ar(nyn_l+1-nbgp_local:nyn_l,:)
     268       ar(nyn_l+1:nyn_l+nbgp_local,:) = ar(nys_l:nys_l-1+nbgp_local,:)
    262269
    263270
     
    265272!
    266273!--    Send front boundary, receive rear one
    267        CALL MPI_SENDRECV( ar(nys,nxlg), 1, type_x_int, psouth, 0,             &
    268                           ar(nyn+1,nxlg), 1, type_x_int, pnorth, 0,           &
     274       CALL MPI_SENDRECV( ar(nys_l,nxl_l-nbgp_local),   1,                    &
     275                          type_x_int(grid_level), psouth, 0,                  &
     276                          ar(nyn_l+1,nxl_l-nbgp_local), 1,                    &
     277                          type_x_int(grid_level), pnorth, 0,                  &
    269278                          comm2d, status, ierr )                         
    270279
    271280!
    272281!--    Send rear boundary, receive front one
    273        CALL MPI_SENDRECV( ar(nyn+1-nbgp,nxlg), 1, type_x_int, pnorth, 1,      &
    274                           ar(nysg,nxlg), 1, type_x_int, psouth, 1,            &
     282       CALL MPI_SENDRECV( ar(nyn_l+1-nbgp_local,nxl_l-nbgp_local), 1,         &
     283                          type_x_int(grid_level), pnorth, 1,                  &
     284                          ar(nys_l-nbgp_local,nxl_l-nbgp_local),   1,         &
     285                          type_x_int(grid_level), psouth, 1,                  &
    275286                          comm2d, status, ierr )
    276287
     
    282293!-- Lateral boundary conditions in the non-parallel case
    283294    IF ( bc_lr_cyc )  THEN
    284        ar(:,nxlg:nxl-1) = ar(:,nxr-nbgp+1:nxr)
    285        ar(:,nxr+1:nxrg) = ar(:,nxl:nxl+nbgp-1)
     295       ar(:,nxl_l-nbgp_local:nxl_l-1) = ar(:,nxr_l-nbgp_local+1:nxr_l)
     296       ar(:,nxr_l+1:nxr_l+nbgp_local) = ar(:,nxl_l:nxl_l+nbgp_local-1)
    286297    ENDIF
    287298
    288299    IF ( bc_ns_cyc )  THEN
    289        ar(nysg:nys-1,:) = ar(nyn+1-nbgp:nyn,:)
    290        ar(nyn+1:nyng,:) = ar(nys:nys-1+nbgp,:)
     300       ar(nys_l-nbgp_local:nys_l-1,:) = ar(nyn_l+1-nbgp_local:nyn_l,:)
     301       ar(nyn_l+1:nyn_l+nbgp_local,:) = ar(nys_l:nys_l-1+nbgp_local,:)
    291302    ENDIF
    292303
     
    295306!-- Neumann-conditions at inflow/outflow/nested boundaries
    296307    IF ( nest_bound_l )  THEN
    297        DO  i = nbgp, 1, -1
    298          ar(:,nxl-i) = ar(:,nxl)
     308       DO  i = nbgp_local, 1, -1
     309         ar(:,nxl_l-i) = ar(:,nxl_l)
    299310       ENDDO
    300311    ENDIF
    301312    IF ( nest_bound_r )  THEN
    302        DO  i = 1, nbgp
    303           ar(:,nxr+i) = ar(:,nxr)
     313       DO  i = 1, nbgp_local
     314          ar(:,nxr_l+i) = ar(:,nxr_l)
    304315       ENDDO
    305316    ENDIF
    306317    IF ( nest_bound_s )  THEN
    307        DO  i = nbgp, 1, -1
    308          ar(nys-i,:) = ar(nys,:)
     318       DO  i = nbgp_local, 1, -1
     319         ar(nys_l-i,:) = ar(nys_l,:)
    309320       ENDDO
    310321    ENDIF
    311322    IF ( nest_bound_n )  THEN
    312        DO  i = 1, nbgp
    313          ar(nyn+i,:) = ar(nyn,:)
     323       DO  i = 1, nbgp_local
     324         ar(nyn_l+i,:) = ar(nyn_l,:)
    314325       ENDDO
    315326    ENDIF
Note: See TracChangeset for help on using the changeset viewer.