zmiany w MD
[unres4.git] / source / unres / REMD.f90
index e1cf84c..fe970be 100644 (file)
@@ -25,7 +25,7 @@
       use comm_cipiszcze
       use energy_data
       use geometry_data, only: nres
-      use control_data 
+      use control_data    !el, only: mucadyn,lmuca
 #ifdef MPI
        include 'mpif.h'
       real(kind=8) :: time00
 !       include 'COMMON.CONTROL'
 !       include 'COMMON.MUCA'
 !      include 'COMMON.TIME1'
-       
-       integer :: i,j,ind,itime
+       integer ::i,j,ind,itime,k
        real(kind=8) :: zapas(6*nres) !,muca_factor     !maxres6=6*maxres
+       real(kind=8) :: rs(dimen),xsolv(dimen)
+#ifdef CHECK5DSOL
+       real(kind=8) :: rscheck(dimen),rsold(dimen)
+#endif
        logical :: lprn = .false.
 !el       common /cipiszcze/ itime
        itime = itt_comm
 #ifdef TIMING
        time00=MPI_Wtime()
 #endif
+#ifdef FIVEDIAG
+      if (lprn) then
+        write (iout,*) "Potential forces backbone"
+        do i=nnt,nct
+          write (iout,'(i5,3e15.5,5x,3e15.5)')i,(-gcart(j,i),j=1,3)
+        enddo
+        write (iout,*) "Potential forces sidechain"
+        do i=nnt,nct
+          if (itype(i).ne.10 .and. itype(i).ne.ntyp1) &
+            write (iout,'(i5,3e15.5,5x,3e15.5)') i,(-gxcart(j,i),j=1,3)
+        enddo
+      endif
+       do j=1,3
+         ind=1
+         do i=nnt,nct
+           if (itype(i).eq.10 .or. itype(i).eq.ntyp1)then
+           rs(ind)=-gcart(j,i)-gxcart(j,i)
+            ind=ind+1
+          else
+           rs(ind)=-gcart(j,i)
+           rs(ind+1)=-gxcart(j,i)
+           ind=ind+2
+          end if 
+         enddo
+#ifdef CHECK5DSOL
+         rsold=rs 
+#endif
+         if (lprn) then
+           write(iout,*) "RHS of the 5-diag equations system"
+           do i=1,dimen
+             write(iout,*) i,rs(i)
+           enddo
+         endif
+        
+         call FDISYS (dimen,DM,DU1,DU2,rs,xsolv)
+         if (lprn) then
+          write (iout,*) "Solution of the 5-diagonal equations system"
+           do i=1,dimen
+             write (iout,'(i5,f10.5)') i,xsolv(i)
+          enddo
+         endif
+#ifdef CHECK5DSOL
+! Check the solution
+         rscheck(1)=DMorig(1)*xsolv(1)+DU1orig(1)*xsolv(2)+&
+           DU2orig(1)*xsolv(3) 
+         rscheck(2)=DU1orig(1)*xsolv(1)+DMorig(2)*xsolv(2)+&
+           DU1orig(2)*xsolv(3)+DU2orig(2)*xsolv(4)
+         
+         do i=3,dimen-2
+          rscheck(i)=DU2orig(i-2)*xsolv(i-2)+DU1orig(i-1)*&
+            xsolv(i-1)+DMorig(i)*xsolv(i)+DU1orig(i)*&
+             xsolv(i+1)+DU2orig(i)*xsolv(i+2)
+         enddo
+       rscheck(dimen-1)=DU2orig(dimen-3)*xsolv(dimen-3)+&
+         DU1orig(dimen-2)*xsolv(dimen-2)+DMorig(dimen-1)*&
+          xsolv(dimen-1)+DU1orig(dimen-1)*&
+           xsolv(dimen)
+       rscheck(dimen)=DU2orig(dimen-2)*xsolv(dimen-2)+DU1orig(dimen-1)*&
+          xsolv(dimen-1)+DMorig(dimen)*xsolv(dimen)
+         
+         do i=1,dimen
+            write(iout,*) "i",i,"rsold",rsold(i),"rscheck",rscheck(i),&
+            "ratio",rscheck(i)/rsold(i)
+           enddo
+! end check
+#endif
+        ind=1
+         do i=nnt,nct
+         if (itype(i).eq.10 .or. itype(i).eq.ntyp1)then 
+          d_a(j,i)=xsolv(ind)
+          ind=ind+1
+         else
+          d_a(j,i)=xsolv(ind)
+          d_a(j,i+nres)=xsolv(ind+1)
+         ind=ind+2
+         end if 
+        enddo
+       enddo
+       if (lprn) then
+       do i=nnt,nct
+        write (iout,'(i3,3f10.5)') i,(d_a(j,i),j=1,3)
+       enddo
+       do i=nnt,nct
+        write (iout,'(i3,3f10.5)') i,(d_a(j,i+nres),j=1,3)
+       enddo
+       endif
+       do j=1,3
+         d_a(j,0)=d_a(j,nnt)
+       enddo
+       do i=nnt,nct
+         if (itype(i).eq.10 .or. itype(i).eq.ntyp1) then
+           do j=1,3
+            d_a(j,i)=d_a(j,i+1)-d_a(j,i)
+           enddo
+        else 
+           do j=1,3
+            d_a(j,i+nres)=d_a(j,i+nres)-d_a(j,i)
+            d_a(j,i)=d_a(j,i+1)-d_a(j,i)
+           enddo
+       
+
+        end if
+       enddo
+
+      if (lprn) then
+        write(iout,*) 'acceleration 3D FIVEDIAG'
+        write (iout,'(i3,3f10.5,3x,3f10.5)') 0,(d_a(j,0),j=1,3)
+        do i=nnt,nct-1
+         write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3)
+        enddo
+        do i=nnt,nct
+         write (iout,'(i3,3f10.5,3x,3f10.5)') &
+           i+nres,(d_a(j,i+nres),j=1,3)
+        enddo
+      endif
+#else
+! Old procedure
        do j=1,3
          zapas(j)=-gcart(j,0)
        enddo
       do i=nnt,nct
         if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
           if (lprn) write (iout,'(i5,3e15.5,5x,3e15.5)') &
-             i,(-gcart(j,i),j=1,3)
+             i,(-gxcart(j,i),j=1,3)
           do j=1,3
             ind=ind+1
             zapas(ind)=-gxcart(j,i)
           enddo
         endif
       enddo
-      
+
+#endif      
       if(lmuca) then
        imtime=imtime+1
        if(mucadyn.gt.0) call muca_update(potE)       
       include 'mpif.h'
       integer :: ierror
       real(kind=8) :: time00
+      real(kind=8) ,allocatable, dimension(:)  :: DDM,DDU1,DDU2
 #endif
 !      include 'COMMON.SETUP'
 !      include 'COMMON.VAR'
 !      include 'COMMON.TIME1'
       logical :: lprn = .false.
       logical :: osob
+#ifndef FIVEDIAG
+      real(kind=8),dimension(2*nres,2*nres) :: Bmat,matmult
+#endif
       real(kind=8) :: dtdi
       real(kind=8),dimension(2*nres) :: massvec,sqreig !(maxres2) maxres2=2*maxres
+      real(kind=8) :: relfeh,eps1,eps2
 !el      real(kind=8),dimension(:),allocatable :: Ghalf
 !el      real(kind=8),dimension(2*nres*(2*nres+1)/2) :: Ghalf  !(mmaxres2) (mmaxres2=(maxres2*(maxres2+1)/2))
 !el      real(kind=8),dimension(2*nres,2*nres) :: Gcopy        !(maxres2,maxres2)
       integer,dimension(6*nres) :: iwork       !(maxres6) maxres6=6*maxres
 !el      common /przechowalnia/ Gcopy,Ghalf
       real(kind=8) :: coeff
-      integer :: i,j,ind,ind1,k,ii,jj,m,m1,ii1,iti,nres2,ierr
+      integer :: i,j,ind,ind1,k,l,ii,jj,m,m1,ii1,iti,nres2,ierr,nind,mark
+      real(kind=8) :: ip4
+      integer :: iz
+      relfeh=1.0d-14
       nres2=2*nres
 
+      write (iout,*) "before FIVEDIAG"
+#ifndef FIVEDIAG
+      write (iout,*) "ALLOCATE"
       if(.not.allocated(Gcopy)) allocate(Gcopy(nres2,nres2)) !(maxres2,maxres2)
       if(.not.allocated(Ghalf)) allocate(Ghalf(nres2*(nres2+1)/2)) !mmaxres2=(maxres2*(maxres+1)/2)
+#endif
 !
 ! Set up the matrix of the (dC,dX)-->(C,X) transformation (A), the
 ! inertia matrix (Gmat) and the inverse of the inertia matrix (Ginv)
       dimen=(nct-nnt+1)+nside
       dimen1=(nct-nnt)+(nct-nnt+1)
       dimen3=dimen*3
+      write (iout,*) "nnt",nnt," nct",nct," nside",nside
+#ifdef FIVEDIAG
+       ip4=ip/4
+       DM(1)=mp/4+ip4
+       if (iabs(itype(nnt)).eq.10) then
+         DM(1)=DM(1)+msc(10)
+         ind=2
+         nind=1
+       else
+         DM(1)=DM(1)+isc(iabs(itype(nnt)))
+         DM(2)=msc(iabs(itype(nnt)))+isc(iabs(itype(nnt)))
+         ind=3
+         nind=2
+       endif     
+       do i=nnt+1,nct-1
+!         if (iabs(itype(i)).eq.ntyp1) cycle
+         DM(ind)=2*ip4+mp/2
+         if (iabs(itype(i)).eq.10 .or. iabs(itype(i)).eq.ntyp1) then
+           if (iabs(itype(i)).eq.10) DM(ind)=DM(ind)+msc(10)
+           ind=ind+1
+         else
+           DM(ind)=DM(ind)+isc(iabs(itype(i)))
+           DM(ind+1)=msc(iabs(itype(i)))+isc(iabs(itype(i)))
+           ind=ind+2
+         endif 
+       enddo
+       if (nct.gt.nnt) then
+       DM(ind)=ip4+mp/4
+       if (iabs(itype(nct)).eq.10) then
+         DM(ind)=DM(ind)+msc(10)
+         nind=ind
+       else
+         DM(ind)=DM(ind)+isc(iabs(itype(nct)))
+         DM(ind+1)=msc(iabs(itype(nct)))+isc(iabs(itype(nct)))
+         nind=ind+1
+       endif
+        endif
+       
+       
+        ind=1
+        do i=nnt,nct
+       if (iabs(itype(i)).ne.10 .and.iabs(itype((i))).ne.ntyp1) then
+          DU1(ind)=-isc(iabs(itype(i)))
+          DU1(ind+1)=0.0d0
+         ind=ind+2
+       else
+         DU1(ind)=mp/4-ip4
+         ind=ind+1
+       endif
+       enddo
+
+       ind=1
+       do i=nnt,nct-1
+!        if (iabs(itype(i)).eq.ntyp1) cycle
+        write (iout,*) "i",i," itype",itype(i),ntyp1
+       if (iabs(itype(i)).ne.10 .and. iabs(itype(i)).ne.ntyp1) then
+         DU2(ind)=mp/4-ip4
+         DU2(ind+1)=0.0d0
+         ind=ind+2
+       else
+         DU2(ind)=0.0d0
+        DU2(ind+1)=0.0d0
+        ind=ind+1
+       endif
+       enddo
+       DMorig=DM
+       DU1orig=DU1
+       DU2orig=DU2
+       write (iout,*) "nind",nind," dimen",dimen
+       if (nind.ne.dimen) then
+         write (iout,*) "ERROR, dimensions differ"
+#ifdef MPI
+         call MPI_Finalize(ierr)
+#endif
+         stop
+       endif
+     write (iout,*) "The upper part of the five-diagonal inertia matrix"
+       do i=1,dimen
+         if (i.lt.dimen-1) then
+           write (iout,'(i3,3f10.5)') i,DM(i),DU1(i),DU2(i)
+         else if (i.eq.dimen-1) then  
+           write (iout,'(i3,3f10.5)') i,DM(i),DU1(i)
+         else
+           write (iout,'(i3,3f10.5)') i,DM(i)
+         endif 
+       enddo
+
+        call FDISYP (dimen, DM, DU1, DU2, MARK)
+
+        if (mark.eq.-1) then
+     write (iout,*) "ERROR: the inertia matrix is not positive definite"
+#ifdef MPI
+         call MPI_Finalize(ierr)
+#endif
+         stop
+        else if (mark.eq.0) then
+     write (iout,*) "ERROR: the inertia matrix is singular"
+#ifdef MPI
+         call MPI_Finalize(ierr)
+#endif
+        else if (mark.eq.1) then
+          write (iout,*) "The transformed inertia matrix"
+          do i=1,dimen
+            if (i.lt.dimen-1) then
+              write (iout,'(i3,3f10.5)') i,DM(i),DU1(i),DU2(i)
+            else if (i.eq.dimen-1) then  
+              write (iout,'(i3,3f10.5)') i,DM(i),DU1(i)
+            else
+              write (iout,'(i3,3f10.5)') i,DM(i)
+            endif 
+          enddo
+        endif
+! Diagonalization of the pentadiagonal matrix
+        allocate(DDU1(2*nres))
+        allocate(DDU2(2*nres))
+        allocate(DDM(2*nres))
+        do i=1,dimen-1
+          DDU1(i+1)=DU1orig(i)
+        enddo
+        do i=1,dimen-2
+          DDU2(i+2)=DU2orig(i)
+        enddo
+        DDM=DMorig
+        call quindibisect2(DDM,DDU1,DDU2,dimen,1,dimen,eps1,relfeh,eps2,iz,geigen)
+        if (lprn) then
+          write (iout,*) &
+           "Eigenvalues of the five-diagonal inertia matrix"
+          do i=1,dimen
+            write (iout,'(i5,f10.5)') i,geigen(i)
+          enddo
+        endif
+        deallocate(DDU1)
+        deallocate(DDU2)
+        deallocate(DDM)
+#else 
+! Old Gmatrix
 #ifdef MPI
       if (nfgtasks.gt.1) then
       time00=MPI_Wtime()
         write (iout,'(//a)') "Ginv"
         call matout(dimen,dimen,nres2,nres2,Ginv)
       endif
+
+      Bmat=0.0d0
+      Bmat(1,1)=1.0d0
+      j=2
+      do i=nnt,nct
+        if (itype(i).eq.10) then
+          Bmat(i-nnt+2,j-1)=-1
+          Bmat(i-nnt+2,j)=1
+          j=j+1
+        else
+          if (i.lt.nct) then
+            Bmat(i-nnt+2,j-1)=-1
+            Bmat(i-nnt+2,j+1)=1
+            Bmat(i-nnt+1+(nct-nnt)+1,j-1)=-1
+            Bmat(i-nnt+1+(nct-nnt)+1,j)=1
+            j=j+2
+          else
+            Bmat(i-nnt+1+(nct-nnt)+1,j-1)=-1
+            Bmat(i-nnt+1+(nct-nnt)+1,j)=1
+          endif
+        endif
+      enddo
+      write (iout,*) "j",j," dimen",dimen 
+      if (lprn) then
+        write (iout,'(//a)') "Bmat"
+        call matout(dimen,dimen,nres2,nres2,Bmat)
+      endif
+      Gcopy=0.0d0
+      do i=1,dimen
+        do j=1,dimen
+            do k=1,dimen
+               do l=1,dimen
+                 Gcopy(i,j)=Gcopy(i,j)+Bmat(k,i)*Gmat(k,l)*Bmat(l,j)
+               enddo
+            enddo
+        enddo
+      enddo
+      if (lprn) then
+        write (iout,'(//a)') "Gmat-transformed"
+        call matout(dimen,dimen,nres2,nres2,Gcopy)
+      endif
 #ifdef MPI
       if (nfgtasks.gt.1) then
         myginv_ng_count=nres2*my_ng_count
         enddo
       endif
       deallocate(Gcopy)
+#endif
       return
       end subroutine setup_MD_matrices
 !-----------------------------------------------------------------------------