diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 8d4cdc38599eb2b3b185c3f41762975ccbdbc5a2..bf758751f8e46e56be7380beb174ff63bab096b0 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -1287,8 +1287,7 @@ ELSE CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) ! Collect global domain boundaries - CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XHAT_BOUND ) - CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND ) + CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND ) END IF ! diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index 7bdf08ec4db7f3a70fb3cbd3a2cbb99ce17c0e5d..4afe7ed323b17c776bcaa1e72555dc7535dde234 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -261,8 +261,7 @@ IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) ) CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) ! Collect global domain boundaries -CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XHAT_BOUND ) -CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND ) +CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND ) !JUAN REALZ IF ( CPROGRAM .EQ. "REAL " ) THEN diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index 7fd47bf64b613692b1a085a4757fe8563d1d54d3..a00d7a30af068070d8d840df7e95b7d3226b9ac4 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -332,8 +332,7 @@ XZTOP = XZHAT(IKU) CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) ! Collect global domain boundaries -CALL STORE_VERGRID_BOUNDS( XZHAT, XHAT_BOUND ) -CALL STORE_VERGRID_BOUNDS( XZHATM, XHATM_BOUND ) +CALL STORE_VERGRID_BOUNDS( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index 25d645e5c6f64e5ef02b131a33ef4db16676cb0e..c6acdf6b952df5f7a5a6d071b6a70ce5eb8e1043 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -352,8 +352,7 @@ CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) ! Collect global domain boundaries -CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) -CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND ) +CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) IF (LCARTESIAN) THEN CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ) @@ -517,7 +516,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS !----------------------------------------------------------------- -SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHAT_BOUND ) +SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) USE MODD_GRID_n USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT @@ -528,94 +527,137 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHAT_BOUND ) IMPLICIT NONE - CHARACTER(LEN=1), INTENT(IN) :: HDIR ! Direction ('X', 'Y' or 'Z') - REAL, DIMENSION(:), TARGET, INTENT(IN) :: PHAT ! Position x, y or z in the conformal or cartesian plane - REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! Direction ('X', 'Y' or 'Z') + REAL, DIMENSION(:), TARGET, INTENT(IN) :: PHAT ! Position x, y or z in the conformal or cartesian plane + REAL, DIMENSION(:), TARGET, INTENT(IN) :: PHATM ! id at mass points + REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHATM_BOUND ! id at mass points INTEGER :: IERR - LOGICAL :: GALLOC + LOGICAL :: GALLOC, GALLOCM REAL, DIMENSION(:), POINTER :: ZHAT_GLOB + REAL, DIMENSION(:), POINTER :: ZHATM_GLOB - ZHAT_GLOB => NULL() + ZHAT_GLOB => NULL() + ZHATM_GLOB => NULL() SELECT CASE (HDIR) CASE ( 'X' ) - CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) - CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR ) + CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) + CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'XX', GALLOCM ) + CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR ) + CALL GATHERALL_FIELD_ll( 'XX', PHATM, ZHATM_GLOB, IERR ) + + ! Global boundaries on u points PHAT_BOUND(NEXTE_XMIN) = ZHAT_GLOB( 1 ) PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 ) - PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT ) + PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_XMIN) = ZHATM_GLOB( 1 ) + PHATM_BOUND(NEXTE_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) + PHATM_BOUND(NPHYS_XMIN) = ZHATM_GLOB( JPHEXT + 1 ) + PHATM_BOUND(NPHYS_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT ) CASE ( 'Y' ) - CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC ) - CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR ) + CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC ) + CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'YY', GALLOCM ) + CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR ) + CALL GATHERALL_FIELD_ll( 'YY', PHATM, ZHATM_GLOB, IERR ) + + ! Global boundaries on v points PHAT_BOUND(NEXTE_YMIN) = ZHAT_GLOB( 1 ) PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 ) - PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT ) + PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_YMIN) = ZHATM_GLOB( 1 ) + PHATM_BOUND(NEXTE_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) + PHATM_BOUND(NPHYS_YMIN) = ZHATM_GLOB( JPHEXT + 1 ) + PHATM_BOUND(NPHYS_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT ) CASE ( 'Z' ) - ZHAT_GLOB => PHAT + ZHAT_GLOB => PHAT + ZHATM_GLOB => PHATM + + ! Global boundaries on w points PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 ) PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 ) - PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPVEXT ) + PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_ZMIN) = ZHATM_GLOB( 1 ) + PHATM_BOUND(NEXTE_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) + PHATM_BOUND(NPHYS_ZMIN) = ZHATM_GLOB( JPVEXT + 1 ) + PHATM_BOUND(NPHYS_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPVEXT ) CASE DEFAULT CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR_BOUNDS', 'invalid direction (valid: X, Y or Z)' ) END SELECT - IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB ) + IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB ) + IF ( GALLOCM ) DEALLOCATE( ZHATM_GLOB ) END SUBROUTINE STORE_GRID_1DIR_BOUNDS !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) +SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! Position x in the conformal or cartesian plane REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Position y in the conformal or cartesian plane REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position y in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! id at mass points + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! id at mass points + REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! id at mass points + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points - CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) END SUBROUTINE STORE_GRID_BOUNDS !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PHAT_BOUND ) +SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! Position x in the conformal or cartesian plane REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Position y in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! id at mass points + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! id at mass points + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points - CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) END SUBROUTINE STORE_HORGRID_BOUNDS !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PHAT_BOUND ) +SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position y in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! id at mass points + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points - CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) END SUBROUTINE STORE_VERGRID_BOUNDS !----------------------------------------------------------------- diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 564efb71650d842c3e266ec0d9e8b542275bd0f8..2bbc35dd8b8287a9ca26b931ecf5a5fd63296f7b 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -464,8 +464,7 @@ PLEN2 = XLEN21 CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) ! Collect global domain boundaries - CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) - CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND ) + CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) !!$======= !!$ IXSIZE1=SIZE(XXHAT1)