| 查看: 225 | 回复: 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 |
» 猜你喜欢
售T0P一区SCI文章,我:8O5.51.O.54,科目齐全,可+急
已经有4人回复
大家好,校样时候的紧急求助,请各位帮帮忙了
已经有7人回复
售T0P一区SCI文章,我:8O5.51.O.54,科目齐全,可+急
已经有3人回复
昨日死,今日生
已经有7人回复
售T0P一区SCI文章,我:8O5.51.O.54,科目齐全,可+急
已经有7人回复
有没有同学在用一款线上科研辅助平台?
已经有3人回复
27年博士招生信息
已经有13人回复
植酸TLC薄层色谱爬板
已经有6人回复
单宁酸
已经有3人回复
求助难溶化合物在DMSO+三氟乙酸中的氢谱分析
已经有7人回复











回复此楼