24小时热门版块排行榜    

Znn3bq.jpeg
查看: 213  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 面上本子正文33页,违规吗?会被低分嘛? +8 1234567wang 2026-05-17 10/500 2026-05-18 18:52 by zzahkj
[基金申请] 今年审到国自然15份,谈谈感受 +16 国自然国社科中 2026-05-17 16/800 2026-05-18 14:58 by gy116024
[基金申请] 青C资助名额大幅增加! +12 西葫芦炒鸡蛋 2026-05-13 16/800 2026-05-18 10:02 by Equinoxhua
[文学芳草园] 半夜喝咖啡 +3 myrtle 2026-05-15 5/250 2026-05-18 01:03 by 小沈2018
[找工作] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 ky2p12rrjj 2026-05-15 4/200 2026-05-17 19:47 by Equinoxhua
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +6 l7k6xnh0yc 2026-05-14 7/350 2026-05-17 19:42 by Equinoxhua
[考研] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 xx7gd5zq4e 2026-05-15 6/300 2026-05-17 19:36 by Equinoxhua
[公派出国] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 v9tggjlwd0 2026-05-15 5/250 2026-05-17 18:39 by Equinoxhua
[考博] 26/27博士推荐 +3 1木头人13949 2026-05-13 3/150 2026-05-17 09:41 by YuY66
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 v9tggjlwd0 2026-05-15 4/200 2026-05-17 08:06 by 11n4dfd8yn
[考博] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 7hlccowb3h 2026-05-15 4/200 2026-05-17 07:46 by 11n4dfd8yn
[考博] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +6 l7k6xnh0yc 2026-05-14 6/300 2026-05-17 07:11 by 11n4dfd8yn
[考研] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 k37jurhrau 2026-05-16 3/150 2026-05-17 01:25 by ue3ir18jc3
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 ky2p12rrjj 2026-05-15 3/150 2026-05-17 00:45 by ue3ir18jc3
[高分子] 本人最近太闲了,谁有问题可以提,每天会统一回复 +9 一切都是空工 2026-05-12 20/1000 2026-05-16 19:52 by Equinoxhua
[有机交流] 求有机合成大神指点三硫酸乙烯酯(CAS:2793408-99-6)的合成路线 30+3 Leekmid 2026-05-13 10/500 2026-05-16 16:37 by czyzsu
[考研] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +4 l7k6xnh0yc 2026-05-14 6/300 2026-05-16 11:29 by h3oerqvkv9
[教师之家] 教学课件你会给同学吗 +8 硕士研究生吗 2026-05-13 8/400 2026-05-14 22:23 by 常规沥青
[考博] 26应届毕业生考博求助 +3 wo一定上岸 2026-05-13 3/150 2026-05-14 21:47 by 明海天涯
[论文投稿] 求助大佬sci投稿哪个好中 +3 江沅188 2026-05-12 4/200 2026-05-13 14:35 by 江沅188
信息提示
请填处理意见