24小时热门版块排行榜    

查看: 242  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 国社科又开始会评了,不知道这次命运如何 +8 雨打竹帘 2026-08-30 12/600 2026-09-03 06:24 by sincosx
[基金申请] 麻烦专家们看看评委们的意见(F口面上) +8 gdd2018 2026-08-28 13/650 2026-09-03 06:22 by 羽毛枫f
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 ero8OE6tv9cu 2026-09-02 4/200 2026-09-03 03:14 by rM1TE0WVDIIY
[博后之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 ero8OE6tv9cu 2026-09-02 6/300 2026-09-02 23:59 by rM1TE0WVDIIY
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +14 Kittylucky 2026-08-27 15/750 2026-09-02 19:35 by liumei0601
[基金申请] 科研人应该花精力去思考如何解决问题,而不是去凝练问题 +7 瞬息宇宙 2026-09-01 14/700 2026-09-02 17:33 by ma0526
[基金申请] 要骂人了,新模版改版就是要淡化问题凝练这种虚的东西,结果有个评委还在说凝练得不够 +9 瞬息宇宙 2026-08-31 17/850 2026-09-02 14:04 by anjeeshine
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 10/500 2026-09-02 11:35 by 大不刘6
[基金申请] 学科评审组评审是指会评吗? +5 瞬息宇宙 2026-08-31 5/250 2026-09-02 10:13 by 雨冰共舞
[基金申请] 面上函评意见出来了,像什么等级? 20+4 Tsingking1 2026-08-27 17/850 2026-09-01 19:51 by 超级无敌华子
[论文投稿] 小白求助 投论文要求的highlights应该如何写 5+3 l1963982152 2026-08-29 4/200 2026-09-01 09:04 by 北京莱茵编辑
[基金申请] 面上意见出来了 +12 黄鸟于飞Chao 2026-08-29 23/1150 2026-08-31 18:57 by 黄鸟于飞Chao
[基金申请] 能否申诉? +7 echo8914667 2026-08-30 8/400 2026-08-31 17:00 by yihongxu
[基金申请] 中青基了要发朋友圈吗? +7 349506619 2026-08-28 7/350 2026-08-31 13:39 by 冼亮淀粉酶
[基金申请] 29号明天会评吗 +4 笨笨唐 2026-08-28 4/200 2026-08-31 09:30 by huixian257
[基金申请] 有没有仍没收到信息的 +7 德尚中行 2026-08-27 8/400 2026-08-30 20:52 by purplejack
[考博] 找导师 +6 yuanjiabao 2026-08-29 7/350 2026-08-30 14:40 by 生科新手
[基金申请] 我就是申请一个面上项目而已,这评审意见是按照杰青的条件评的吧? +6 gouxfjh 2026-08-28 11/550 2026-08-30 07:57 by gouxfjh
[基金申请] 国自然评审意见 +13 wangmingqi 2026-08-28 19/950 2026-08-29 10:22 by Poppy1104
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
信息提示
请填处理意见