SURFEX v7.3
General documentation of Surfex
|
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