| 查看: 242 | 回复: 0 | |||
| 当前主题已经存档。 | |||
[交流]
【求助】计算库伦相互作用能的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 |
» 猜你喜欢
国社科又开始会评了,不知道这次命运如何
已经有12人回复
麻烦专家们看看评委们的意见(F口面上)
已经有13人回复
售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急
已经有4人回复
售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急
已经有6人回复
为什么资助数各大高校都创新高,自己申请怎么就这么难
已经有15人回复
科研人应该花精力去思考如何解决问题,而不是去凝练问题
已经有14人回复
要骂人了,新模版改版就是要淡化问题凝练这种虚的东西,结果有个评委还在说凝练得不够
已经有17人回复
基金系统什么内容也没有
已经有10人回复
学科评审组评审是指会评吗?
已经有5人回复
面上函评意见出来了,像什么等级?
已经有17人回复










回复此楼
30