24小时热门版块排行榜    

CyRhmU.jpeg
查看: 169  |  回复: 0
当前主题已经存档。

阳光不锈7717

[交流] 【求助】计算库伦相互作用能的fortran程序并行化(1)

c  此程序是化学方面理论计算部分用于计算静电相互作用能(即库仑作用能)和力的一个被调用子程序,
   在计算能量e时为四个大的循环部分(这四部分可细分为9个小部分分别是循环的):
原子部分(myid==1)        原子-原子        Atom-atom
        原子-键        Atom-bond
        原子-孤对电子        Atom-lp
        原子-∏电子        Atom-pie
键部分(myid==2)        键-键        Bond-bond
        键-∏电子        Bond lp
孤对电子部分(myid==3)        孤对电子-孤对电子        Lp-lp
        孤对电子-∏电子        Lp-pie
∏电子部分(myid==4)        ∏电子-∏电子        Pie-pie

     现在我的想法就是把这四部分实现并行,请教大家。
(在我想分的进程处加了我的分配语句,已经注销了,请大家帮忙实现并行,有其他的办法更好)
   
      ###############################################################
c     ##                                                           ##
c     ##  subroutine echarge1a  --  charge derivs via double loop      
c     ##                                                           ##
c     ###############################################################
c
c
c     "echarge1a" calculates the charge-charge interaction energy
c     and first derivatives with respect to Cartesian coordinates
c     using a pairwise double loop
c
c
      subroutine echarge1a
      implicit none
c-----------------------------09.04.21 lc--------------------
      include 'mpi.i'
c-----------------------------09.04.21 lc--------------------
      include 'sizes.i'
      include 'atoms.i'
      include 'bound.i'
      include 'cell.i'
        include 'cutoff.i'
        include 'cutoffa.i'
      include 'charge.i'
      include 'chgpot.i'
      include 'couple.i'
      include 'deriv.i'
      include 'energi.i'
      include 'group.i'
      include 'inter.i'
      include 'molcul.i'
      include 'shunt.i'
      include 'units.i'
      include 'usage.i'
      include 'virial.i'
      integer i,j,k,iii,jjj
      integer ii,kk
      integer in,kn
      integer ic,kc
      real*8 e,de,dc
      real*8 f,fi,fik
      real*8 r,r2,fgrp
      real*8 xi,yi,zi
      real*8 xr,yr,zr
      real*8 xc,yc,zc
      real*8 xic,yic,zic
      real*8 dedx,dedy,dedz
      real*8 dedxc,dedyc,dedzc
      real*8 shift,taper,trans
      real*8 dtaper,dtrans
      real*8 rc,rc2,rc3,rc4
      real*8 rc5,rc6,rc7
      real*8 vxx,vyy,vzz
      real*8 vyx,vzx,vzy
      real*8 cscale(maxatm)
      logical proceed,iuse
      real*8 dipolex,dipoley,dipolez
        integer at,istep,t,pi,M1,M2,MM1,MM2
      real*8 xcl,ycl,zcl,xrl,yrl,zrl,r2l,kl,einterobj
        include 'atmtyp.i'
        include 'bath.i'
        include 'abeem.i'
c-----------------------------09.04.21 zj--------------------
        real*8 cputime11,cputime12,cputime21,cputime22
        real*8 cputime31,cputime32,cputime41,cputime42
c        real*8 cputime1,cputime2,cputime1,cputime2
c-----------------------------09.04.21 zj--------------------
c
c
c     zero out the charge interaction energy and derivatives
c   
c      open(11,file='each-ec.txt',status='unknown')
c      open(12,file='ec.txt',status='unknown')
c-----------------------------09.04.21 lc--------------------
      open(123,file='time.txt',status='unknown')
       call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
c-----------------------------09.04.21 lc--------------------

      nion=n
      natom=nion
        nmol1=nmol       
c*******trans the coordinates into simutanious ones
       do i=1,natom
         ca(i,1)=x(i)
         ca(i,2)=y(i)
         ca(i,3)=z(i)
      an(i)=atomic(i)
        molcule1(i)=molcule(i)
      am(i)=an(i)       
         nt12(i)=n12(i)
          do j=1,nt12(i)
         t12(j,i)=i12(j,i)
         enddo         
         enddo        
                         
      call peptidecouple
        do i=1,na
        pchg(i)=bcharge(i)
        molcule(I)=molcule1(i)
        x(I)=ca(i,1)
        Y(I)=ca(i,2)
        z(i)=ca(i,3)
C        write(*,*) pchg(i),NATOM,NLP,NATOMBOND
        enddo      
c         open(UNIT=8,file='dipole',status='unknown')
c      dipolex=0.0d0
c        dipoley=0.0d0
c        dipolez=0.0d0

c      do i=1,na       
c        if(molcule(I).eq.obj)then
c        dipolex=dipolex+ca(i,1)*pchg(i)
c        dipoley=dipoley+ca(i,2)*pchg(i)
c        dipolez=dipolez+ca(i,3)*pchg(i)
c        endif
c        enddo

c        dipole=DSQRT(dipolex**2+dipoley**2+dipolez**2)
c     &*2.541765/0.529      
c      write(8,*) 'dipole=  ',dipole  
c        write(*,*) dipole,'dipole'
             
c     zero out the charge interaction energy and derivatives
c
      ec = 0.0d0
        ec1=0.0d0       
        e=0.0d0
      do i = 1, n
         dec(1,i) = 0.0d0
         dec(2,i) = 0.0d0
         dec(3,i) = 0.0d0
      end do

      if (nion .eq. 0)  return
c
c     set conversion factor and switching function coefficients
c
      f = electric / dielec
        f=332.05382d0
        use_group=.false.
      call switch ('CHARGE')
        cut = chgcuta
        off =chgoffa
c
c     compute the charge interaction energy and first derivatives
c   
        do ii=1,na
          iion(ii)=ii
          jion(ii)=ii
          kion(ii)=ii
      enddo
c--------------------------09.04.21  ------------------------------
c      if(myid==1.or.myid==2.or.myid==3.or.myid==4.or.myid==5)then
c      write(123,*)"process",myid,"is alive"
c--------------------------09.04.21  ------------------------------
      do ii = 1, nion
                   c2scale= 0.0d0  
          c4scale= 0.57d0
            c3scale= 0.0d0         
         i = iion(ii)
         in = jion(ii)
         ic = kion(ii)
         xic = x(ic)
         yic = y(ic)
         zic = z(ic)
         xi = x(i) - xic
         yi = y(i) - yic
         zi = z(i) - zic
         fi = f * pchg(ii)
         iuse = (use(i) .or. use(ic))
             do j = 1, na
               if(ii.ne.j) cscale(j) = 0.57d0
             end do       
       DO J=1,NATOMLP(II)
         CSCALE(ATOMLP(J,II))=0.0D0
         ENDDO
         DO J=1,NATOMPIE(II)
         CSCALE(ATOMPIE(J,II))=0.0D0
         ENDDO          
         do j = 1, n12(ii)
            cscale(i12(j,ii)) = c2scale
        if(atomlp(1,i12(j,in)).ne.0) cscale(atomlp(1,i12(j,in)))=c2scale
      if(atomlp(2,i12(j,in)).ne.0) cscale(atomlp(2,i12(j,in)))=c2scale
        if(atompie(1,i12(j,in)).ne.0)then
        cscale(atompie(1,i12(j,in)))=c2scale
        endif
       if(atompie(2,i12(j,in)).ne.0) then
       cscale(atompie(2,i12(j,in)))=c2scale
       endif                                                                   
         end do
         do j = 1, natbond12(ii)
            cscale(atbond12(j,ii)) = c2scale
         end do                                                     
         do j = 1, n13(ii)
            cscale(i13(j,ii)) = c3scale
        if(atomlp(1,i13(j,in)).ne.0)then
         cscale(atomlp(1,i13(j,in)))=c3scale
        endiF
        if(atomlp(2,i13(j,in)).ne.0) cscale(atomlp(2,i13(j,in)))=c3scale
        if(atompie(1,i13(j,in)).ne.0) then
        cscale(atompie(1,i13(j,in)))=c3scale
        endif
        if(atompie(2,i13(j,in)).ne.0) then
        cscale(atompie(2,i13(j,in)))=c3scale
        endif
         end do         
         do j = 1, natbond13(ii)
            cscale(atbond13(j,ii)) = c2scale
         end do
           do j = 1, n14(ii)               
              cscale(i14(j,ii)) = c4scale           
            end do
         do j = 1, natbond14(ii)
            cscale(atbond14(j,ii)) = c3scale  
         end do
c
c     decide whether to compute the current interaction
c
c-----------------------------09.04.21--------------------
c       if(myid==1)then
c------------------------------------------------------------   
         do  kk = ii+1, nion       
            k = iion(kk)
            kn = jion(kk)
            kc = kion(kk)
            proceed = .true.
c            if (proceed)  proceed = (iuse .or. use(k) .or. use(kc))
c
c     compute the energy contribution for this interaction
c
            if (proceed) then
               xc = xic - x(kk)
               yc = yic - y(kk)
               zc = zic - z(kk)
                if (use_image)  call image (xc,yc,zc,0)
               rc2 = xc*xc + yc*yc + zc*zc               
                  xr = xc + xi - x(kk) + x(kk)
                  yr = yc + yi - y(kk) + y(kk)
                  zr = zc + zi - z(kk) + z(kk)
                  r2 = xr*xr + yr*yr + zr*zr
                    r = sqrt(r2)             
                  fik = fi * pchg(kk) * cscale(kk)
        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                  fik =  fik*lamp2
        endif
                          e = fik / r
c                  de = -fik / r2
                   dc = 0.0d0

         if (molcule(ii) .ne. molcule(kk)) then
                 einter = einter + e
         end if       
           if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &   (molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                 eintero= eintero + e
         end if
           if ((molcule(ii).eq.obj.and.molcule(kk).eq.obj))then
                 eintrao= eintrao + e
         end if
           if(abs(e).gt.800)then
           write(*,*) 'echarge',ii,kk,molcule(II),molcule(kk)
         write(*,*) pchg(ii),pchg(kk),r
           endif               
c           write(11,*) 'atom-atom',e                                     
                ec1 = ec1 + e
            end if

        enddo


c-------------------------------------------------
         do kk = natom+1, natombond
            fi = f * pchg(ii)
            k = iion(kk)
            kn = jion(kk)
            kc = kion(kk)
            proceed = .true.   
            if (proceed) then
               xc = xic - x(kk)
               yc = yic - y(kk)
               zc = zic - z(kk)
                if (use_image)  call image (xc,yc,zc,0)
               rc2 = xc*xc + yc*yc + zc*zc               
                  xr = xc + xi - x(kk) + x(kk)
                  yr = yc + yi - y(kk) + y(kk)
                  zr = zc + zi - z(kk) + z(kk)
                  r2 = xr*xr + yr*yr + zr*zr
                  r = sqrt(r2)
                  fik = fi * pchg(kk) * cscale(kk)
        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                  fik =  fik*lamp2
        endif       
                    e = fik / r
         if (molcule(ii) .ne. molcule(bdatom12(1,kk))) then
                 einter = einter + e
         end if
        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                 eintero = eintero + e
         end if       
        if ((molcule(ii).eq.obj.and.molcule(kk).eq.obj))then
                 eintrao = eintrao + e
         end if       
           if(abs(e).gt.800)then
           write(*,*) ii,kk,molcule(II),molcule(kk)
           endif       
c           write(11,*) 'atom-bond',e                                                        
                ec1=ec1+e     
            end if
         end do


c-----------------------------------------------
        do kk = natombond+1, NATOMBOND+NLP
            fi = f * pchg(ii)
            k = iion(kk)
            kn = jion(kk)
            kc = kion(kk)
            proceed = .true.
               xc = xic - x(kk)
               yc = yic - y(kk)
               zc = zic - z(kk)
                if (use_image)  call image (xc,yc,zc,0)
               rc2 = xc*xc + yc*yc + zc*zc              
                  xr = xc + xi - x(kk) + x(kk)
                  yr = yc + yi - y(kk) + y(kk)
                  zr = zc + zi - z(kk) + z(kk)
                  r2 = xr*xr + yr*yr + zr*zr
                  r = sqrt(r2)
        if(cscale(kk).ne.0.0d0)then
        IF(AM1(II).GT.AM1(KK))THEN
        M1=AM1(II)
        M2=AM1(KK)
        ELSE
        M1=AM1(kk)
        M2=AM1(II)
        ENDIF
        IF(LPATOM(II).EQ.0.AND.LPATOM(KK).NE.0)THEN
        MM1=KK
        MM2=II
        ENDIF
        IF(LPATOM(II).NE.0.AND.LPATOM(KK).EQ.0)THEN
        MM1=II
        MM2=KK
        ENDIF

      if((M1.eq.182.and.M2.EQ.11).AND.distance(kk,ii).lt.2.0d0)then
        if(lamp2.ne.0.0d0)then   
           cscale(kk)=0.6060d0-0.0496/(1.0d0+exp((r-1.3978)/0.1034))
        endif
      endif
      if((M1.eq.881.and.M2.EQ.182).AND.distance(KK,iI).lt.2.0d0)then
        if(lamp2.ne.0.0d0)then   
           cscale(KK)=0.6300d0-0.1297/(1.0d0+exp((r-1.8707)/0.2842))
        endif
      endif       
      if((M1.eq.883.and.M2.EQ.11).AND.distance(KK,iI).lt.2.0d0)then
        if(lamp2.ne.0.0d0)then
           cscale(KK)=0.63d0-0.0684/(1.0d0+exp((r-1.0099)/0.3376))
        endif
      endif       
      if((M1.eq.883.and.M2.EQ.881).AND.distance(kk,ii).lt.2.3d0)then   
        if(lamp2.ne.0.0d0)then
           cscale(kk)=0.621d0-0.0813/(1.0d0+exp((r-1.151)/0.0697))
      endif
        endif


        endif
                  fik = fi * pchg(kk) * cscale(kk)
c        WRITE(*,*) AM(II),AM(KK),CSCALE(KK)

        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                  fik =  fik*lamp2
        endif
                          e = fik / r
         if (molcule(ii) .ne. molcule(lpatom(kk))) then
                 einter = einter + e
         end if
        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                 eintero = eintero + e
         end if       
        if ((molcule(ii).eq.obj.and.molcule(kk).eq.obj))then
                 eintrao = eintrao + e
         end if       
           if(abs(e).gt.800)then
           write(*,*) ii,kk,molcule(II),molcule(kk)
           endif                            
c                      write(11,*) 'atom-lp',e                                                                          
                ec1=ec1+e   
         end do

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

        do kk = naTOMBOND+NLP+1,NA
            fi = f * pchg(ii)
            k = iion(kk)
            kn = jion(kk)
            kc = kion(kk)
            proceed = .true.     
               xc = xic - x(kk)
               yc = yic - y(kk)
               zc = zic - z(kk)
                if (use_image)  call image (xc,yc,zc,0)
               rc2 = xc*xc + yc*yc + zc*zc              
                  xr = xc + xi - x(kk) + x(kk)
                  yr = yc + yi - y(kk) + y(kk)
                  zr = zc + zi - z(kk) + z(kk)
                  r2 = xr*xr + yr*yr + zr*zr
                  r = sqrt(r2)

                  fik = fi * pchg(kk) * cscale(kk)
c        WRITE(*,*) AM(II),AM(KK),CSCALE(KK)

        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                  fik =  fik*lamp2
        endif
                          e = fik / r
         if (molcule(ii) .ne. molcule(PIEatom(kk))) then
                 einter = einter + e
         end if
        if ((molcule(ii).eq.obj.and.molcule(kk).ne.obj).or.
     &(molcule(ii).ne.obj.and.molcule(kk).eq.obj))then
                 eintero = eintero + e
         end if       
        if ((molcule(ii).eq.obj.and.molcule(kk).eq.obj))then
                 eintrao = eintrao + e
         end if       
           if(abs(e).gt.800)then
           write(*,*) ii,kk,molcule(II),molcule(kk)
           endif                 
c                        write(11,*) 'atom-pie',e                                                                                   
                ec1=ec1+e   
         end do

        end do
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 阳光不锈7717 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见