# define NAT_IN(k) cd_nat(k) # define SGN_IN(k) psgn(k) # define F_SIZE(ptab) kfld # define OPT_K(k) ,ipf # if defined DIM_2d # if defined SINGLE_PRECISION # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_2D_sp) , INTENT(inout) :: ptab(f) # else # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_2D_dp) , INTENT(inout) :: ptab(f) # endif # define ARRAY_IN(i,j,k,l,f) ptab(f)%pt2d(i,j) # define K_SIZE(ptab) 1 # define L_SIZE(ptab) 1 # endif # if defined DIM_3d # if defined SINGLE_PRECISION # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_3D_sp) , INTENT(inout) :: ptab(f) # else # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_3D_dp) , INTENT(inout) :: ptab(f) # endif # define ARRAY_IN(i,j,k,l,f) ptab(f)%pt3d(i,j,k) # define K_SIZE(ptab) SIZE(ptab(1)%pt3d,3) # define L_SIZE(ptab) 1 # endif # if defined DIM_4d # if defined SINGLE_PRECISION # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_4D_sp) , INTENT(inout) :: ptab(f) # else # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_4D_dp) , INTENT(inout) :: ptab(f) # endif # define ARRAY_IN(i,j,k,l,f) ptab(f)%pt4d(i,j,k,l) # define K_SIZE(ptab) SIZE(ptab(1)%pt4d,3) # define L_SIZE(ptab) SIZE(ptab(1)%pt4d,4) # endif # if defined SINGLE_PRECISION # define PRECISION sp # define MPI_TYPE MPI_REAL # else # define PRECISION dp # define MPI_TYPE MPI_DOUBLE_PRECISION # endif SUBROUTINE ROUTINE_NC( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ncsten ) INTEGER , INTENT(in ) :: kfld ! number of pt3d arrays ARRAY_TYPE(:,:,:,:,:) ! array or pointer of arrays on which the boundary condition is applied CHARACTER(len=*) , INTENT(in ) :: cdname ! name of the calling subroutine CHARACTER(len=1) , INTENT(in ) :: NAT_IN(:) ! nature of array grid-points REAL(wp) , INTENT(in ) :: SGN_IN(:) ! sign used across the north fold boundary INTEGER , OPTIONAL, INTENT(in ) :: kfillmode ! filling method for halo over land (default = constant) REAL(wp), OPTIONAL, INTENT(in ) :: pfillval ! background value (used at closed boundaries) LOGICAL, DIMENSION(4),OPTIONAL, INTENT(in ) :: lsend, lrecv ! communication with other 4 proc LOGICAL, OPTIONAL, INTENT(in ) :: ncsten ! 5-point or 9-point stencil ! INTEGER :: ji, jj, jk, jl, jf ! dummy loop indices INTEGER :: ipi, ipj, ipk, ipl, ipf ! dimension of the input array INTEGER :: ishift, ishift2, idx, icount, icount1 ! local integers INTEGER :: idims, idimr, isizet, isizets, isizetr, izsnd, izrcv ! local integers INTEGER :: ierr INTEGER :: ifill_we, ifill_ea, ifill_so, ifill_no INTEGER :: ifill_web, ifill_eab REAL(wp) :: zland INTEGER , DIMENSION(MPI_STATUS_SIZE) :: istate ! for mpi_isend REAL(PRECISION), DIMENSION(:), ALLOCATABLE :: zsnd, zrcv ! halos arrays INTEGER , DIMENSION(:), ALLOCATABLE :: isizes ! number of elements to be sent INTEGER , DIMENSION(:), ALLOCATABLE :: isizer ! number of elements to be received INTEGER , DIMENSION(:), ALLOCATABLE :: idatatys, idatatyr ! datatype of halos arrays INTEGER (KIND=MPI_ADDRESS_KIND), DIMENSION (:), ALLOCATABLE :: idispls, idisplr ! displacement in halos arrays LOGICAL :: llsend_we, llsend_ea, llsend_no, llsend_so ! communication send LOGICAL :: llrecv_we, llrecv_ea, llrecv_no, llrecv_so ! communication receive LOGICAL :: lldo_nfd ! do north pole folding LOGICAL :: llncall ! default: 9-point stencil !!---------------------------------------------------------------------- ! ! ----------------------------------------- ! ! 0. local variables initialization ! ! ----------------------------------------- ! ! llncall = .TRUE. ipk = K_SIZE(ptab) ! 3rd dimension ipl = L_SIZE(ptab) ! 4th - ipf = F_SIZE(ptab) ! 5th - use in "multi" case (array of pointers) ! IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. ) ! IF ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN llsend_we = lsend(1) ; llsend_ea = lsend(2) ; llsend_so = lsend(3) ; llsend_no = lsend(4) llrecv_we = lrecv(1) ; llrecv_ea = lrecv(2) ; llrecv_so = lrecv(3) ; llrecv_no = lrecv(4) ELSE IF( PRESENT(lsend) .OR. PRESENT(lrecv) ) THEN WRITE(ctmp1,*) ' E R R O R : Routine ', cdname, ' is calling lbc_lnk with only one of the two arguments lsend or lrecv' WRITE(ctmp2,*) ' ========== ' CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) ELSE ! send and receive with every neighbour llsend_we = nbondi == 1 .OR. nbondi == 0 ! keep for compatibility, should be defined in mppini llsend_ea = nbondi == -1 .OR. nbondi == 0 ! keep for compatibility, should be defined in mppini llsend_so = nbondj == 1 .OR. nbondj == 0 ! keep for compatibility, should be defined in mppini llsend_no = nbondj == -1 .OR. nbondj == 0 ! keep for compatibility, should be defined in mppini llrecv_we = llsend_we ; llrecv_ea = llsend_ea ; llrecv_so = llsend_so ; llrecv_no = llsend_no END IF lldo_nfd = npolj /= 0 ! keep for compatibility, should be defined in mppini zland = 0._wp ! land filling value: zero by default IF( PRESENT( pfillval ) ) zland = pfillval ! set land value ! define the method we will use to fill the halos in each direction IF( llrecv_we ) THEN ; ifill_we = jpfillmpi ELSEIF( l_Iperio ) THEN ; ifill_we = jpfillperio ELSEIF( PRESENT(kfillmode) ) THEN ; ifill_we = kfillmode ELSE ; ifill_we = jpfillcst END IF IF( l_Iperio ) THEN ; ifill_web = jpfillperio ELSEIF( PRESENT(kfillmode) ) THEN ; ifill_web = kfillmode ELSE ; ifill_web = jpfillcst END IF ! IF( llrecv_ea ) THEN ; ifill_ea = jpfillmpi ELSEIF( l_Iperio ) THEN ; ifill_ea = jpfillperio ELSEIF( PRESENT(kfillmode) ) THEN ; ifill_ea = kfillmode ELSE ; ifill_ea = jpfillcst END IF IF( l_Iperio ) THEN ; ifill_eab = jpfillperio ELSEIF( PRESENT(kfillmode) ) THEN ; ifill_eab = kfillmode ELSE ; ifill_eab = jpfillcst END IF ! IF( llrecv_so ) THEN ; ifill_so = jpfillmpi ELSEIF( l_Jperio ) THEN ; ifill_so = jpfillperio ELSEIF( PRESENT(kfillmode) ) THEN ; ifill_so = kfillmode ELSE ; ifill_so = jpfillcst END IF ! IF( llrecv_no ) THEN ; ifill_no = jpfillmpi ELSEIF( l_Jperio ) THEN ; ifill_no = jpfillperio ELSEIF( PRESENT(kfillmode) ) THEN ; ifill_no = kfillmode ELSE ; ifill_no = jpfillcst END IF ! IF(PRESENT(ncsten)) llncall = ncsten #if defined PRINT_CAUTION ! ! ================================================================================== ! ! CAUTION: semi-column notation is often impossible because of the cpp preprocessing ! ! ================================================================================== ! ! #endif ! ! -------------------------------------------------- ! ! 1. Do west, east, south and north MPI exchange ! ! -------------------------------------------------- ! ! ! Allocate local temporary arrays to be sent/received. Fill arrays to be sent idims = 0 idimr = 0 izsnd = 0 izrcv = 0 IF(llsend_we) idims = idims + 1 IF(llsend_ea) idims = idims + 1 IF(llsend_so) idims = idims + 1 IF(llsend_no) idims = idims + 1 idimr = idims IF(llncall) THEN IF(noswr .ne. -1) idimr = idimr + 1 IF(noser .ne. -1) idimr = idimr + 1 IF(nonwr .ne. -1) idimr = idimr + 1 IF(noner .ne. -1) idimr = idimr + 1 IF(nosws .ne. -1) idims = idims + 1 IF(noses .ne. -1) idims = idims + 1 IF(nonws .ne. -1) idims = idims + 1 IF(nones .ne. -1) idims = idims + 1 END IF IF(llsend_we) izsnd = izsnd + nn_hls * (jpj - 2*nn_hls) * ipk * ipl * ipf IF(llsend_ea) izsnd = izsnd + nn_hls * (jpj - 2*nn_hls) * ipk * ipl * ipf IF(llsend_so) izsnd = izsnd + (jpi - 2*nn_hls) * nn_hls * ipk * ipl * ipf IF(llsend_no) izsnd = izsnd + (jpi - 2*nn_hls) * nn_hls * ipk * ipl * ipf izrcv = izsnd IF(llncall) THEN IF(noswr .ne. -1) izrcv = izrcv + nn_hls * nn_hls * ipk * ipl * ipf IF(noser .ne. -1) izrcv = izrcv + nn_hls * nn_hls * ipk * ipl * ipf IF(nonwr .ne. -1) izrcv = izrcv + nn_hls * nn_hls * ipk * ipl * ipf IF(noner .ne. -1) izrcv = izrcv + nn_hls * nn_hls * ipk * ipl * ipf IF(nosws .ne. -1) izsnd = izsnd + nn_hls * nn_hls * ipk * ipl * ipf IF(noses .ne. -1) izsnd = izsnd + nn_hls * nn_hls * ipk * ipl * ipf IF(nonws .ne. -1) izsnd = izsnd + nn_hls * nn_hls * ipk * ipl * ipf IF(nones .ne. -1) izsnd = izsnd + nn_hls * nn_hls * ipk * ipl * ipf END IF ALLOCATE(zsnd(izsnd)) ALLOCATE(zrcv(izrcv)) ALLOCATE(isizes(idims)) ALLOCATE(isizer(idimr)) ALLOCATE(idatatys(idims)) ALLOCATE(idatatyr(idimr)) ALLOCATE(idispls(idims)) ALLOCATE(idisplr(idimr)) zrcv(:)=-1 zsnd(:)=-1 isizes(:) = 0 isizer(:) = 0 idispls(:) = 0 idisplr(:) = 0 isizet = 0 idx = 1 icount = 1 IF(llsend_we) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = nn_hls + 1, jpj - nn_hls ; DO ji = 1, nn_hls zsnd(idx) = ARRAY_IN(nn_hls+ji,jj,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = nn_hls * (jpj - 2*nn_hls) * ipk * ipl * ipf IF(icount .gt. 1) isizet = isizet + isizes(icount - 1) idispls(icount) = jpbyt*isizet icount = icount + 1 END IF IF(llsend_ea) THEN ishift = jpi-2*nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = nn_hls + 1, jpj - nn_hls ; DO ji = 1, nn_hls zsnd(idx) = ARRAY_IN(ishift+ji,jj,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = nn_hls * (jpj - 2*nn_hls) * ipk * ipl * ipf IF(icount .gt. 1) isizet = isizet + isizes(icount - 1) idispls(icount) = jpbyt*isizet icount = icount + 1 END IF IF(llsend_so) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = nn_hls + 1, jpi - nn_hls zsnd(idx) = ARRAY_IN(ji,nn_hls+jj,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = (jpi - 2*nn_hls) * nn_hls * ipk * ipl * ipf IF(icount .gt. 1) isizet = isizet + isizes(icount - 1) idispls(icount) = jpbyt*isizet icount = icount + 1 END IF IF(llsend_no) THEN ishift = jpj-2*nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = nn_hls + 1, jpi - nn_hls zsnd(idx) = ARRAY_IN(ji,ishift+jj,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = (jpi - 2*nn_hls) * nn_hls * ipk * ipl * ipf IF(icount .gt. 1) isizet = isizet + isizes(icount - 1) idispls(icount) = jpbyt*isizet icount = icount + 1 END IF isizer(:) = isizes(:) idisplr(:) = idispls(:) icount1 = icount isizets = isizet isizetr = isizet IF(llncall) THEN IF(noswr .ne. -1) THEN isizer(icount1) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount1 .gt. 1) isizetr = isizetr + isizer(icount1 - 1) idisplr(icount1) = jpbyt*isizetr icount1 = icount1 + 1 END IF IF(noser .ne. -1) THEN isizer(icount1) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount1 .gt. 1) isizetr = isizetr + isizer(icount1 - 1) idisplr(icount1) = jpbyt*isizetr icount1 = icount1 + 1 END IF IF(nonwr .ne. -1) THEN isizer(icount1) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount1 .gt. 1) isizetr = isizetr + isizer(icount1 - 1) idisplr(icount1) = jpbyt*isizetr icount1 = icount1 + 1 END IF IF(noner .ne. -1) THEN isizer(icount1) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount1 .gt. 1) isizetr = isizetr + isizer(icount1 - 1) idisplr(icount1) = jpbyt*isizetr icount1 = icount1 + 1 END IF IF(nosws .ne. -1) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls zsnd(idx) = ARRAY_IN(nn_hls+ji,nn_hls+jj,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount .gt. 1) isizets = isizets + isizes(icount - 1) idispls(icount) = jpbyt*isizets icount = icount + 1 END IF IF(noses .ne. -1) THEN ishift = jpi-2*nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls zsnd(idx) = ARRAY_IN(ji+ishift,nn_hls+jj,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount .gt. 1) isizets = isizets + isizes(icount - 1) idispls(icount) = jpbyt*isizets icount = icount + 1 END IF IF(nonws .ne. -1) THEN ishift = jpj-2*nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls zsnd(idx) = ARRAY_IN(nn_hls+ji,jj+ishift,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount .gt. 1) isizets = isizets + isizes(icount - 1) idispls(icount) = jpbyt*isizets icount = icount + 1 END IF IF(nones .ne. -1) THEN ishift = jpi-2*nn_hls ishift2 = jpj-2*nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls zsnd(idx) = ARRAY_IN(ji+ishift,jj+ishift2,jk,jl,jf) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO isizes(icount) = nn_hls * nn_hls * ipk * ipl * ipf IF(icount .gt. 1) isizets = isizets + isizes(icount - 1) idispls(icount) = jpbyt*isizets icount = icount + 1 END IF END IF idatatys(:) = MPI_TYPE idatatyr(:) = MPI_TYPE IF(llncall) THEN IF( ln_timing ) CALL tic_tac(.TRUE.) CALL mpi_neighbor_alltoallw (zsnd, isizes, idispls, idatatys, zrcv, isizer, idisplr, idatatyr, mpi_nc_all_com, ierr) IF( ln_timing ) CALL tic_tac(.FALSE.) ELSE IF( ln_timing ) CALL tic_tac(.TRUE.) CALL mpi_neighbor_alltoallw (zsnd, isizes, idispls, idatatys, zrcv, isizer, idisplr, idatatyr, mpi_nc_com, ierr) IF( ln_timing ) CALL tic_tac(.FALSE.) END IF ! --------------------------------------------------- ! ! 2. Fill east and west north and south halos ! ! --------------------------------------------------- ! ! !!! Patch to solve MPI3 bug when we have only two processes columns IF(jpni .eq. 2) THEN ! --------------------- ! 2.2 fill eastern halo ! --------------------- idx = 1 ishift = jpi - nn_hls ! fill halo from ji = jpi-nn_hls+1 to jpi SELECT CASE ( ifill_ea ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = nn_hls + 1, jpj - nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zrcv(idx) ! jpi - nn_hls + 1 -> jpi idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillperio ) ! use east-weast periodicity ishift2 = nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ! ---------------------- ! 2.1 fill weastern halo ! ---------------------- SELECT CASE ( ifill_we ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = nn_hls + 1, jpj - nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) ! 1 -> nn_hls idx = idx + 1 END DO; END DO ; END DO ; END DO ; END DO CASE ( jpfillperio ) ! use east-weast periodicity ishift2 = jpi - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(nn_hls+1,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ELSE ! ---------------------- ! 2.1 fill weastern halo ! ---------------------- idx = 1 SELECT CASE ( ifill_we ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = nn_hls + 1, jpj - nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) ! 1 -> nn_hls idx = idx + 1 END DO; END DO ; END DO ; END DO ; END DO CASE ( jpfillperio ) ! use east-weast periodicity ishift2 = jpi - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(nn_hls+1,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ! --------------------- ! 2.2 fill eastern halo ! --------------------- ishift = jpi - nn_hls ! fill halo from ji = jpi-nn_hls+1 to jpi SELECT CASE ( ifill_ea ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = nn_hls + 1, jpj - nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zrcv(idx) ! jpi - nn_hls + 1 -> jpi idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillperio ) ! use east-weast periodicity ishift2 = nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ENDIF !!! Patch to solve MPI3 bug when we have only two processes rows IF(jpnj .eq. 2) THEN ! ---------------------- ! 2.3 fill northern halo ! ---------------------- ishift = jpj - nn_hls ! fill halo from jj = jpj-nn_hls+1 to jpj SELECT CASE ( ifill_no ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = nn_hls + 1, jpi - nn_hls ARRAY_IN(ji,ishift+jj,jk,jl,jf) = zrcv(idx) ! jpj-nn_hls+1 -> jpj idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO IF(nonwr .eq. -1) THEN ishift = jpj - nn_hls SELECT CASE ( ifill_web ) CASE ( jpfillperio ) ishift2 = jpi - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(nn_hls+1,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF IF(noner .eq. -1) THEN ishift = jpi - nn_hls ishift2 = jpj - nn_hls SELECT CASE ( ifill_eab ) CASE ( jpfillperio ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift2, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift2, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift2, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF CASE ( jpfillperio ) ! use north-south periodicity ishift2 = nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,ishift+jj,jk,jl,jf) = ARRAY_IN(ji,ishift2+jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,ishift+jj,jk,jl,jf) = ARRAY_IN(ji,ishift,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,ishift+jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ! ---------------------- ! 2.4 fill southern halo ! ---------------------- SELECT CASE ( ifill_so ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = nn_hls + 1, jpi - nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) ! 1 -> nn_hls idx = idx + 1 END DO; END DO ; END DO ; END DO ; END DO IF(noswr .eq. -1) THEN SELECT CASE ( ifill_web ) CASE ( jpfillperio ) ishift2 = jpi - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(nn_hls+1,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF IF(noser .eq. -1) THEN ishift = jpi - nn_hls SELECT CASE ( ifill_eab ) CASE ( jpfillperio ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ji+nn_hls,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF CASE ( jpfillperio ) ! use north-south periodicity ishift2 = jpj - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ji,ishift2+jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ji,nn_hls+1,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ELSE ! ---------------------- ! 2.3 fill southern halo ! ---------------------- SELECT CASE ( ifill_so ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = nn_hls + 1, jpi - nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) ! 1 -> nn_hls idx = idx + 1 END DO; END DO ; END DO ; END DO ; END DO IF(noswr .eq. -1) THEN SELECT CASE ( ifill_web ) CASE ( jpfillperio ) ishift2 = jpi - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(nn_hls+1,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF IF(noser .eq. -1) THEN ishift = jpi - nn_hls SELECT CASE ( ifill_eab ) CASE ( jpfillperio ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ji+nn_hls,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF CASE ( jpfillperio ) ! use north-south periodicity ishift2 = jpj - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ji,ishift2+jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ji,nn_hls+1,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ! ---------------------- ! 2.4 fill northern halo ! ---------------------- ishift = jpj - nn_hls ! fill halo from jj = jpj-nn_hls+1 to jpj SELECT CASE ( ifill_no ) CASE ( jpfillnothing ) ! no filling CASE ( jpfillmpi ) ! use data received by MPI DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = nn_hls + 1, jpi - nn_hls ARRAY_IN(ji,ishift+jj,jk,jl,jf) = zrcv(idx) ! jpj-nn_hls+1 -> jpj idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO IF(nonwr .eq. -1) THEN ishift = jpj - nn_hls SELECT CASE ( ifill_web ) CASE ( jpfillperio ) ishift2 = jpi - 2 * nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(ishift2+ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = ARRAY_IN(nn_hls+1,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift, jpj ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF IF(noner .eq. -1) THEN ishift = jpi - nn_hls ishift2 = jpj - nn_hls SELECT CASE ( ifill_eab ) CASE ( jpfillperio ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift2, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ji,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift2, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = ARRAY_IN(ishift,jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1 + ishift2, jpj ; DO ji = 1, nn_hls ARRAY_IN(ishift+ji,jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT END IF CASE ( jpfillperio ) ! use north-south periodicity ishift2 = nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,ishift+jj,jk,jl,jf) = ARRAY_IN(ji,ishift2+jj,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcopy ) ! filling with inner domain values DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,ishift+jj,jk,jl,jf) = ARRAY_IN(ji,ishift,jk,jl,jf) END DO ; END DO ; END DO ; END DO ; END DO CASE ( jpfillcst ) ! filling with constant value DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, jpi ARRAY_IN(ji,ishift+jj,jk,jl,jf) = zland END DO ; END DO ; END DO ; END DO ; END DO END SELECT ENDIF IF(llncall) THEN !!! Patch to solve MPI3 bug when we have only two processes columns IF(jpni .eq. 2) THEN !!! Patch to solve MPI3 bug when we have only two processes rows IF(jpnj .eq. 2) THEN ! --------------------------- ! 2.5 fill east-nouthern halo ! --------------------------- IF(noner .ne. -1) THEN ishift = jpi - nn_hls ishift2 = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj+ishift2,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.6 fill west-nouthern halo ! --------------------------- IF(nonwr .ne. -1) THEN ishift = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj+ishift,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.7 fill east-southern halo ! --------------------------- IF(noser .ne. -1) THEN ishift = jpi - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.8 fill west-southern halo ! --------------------------- IF(noswr .ne. -1) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ELSE ! --------------------------- ! 2.5 fill east-southern halo ! --------------------------- IF(noser .ne. -1) THEN ishift = jpi - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.6 fill west-southern halo ! --------------------------- IF(noswr .ne. -1) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.7 fill east-nouthern halo ! --------------------------- IF(noner .ne. -1) THEN ishift = jpi - nn_hls ishift2 = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj+ishift2,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.8 fill west-nouthern halo ! --------------------------- IF(nonwr .ne. -1) THEN ishift = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj+ishift,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ENDIF ELSE !!! Patch to solve MPI3 bug when we have only two processes rows IF(jpnj .eq. 2) THEN ! --------------------------- ! 2.5 fill west-nouthern halo ! --------------------------- IF(nonwr .ne. -1) THEN ishift = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj+ishift,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.6 fill east-nouthern halo ! --------------------------- IF(noner .ne. -1) THEN ishift = jpi - nn_hls ishift2 = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj+ishift2,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.7 fill west-southern halo ! --------------------------- IF(noswr .ne. -1) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.8 fill east-southern halo ! --------------------------- IF(noser .ne. -1) THEN ishift = jpi - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ELSE ! --------------------------- ! 2.5 fill west-southern halo ! --------------------------- IF(noswr .ne. -1) THEN DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.6 fill east-southern halo ! --------------------------- IF(noser .ne. -1) THEN ishift = jpi - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.7 fill west-nouthern halo ! --------------------------- IF(nonwr .ne. -1) THEN ishift = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji,jj+ishift,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ! --------------------------- ! 2.8 fill east-nouthern halo ! --------------------------- IF(noner .ne. -1) THEN ishift = jpi - nn_hls ishift2 = jpj - nn_hls DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1, nn_hls ; DO ji = 1, nn_hls ARRAY_IN(ji+ishift,jj+ishift2,jk,jl,jf) = zrcv(idx) idx = idx + 1 END DO ; END DO ; END DO ; END DO ; END DO END IF ENDIF END IF END IF ! ! -------------------------------------------- ! ! 3. deallocate local temporary arrays ! ! -------------------------------------------- ! ! DEALLOCATE( zsnd ) DEALLOCATE( zrcv ) DEALLOCATE(isizes) DEALLOCATE(isizer) DEALLOCATE(idatatys) DEALLOCATE(idatatyr) DEALLOCATE(idispls) DEALLOCATE(idisplr) ! ! ------------------------------- ! ! 4. north fold treatment ! ! ------------------------------- ! ! IF( lldo_nfd .AND. ifill_no /= jpfillnothing ) THEN ! SELECT CASE ( jpni ) CASE ( 1 ) ; CALL lbc_nfd( ptab, NAT_IN(:), SGN_IN(:) OPT_K(:) ) ! only 1 northern proc, no mpp CASE DEFAULT ; CALL mpp_nfd( ptab, NAT_IN(:), SGN_IN(:), ifill_no, zland OPT_K(:) ) ! for all northern procs. END SELECT ! ifill_no = jpfillnothing ! force to do nothing for the northern halo as we just done the north pole folding ! ENDIF END SUBROUTINE ROUTINE_NC #undef PRECISION #undef ARRAY_TYPE #undef NAT_IN #undef SGN_IN #undef ARRAY_IN #undef K_SIZE #undef L_SIZE #undef F_SIZE #undef OPT_K #undef MPI_TYPE