Newer
Older
/**/
/*-----------------------------*/
/* DEFINE COMMON VARIABLES */
/*-----------------------------*/
/**/
# define XD 1d
# define ARRAY_IN(i,j,k,l) ptab(i)
# define XD 2d
# define ARRAY_IN(i,j,k,l) ptab(i,j)
# define K_SIZE(ptab) 1
# define L_SIZE(ptab) 1
# define LAST_SIZE -1
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# define XD 3d
# define ARRAY_IN(i,j,k,l) ptab(i,j,k)
# define K_SIZE(ptab) SIZE(ptab,3)
# define L_SIZE(ptab) 1
# define LAST_SIZE SIZE(ptab,3)
# endif
# if defined DIM_4d
# define XD 4d
# define ARRAY_IN(i,j,k,l) ptab(i,j,k,l)
# define K_SIZE(ptab) SIZE(ptab,3)
# define L_SIZE(ptab) SIZE(ptab,4)
# define LAST_SIZE SIZE(ptab,4)
# endif
# if defined VEC
# define ISVEC _vec
# else
# define ISVEC
# endif
# if defined LOCALONLY
# define TYPENAME local
# else
# define TYPENAME glob
# endif
/**/
/*-------------------------------*/
/* FUNCTION FUNCTION_GLOBSUM */
/*-------------------------------*/
/**/
#if defined GLOBSUM_CODE
/**/
/* DEFINE LOCAL VARIABLES */
/**/
!
# if defined LOCALONLY
FUNCTION TYPENAME/**/_sum/**/ISVEC/**/_/**/XD/**/( ptab ) RESULT( ptmp )
!!----------------------------------------------------------------------
# else
FUNCTION TYPENAME/**/_sum/**/ISVEC/**/_/**/XD/**/( cdname, ptab ) RESULT( ptmp )
!!----------------------------------------------------------------------
CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine
# endif
REAL(wp) , INTENT(in ) :: ARRAY_IN(:,:,:,:) ! array on which operation is applied
# if defined VEC
REAL(wp) , DIMENSION(LAST_SIZE) :: ptmp
COMPLEX(dp), DIMENSION(LAST_SIZE) :: ctmp
# else
REAL(wp) :: ptmp
# endif
INTEGER :: ji, jj, jk, jl ! dummy loop indices
INTEGER :: ipi, ipj, ipk, ipl ! dimensions
!!-----------------------------------------------------------------------
!
ctmp = CMPLX( 0.e0, 0.e0, dp ) ! warning ctmp is cumulated
DO ji = 1, SIZE(ptab,1)
CALL DDPDD( CMPLX( ptab(ji), 0.e0, dp ), ctmp )
END DO
ipj = SIZE(ptab,2) ! 2nd dimension
ipl = L_SIZE(ptab) ! 4th dimension
iisht = ( jpi - ipi ) / 2
ijsht = ( jpj - ipj ) / 2 ! should be the same as iisht...
ctmp = CMPLX( 0.e0, 0.e0, dp ) ! warning ctmp is cumulated
!
DO jl = 1, ipl
DO jk = 1, ipk
DO_2D( 0, 0, 0, 0 )
! warning tmask_i is defined over the full MPI domain but maybe not ptab
# define ARRAY_LOOP ARRAY_IN(ji-iisht,jj-ijsht,jk,jl) * tmask_i(ji,jj)
# if defined VEC && defined DIM_3d
CALL DDPDD( CMPLX( ARRAY_LOOP, 0.e0, dp ), ctmp(jk) )
# endif
# if defined VEC && defined DIM_4d
CALL DDPDD( CMPLX( ARRAY_LOOP, 0.e0, dp ), ctmp(jl) )
# endif
# if ! defined VEC
CALL DDPDD( CMPLX( ARRAY_LOOP, 0.e0, dp ), ctmp )
END_2D
END DO
END DO
!
# endif
# if defined LOCALONLY
ptmp = ctmp
# else
CALL mpp_sum( cdname, ctmp ) ! sum over the global domain
ptmp = REAL(ctmp, wp)
# endif
!
END FUNCTION TYPENAME/**/_sum/**/ISVEC/**/_/**/XD
/**/
/*----------------------------------*/
/* FUNCTION FUNCTION_GLOBMINMAX */
/*----------------------------------*/
/**/
/**/
/* DEFINE LOCAL VARIABLES */
/**/
# define OPER min
# define DEFAULT HUGE(1._wp)
# define OPER max
# define DEFAULT -HUGE(1._wp)
!
# if defined LOCALONLY
FUNCTION TYPENAME/**/_/**/OPER/**//**/ISVEC/**/_/**/XD/**/( ptab ) RESULT( ptmp )
!!----------------------------------------------------------------------
# else
FUNCTION TYPENAME/**/_/**/OPER/**//**/ISVEC/**/_/**/XD/**/( cdname, ptab ) RESULT( ptmp )
!!----------------------------------------------------------------------
CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine
# endif
REAL(wp) , INTENT(in ) :: ARRAY_IN(:,:,:,:) ! array on which operation is applied
# if defined VEC
REAL(wp), DIMENSION(LAST_SIZE) :: ptmp
# else
REAL(wp) :: ptmp
# endif
INTEGER :: ji, jj, jk, jl ! dummy loop indices
INTEGER :: ipi, ipj, ipk, ipl ! dimensions
!!-----------------------------------------------------------------------
!
ipi = SIZE(ptab,1) ! 1st dimension
ipj = SIZE(ptab,2) ! 2nd dimension
ipl = L_SIZE(ptab) ! 4th dimension
iisht = ( jpi - ipi ) / 2
ijsht = ( jpj - ipj ) / 2 ! should be the same as iisht...
!
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
ptmp = DEFAULT
!
DO jl = 1, ipl
DO jk = 1, ipk
# define ARRAY_LOOP ARRAY_IN(Nis0-iisht:Nie0-iisht,Njs0-ijsht:Nje0-ijsht,jk,jl)*tmask_i(Nis0:Nie0,Njs0:Nje0)
# if defined VEC && defined DIM_3d
ptmp(jk) = OPER/**/( ptmp(jk), OPER/**/val( ARRAY_LOOP ) )
# endif
# if defined VEC && defined DIM_4d
ptmp(jl) = OPER/**/( ptmp(jl), OPER/**/val( ARRAY_LOOP ) )
# endif
# if ! defined VEC
ptmp = OPER/**/( ptmp , OPER/**/val( ARRAY_LOOP ) )
# endif
END DO
END DO
!
# if ! defined LOCAL
CALL mpp_/**/OPER/**/( cdname, ptmp )
# endif
!
END FUNCTION TYPENAME/**/_/**/OPER/**//**/ISVEC/**/_/**/XD
!
# undef DEFAULT
# undef OPER
# endif
/**/
/* */
/* UNDEFINE COMMON VARIABLES */
/* */
/**/
# if ! defined DIM_1d
#undef L_SIZE
#undef LAST_SIZE
# endif
#undef ISVEC
#undef TYPENAME
#undef ARRAY_LOOP