diff --git a/NEWS.txt b/NEWS.txt
index 94d886badd11a53144dca576c9097a4025749d33..2785e4fca6fad86c46048f097e031977a77a488f 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,6 +1,10 @@
 Latest changes
 ==============
 
+TELEMAC-2D/GAIA: in parallel, replace multiple calls to P_MIN and P_MAX with
+a single call to P_MIN_ARRAY and P_MAX_ARRAY. Also introduce the subroutine
+P_SUM_ARRAY with the same interface as P_MIN_ARRAY.
+
 TOMAWAC: add functionality to have different time steps for different processes.
 Using this functionality, substantially faster calculation times can be obtained.
 
diff --git a/sources/api/api.cmdf b/sources/api/api.cmdf
index 1e68b961768028272e21e1386e3dafa05eee6c24..7fb873922479aac3caca261a121784f5d08ab8a2 100644
--- a/sources/api/api.cmdf
+++ b/sources/api/api.cmdf
@@ -916,16 +916,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
@@ -947,7 +951,6 @@ files: declarations_parallel.F
   p_mpi_alltoall.F
   p_mpi_type_free.F
   p_sync.F
-  p_dmin_array.F
 
 [partel]
 path: <root>|sources|utils|partel
diff --git a/sources/artemis/artemis.cmdf b/sources/artemis/artemis.cmdf
index c77fe4f91902318834732b1b992988dfcf7c84e9..23c416693c75ee855b0fe2c8b523e27e102c72db 100644
--- a/sources/artemis/artemis.cmdf
+++ b/sources/artemis/artemis.cmdf
@@ -563,16 +563,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
diff --git a/sources/gaia/conlit.f b/sources/gaia/conlit.f
index 45c5b995b924051af447837437a63f2cc49dd00f..cedcde79937306119406ba5d7debe93f0ed3c4d0 100644
--- a/sources/gaia/conlit.f
+++ b/sources/gaia/conlit.f
@@ -18,11 +18,12 @@
       USE DECLARATIONS_TELEMAC
 !
       USE DECLARATIONS_SPECIAL
-      USE INTERFACE_PARALLEL, ONLY : P_MAX
+      USE INTERFACE_PARALLEL, ONLY : P_MAX_ARRAY
       IMPLICIT NONE
 !
       INTEGER I,K,IFRLIQ,ISAND
       INTEGER YADEB(MAXFRO)
+      INTEGER, ALLOCATABLE :: TMP(:)
 !
       DOUBLE PRECISION, EXTERNAL :: QGL
 !
@@ -100,8 +101,13 @@
 !     DEALING WITH PRESCRIBED SOLID DISCHARGES
 !
       IF(NFRLIQ.GT.0) THEN
+        IF(NCSIZE.GT.1) THEN
+          ALLOCATE(TMP(NFRLIQ))
+          CALL P_MAX_ARRAY(YADEB(1:NFRLIQ), NFRLIQ, TMP)
+          YADEB(1:NFRLIQ) = TMP(1:NFRLIQ)
+          DEALLOCATE(TMP)
+        ENDIF
         DO IFRLIQ=1,NFRLIQ
-          IF(NCSIZE.GT.1) YADEB(IFRLIQ)=P_MAX(YADEB(IFRLIQ))
           IF(YADEB(IFRLIQ).EQ.1) THEN
 !
 !         READING BOUNDARY CONDITION FILE WITH SOLID DISCHARGE
diff --git a/sources/postel3d/postel3d.cmdf b/sources/postel3d/postel3d.cmdf
index 70e14ae658262d129345116c46c58e0a6e0aaa13..1ea8a39dc31d3cfa3f92c48add9cf88d6a1de21d 100644
--- a/sources/postel3d/postel3d.cmdf
+++ b/sources/postel3d/postel3d.cmdf
@@ -112,16 +112,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
diff --git a/sources/stbtel/stbtel.cmdf b/sources/stbtel/stbtel.cmdf
index 84243cac2956b0588e253ac4308dbf42676ba132..6b35324793c83e98d8d0785b3c367907ec6b709f 100644
--- a/sources/stbtel/stbtel.cmdf
+++ b/sources/stbtel/stbtel.cmdf
@@ -90,16 +90,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
diff --git a/sources/telemac2d/buse.f b/sources/telemac2d/buse.f
index 04630ec9f9a0b6764312ae176039385f3b7e0481..dfa7f2b833364dcd991bfa079e4203a0418b2704 100644
--- a/sources/telemac2d/buse.f
+++ b/sources/telemac2d/buse.f
@@ -11,7 +11,7 @@
      & NPTSCE,NPOIN2,KSCE)
 !
 !***********************************************************************
-! TELEMAC2D   V8P4
+! TELEMAC2D   V9P0
 !***********************************************************************
 !
 !Brief    TREATS CULVERTS/TUBES (OR BRIDGES) IN CHARGE
@@ -110,7 +110,7 @@
       USE BIEF
 !
       USE DECLARATIONS_SPECIAL
-      USE INTERFACE_PARALLEL, ONLY : P_MAX,P_MIN
+      USE INTERFACE_PARALLEL, ONLY : P_MAX_ARRAY, P_MIN_ARRAY
       IMPLICIT NONE
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -150,6 +150,10 @@
       DOUBLE PRECISION RD1,RD2,RD
       DOUBLE PRECISION FRIC,LONG,HAST,RAYON,TRASH,RADI1,RADI2
       DOUBLE PRECISION CORR56,CORRV5,VALVE,CORR5,CIR
+      DOUBLE PRECISION L_TMP(4),G_TMP_MIN(4)
+      DOUBLE PRECISION G_TMP_MAX(4)
+      DOUBLE PRECISION, ALLOCATABLE :: L_TMP2(:), G_TMP_MIN2(:),
+     &             G_TMP_MAX2(:)
 !
       DOUBLE PRECISION PI
       DOUBLE PRECISION TWOTHIRDS,FOURTHIRDS
@@ -193,10 +197,16 @@
         ENDIF
 !       CASE WHERE ONE OF THE ENDS IS NOT IN THE SUB-DOMAIN
         IF(NCSIZE.GT.1) THEN
-          S1=P_MAX(S1)+P_MIN(S1)
-          S2=P_MAX(S2)+P_MIN(S2)
-          QMAX1=P_MAX(QMAX1)+P_MIN(QMAX1)
-          QMAX2=P_MAX(QMAX2)+P_MIN(QMAX2)
+          L_TMP(1) = S1
+          L_TMP(2) = S2
+          L_TMP(3) = QMAX1
+          L_TMP(4) = QMAX2
+          CALL P_MIN_ARRAY(L_TMP, 4, G_TMP_MIN)
+          CALL P_MAX_ARRAY(L_TMP, 4, G_TMP_MAX)
+          S1=G_TMP_MAX(1)+G_TMP_MIN(1)
+          S2=G_TMP_MAX(2)+G_TMP_MIN(2)
+          QMAX1=G_TMP_MAX(3)+G_TMP_MIN(3)
+          QMAX2=G_TMP_MAX(4)+G_TMP_MIN(4)
         ENDIF
 !
 !       COEFFICIENTS FOR COMPUTATION OF PRESSURE LOSS
@@ -621,8 +631,12 @@
             VBUS(1,N) = 0.D0
           ENDIF
           IF(NCSIZE.GT.1) THEN
-            UBUS(1,N) = P_MAX(UBUS(1,N))+P_MIN(UBUS(1,N))
-            VBUS(1,N) = P_MAX(VBUS(1,N))+P_MIN(VBUS(1,N))
+            L_TMP(1) = UBUS(1,N)
+            L_TMP(2) = VBUS(1,N)
+            CALL P_MIN_ARRAY(L_TMP(1:2), 2, G_TMP_MIN(1:2))
+            CALL P_MAX_ARRAY(L_TMP(1:2), 2, G_TMP_MAX(1:2))
+            UBUS(1,N) = G_TMP_MAX(1)+G_TMP_MIN(1)
+            VBUS(1,N) = G_TMP_MAX(2)+G_TMP_MIN(2)
           ENDIF
         ELSEIF(DBUS(N).LT.0.D0) THEN
           UBUS(1,N) = (COS(D1)*DBUS(N)/SECBUS(N)) * COS(ANGBUS(N,1))
@@ -640,8 +654,12 @@
             VBUS(2,N) = 0.D0
           ENDIF
           IF(NCSIZE.GT.1) THEN
-            UBUS(2,N) = P_MAX(UBUS(2,N))+P_MIN(UBUS(2,N))
-            VBUS(2,N) = P_MAX(VBUS(2,N))+P_MIN(VBUS(2,N))
+            L_TMP(1) = UBUS(2,N)
+            L_TMP(2) = VBUS(2,N)
+            CALL P_MIN_ARRAY(L_TMP(1:2), 2, G_TMP_MIN(1:2))
+            CALL P_MAX_ARRAY(L_TMP(1:2), 2, G_TMP_MAX(1:2))
+            UBUS(2,N) = G_TMP_MAX(1)+G_TMP_MIN(1)
+            VBUS(2,N) = G_TMP_MAX(2)+G_TMP_MIN(2)
           ENDIF
         ELSEIF(DBUS(N).EQ.0.D0) THEN
           UBUS(1,N) = 0.D0
@@ -649,10 +667,16 @@
           UBUS(2,N) = 0.D0
           VBUS(2,N) = 0.D0
           IF(NCSIZE.GT.1) THEN
-            UBUS(1,N) = P_MAX(UBUS(1,N))+P_MIN(UBUS(1,N))
-            VBUS(1,N) = P_MAX(VBUS(1,N))+P_MIN(VBUS(1,N))
-            UBUS(2,N) = P_MAX(UBUS(2,N))+P_MIN(UBUS(2,N))
-            VBUS(2,N) = P_MAX(VBUS(2,N))+P_MIN(VBUS(2,N))
+            L_TMP(1) = UBUS(1,N)
+            L_TMP(2) = VBUS(1,N)
+            L_TMP(3) = UBUS(2,N)
+            L_TMP(4) = VBUS(2,N)
+            CALL P_MIN_ARRAY(L_TMP, 4, G_TMP_MIN)
+            CALL P_MAX_ARRAY(L_TMP, 4, G_TMP_MAX)
+            UBUS(1,N) = G_TMP_MAX(1)+G_TMP_MIN(1)
+            VBUS(1,N) = G_TMP_MAX(2)+G_TMP_MIN(2)
+            UBUS(2,N) = G_TMP_MAX(3)+G_TMP_MIN(3)
+            VBUS(2,N) = G_TMP_MAX(4)+G_TMP_MIN(4)
           ENDIF
         ENDIF
 !
@@ -695,15 +719,29 @@
                 TBUS%ADR(ITRAC)%P%R(NBUSE+N) = 0.D0
               ENDIF
             ENDIF
-            IF(NCSIZE.GT.1) THEN
-              TBUS%ADR(ITRAC)%P%R(NBUSE+N)=
-     &          P_MAX(TBUS%ADR(ITRAC)%P%R(NBUSE+N))
-     &         +P_MIN(TBUS%ADR(ITRAC)%P%R(NBUSE+N))
-              TBUS%ADR(ITRAC)%P%R(N)      =
-     &          P_MAX(TBUS%ADR(ITRAC)%P%R(N))
-     &         +P_MIN(TBUS%ADR(ITRAC)%P%R(N))
-            ENDIF
           ENDDO
+          IF(NCSIZE.GT.1) THEN
+            ALLOCATE(L_TMP2(NTRAC*2))
+            ALLOCATE(G_TMP_MIN2(NTRAC*2))
+            ALLOCATE(G_TMP_MAX2(NTRAC*2))
+            DO ITRAC=1,NTRAC
+              L_TMP2(ITRAC) = TBUS%ADR(ITRAC)%P%R(NBUSE+N)
+              L_TMP2(ITRAC+NTRAC) = TBUS%ADR(ITRAC)%P%R(N)
+            ENDDO
+            CALL P_MIN_ARRAY(L_TMP2, NTRAC*2, G_TMP_MIN2)
+            CALL P_MAX_ARRAY(L_TMP2, NTRAC*2, G_TMP_MAX2)
+            DO ITRAC=1,NTRAC
+              TBUS%ADR(ITRAC)%P%R(NBUSE+N) =
+     &          G_TMP_MIN2(ITRAC) +
+     &          G_TMP_MAX2(ITRAC)
+              TBUS%ADR(ITRAC)%P%R(N) =
+     &           G_TMP_MIN2(ITRAC+NTRAC) +
+     &           G_TMP_MAX2(ITRAC+NTRAC)
+            ENDDO
+            DEALLOCATE(L_TMP2)
+            DEALLOCATE(G_TMP_MIN2)
+            DEALLOCATE(G_TMP_MAX2)
+          ENDIF
         ENDIF
 !
 !  END OF THE LOOP OVER THE CULVERTS
diff --git a/sources/telemac2d/cltrac.f b/sources/telemac2d/cltrac.f
index 66e7f9f51b07f17a10ee27648d2867396f0af486..d4af39265605b8111885b7c33964ba537bd717c6 100644
--- a/sources/telemac2d/cltrac.f
+++ b/sources/telemac2d/cltrac.f
@@ -5,7 +5,7 @@
      &(NWEIRS,NPSING,NDGA1,NDGB1,ZF,ZDIG,H,T,NBOR,LITBOR,TBOR,NTRAC)
 !
 !***********************************************************************
-! TELEMAC2D   V6P3                                   21/08/2010
+! TELEMAC2D   V9P0
 !***********************************************************************
 !
 !brief    MANAGES THE BOUNDARY CONDITIONS FOR TRACER.
@@ -69,7 +69,7 @@
       USE BIEF
 !
       USE DECLARATIONS_SPECIAL
-      USE INTERFACE_PARALLEL, ONLY : P_MAX,P_MIN
+      USE INTERFACE_PARALLEL, ONLY : P_MAX_ARRAY,P_MIN_ARRAY
       IMPLICIT NONE
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -88,6 +88,7 @@
       INTEGER I,I1,I2,N,N1,N2,ITRAC
 !
       DOUBLE PRECISION Z1,Z2,T1,T2
+      DOUBLE PRECISION L_TMP(4), G_TMP_MIN(4), G_TMP_MAX(4)
 !
 !-----------------------------------------------------------------------
 !
@@ -116,10 +117,16 @@
           ENDIF
 !
           IF(NCSIZE.GT.1) THEN
-            Z1=P_MAX(MAX(Z1,0.D0))-P_MIN(MAX(-Z1,0.D0))
-            Z2=P_MAX(MAX(Z2,0.D0))-P_MIN(MAX(-Z2,0.D0))
-            T1=P_MAX(MAX(T1,0.D0))-P_MIN(MAX(-T1,0.D0))
-            T2=P_MAX(MAX(T2,0.D0))-P_MIN(MAX(-T2,0.D0))
+            L_TMP(1) = Z1
+            L_TMP(2) = Z2
+            L_TMP(3) = T1
+            L_TMP(4) = T2
+            CALL P_MIN_ARRAY(L_TMP, 4, G_TMP_MIN)
+            CALL P_MAX_ARRAY(L_TMP, 4, G_TMP_MAX)
+            Z1=G_TMP_MAX(1)+G_TMP_MIN(1)
+            Z2=G_TMP_MAX(2)+G_TMP_MIN(2)
+            T1=G_TMP_MAX(3)+G_TMP_MIN(3)
+            T2=G_TMP_MAX(4)+G_TMP_MIN(4)
           ENDIF
 !
 !         POINT 1
diff --git a/sources/telemac2d/lecbus.f b/sources/telemac2d/lecbus.f
index 4f26384db7781aecccf622c24d94a3539997b0fe..2309697a3e1ed70c444824fbe01d7f7b78945aea 100644
--- a/sources/telemac2d/lecbus.f
+++ b/sources/telemac2d/lecbus.f
@@ -8,7 +8,7 @@
      & AABUS)
 !
 !***********************************************************************
-! TELEMAC2D   V7P2                                   20/11/2015
+! TELEMAC2D   V9P0
 !***********************************************************************
 !
 !brief    READS THE DATA FOR CULVERTS/TUBES/BRIDGES.
@@ -72,7 +72,7 @@
 !
       USE BIEF
       USE DECLARATIONS_SPECIAL
-      USE INTERFACE_PARALLEL, ONLY : P_MAX,P_MIN
+      USE INTERFACE_PARALLEL, ONLY : P_MAX_ARRAY,P_MIN_ARRAY
       IMPLICIT NONE
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -103,6 +103,7 @@
       DOUBLE PRECISION DX,DY,ANG,CE1,CE2,CS1,CS2
       DOUBLE PRECISION HAU1,HAU2,ALT1,ALT2
       DOUBLE PRECISION DELTA1,DELTA2
+      DOUBLE PRECISION TMP(4), G_TMP_MAX(4), G_TMP_MIN(4)
 !
       DOUBLE PRECISION PI
       DOUBLE PRECISION, PARAMETER:: EPSL=1.D-12
@@ -167,10 +168,16 @@
           YSOR=0.D0
         ENDIF
         IF(NCSIZE.GT.1) THEN
-          XENT=P_MAX(XENT)+P_MIN(XENT)
-          YENT=P_MAX(YENT)+P_MIN(YENT)
-          XSOR=P_MAX(XSOR)+P_MIN(XSOR)
-          YSOR=P_MAX(YSOR)+P_MIN(YSOR)
+          TMP(1) = XENT
+          TMP(2) = YENT
+          TMP(3) = XSOR
+          TMP(4) = YSOR
+          CALL P_MIN_ARRAY(TMP, 4, G_TMP_MIN)
+          CALL P_MAX_ARRAY(TMP, 4, G_TMP_MAX)
+          XENT=G_TMP_MAX(1)+G_TMP_MIN(1)
+          YENT=G_TMP_MAX(2)+G_TMP_MIN(2)
+          XSOR=G_TMP_MAX(3)+G_TMP_MIN(3)
+          YSOR=G_TMP_MAX(4)+G_TMP_MIN(4)
         ENDIF
         IF (AABUS(N).EQ.1) THEN
           DX  = XSOR-XENT
diff --git a/sources/telemac2d/telemac2d.cmdf b/sources/telemac2d/telemac2d.cmdf
index 01689eeb0297d124991c6cc924a5f5e2ad654971..cf3f9447fec42394405e605b17b48f9578834d00 100644
--- a/sources/telemac2d/telemac2d.cmdf
+++ b/sources/telemac2d/telemac2d.cmdf
@@ -810,16 +810,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
@@ -841,7 +845,6 @@ files: declarations_parallel.F
   p_mpi_alltoall.F
   p_mpi_type_free.F
   p_dsumerr.F
-  p_dmin_array.F
 
 [special]
 path: <root>|sources|utils|special
diff --git a/sources/telemac3d/telemac3d.cmdf b/sources/telemac3d/telemac3d.cmdf
index 487ddc5d5d7dfff9b60a57fa60620cf651eb44e7..a061ac76224e28c1d7610b7485f5532ca655cfa0 100644
--- a/sources/telemac3d/telemac3d.cmdf
+++ b/sources/telemac3d/telemac3d.cmdf
@@ -771,16 +771,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
diff --git a/sources/tomawac/tomawac.cmdf b/sources/tomawac/tomawac.cmdf
index 3ae7616015574bfe76c722df6f263a6397e23996..f772fa90ea36a42b04d8a0bcb0cf2c79098c6650 100644
--- a/sources/tomawac/tomawac.cmdf
+++ b/sources/tomawac/tomawac.cmdf
@@ -516,16 +516,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
diff --git a/sources/utils/parallel/interface_parallel.f b/sources/utils/parallel/interface_parallel.f
index 35ba1d530ebd839d66045921b7efd15925631d79..e5e4a68855c6cc8f32d97f68500bf19befcf7bcd 100644
--- a/sources/utils/parallel/interface_parallel.f
+++ b/sources/utils/parallel/interface_parallel.f
@@ -4,7 +4,7 @@
 !
 !
 !***********************************************************************
-! PARALLEL VERSION 7.0                                  31/07/2012
+! PARALLEL   V9P0
 !***********************************************************************
 !
 !brief    INTERFACES OF PARALLEL LIBRARY PUBLIC SUBROUTINES
@@ -41,6 +41,10 @@
       CALL MPI_ADDRESS3
       CALL P_IMAX_ARRAY
       CALL P_DMAX_ARRAY
+      CALL P_IMIN_ARRAY
+      CALL P_DMIN_ARRAY
+      CALL P_ISUM_ARRAY
+      CALL P_DSUM_ARRAY
       CALL P_MPI_ALLTOALLV_I
       CALL P_MPI_ALLTOALLV_OIL
       CALL P_MPI_ALLTOALLV_ALG
@@ -76,22 +80,6 @@
         IMPLICIT NONE
         DOUBLE PRECISION, INTENT(IN) :: PARTIAL(2)
       END FUNCTION
-!
-      SUBROUTINE P_DMIN_ARRAY(MYPART,N,VALUES)
-        IMPLICIT NONE
-        INTEGER, INTENT(IN) :: N
-        DOUBLE PRECISION, INTENT(IN) :: MYPART(N)
-        DOUBLE PRECISION, INTENT(IN) :: VALUES(N)
-      END SUBROUTINE
-!
-      SUBROUTINE P_ISUM_ARRAY
-     &(SEND_BUFFER, RECV_BUFFER, NCOUNT, IERR)
-        IMPLICIT NONE
-        INTEGER, INTENT(IN)  :: NCOUNT
-        INTEGER, INTENT(IN)  :: SEND_BUFFER(NCOUNT)
-        INTEGER, INTENT(OUT) :: RECV_BUFFER(NCOUNT)
-        INTEGER, INTENT(OUT) :: IERR
-      END SUBROUTINE
 !
       SUBROUTINE P_MPI_ALLTOALL
      &(SEND_BUFFER,NSEND,SEND_DATYP,RECV_BUFFER,NRECV,RECV_DATYP,
@@ -223,13 +211,11 @@
           DOUBLE PRECISION, INTENT(IN) :: VALUES(N)
         END SUBROUTINE
 !
-        SUBROUTINE P_IMAX_ARRAY
-     &  (SEND_BUFFER, RECV_BUFFER, NCOUNT, IERR)
+        SUBROUTINE P_IMAX_ARRAY(MYPART,N,VALUES)
           IMPLICIT NONE
-          INTEGER, INTENT(IN)  :: NCOUNT
-          INTEGER, INTENT(IN)  :: SEND_BUFFER(NCOUNT)
-          INTEGER, INTENT(OUT) :: RECV_BUFFER(NCOUNT)
-          INTEGER, INTENT(OUT) :: IERR
+          INTEGER, INTENT(IN)  :: N
+          INTEGER, INTENT(IN)  :: MYPART(N)
+          INTEGER, INTENT(OUT) :: VALUES(N)
         END SUBROUTINE
       END INTERFACE
 
@@ -245,6 +231,23 @@
         END FUNCTION
       END INTERFACE
 
+      INTERFACE P_MIN_ARRAY
+        SUBROUTINE P_DMIN_ARRAY(MYPART,N,VALUES)
+          IMPLICIT NONE
+          INTEGER, INTENT(IN) :: N
+          DOUBLE PRECISION, INTENT(IN) :: MYPART(N)
+          DOUBLE PRECISION, INTENT(IN) :: VALUES(N)
+        END SUBROUTINE
+
+        SUBROUTINE P_IMIN_ARRAY(MYPART,N,VALUES)
+          IMPLICIT NONE
+          INTEGER, INTENT(IN) :: N
+          INTEGER, INTENT(IN) :: MYPART(N)
+          INTEGER, INTENT(IN) :: VALUES(N)
+        END SUBROUTINE
+      END INTERFACE
+!
+
       INTERFACE P_SUM
         DOUBLE PRECISION FUNCTION P_DSUM(MYPART)
           IMPLICIT NONE
@@ -257,6 +260,22 @@
         END FUNCTION
       END INTERFACE
 
+      INTERFACE P_SUM_ARRAY
+        SUBROUTINE P_ISUM_ARRAY(MYPART, N, VALUES)
+          IMPLICIT NONE
+          INTEGER, INTENT(IN)  :: N
+          INTEGER, INTENT(IN)  :: MYPART(N)
+          INTEGER, INTENT(OUT) :: VALUES(N)
+        END SUBROUTINE
+!
+        SUBROUTINE P_DSUM_ARRAY(MYPART, N, VALUES)
+          IMPLICIT NONE
+          INTEGER, INTENT(IN)  :: N
+          DOUBLE PRECISION, INTENT(IN)  :: MYPART(N)
+          DOUBLE PRECISION, INTENT(OUT) :: VALUES(N)
+        END SUBROUTINE
+      END INTERFACE
+!
       INTERFACE P_MPI_ADDRESS
         SUBROUTINE P_MPI_ADDRESS
      &  (LOCATION,ADDRESS,IER)
diff --git a/sources/utils/parallel/p_dsum_array.F b/sources/utils/parallel/p_dsum_array.F
new file mode 100644
index 0000000000000000000000000000000000000000..43477dce77882f805f322525f885135f2dfd603a
--- /dev/null
+++ b/sources/utils/parallel/p_dsum_array.F
@@ -0,0 +1,59 @@
+!                   ***********************
+                    SUBROUTINE P_DSUM_ARRAY
+!                   ***********************
+!
+     &(MYPART, N, VALUES)
+!
+!***********************************************************************
+! PARALLEL   V9P0
+!***********************************************************************
+!
+!brief    Sum values from all processes and distributes the result back
+!+        to all processes
+!
+!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+!| MYPART       |-->| SEND BUFFER.
+!| N            |-->| SIZE IF THE BUFFERS
+!| VALUES       |<--| RECV BUFFER.
+!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+!
+      USE DECLARATIONS_PARALLEL
+      USE DECLARATIONS_SPECIAL
+      IMPLICIT NONE
+!
+!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+!
+      INTEGER, INTENT(IN)  :: N
+      DOUBLE PRECISION, INTENT(IN)  :: MYPART(N)
+      DOUBLE PRECISION, INTENT(OUT) :: VALUES(N)
+!
+!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+!
+#if defined HAVE_MPI
+      INTEGER IERR
+!
+!-----------------------------------------------------------------------
+!
+      IERR = 0
+      VALUES = 0
+      CALL MPI_ALLREDUCE(MYPART,VALUES,N,MPI_DOUBLE_PRECISION,
+     &                   MPI_SUM,COMM,IERR)
+!
+      IF(IERR.NE.0) THEN
+        WRITE(LU,*) 'P_DSUM_ARRAY: ERROR IN MPI_ALLREDUCE'
+        WRITE(LU,*) 'MPI ERROR ',IERR
+        CALL PLANTE(1)
+        STOP
+      ENDIF
+#else
+      WRITE(LU,*)'CALL OF P_DSUM_ARRAY IN ITS VOID VERSION'
+      VALUES=MYPART
+!
+!-----------------------------------------------------------------------
+!
+#endif
+!
+!-----------------------------------------------------------------------
+!
+      RETURN
+      END
diff --git a/sources/utils/parallel/p_imax_array.F b/sources/utils/parallel/p_imax_array.F
index 2a929f6c268188fd8b9ec5aee6f54c561f1c6fc5..327815d93cb724a3bc08f3a9079daf6d24719e12 100644
--- a/sources/utils/parallel/p_imax_array.F
+++ b/sources/utils/parallel/p_imax_array.F
@@ -2,21 +2,19 @@
                     SUBROUTINE P_IMAX_ARRAY
 !                   ***********************
 !
-     &(SEND_BUFFER, RECV_BUFFER, NCOUNT, IERR)
+     &(MYPART, N, VALUES)
 !
 !***********************************************************************
-! PARALLEL   V6P1                                   21/08/2010
+! PARALLEL   V9P0
 !***********************************************************************
 !
-!brief    MAX VALUES FROM ALL PROCESSES AND DISTRIBUTES THE RESULT BACK TO ALL PROCESSES
-!
-!history  AUDOUIN YOANN
-!+        25/04/2013
-!+
-!+   CREATED
+!brief    Max values from all processes and distributes the result back
+!+        to all processes
 !
 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-!| MYPART         |-->| SEND BUFFER.
+!| MYPART         |-->| SEND BUFFER
+!| N              |-->| SIZE OF BUFFER
+!| VALUES         |-->| RECEIVED BUFFER
 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 !
       USE DECLARATIONS_PARALLEL
@@ -25,20 +23,20 @@
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 !
-      INTEGER, INTENT(IN)  :: NCOUNT
-      INTEGER, INTENT(IN)  :: SEND_BUFFER(NCOUNT)
-      INTEGER, INTENT(OUT) :: RECV_BUFFER(NCOUNT)
-      INTEGER, INTENT(OUT) :: IERR
+      INTEGER, INTENT(IN)  :: N
+      INTEGER, INTENT(IN)  :: MYPART(N)
+      INTEGER, INTENT(OUT) :: VALUES(N)
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 !
+#if defined HAVE_MPI
+      INTEGER IERR
 !
 !-----------------------------------------------------------------------
 !
       IERR = 0
-      RECV_BUFFER = 0
-#if defined HAVE_MPI
-      CALL MPI_ALLREDUCE(SEND_BUFFER,RECV_BUFFER,NCOUNT,MPI_INTEGER,
+      VALUES = 0
+      CALL MPI_ALLREDUCE(MYPART,VALUES,N,MPI_INTEGER,
      &                   MPI_MAX,COMM,IERR)
 !
       IF(IERR.NE.0) THEN
@@ -49,9 +47,8 @@
       ENDIF
       RETURN
 #else
-      WRITE(LU,*)'CALL OF P_IMAX_ARRAY IN ITS VOID VERSION'
 !
-!-----------------------------------------------------------------------
+      VALUES=MYPART
 !
 #endif
 !
diff --git a/sources/utils/parallel/p_imin_array.F b/sources/utils/parallel/p_imin_array.F
new file mode 100644
index 0000000000000000000000000000000000000000..1a2d5d9e98b8954fa1d9f9e44238e1a5af297511
--- /dev/null
+++ b/sources/utils/parallel/p_imin_array.F
@@ -0,0 +1,61 @@
+!                   ***********************
+                    SUBROUTINE P_IMIN_ARRAY
+!                   ***********************
+!
+     &(MYPART, N, VALUES)
+!
+!***********************************************************************
+! PARALLEL   V9P0
+!***********************************************************************
+!
+!brief    Min values from all processes and distributes the result back
+!+        to all processes
+!
+!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+!| MYPART         |-->| SEND BUFFER
+!| N              |-->| SIZE OF BUFFER
+!| VALUES         |-->| RECEIVED BUFFER
+!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+!
+      USE DECLARATIONS_PARALLEL
+      USE DECLARATIONS_SPECIAL
+      IMPLICIT NONE
+!
+!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+!
+      INTEGER, INTENT(IN) :: N
+      INTEGER, INTENT(IN) :: MYPART(N)
+      INTEGER, INTENT(INOUT) :: VALUES(N)
+!
+!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+!
+#if defined HAVE_MPI
+      INTEGER IER
+!
+!-----------------------------------------------------------------------
+!
+#  ifdef COMPAD
+      VALUES=0.D0
+      CALL AMPI_ALLREDUCE(MYPART,VALUES,N,AMPI_TYPE,AMPI_OP_MIN,
+     &                    COMM,IER)
+#  else
+      CALL MPI_ALLREDUCE(MYPART,VALUES,N,MPI_INTEGER,MPI_MIN,
+     &                   COMM,IER)
+#  endif
+!
+      IF(IER.NE.0) THEN
+        WRITE(LU,*) 'P_IMIN: ERROR IN MPI_ALLREDUCE'
+        WRITE(LU,*) 'MPI ERROR ',IER
+        CALL PLANTE(1)
+        STOP
+      ENDIF
+      RETURN
+#else
+!
+      VALUES=MYPART
+!
+#endif
+!
+!-----------------------------------------------------------------------
+!
+      END
diff --git a/sources/utils/parallel/p_isum_array.F b/sources/utils/parallel/p_isum_array.F
index 64c33b206e73459f70fc507634da8d7268d19334..a3f7fc7c5f3463478d601ab3f27f7fba77c0c4b6 100644
--- a/sources/utils/parallel/p_isum_array.F
+++ b/sources/utils/parallel/p_isum_array.F
@@ -2,24 +2,19 @@
                     SUBROUTINE P_ISUM_ARRAY
 !                   ***********************
 !
-     &(SEND_BUFFER, RECV_BUFFER, NCOUNT, IERR)
+     &(MYPART, N, VALUES)
 !
 !***********************************************************************
-! PARALLEL   V6P1                                   21/08/2010
+! PARALLEL   V9P0
 !***********************************************************************
 !
-!brief    SUM VALUES FROM ALL PROCESSES AND DISTRIBUTES THE RESULT BACK TO ALL PROCESSES
-!
-!history  AUDOUIN YOANN
-!+        25/04/2013
-!+
-!+   CREATED
+!brief    Sum values from all processes and distributes the result back
+!+        to all processes
 !
 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-!| SEND_BUFFER       |-->| SEND BUFFER.
-!| RECV_BUFFER       |<--| RECV BUFFER.
-!| NCOUNT            |-->| SIZE IF THE BUFFERS
-!| IERR              |<--| RETURN VALUE OF THE MPI_FUNCTION
+!| MYPART       |-->| SEND BUFFER.
+!| N            |-->| SIZE IF THE BUFFERS
+!| VALUES       |<--| RECV BUFFER.
 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 !
       USE DECLARATIONS_PARALLEL
@@ -28,20 +23,20 @@
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 !
-      INTEGER, INTENT(IN)  :: NCOUNT
-      INTEGER, INTENT(IN)  :: SEND_BUFFER(NCOUNT)
-      INTEGER, INTENT(OUT) :: RECV_BUFFER(NCOUNT)
-      INTEGER, INTENT(OUT) :: IERR
+      INTEGER, INTENT(IN)  :: N
+      INTEGER, INTENT(IN)  :: MYPART(N)
+      INTEGER, INTENT(OUT) :: VALUES(N)
 !
 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 !
+#if defined HAVE_MPI
+      INTEGER IERR
 !
 !-----------------------------------------------------------------------
 !
       IERR = 0
-      RECV_BUFFER = 0
-#if defined HAVE_MPI
-      CALL MPI_ALLREDUCE(SEND_BUFFER,RECV_BUFFER,NCOUNT,MPI_INTEGER,
+      VALUES = 0
+      CALL MPI_ALLREDUCE(MYPART,VALUES,N,MPI_INTEGER,
      &                   MPI_SUM,COMM,IERR)
 !
       IF(IERR.NE.0) THEN
@@ -52,6 +47,7 @@
       ENDIF
 #else
       WRITE(LU,*)'CALL OF P_ISUM_ARRAY IN ITS VOID VERSION'
+      VALUES=MYPART
 !
 !-----------------------------------------------------------------------
 !
@@ -61,4 +57,3 @@
 !
       RETURN
       END
-
diff --git a/sources/utils/partel/partel.cmdf b/sources/utils/partel/partel.cmdf
index 0cdd405ad213d75faee749004f709b8817685b01..ee1b1eeabd0e7aa7f94b9faf55780d6d78af9062 100644
--- a/sources/utils/partel/partel.cmdf
+++ b/sources/utils/partel/partel.cmdf
@@ -63,16 +63,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
diff --git a/sources/utils/partel/partel_para.F b/sources/utils/partel/partel_para.F
index 7f6bcb0984c5ce4e334eb242d3c76cde44a39d5c..98ae19c699e216913311297cc19ac9aa3ae10238 100644
--- a/sources/utils/partel/partel_para.F
+++ b/sources/utils/partel/partel_para.F
@@ -3,7 +3,7 @@
 !                   *******************
 !
 !***********************************************************************
-! PARALLEL   V6P2                                   20/02/2012
+! PARALLEL   V9P0
 !***********************************************************************
 !
 !brief    PREPROCESSING STEP BEFORE A PARALLEL COMPUTATION
@@ -888,7 +888,7 @@
       NB_INTER_GLOB=0
       ! IF (IPID. EQ. 0) WRITE(89,*) SORT
       ! CUT=0
-      CALL P_MAX_ARRAY(SORT,CUT,NPOIN2,IER)
+      CALL P_MAX_ARRAY(SORT,NPOIN2,CUT)
 !
       DO J=1,NPOIN2
         IF (CUT(J) .NE. 0) THEN
diff --git a/sources/utils/partel/partel_para.cmdf b/sources/utils/partel/partel_para.cmdf
index 5b6601c0ddb46a72d583faea40c549b00705626d..71985bba2253ddaa00eb926aad9e68ac3bdd0f5c 100644
--- a/sources/utils/partel/partel_para.cmdf
+++ b/sources/utils/partel/partel_para.cmdf
@@ -18,16 +18,20 @@ files: declarations_parallel.F
   p_dmax.F
   p_dmax_array.F
   p_dmin.F
+  p_dmin_array.F
   p_dread.F
   p_dsum.F
+  p_dsum_array.F
   p_dwrit.F
   p_imax.F
   p_imax_array.F
   p_imin.F
+  p_imin_array.F
   p_iread.F
   p_ireadi.F
   p_ireadi8.F
   p_isum.F
+  p_isum_array.F
   p_iwrit.F
   p_iwriti.F
   p_iwriti8.F
@@ -39,7 +43,6 @@ files: declarations_parallel.F
   p_allgatherv_i.F
   p_exit.F
   p_init.F
-  p_isum_array.F
   p_sync.F
   p_time.F