Merge branch 'UCGM' of mmka.chem.univ.gda.pl:unres4 into UCGM
[unres4.git] / source / unres / MD.f90
index 848702b..e34b384 100644 (file)
       real(kind=8),dimension(:,:),allocatable :: ginvfric !(2*nres,2*nres) !maxres2=2*maxres
 !-----------------------------------------------------------------------------
 !      common /przechowalnia/ subroutine: setup_fricmat
-!el      real(kind=8),dimension(:,:),allocatable :: fcopy !(2*nres,2*nres)
+      real(kind=8),dimension(:,:),allocatable :: fcopy !(2*nres,2*nres)
 !-----------------------------------------------------------------------------
 !
 !
       real(kind=8),dimension(6*nres,2*nres) :: Bmat,GBmat,Tmat !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
       real(kind=8),dimension(2*nres,2*nres) :: Cmat_,Cinv      !(maxres2,maxres2) maxres2=2*maxres
       real(kind=8),dimension(6*nres,6*nres) :: Pmat    !(maxres6,maxres6) maxres6=6*maxres
+!      real(kind=8),dimension(:,:),allocatable :: Bmat,GBmat,Tmat      !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
+!      real(kind=8),dimension(:,:),allocatable :: Cmat_,Cinv   !(maxres2,maxres2) maxres2=2*maxres
+!      real(kind=8),dimension(:,:),allocatable :: Pmat !(maxres6,maxres6) maxres6=6*maxres
       real(kind=8),dimension(6*nres) :: Td     !(maxres6) maxres6=6*maxres
       real(kind=8),dimension(2*nres) :: ppvec  !(maxres2) maxres2=2*maxres
 !el      common /stochcalc/ stochforcvec
       logical :: osob
       nres2=2*nres
       nres6=6*nres
+!      if (.not.allocated(Bmat)) allocate(Bmat(nres6,nres2))
+!      if (.not.allocated(GBmat)) allocate (GBmat(nres6,nres2))
+!      if (.not.allocated(Tmat)) allocate (Tmat(nres6,nres2))
+!      if (.not.allocated(Cmat_)) allocate(Cmat_(nres2,nres2))
+!      if (.not.allocated(Cinv)) allocate (Cinv(nres2,nres2))
+!      if (.not.allocated(Pmat)) allocate(Pmat(6*nres,6*nres))
 
       if (.not.allocated(stochforcvec)) allocate(stochforcvec(nres6))  !(MAXRES6) maxres6=6*maxres
 
 !      include 'COMMON.INTERACT'
 !      include 'COMMON.MD'
 !      include 'COMMON.IOUNITS'
-      real(kind=8) :: KE_total
+      real(kind=8) :: KE_total,mscab
                                                              
       integer :: i,j,k,iti,mnum
       real(kind=8) :: KEt_p,KEt_sc,KEr_p,KEr_sc,incr(3),&
       enddo
       do i=nnt,nct-1
        mnum=molnum(i)
+       if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
 !        write (iout,*) "Kinetic trp:",i,(incr(j),j=1,3) 
         do j=1,3
           v(j)=incr(j)+0.5d0*d_t(j,i)
       do i=nnt,nct
          mnum=molnum(i)
         iti=iabs(itype(i,mnum))
+        if (mnum.eq.5) then
+         mscab=0.0d0
+        else
+         mscab=msc(iti,mnum)
+        endif
 !        if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
-         if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
-          .and.(mnum.ne.5)) then
+         if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
+          .or.(mnum.eq.5)) then
           do j=1,3
             v(j)=incr(j)
          enddo   
         endif
 !        write (iout,*) "Kinetic trsc:",i,(incr(j),j=1,3) 
 !        write (iout,*) "i",i," msc",msc(iti)," v",(v(j),j=1,3) 
-        KEt_sc=KEt_sc+msc(iti,mnum)*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))            
+        KEt_sc=KEt_sc+mscab*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))            
         vtot(i+nres)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
         do j=1,3
           incr(j)=incr(j)+d_t(j,i)
       real(kind=8) :: tt0,scalfac
       integer :: nres2
       nres2=2*nres
+      print *, "ENTER MD"
 !
 #ifdef MPI
+      print *,"MY tmpdir",tmpdir,ilen(tmpdir)
       if (ilen(tmpdir).gt.0) &
         call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_" &
               //liczba(:ilen(liczba))//'.rst')
 #else
       tt0 = tcpu()
 #endif
+       print *,"just befor setup matix",nres
 ! Determine the inverse of the inertia matrix.
       call setup_MD_matrices
 ! Initialize MD
+      print *,"AFTER SETUP MATRICES"
       call init_MD
+      print *,"AFTER INIT MD"
+
 #ifdef MPI
       t_MDsetup = MPI_Wtime()-tt0
 #else
         stop
 #endif
       else if (lang.eq.1 .or. lang.eq.4) then
+        print *,"before setup_fricmat"
         call setup_fricmat
+        print *,"after setup_fricmat"
       endif
 #ifdef MPI
       t_langsetup=MPI_Wtime()-tt0
 #endif
         endif
         if (ntwe.ne.0) then
-         if (mod(itime,ntwe).eq.0) call statout(itime)
+         if (mod(itime,ntwe).eq.0) then
+            call statout(itime)
+            call returnbox
+!            call  check_ecartint 
+         endif
 #ifdef VOUT
         do j=1,3
           v_work(j)=d_t(j,0)
           enddo
         enddo
         do i=nnt,nct
-          if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
+          mnum=molnum(i)
+          if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.mnum.ne.5) then
             do j=1,3
               ind=ind+1
               v_work(ind)=d_t(j,i+nres)
 #endif
         endif
         if (mod(itime,ntwx).eq.0) then
+          call returnbox
           write (tytul,'("time",f8.2)') totT
           if(mdpdb) then
              call hairpin(.true.,nharp,iharp)
           enddo
         endif
 ! Side chains
-        if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
+        if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.&
+        molnum(i).ne.5) then
           do j=1,3 
             epdriftij= &
              dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
        write (iout,*) "vcm right after adjustment:"
        write (iout,*) (vcm(j),j=1,3) 
       endif
-      if ((.not.rest).and.(indpdb.eq.0)) then          
-         call chainbuild
-         if(iranconf.ne.0) then
+      if (.not.rest) then              
+!         call chainbuild
+         if(iranconf.ne.0 .or.indpdb.gt.0.and..not.unres_pdb .or.preminim) then
           if (overlapsc) then 
            print *, 'Calling OVERLAP_SC'
            call overlap_sc(fail)
 !      include 'COMMON.NAMES'
 !      include 'COMMON.TIME1'
       real(kind=8) :: xv,sigv,lowb,highb  ,Ek1
+!#define DEBUG
 #ifdef FIVEDIAG
        real(kind=8) ,allocatable, dimension(:)  :: DDU1,DDU2,DL2,DL1,xsolv,DML,rs
        real(kind=8) :: sumx
 #ifdef DEBUG
        real(kind=8) ,allocatable, dimension(:)  :: rsold
        real (kind=8),allocatable,dimension(:,:) :: matold
+       integer :: iti
 #endif
 #endif
       integer :: i,j,ii,k,ind,mark,imark,mnum
       do i=nnt,nct
 !        if (itype(i,1).eq.10) then
          mnum=molnum(i)
+          if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
         iti=iabs(itype(i,mnum))
 !        if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
-         if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
-          .and.(mnum.ne.5)) then
+         if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
+          .or.(mnum.eq.5)) then
           j=ii+3
         else
           j=ii+6
           write (iout,*) "k",k," ii",ii,"EK1",EK1
           if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
           .and.(mnum.ne.5))&
-           Ek1=Ek1+0.5d0*Isc(iabs(itype(i,mnum),mnum))*(d_t_work(ii)-d_t_work(ii-3))**2
+           Ek1=Ek1+0.5d0*Isc(iabs(itype(i,mnum)),mnum)*(d_t_work(ii)-d_t_work(ii-3))**2
           Ek1=Ek1+0.5d0*msc(iabs(itype(i,mnum)),mnum)*d_t_work(ii)**2
         enddo
         write (iout,*) "i",i," ii",ii
           d_t(k,j)=d_t_work(ind)
           ind=ind+1
         enddo
-         mnum=molnum(i)
-         if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
-          .and.(mnum.ne.5))
+         mnum=molnum(j)
+         if (itype(j,1).ne.10 .and. itype(j,mnum).ne.ntyp1_molec(mnum)&
+          .and.(mnum.ne.5)) then
           do k=1,3
             d_t(k,j+nres)=d_t_work(ind)
             ind=ind+1
       do i=nnt,nct
 !        if (itype(i,1).eq.10) then
          mnum=molnum(i)
-         if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
-          .and.(mnum.ne.5))
+         if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
+          .or.(mnum.eq.5)) then
           do j=1,3
             d_t(j,i)=d_t(j,i+1)-d_t(j,i)
           enddo
 !      write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",&
 !        2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
 !      call flush(iout)
+!      write(iout,*) "end init MD"
       return
-#undef DEBUG
       end subroutine random_vel
 !-----------------------------------------------------------------------------
 #ifndef LANG0
         M_PEP=0.0d0
         do i=nnt,nct-1
           mnum=molnum(i)
+          if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
           if (itype(i,mnum).eq.ntyp1_molec(mnum)) cycle
           M_PEP=M_PEP+mp(mnum)
           do j=1,3
         M_SC=0.0d0                             
         do i=nnt,nct
            mnum=molnum(i)
+           if (mnum.eq.5) cycle
            iti=iabs(itype(i,mnum))              
           M_SC=M_SC+msc(iabs(iti),mnum)
            inres=i+nres
        
         do i=nnt,nct-1
            mnum=molnum(i)
+          if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
           do j=1,3
             pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
           enddo
        do i=nnt,nct    
            mnum=molnum(i)
            iti=iabs(itype(i,mnum))
+           if (mnum.eq.5) cycle
            inres=i+nres
            do j=1,3
              pr(j)=c(j,inres)-cm(j)        
        
         call angmom(cm,L)
 !        write(iout,*) "The angular momentum before adjustment:"
-!        write(iout,*) (L(j),j=1,3)                                                                                                                                                                                                                    
+!        write(iout,*) (L(j),j=1,3)
         
        Im(2,1)=Im(1,2)
         Im(3,1)=Im(1,3)
         do i=1,3
          do j=1,3
            Imcp(i,j)=Im(i,j)
-            Id(i,j)=0.0d0          
+            Id(i,j)=0.0d0
          enddo
         enddo
                                                              
        enddo
        call angmom(cm,L)
 !       write(iout,*) "The angular momentum after adjustment:"
-!       write(iout,*) (L(j),j=1,3)                                                                               
+!       write(iout,*) (L(j),j=1,3) 
 
       return
       end subroutine inertia_tensor
 !       include 'COMMON.INTERACT'
 !       include 'COMMON.IOUNITS'
 !       include 'COMMON.NAMES'
-      
+      real(kind=8) :: mscab
       real(kind=8),dimension(3) :: L,cm,pr,vp,vrot,incr,v,pp
       integer :: iti,inres,i,j,mnum
 !  Calculate the angular momentum
        enddo                  
        do i=nnt,nct-1
           mnum=molnum(i)
+          if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
           do j=1,3
             pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
           enddo
           mnum=molnum(i)
          iti=iabs(itype(i,mnum))
          inres=i+nres
+        if (mnum.eq.5) then
+         mscab=0.0d0
+        else
+         mscab=msc(iti,mnum)
+        endif
          do j=1,3
            pr(j)=c(j,inres)-cm(j)          
          enddo
            enddo
          endif
          call vecpr(pr(1),v(1),vp)
-!         write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3),
-!     &     " v",(v(j),j=1,3)," vp",(vp(j),j=1,3)
+!         write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3),&
+!           " v",(v(j),j=1,3)," vp",(vp(j),j=1,3)
          do j=1,3
-            L(j)=L(j)+msc(iabs(iti),mnum)*vp(j)
+            L(j)=L(j)+mscab*vp(j)
          enddo
 !         write (iout,*) "L",(l(j),j=1,3)
          if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
        summas=0.0d0
        do i=nnt,nct
          mnum=molnum(i)
+         if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
          if (i.lt.nct) then
            summas=summas+mp(mnum)
            do j=1,3
              vcm(j)=vcm(j)+mp(mnum)*(vv(j)+0.5d0*d_t(j,i))
            enddo
          endif
+         if (mnum.ne.5) then 
          amas=msc(iabs(itype(i,mnum)),mnum)
+         else
+         amas=0.0d0
+         endif
          summas=summas+amas                     
          if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
           .and.(mnum.ne.5)) then
       logical :: lprn = .false.
       real(kind=8) :: dtdi !el ,gamvec(2*nres)
 !el      real(kind=8),dimension(2*nres,2*nres) :: ginvfric,fcopy
-      real(kind=8),dimension(2*nres,2*nres) :: fcopy
+!      real(kind=8),allocatable,dimension(:,:) :: fcopy
 !el      real(kind=8),dimension(2*nres*(2*nres+1)/2) :: Ghalf   !(mmaxres2) (mmaxres2=(maxres2*(maxres2+1)/2))
 !el      common /syfek/ gamvec
       real(kind=8) :: work(8*2*nres)
       integer :: iwork(2*nres)
 !el      common /przechowalnia/ ginvfric,Ghalf,fcopy
       integer :: ii,iti,k,l,nzero,nres2,nres6,ierr,mnum
+      nres2=2*nres
+      nres6=6*nres
 #ifdef MPI
+      if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
+       if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
       if (fg_rank.ne.king) goto 10
 #endif
-      nres2=2*nres
-      nres6=6*nres
+!      nres2=2*nres
+!      nres6=6*nres
 
       if(.not.allocated(gamvec)) allocate(gamvec(nres2)) !(MAXRES2)
       if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
-!el      if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
+       if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
 !el      allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
       if(.not.allocated(Ghalf)) allocate(Ghalf(nres2*(nres2+1)/2)) !maxres2=2*maxres
 
-!el      if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
+      if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
 !  Zeroing out fricmat
       do i=1,dimen
         do j=1,dimen
 !  Load the friction coefficients corresponding to side chains
       m=nct-nnt
       ind=0
-      do j=1,5
+      do j=1,2
       gamsc(ntyp1_molec(j),j)=1.0d0
       enddo
       do i=nnt,nct
       allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
 #endif
 
-!el      if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2))
+      if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2))
 !----------------------
 ! commom.hairpin in CSA module
 !----------------------