+++ /dev/null
- module work_part
-!------------------------------------------------------------------------------
- use io_units
- use MPI_data
- use wham_data
- implicit none
-#ifdef MPI
-!------------------------------------------------------------------------------
-!
-!
-!-----------------------------------------------------------------------------
- contains
-!-----------------------------------------------------------------------------
-#ifdef CLUSTER
- subroutine work_partition(lprint,ncon_work)
-#else
- subroutine work_partition(islice,lprint)
-#endif
-! Split the conformations between processors
-! implicit none
-! include "DIMENSIONS"
-! include "DIMENSIONS.ZSCOPT"
-! include "DIMENSIONS.FREE"
- include "mpif.h"
-! include "COMMON.IOUNITS"
-! include "COMMON.MPI"
-! include "COMMON.PROT"
- integer :: islice,ncon_work
- integer :: n,chunk,i,j,ii,remainder
-!el integer :: kolor
- integer :: key,ierror,errcode
- logical :: lprint
-!
-! Divide conformations between processors; the first and
-! the last conformation to handle by ith processor is stored in
-! indstart(i) and indend(i), respectively.
-!
-!el MPI_data
- if (.not. allocated(indstart)) allocate(indstart(0:nprocs))
- if (.not. allocated(indend)) allocate(indend(0:nprocs))
- if (.not. allocated(idispl)) allocate(idispl(0:nprocs))
- if (.not. allocated(scount)) allocate(scount(0:nprocs))
-! First try to assign equal number of conformations to each processor.
-!
-#ifdef CLUSTER
- n=ncon_work
- write (iout,*) "n=",n," nprocs=",nprocs
- nprocs1=nprocs
-#else
- n=ntot(islice)
- write (iout,*) "n=",n
-#endif
- indstart(0)=1
- chunk = N/nprocs1
- scount(0) = chunk
-write(iout,*)"chunk",chunk,scount(0)
-flush(iout)
-! print *,"i",0," indstart",indstart(0)," scount",&
-! scount(0)
- do i=1,nprocs1-1
- indstart(i)=chunk+indstart(i-1)
- scount(i)=scount(i-1)
-! print *,"i",i," indstart",indstart(i)," scount",
-! & scount(i)
- enddo
-!
-! Determine how many conformations remained yet unassigned.
-!
- remainder=N-(indstart(nprocs1-1) &
- +scount(nprocs1-1)-1)
-! print *,"remainder",remainder
-!
-! Assign the remainder conformations to consecutive processors, starting
-! from the lowest rank; this continues until the list is exhausted.
-!
- if (remainder .gt. 0) then
- do i=1,remainder
- scount(i-1) = scount(i-1) + 1
- indstart(i) = indstart(i) + i
- enddo
- do i=remainder+1,nprocs1-1
- indstart(i) = indstart(i) + remainder
- enddo
- endif
-
- indstart(nprocs1)=N+1
- scount(nprocs1)=0
-
- do i=0,NProcs1
- indend(i)=indstart(i)+scount(i)-1
- idispl(i)=indstart(i)-1
- enddo
-
- N=0
- do i=0,Nprocs1-1
- N=N+indend(i)-indstart(i)+1
- enddo
-
-! print *,"N",n," NTOT",ntot(islice)
-#ifdef CLUSTER
- if (N.ne.ncon_work) then
- write (iout,*) "!!! Checksum error on processor",me,&
- n,ncon_work
-#else
- if (N.ne.ntot(islice)) then
- write (iout,*) "!!! Checksum error on processor",me,&
- " slice",islice
-#endif
- call flush(iout)
- call MPI_Abort( MPI_COMM_WORLD, Ierror, Errcode )
- endif
-
- if (lprint) then
- write (iout,*) "Partition of work between processors"
- do i=0,nprocs1-1
- write (iout,'(a,i5,a,i7,a,i7,a,i7)') &
- "Processor",i," indstart",indstart(i),&
- " indend",indend(i)," count",scount(i)
- enddo
- endif
- return
- end subroutine work_partition
-#endif
-!----------------------------------------------------------------------------
- end module work_part
-!-----------------------------------------------------------------------------
-!-----------------------------------------------------------------------------