Skip to content
Snippets Groups Projects
lib_fortran_generic.h90 4.68 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
#if defined GLOBSUM_CODE
!                          ! FUNCTION FUNCTION_GLOBSUM !
#   if defined DIM_1d
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define XD                1d
Guillaume Samson's avatar
Guillaume Samson committed
#      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
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define XD                2d
Guillaume Samson's avatar
Guillaume Samson committed
#      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
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define MASK_ARRAY(i,j)   tmask_i(i,j)
Guillaume Samson's avatar
Guillaume Samson committed
#   endif
#   if defined DIM_3d
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define XD                3d
Guillaume Samson's avatar
Guillaume Samson committed
#      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

Sebastien MASSON's avatar
Sebastien MASSON committed
   FUNCTION glob_sum_/**/XD/**/( cdname, ptab )
Guillaume Samson's avatar
Guillaume Samson committed
      !!----------------------------------------------------------------------
      CHARACTER(len=*),  INTENT(in   ) ::   cdname  ! name of the calling subroutine
      ARRAY_TYPE(:,:,:)                             ! array on which operation is applied
Sebastien MASSON's avatar
Sebastien MASSON committed
      REAL(wp)   ::  glob_sum_/**/XD
Guillaume Samson's avatar
Guillaume Samson committed
      !
      !!-----------------------------------------------------------------------
      !
      COMPLEX(dp)::   ctmp
      REAL(wp)   ::   ztmp
      INTEGER    ::   ji, jj, jk           ! dummy loop indices
      INTEGER    ::   ipi, ipj, ipk        ! dimensions
      INTEGER    ::   iisht, ijsht
Guillaume Samson's avatar
Guillaume Samson committed
      !!-----------------------------------------------------------------------
      !
      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
Guillaume Samson's avatar
Guillaume Samson committed
      ipi = SIZE(ptab,1)   ! 1st dimension
      ipj = SIZE(ptab,2)   ! 2nd dimension
Guillaume Samson's avatar
Guillaume Samson committed
      ipk = K_SIZE(ptab)   ! 3rd dimension
      !
      iisht = ( jpi - ipi ) / 2
      ijsht = ( jpj - ipj ) / 2   ! should be the same as iisht...
Guillaume Samson's avatar
Guillaume Samson committed
      !
      DO jk = 1, ipk
         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
Guillaume Samson's avatar
Guillaume Samson committed
      END DO
Guillaume Samson's avatar
Guillaume Samson committed
      CALL mpp_sum( cdname, ctmp )   ! sum over the global domain
Sebastien MASSON's avatar
Sebastien MASSON committed
      glob_sum_/**/XD = REAL(ctmp,wp)
Guillaume Samson's avatar
Guillaume Samson committed

Sebastien MASSON's avatar
Sebastien MASSON committed
   END FUNCTION glob_sum_/**/XD
Guillaume Samson's avatar
Guillaume Samson committed

Sebastien MASSON's avatar
Sebastien MASSON committed
#undef XD
Guillaume Samson's avatar
Guillaume Samson committed
#undef ARRAY_TYPE
#undef ARRAY_IN
#undef K_SIZE
#undef MASK_ARRAY
!
# endif
#if defined GLOBMINMAX_CODE
!                          ! FUNCTION FUNCTION_GLOBMINMAX !
#   if defined DIM_2d
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define XD                2d
Guillaume Samson's avatar
Guillaume Samson committed
#      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
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define XD                3d
Guillaume Samson's avatar
Guillaume Samson committed
#      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
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define OPER min
Guillaume Samson's avatar
Guillaume Samson committed
#   endif
#   if defined OPERATION_GLOBMAX
Sebastien MASSON's avatar
Sebastien MASSON committed
#      define OPER max
Guillaume Samson's avatar
Guillaume Samson committed
#   endif

Sebastien MASSON's avatar
Sebastien MASSON committed
   FUNCTION glob_/**/OPER/**/_/**/XD/**/( cdname, ptab )
Guillaume Samson's avatar
Guillaume Samson committed
      !!----------------------------------------------------------------------
      CHARACTER(len=*),  INTENT(in   ) ::   cdname  ! name of the calling subroutine
      ARRAY_TYPE(:,:,:)                             ! array on which operation is applied
Sebastien MASSON's avatar
Sebastien MASSON committed
      REAL(wp)   ::  glob_/**/OPER/**/_/**/XD
Guillaume Samson's avatar
Guillaume Samson committed
      !
      !!-----------------------------------------------------------------------
      !
      COMPLEX(dp)::   ctmp
      REAL(wp)   ::   ztmp
      INTEGER    ::   jk       ! dummy loop indices
      INTEGER    ::   ipi, ipj, ipk        ! dimensions
      INTEGER    ::   iisht, ijsht
Guillaume Samson's avatar
Guillaume Samson committed
      !!-----------------------------------------------------------------------
      !
      ipi = SIZE(ptab,1)   ! 1st dimension
      ipj = SIZE(ptab,2)   ! 2nd dimension
Guillaume Samson's avatar
Guillaume Samson committed
      ipk = K_SIZE(ptab)   ! 3rd 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) )
Guillaume Samson's avatar
Guillaume Samson committed
      DO jk = 2, ipk
         ztmp = OPER/**/(ztmp, OPER/**/val( ARRAY_IN(Nis0-iisht:Nie0-iisht,Njs0-ijsht:Nje0-ijsht,jk)*tmask_i(Nis0:Nie0,Njs0:Nje0) ))
Guillaume Samson's avatar
Guillaume Samson committed
      ENDDO

Sebastien MASSON's avatar
Sebastien MASSON committed
      CALL mpp_/**/OPER/**/( cdname, ztmp)
Guillaume Samson's avatar
Guillaume Samson committed

      glob_/**/OPER/**/_/**/XD = ztmp
Guillaume Samson's avatar
Guillaume Samson committed

Sebastien MASSON's avatar
Sebastien MASSON committed
   END FUNCTION glob_/**/OPER/**/_/**/XD
Guillaume Samson's avatar
Guillaume Samson committed

Sebastien MASSON's avatar
Sebastien MASSON committed
#undef XD
Guillaume Samson's avatar
Guillaume Samson committed
#undef ARRAY_TYPE
#undef ARRAY_IN
#undef K_SIZE
Sebastien MASSON's avatar
Sebastien MASSON committed
#undef OPER
Guillaume Samson's avatar
Guillaume Samson committed
# endif