Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: [OMPI users] parallel molecular Dynamic simulations: All to All Comunication
From: Chembeti, Ramesh (S&T-Student) (rc2nf_at_[hidden])
Date: 2008-03-18 17:52:55


  
     Dear All,

         I was parallelising the serial molecular dynamic simulation code as given below:
         I have only two processors. My system is a duacore system.

c------------------------------------------------------------------

           SERIAL CODE
c...................................................................

       DO m=1,nmol !! nmol is total number of molecules

          DO i=1,2

            ax(i,m)=0.0d0 !acceleration

            ay(i,m)=0.0d0 !acceleration

            az(i,m)=0.0d0 !acceleration

          ENDDO

          DO j=1,nmol

            Ngmol(j,m)=0

          ENDDO

       ENDDO

c---------------------------------------------
c force calculations
c---------------------------------------------
       DO m=1,nmol-1

          DO i=1,2

            natom = natom +1

            ibeg = inbl(natom)

            iend = inbl(natom+1)-1

            DO ilist=ibeg,iend !! no. of neighbors

              j=inblst1(ilist) !! neighbor molecular label

              k=inblst2(ilist) !! neighbor atomic label
c j,k are molecular and atomic label of neighbour list of each molecule
c on each processor.

C ____________________

C

C Interatomic distance

C ____________________

              xij = x1(i,m) - x1(k,j)

              yij = y1(i,m) - y1(k,j)

              zij = z1(i,m) - z1(k,j)

C __________________________________

C

C Apply periodic boundary conditions

C __________________________________

              dpbcx = - boxx*dnint(xij/boxx)

              dpbcy = - boxy*dnint(yij/boxy)

              dpbcz = - boxz*dnint(zij/boxz)

              xij = xij + dpbcx

              yij = yij + dpbcy

              zij = zij + dpbcz

              rij2 = xij*xij + yij*yij + zij*zij

C ________________

C

C Calculate forces

C ________________

              

              IF (rij2.le.rcutsq) then

                rij = dsqrt(rij2)

                r_2 = sig1sq/rij2

                r_6 = r_2*r_2*r_2

                r_12 = r_6*r_6

                pot_lj = pot_lj+((r_12-r_6) + rij*vfc-vc) !! need 4*eps1

                fij = 24.0d0*eps1*((2*r_12-r_6)/rij2 - fc/rij)

                fxlj = fij*xij

                fylj = fij*yij

                fzlj = fij*zij

                
                ax(i,m) = ax(i,m) + fxlj

                ay(i,m) = ay(i,m) + fylj

                az(i,m) = az(i,m) + fzlj
                ax(k,j) = ax(k,j) - fxlj

                ay(k,j) = ay(k,j) - fylj

                az(k,j) = az(k,j) - fzlj

                pconf = pconf+(xij*fxlj + yij*fylj + zij*fzlj)

          

                IF (ngmol(j,m).eq.0) then

                  xmolij = xmol(m) - xmol(j) + dpbcx

                  ymolij = ymol(m) - ymol(j) + dpbcy

                  zmolij = zmol(m) - zmol(j) + dpbcz

                  rmolij = dsqrt(xmolij*xmolij+ymolij*ymolij

     & +zmolij*zmolij)

                  nr = dnint(rmolij/dgr)

                  ng12(nr) = ng12(nr)+2
                  ngmol(j,m) = 1

                ENDIF

              ENDIF

            ENDDO

          ENDDO

       ENDDO
       DO m=1,nmol

            DO i=1,2

            write(*,100)ax(i,m),ay(i,m),az(i,m)

            ENDDO

       ENDDO

and below is the parallelised part

c------------------------------------------------------------------------
c PARALLEL CODE:
c--------------------------------------------------------------------------
       DO m=1,nmol

          DO i=1,2

            ax(i,m)=0.0d0

            ay(i,m)=0.0d0

            az(i,m)=0.0d0

          ENDDO

          DO j=1,nmol

            ngmol(j,m)=0

          ENDDO

        ENDDO
       CALL para_range(1, nmol, nprocs, myrank, nmolsta, nmolend)
       DO m=nmolsta,nmolend-1 !!nmol is diveded into two parts
                               !!and nmolsta and nmolend are starting and ending
                               !!index for each processor

          DO i=1,2

            

            ibeg = inbl(natom)

            iend = inbl(natom+1)-1
            

             DO ilist=ibeg,iend !! no. of neighbors

               j=inblst1(ilist) !! neighbor molecular label

               k=inblst2(ilist) !! neighbor atomic label

c ____________________

C

C Interatomic distance

C ____________________

              xij = x1(i,m) - x1(k,j)

              yij = y1(i,m) - y1(k,j)

              zij = z1(i,m) - z1(k,j)

              dpbcx = - boxx*dnint(xij/boxx)

              dpbcy = - boxy*dnint(yij/boxy)

              dpbcz = - boxz*dnint(zij/boxz)

              xij = xij + dpbcx

              yij = yij + dpbcy

              zij = zij + dpbcz

              rij2 = xij*xij + yij*yij + zij*zij

              IF (rij2.le.rcutsq) then

                rij = dsqrt(rij2)

                r_2 = sig1sq/rij2

                r_6 = r_2*r_2*r_2

                r_12 = r_6*r_6

                pot_lj = pot_lj+((r_12-r_6) + rij*vfc-vc) !! need 4*eps1

                fij = 24.0d0*eps1*((2*r_12-r_6)/rij2 - fc/rij)

                fxlj = fij*xij

                fylj = fij*yij

                fzlj = fij*zij

                ax(i,m) = ax(i,m) + fxlj

                ay(i,m) = ay(i,m) + fylj

                az(i,m) = az(i,m) + fzlj
                ax(k,j) = ax(k,j) - fxlj

                ay(k,j) = ay(k,j) - fylj

                az(k,j) = az(k,j) - fzlj

                pconf = pconf+(xij*fxlj + yij*fylj + zij*fzlj)

                IF (ngmol(j,m).eq.0) then

                  xmolij = xmol(m) - xmol(j) + dpbcx

                  ymolij = ymol(m) - ymol(j) + dpbcy

                  zmolij = zmol(m) - zmol(j) + dpbcz

                  rmolij = dsqrt(xmolij*xmolij+ymolij*ymolij

     & +zmolij*zmolij)

                  nr = dnint(rmolij/dgr)

                  ng12(nr) = ng12(nr)+2
                  ngmol(j,m) = 1

                ENDIF

              ENDIF

            ENDDO
               natom = natom +1

          ENDDO

        

        ENDDO

        if(myrank.ne.(nprocs-1))then !! this is for nmolend molecule on each processor
          
          DO i=1,2
             

            m=nmolend
            natom = (2*nmolend)-1

            ibeg = inbl(natom)

            iend = inbl(natom+1)-1
            

             DO ilist=ibeg,iend !! no. of neighbors

               j=inblst1(ilist) !! neighbor molecular label

               k=inblst2(ilist) !! neighbor atomic label

              xij = x1(i,m) - x1(k,j)

              yij = y1(i,m) - y1(k,j)

              zij = z1(i,m) - z1(k,j)

              dpbcx = - boxx*dnint(xij/boxx)

              dpbcy = - boxy*dnint(yij/boxy)

              dpbcz = - boxz*dnint(zij/boxz)

              xij = xij + dpbcx

              yij = yij + dpbcy

              zij = zij + dpbcz

              rij2 = xij*xij + yij*yij + zij*zij

              IF (rij2.le.rcutsq) then

                rij = dsqrt(rij2)

                r_2 = sig1sq/rij2

                r_6 = r_2*r_2*r_2

                r_12 = r_6*r_6

                pot_lj = pot_lj+((r_12-r_6) + rij*vfc-vc) !! need 4*eps1

                fij = 24.0d0*eps1*((2*r_12-r_6)/rij2 - fc/rij)

                fxlj = fij*xij

                fylj = fij*yij

                fzlj = fij*zij

                ax(i,m) = ax(i,m) + fxlj

                ay(i,m) = ay(i,m) + fylj

                az(i,m) = az(i,m) + fzlj

                ax(k,j) = ax(k,j) - fxlj

                ay(k,j) = ay(k,j) - fylj

                az(k,j) = az(k,j) - fzlj

                pconf = pconf+(xij*fxlj + yij*fylj + zij*fzlj)!!............doubt

                IF (ngmol(j,m).eq.0) then

                  xmolij = xmol(m) - xmol(j) + dpbcx

                  ymolij = ymol(m) - ymol(j) + dpbcy

                  zmolij = zmol(m) - zmol(j) + dpbcz

                  rmolij = dsqrt(xmolij*xmolij+ymolij*ymolij

     & +zmolij*zmolij)

                  nr = dnint(rmolij/dgr)

                  ng12(nr) = ng12(nr)+2

                  ngmol(j,m) = 1

                ENDIF

              ENDIF

            ENDDO
               natom = natom +1

          ENDDO

        endif
c--------------------------------------------------------------------------------------------
 An all to all communication to gather all acceleration information on both the processors
c----------------------------------------------------------------------------------------------
      DO irank = 0, nprocs - 1
         CALL para_range(1, nmol, nprocs, irank, nmolsta, nmolend)
         jjasta(irank) = nmolsta
         jjalen(irank) = nua * (nmolend - nmolsta + 1)
      ENDDO
      CALL para_range(1, nmol, nprocs, myrank, nmolsta, nmolend)
      
      DO irank = 0, nprocs - 1
        CALL MPI_BCAST(ax(1,jjasta(irank)), jjalen(irank), MPI_REAL8,
     & irank, MPI_COMM_WORLD, ierr)
        CALL MPI_BCAST(ay(1,jjasta(irank)), jjalen(irank), MPI_REAL8,
     & irank, MPI_COMM_WORLD, ierr)
        CALL MPI_BCAST(az(1,jjasta(irank)), jjalen(irank), MPI_REAL8,
     & irank, MPI_COMM_WORLD, ierr)
        
      ENDDO
c----------------------------------------------------------------------------------
         If(myrank.eq.0)then !! or if(myrank.eq.1)
          DO m=1,nmol

            DO i=1,2

            write(*,100)ax(i,m),ay(i,m),az(i,m)

            ENDDO

          ENDDO
         endif

      SUBROUTINE para_range(n1, n2, nprocs, irank, ista, iend)
      iwork1 = (n2 - n1 + 1) / nprocs
      iwork2 = MOD(n2 - n1 + 1, nprocs)
      ista = irank * iwork1 + n1 + MIN(irank, iwork2)
      iend = ista + iwork1 - 1
      IF (iwork2 > irank) iend = iend + 1
      END

MY question is : when I printed the results,accelerations on processor 0( ie from 1 to nmol/2) are same as the results for serial code, where as they arent same for processor 1(nmol/2+1 to nmol). As I am learning MPI I couldnt find where it went wrong in doing an all to all operation for accleration part ax(i,m),ay(i,m),az(i,m).

Please give me some solution for this part.

thank you all,

regards,
Ramesh