SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/get_sizes_parallel.F90
Go to the documentation of this file.
00001 SUBROUTINE GET_SIZES_PARALLEL(PIO_FRAC,KPROC,KPIO,KSIZE,KSIZE_TASK)
00002 !
00003 USE MODD_SURFEX_MPI, ONLY : WLOG_MPI
00004 !
00005 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00006 USE PARKIND1  ,ONLY : JPRB
00007 !
00008 IMPLICIT NONE
00009 !
00010 REAL, INTENT(IN) :: PIO_FRAC
00011 INTEGER, INTENT(IN) :: KPROC
00012 INTEGER, INTENT(IN) :: KPIO
00013 INTEGER, INTENT(IN) :: KSIZE
00014 INTEGER, DIMENSION(0:KPROC-1), INTENT(OUT) :: KSIZE_TASK
00015 !
00016 INTEGER :: ISIZE, IRESTE, INRESTE
00017 INTEGER :: J, IPROC
00018 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00019 !
00020 IF (LHOOK) CALL DR_HOOK('GET_SIZES_PARALLEL',0,ZHOOK_HANDLE)
00021 !
00022 ISIZE = CEILING(KSIZE*1./(KPROC-1.+PIO_FRAC)) !nb of points by task
00023 !
00024 IRESTE = KSIZE - (ISIZE * (KPROC-1)) ! nb of points for task 0
00025 !
00026 IF (IRESTE<=0 .AND. PIO_FRAC/=0.) THEN
00027   IRESTE = ISIZE - 1
00028   INRESTE = KPROC*ISIZE - KSIZE !nb of tasks containing ireste points
00029 ELSE
00030   INRESTE = 1
00031 ENDIF
00032 !
00033 KSIZE_TASK(:) = ISIZE
00034 DO J = KPIO,KPIO+INRESTE-1
00035   KSIZE_TASK(MOD(J,KPROC)) = IRESTE
00036 ENDDO
00037 !
00038 IF (KPROC>1 .AND. PIO_FRAC/=1.) THEN
00039   !
00040   IPROC = KPIO
00041   DO WHILE( KSIZE_TASK(KPIO) > NINT(PIO_FRAC*ISIZE) )
00042     KSIZE_TASK(KPIO) = KSIZE_TASK(KPIO)-1
00043     IPROC = IPROC+1
00044     IF (MOD(IPROC,KPROC)==KPIO) ISIZE = ISIZE+1
00045     KSIZE_TASK(MOD(IPROC,KPROC)) = KSIZE_TASK(MOD(IPROC,KPROC))+1
00046   END DO 
00047   !
00048   IPROC = KPIO
00049   DO WHILE( KSIZE_TASK(KPIO) < NINT(PIO_FRAC*ISIZE) )
00050     KSIZE_TASK(KPIO) = KSIZE_TASK(KPIO)+1
00051     IPROC = IPROC+1
00052     IF (MOD(IPROC,KPROC)==KPIO) ISIZE = ISIZE-1
00053     KSIZE_TASK(MOD(IPROC,KPROC)) = KSIZE_TASK(MOD(IPROC,KPROC))-1
00054   END DO       
00055   !
00056 ENDIF
00057 !
00058 !so:
00059 !(nproc-nreste)*isize + nreste*ireste = 
00060 !if nreste==1: 
00061 !(nproc-1)*isize + ireste = 
00062 !(nproc-1)*isize + NDIM_FULL - (nproc-1)*isize = NDIM_FULL
00063 !if (ireste==isize-1):
00064 !nproc*isize - nreste*isize + nreste*isize - nerste = 
00065 !nproc*isize - nreste = NDIM_FULL
00066 !
00067 IF (LHOOK) CALL DR_HOOK('GET_SIZES_PARALLEL',1,ZHOOK_HANDLE)
00068 !
00069 END SUBROUTINE GET_SIZES_PARALLEL