From 1a8769d430637e143276266ffdfbb5dafa688658 Mon Sep 17 00:00:00 2001
From: Sebastien MASSON <massons@irene150.c-irene.tgcc.ccc.cea.fr>
Date: Sun, 13 Feb 2022 11:46:13 +0100
Subject: [PATCH] bugfix and cleaning

---
 src/OCE/lib_fortran.F90         | 57 +++++++++------------------------
 src/OCE/lib_fortran_generic.h90 | 47 +++++++++++++--------------
 2 files changed, 38 insertions(+), 66 deletions(-)

diff --git a/src/OCE/lib_fortran.F90 b/src/OCE/lib_fortran.F90
index 38a16862d..b621373e6 100644
--- a/src/OCE/lib_fortran.F90
+++ b/src/OCE/lib_fortran.F90
@@ -79,59 +79,34 @@ MODULE lib_fortran
 CONTAINS
 
 #  define GLOBSUM_CODE
-
 #     define DIM_1d
-#     define FUNCTION_GLOBSUM           glob_sum_1d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBSUM
+#        include "lib_fortran_generic.h90"
 #     undef DIM_1d
-
 #     define DIM_2d
-#     define OPERATION_GLOBSUM
-#     define FUNCTION_GLOBSUM           glob_sum_2d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBSUM
-#     undef OPERATION_GLOBSUM
+#        include "lib_fortran_generic.h90"
 #     undef DIM_2d
-
 #     define DIM_3d
-#     define OPERATION_GLOBSUM
-#     define FUNCTION_GLOBSUM           glob_sum_3d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBSUM
-#     undef OPERATION_GLOBSUM
+#        include "lib_fortran_generic.h90"
 #     undef DIM_3d
-
 #  undef GLOBSUM_CODE
 
-
 #  define GLOBMINMAX_CODE
-
 #     define DIM_2d
-#     define OPERATION_GLOBMIN
-#     define FUNCTION_GLOBMINMAX           glob_min_2d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBMINMAX
-#     undef OPERATION_GLOBMIN
-#     define OPERATION_GLOBMAX
-#     define FUNCTION_GLOBMINMAX           glob_max_2d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBMINMAX
-#     undef OPERATION_GLOBMAX
+#        define OPERATION_GLOBMIN
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMIN
+#        define OPERATION_GLOBMAX
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMAX
 #     undef DIM_2d
-
 #     define DIM_3d
-#     define OPERATION_GLOBMIN
-#     define FUNCTION_GLOBMINMAX           glob_min_3d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBMINMAX
-#     undef OPERATION_GLOBMIN
-#     define OPERATION_GLOBMAX
-#     define FUNCTION_GLOBMINMAX           glob_max_3d
-#     include "lib_fortran_generic.h90"
-#     undef FUNCTION_GLOBMINMAX
-#     undef OPERATION_GLOBMAX
-#     undef DIM_3d
+#        define OPERATION_GLOBMIN
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMIN
+#        define OPERATION_GLOBMAX
+#           include "lib_fortran_generic.h90"
+#        undef OPERATION_GLOBMAX
+#     undef DIM_3
 #  undef GLOBMINMAX_CODE
 
 !                          ! FUNCTION local_sum !
diff --git a/src/OCE/lib_fortran_generic.h90 b/src/OCE/lib_fortran_generic.h90
index 92f136e82..5201ad6d0 100644
--- a/src/OCE/lib_fortran_generic.h90
+++ b/src/OCE/lib_fortran_generic.h90
@@ -1,6 +1,7 @@
 #if defined GLOBSUM_CODE
 !                          ! FUNCTION FUNCTION_GLOBSUM !
 #   if defined DIM_1d
+#      define XD                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 ARRAY2_IN(i,j,k)  ptab2(i)
@@ -9,13 +10,16 @@
 #      define MASK_ARRAY(i,j)   1.
 #   endif
 #   if defined DIM_2d
+#      define XD                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 ARRAY2_IN(i,j,k)  ptab2(i,j)
 #      define J_SIZE(ptab)      SIZE(ptab,2)
 #      define K_SIZE(ptab)      1
+#      define MASK_ARRAY(i,j)   tmask_i(i,j)
 #   endif
 #   if defined DIM_3d
+#      define XD                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 ARRAY2_IN(i,j,k)  ptab2(i,j,k)
@@ -24,16 +28,14 @@
 #      define MASK_ARRAY(i,j)   tmask_i(i,j)
 #   endif
 
-   FUNCTION FUNCTION_GLOBSUM( cdname, ptab )
+   FUNCTION glob_sum_/**/XD/**/( cdname, ptab )
       !!----------------------------------------------------------------------
       CHARACTER(len=*),  INTENT(in   ) ::   cdname  ! name of the calling subroutine
       ARRAY_TYPE(:,:,:)                             ! array on which operation is applied
-      REAL(wp)   ::  FUNCTION_GLOBSUM
+      REAL(wp)   ::  glob_sum_/**/XD
       !
       !!-----------------------------------------------------------------------
       !
-      REAL(wp) ::   FUNCTION_GLOB_OP   ! global sum
-      !!
       COMPLEX(dp)::   ctmp
       REAL(wp)   ::   ztmp
       INTEGER    ::   ji, jj, jk           ! dummy loop indices
@@ -63,10 +65,11 @@
         END DO
       END DO
       CALL mpp_sum( cdname, ctmp )   ! sum over the global domain
-      FUNCTION_GLOBSUM = REAL(ctmp,wp)
+      glob_sum_/**/XD = REAL(ctmp,wp)
 
-   END FUNCTION FUNCTION_GLOBSUM
+   END FUNCTION glob_sum_/**/XD
 
+#undef XD
 #undef ARRAY_TYPE
 #undef ARRAY2_TYPE
 #undef ARRAY_IN
@@ -79,38 +82,34 @@
 #if defined GLOBMINMAX_CODE
 !                          ! FUNCTION FUNCTION_GLOBMINMAX !
 #   if defined DIM_2d
+#      define XD                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 ARRAY2_IN(i,j,k)  ptab2(i,j)
 #      define K_SIZE(ptab)      1
 #   endif
 #   if defined DIM_3d
+#      define XD                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 ARRAY2_IN(i,j,k)  ptab2(i,j,k)
 #      define K_SIZE(ptab)      SIZE(ptab,3)
 #   endif
 #   if defined OPERATION_GLOBMIN
-#      define SCALAR_OPERATION min
-#      define ARRAY_OPERATION minval
-#      define MPP_OPERATION mpp_min
+#      define OPER min
 #   endif
 #   if defined OPERATION_GLOBMAX
-#      define SCALAR_OPERATION max
-#      define ARRAY_OPERATION maxval
-#      define MPP_OPERATION mpp_max
+#      define OPER max
 #   endif
 
-   FUNCTION FUNCTION_GLOBMINMAX( cdname, ptab )
+   FUNCTION glob_/**/OPER/**/_/**/XD/**/( cdname, ptab )
       !!----------------------------------------------------------------------
       CHARACTER(len=*),  INTENT(in   ) ::   cdname  ! name of the calling subroutine
       ARRAY_TYPE(:,:,:)                             ! array on which operation is applied
-      REAL(wp)   ::  FUNCTION_GLOBMINMAX
+      REAL(wp)   ::  glob_/**/OPER/**/_/**/XD
       !
       !!-----------------------------------------------------------------------
       !
-      REAL(wp)                              ::   FUNCTION_GLOB_OP   ! global sum
-      !!
       COMPLEX(dp)::   ctmp
       REAL(wp)   ::   ztmp
       INTEGER    ::   jk       ! dummy loop indices
@@ -119,24 +118,22 @@
       !
       ipk = K_SIZE(ptab)   ! 3rd dimension
       !
-      ztmp = ARRAY_OPERATION( ARRAY_IN(:,:,1)*tmask_i(:,:) )
+      ztmp = OPER/**/val( ARRAY_IN(:,:,1)*tmask_i(:,:) )
       DO jk = 2, ipk
-         ztmp = SCALAR_OPERATION(ztmp, ARRAY_OPERATION( ARRAY_IN(:,:,jk)*tmask_i(:,:) ))
+         ztmp = OPER/**/(ztmp, OPER/**/val( ARRAY_IN(:,:,jk)*tmask_i(:,:) ))
       ENDDO
 
-      CALL MPP_OPERATION( cdname, ztmp)
-
-      FUNCTION_GLOBMINMAX = ztmp
+      CALL mpp_/**/OPER/**/( cdname, ztmp)
 
+      glob_/**/OPER/**/_/**/XD  = ztmp
 
-   END FUNCTION FUNCTION_GLOBMINMAX
+   END FUNCTION glob_/**/OPER/**/_/**/XD
 
+#undef XD
 #undef ARRAY_TYPE
 #undef ARRAY2_TYPE
 #undef ARRAY_IN
 #undef ARRAY2_IN
 #undef K_SIZE
-#undef SCALAR_OPERATION
-#undef ARRAY_OPERATION
-#undef MPP_OPERATION
+#undef OPER
 # endif
-- 
GitLab