24小时热门版块排行榜    

查看: 261  |  回复: 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 的主题更新
普通表情 龙 兔 虎 猫 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[职场人生] 40+中年人失业后,还能找到好工作吗? +5 xqy2009 2026-10-13 5/250 2026-10-15 09:49 by 淘淘塑物性通
[硕博家园] 极限拉扯,如何抉择 +11 Isak0320 2026-10-12 15/750 2026-10-14 21:55 by 猫鱼不是鱼
[论文投稿] 二审4个多月了还是Awaiting Reviewer Scores 10+3 纳斯达克ML 2026-10-11 4/200 2026-10-14 17:30 by babero
[教师之家] 课题组会帮你通过考核么? +4 好运来~9527 2026-10-10 7/350 2026-10-13 08:41 by xli1984
[公派出国] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +5 qR2AdCWTVtkw 2026-10-09 9/450 2026-10-11 22:34 by XQNyDCa1Tk5n
[公派出国] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +5 qR2AdCWTVtkw 2026-10-09 10/500 2026-10-11 22:26 by XQNyDCa1Tk5n
[找工作] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +5 qR2AdCWTVtkw 2026-10-09 8/400 2026-10-11 22:26 by XQNyDCa1Tk5n
[考博] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +5 qR2AdCWTVtkw 2026-10-09 9/450 2026-10-11 22:15 by XQNyDCa1Tk5n
[考博] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 qR2AdCWTVtkw 2026-10-09 7/350 2026-10-11 22:11 by XQNyDCa1Tk5n
[教师之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 (EPI+-1)(金币-50) +5 qR2AdCWTVtkw 2026-10-09 10/500 2026-10-11 22:06 by XQNyDCa1Tk5n
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 (EPI+-1)(金币-50) +5 qR2AdCWTVtkw 2026-10-09 10/500 2026-10-11 14:25 by VOMexwnDzOFZ
[教师之家] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 (EPI+-1)(金币-50) +4 qR2AdCWTVtkw 2026-10-09 7/350 2026-10-11 14:05 by VOMexwnDzOFZ
[考研] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +5 qR2AdCWTVtkw 2026-10-09 8/400 2026-10-11 13:51 by VOMexwnDzOFZ
[硕博家园] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +5 qR2AdCWTVtkw 2026-10-09 8/400 2026-10-11 13:45 by VOMexwnDzOFZ
[找工作] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +3 qR2AdCWTVtkw 2026-10-09 7/350 2026-10-11 10:54 by VOMexwnDzOFZ
[找工作] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +4 qR2AdCWTVtkw 2026-10-09 7/350 2026-10-11 10:34 by VOMexwnDzOFZ
[考博] 招收博士生一名 +3 mandolin 2026-10-10 3/150 2026-10-11 10:21 by 不是山谷!
[公派出国] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +4 qR2AdCWTVtkw 2026-10-09 4/200 2026-10-11 03:14 by M0zrYVSAnxpE
[有机交流] 各位大佬,路线设计求助 +6 zapen 2026-10-08 8/400 2026-10-10 15:59 by zapen
[有机交流] 我应该选哪条合成路线让实验成功率高一些? +5 jing816y 2026-10-08 9/450 2026-10-10 09:05 by zapen
信息提示
请填处理意见