Newer
Older
#if defined GLOBSUM_CODE
! ! FUNCTION FUNCTION_GLOBSUM !
# if defined DIM_1d
# define ARRAY_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: ARRAY_IN(i,j,k)
# define ARRAY_IN(i,j,k) ptab(i)
# define K_SIZE(ptab) 1
# define MASK_ARRAY(i,j) 1.
# endif
# if defined DIM_2d
# define ARRAY_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: ARRAY_IN(i,j,k)
# define ARRAY_IN(i,j,k) ptab(i,j)
# define K_SIZE(ptab) 1
# define ARRAY_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: ARRAY_IN(i,j,k)
# define ARRAY_IN(i,j,k) ptab(i,j,k)
# define K_SIZE(ptab) SIZE(ptab,3)
# define MASK_ARRAY(i,j) tmask_i(i,j)
# endif
!!----------------------------------------------------------------------
CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine
ARRAY_TYPE(:,:,:) ! array on which operation is applied
!
!!-----------------------------------------------------------------------
!
COMPLEX(dp):: ctmp
REAL(wp) :: ztmp
INTEGER :: ji, jj, jk ! dummy loop indices
INTEGER :: ipi, ipj, ipk ! dimensions
INTEGER :: iisht, ijsht
!!-----------------------------------------------------------------------
!
ctmp = CMPLX( 0.e0, 0.e0, dp ) ! warning ctmp is cumulated
!
# if defined DIM_1d
DO ji = 1, SIZE(ptab,1)
CALL DDPDD( CMPLX( ptab(ji), 0.e0, dp ), ctmp )
END DO
# else
ipj = SIZE(ptab,2) ! 2nd dimension
iisht = ( jpi - ipi ) / 2
ijsht = ( jpj - ipj ) / 2 ! should be the same as iisht...
DO_2D( 0, 0, 0, 0 )
ztmp = ARRAY_IN(ji-iisht,jj-ijsht,jk) * MASK_ARRAY(ji,jj) ! warning tmask_iis defined over the full MPI domain
CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp )
END_2D
CALL mpp_sum( cdname, ctmp ) ! sum over the global domain
#undef ARRAY_TYPE
#undef ARRAY_IN
#undef K_SIZE
#undef MASK_ARRAY
!
# endif
#if defined GLOBMINMAX_CODE
! ! FUNCTION FUNCTION_GLOBMINMAX !
# if defined DIM_2d
# define ARRAY_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: ARRAY_IN(i,j,k)
# define ARRAY_IN(i,j,k) ptab(i,j)
# define K_SIZE(ptab) 1
# endif
# if defined DIM_3d
# define ARRAY_TYPE(i,j,k) REAL(wp) , INTENT(in ) :: ARRAY_IN(i,j,k)
# define ARRAY_IN(i,j,k) ptab(i,j,k)
# define K_SIZE(ptab) SIZE(ptab,3)
# endif
# if defined OPERATION_GLOBMIN
FUNCTION glob_/**/OPER/**/_/**/XD/**/( cdname, ptab )
!!----------------------------------------------------------------------
CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine
ARRAY_TYPE(:,:,:) ! array on which operation is applied
!
!!-----------------------------------------------------------------------
!
COMPLEX(dp):: ctmp
REAL(wp) :: ztmp
INTEGER :: jk ! dummy loop indices
INTEGER :: ipi, ipj, ipk ! dimensions
INTEGER :: iisht, ijsht
!!-----------------------------------------------------------------------
!
ipi = SIZE(ptab,1) ! 1st dimension
ipj = SIZE(ptab,2) ! 2nd dimension
iisht = ( jpi - ipi ) / 2
ijsht = ( jpj - ipj ) / 2 ! should be the same as iisht...
!
ztmp = OPER/**/val( ARRAY_IN(Nis0-iisht:Nie0-iisht,Njs0-ijsht:Nje0-ijsht,1)*tmask_i(Nis0:Nie0,Njs0:Nje0) )
ztmp = OPER/**/(ztmp, OPER/**/val( ARRAY_IN(Nis0-iisht:Nie0-iisht,Njs0-ijsht:Nje0-ijsht,jk)*tmask_i(Nis0:Nie0,Njs0:Nje0) ))
glob_/**/OPER/**/_/**/XD = ztmp
#undef ARRAY_TYPE
#undef ARRAY_IN
#undef K_SIZE