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