MODULE halo_mng !!====================================================================== !! *** MODULE halo_mng *** !! Ocean numerics: massively parallel processing library !!===================================================================== !! History : OPA ! 1994 (M. Guyon, J. Escobar, M. Imbard) !Original code !! 4.0 ! 2019 (CMCC - ASC) initial version of halo management module !in_out_manager !!---------------------------------------------------------------------- USE dom_oce ! ocean space and time domain IMPLICIT NONE PRIVATE INTERFACE halo_mng_copy MODULE PROCEDURE halo_mng_copy_2D, halo_mng_copy_3d, halo_mng_copy_4d END INTERFACE PUBLIC halo_mng_copy PUBLIC halo_mng_init PUBLIC halo_mng_set INTEGER :: jpi_1, jpj_1 INTEGER :: jpimax_1, jpjmax_1 INTEGER :: nlci_1, nlcj_1 INTEGER :: jplbi_1, jplbj_1 CONTAINS SUBROUTINE halo_mng_init( ) jpi_1 = jpi jpj_1 = jpj nlci_1 = nlci nlcj_1 = nlcj jplbi_1 = 1 jplbj_1 = 1 jplbi = 1 jplbj = 1 jpimax_1 = jpimax jpjmax_1 = jpjmax END SUBROUTINE halo_mng_init SUBROUTINE halo_mng_set( khls ) INTEGER, INTENT(in ) :: khls nn_hls = khls jpi = jpi_1 + khls -1 jpj = jpj_1 + khls -1 nlci = nlci_1 + khls -1 nlcj = nlcj_1 + khls -1 jplbi = jplbi_1 - khls +1 jplbj = jplbj_1 - khls +1 jpimax = jpimax_1 + khls -1 jpjmax = jpjmax_1 + khls -1 END SUBROUTINE halo_mng_set SUBROUTINE halo_mng_copy_2D(pta_1, pta_2) !!---------------------------------------------------------------------- !! *** ROUTINE halo_mng_copy *** !! !! ** Purpose : copy pta_1 into pta_2 !! ** Method : !! History : !! 1.0 ! 07-19 ( CMCC - ASC ) halo_mng_copy !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:), INTENT(in) :: pta_1 REAL(wp), DIMENSION(:,:), INTENT(out) :: pta_2 INTEGER :: halo, off1, off2 INTEGER, DIMENSION(2) :: dim halo = (SIZE(pta_1,1) - SIZE(pta_2,1))/2 IF (halo < 0) THEN off1 = 0 off2 = -halo dim = SHAPE(pta_1) ELSE off1 = halo off2 = 0 dim = SHAPE(pta_2) END IF pta_2(1+off2:SIZE(pta_2,1)-off2, 1+off2:SIZE(pta_2,2)-off2) = pta_1(1+off1:SIZE(pta_1,1)-off1, 1+off1:SIZE(pta_1,2)-off1) END SUBROUTINE halo_mng_copy_2D SUBROUTINE halo_mng_copy_3D(pta_1, pta_2) !!---------------------------------------------------------------------- !! *** ROUTINE halo_mng_copy *** !! !! ** Purpose : copy pta_1 into pta_2 !! ** Method : !! History : !! 1.0 ! 07-19 ( CMCC - ASC ) halo_mng_copy !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:,:), INTENT(in) :: pta_1 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pta_2 INTEGER :: halo, off1, off2 INTEGER, DIMENSION(3) :: dim halo = (SIZE(pta_1,1) - SIZE(pta_2,1))/2 IF (halo < 0) THEN off1 = 0 off2 = -halo dim = SHAPE(pta_1) ELSE off1 = halo off2 = 0 dim = SHAPE(pta_2) END IF pta_2(1+off2:SIZE(pta_2,1)-off2, 1+off2:SIZE(pta_2,2)-off2,:) = pta_1(1+off1:SIZE(pta_1,1)-off1, 1+off1:SIZE(pta_1,2)-off1,:) END SUBROUTINE halo_mng_copy_3D SUBROUTINE halo_mng_copy_4D(pta_1, pta_2) !!---------------------------------------------------------------------- !! *** ROUTINE halo_mng_copy *** !! !! ** Purpose : copy pta_1 into pta_2 !! ** Method : !! History : !! 1.0 ! 07-19 ( CMCC - ASC ) halo_mng_copy !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:,:,:), INTENT(in) :: pta_1 REAL(wp), DIMENSION(:,:,:,:), INTENT(out) :: pta_2 INTEGER :: halo, off1, off2 INTEGER, DIMENSION(4) :: dim halo = (SIZE(pta_1,1) - SIZE(pta_2,1))/2 IF (halo < 0) THEN off1 = 0 off2 = -halo dim = SHAPE(pta_1) ELSE off1 = halo off2 = 0 dim = SHAPE(pta_2) END IF pta_2(1+off2:SIZE(pta_2,1)-off2, 1+off2:SIZE(pta_2,2)-off2,:,:) = pta_1(1+off1:SIZE(pta_1,1)-off1, 1+off1:SIZE(pta_1,2)-off1,:,:) END SUBROUTINE halo_mng_copy_4D END MODULE