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