changes in ions
[unres4.git] / source / unres / geometry.F90
index 27b2d7d..ae86ead 100644 (file)
       do 10 it=1,1 
         if ((it.eq.10).or.(it.eq.ntyp1)) goto 10 
         open (20,file=restyp(it,1)//'_distr.sdc',status='unknown')
-        call gen_side(it,90.0D0 * deg2rad,al,om,fail)
+        call gen_side(it,90.0D0 * deg2rad,al,om,fail,1)
         close (20)
         goto 10
         open (20,file=restyp(it,1)//'_distr1.sdc',status='unknown')
           enddo
         enddo
         do isample=1,MaxSample
-          call gen_side(it,90.0D0 * deg2rad,al,om,fail)
+          call gen_side(it,90.0D0 * deg2rad,al,om,fail,1)
           indal=rad2deg*al/2
           indom=(rad2deg*om+180.0D0)/5
           prob(indom,indal)=prob(indom,indal)+delt
       integer :: it1,it2,it,j
 !d    print *,' CG Processor',me,' maxgen=',maxgen
       maxsi=1000
-!      write (iout,*) 'Gen_Rand_conf: nstart=',nstart
+      write (iout,*) 'Gen_Rand_conf: nstart=',nstart,nres
       if (nstart.lt.5) then
         it1=iabs(itype(2,1))
         phi(4)=gen_phi(4,iabs(itype(2,1)),iabs(itype(3,1)))
 !       write(iout,*)'phi(4)=',rad2deg*phi(4)
-        if (nstart.lt.3) theta(3)=gen_theta(iabs(itype(2,1)),pi,phi(4))
+        if (nstart.lt.3) theta(3)=gen_theta(iabs(itype(2,1)),pi,phi(4),molnum(2))
 !       write(iout,*)'theta(3)=',rad2deg*theta(3) 
         if ((it1.ne.10).and.(it1.ne.ntyp1)) then
           nsi=0
           fail=.true.
           do while (fail.and.nsi.le.maxsi)
-            call gen_side(it1,theta(3),alph(2),omeg(2),fail)
+            call gen_side(it1,theta(3),alph(2),omeg(2),fail,molnum(2))
+            write (iout,*) 'nsi=',nsi,maxsi
             nsi=nsi+1
           enddo
           if (nsi.gt.maxsi) return 1
         endif ! it1.ne.10
+        write(iout,*) "before origin_frame"
         call orig_frame
+        write(iout,*) "after origin_frame"
         i=4
         nstart=4
       else
       niter=0
       back=.false.
       do while (i.le.nres .and. niter.lt.maxgen)
+        write(iout,*) 'i=',i,'back=',back
         if (i.lt.nstart) then
           if(iprint.gt.1) then
           write (iout,'(/80(1h*)/2a/80(1h*))') &
        if (back) then
           phi(i)=gen_phi(i+1,it2,it1)
 !         print *,'phi(',i,')=',phi(i)
-         theta(i-1)=gen_theta(it2,phi(i-1),phi(i))
+         theta(i-1)=gen_theta(it2,phi(i-1),phi(i),molnum(i))
 !          print *,"theta",theta(i-1),phi(i)
          if ((it2.ne.10).and.(it2.ne.ntyp1)) then
             nsi=0
             fail=.true.
             do while (fail.and.nsi.le.maxsi)
-              call gen_side(it2,theta(i-1),alph(i-2),omeg(i-2),fail)
+              call gen_side(it2,theta(i-1),alph(i-2),omeg(i-2),fail,molnum(i-2))
               nsi=nsi+1
             enddo
             if (nsi.gt.maxsi) return 1
           endif
          call locate_next_res(i-1)
        endif
-       theta(i)=gen_theta(it1,phi(i),phi(i+1))
+       theta(i)=gen_theta(it1,phi(i),phi(i+1),molnum(i))
 !        write(iout,*) "theta(i),",theta(i)
         if ((it1.ne.10).and.(it1.ne.ntyp1)) then 
         nsi=0
         fail=.true.
         do while (fail.and.nsi.le.maxsi)
-          call gen_side(it1,theta(i),alph(i-1),omeg(i-1),fail)
+          call gen_side(it1,theta(i),alph(i-1),omeg(i-1),fail,molnum(i))
 !                  write(iout,*)"alpha,omeg(i-1)",alph(i-1),omeg(i-1),i,nsi,maxsi
           nsi=nsi+1
         enddo
         if (nsi.gt.maxsi) return 1
         endif
        call locate_next_res(i)
-!        write(iout,*) "overlap,",overlap(i-1)
+        write(iout,*) "overlap,",overlap(i-1)
        if (overlap(i-1)) then
          if (nit.lt.maxnit) then
            back=.true.
       nres2=2*nres
       data redfac /0.5D0/
       overlap=.false.
-      iti=iabs(itype(i,1))
+      iti=iabs(itype(i,molnum(i)))
       if (iti.gt.ntyp) return
 ! Check for SC-SC overlaps.
 !d    print *,'nnt=',nnt,' nct=',nct
       do j=nnt,i-1
-        
+!        print *, "molnum(j)",j,molnum(j)
+        if (molnum(j).eq.1) then
         itj=iabs(itype(j,1))
         if (itj.eq.ntyp1) cycle
         if (j.lt.i-1 .or. ipot.ne.4) then
 !d      print *,'j=',j
        if (dist(nres+i,nres+j).lt.redfac*rcomp) then
           overlap=.true.
+        
 !        print *,'overlap, SC-SC: i=',i,' j=',j,
 !     &     ' dist=',dist(nres+i,nres+j),' rcomp=',
 !     &     rcomp
          return
         endif
+        else if (molnum(j).eq.2) then
+        itj=iabs(itype(j,2))
+        if (dist(nres+i,nres+j).lt.redfac*sigma_nucl(iti,itj)) then
+          overlap=.true.
+
+!        print *,'overlap, SC-SC: i=',i,' j=',j,
+!     &     ' dist=',dist(nres+i,nres+j),' rcomp=',
+!     &     rcomp
+          return
+        endif
+        
+      endif
       enddo
 ! Check for overlaps between the added peptide group and the preceding
 ! SCs.
        c(j,nres2+3)=0.5D0*(c(j,i)+c(j,i+1))
       enddo
       do j=nnt,i-2
+        if (molnum(j).ne.1) cycle
        itj=iabs(itype(j,1))
 !d      print *,'overlap, p-Sc: i=',i,' j=',j,
 !d   &         ' dist=',dist(nres+j,maxres2+1)
 ! Check for overlaps between the added side chain and the preceding peptide
 ! groups.
       do j=1,nnt-2
+        if (molnum(j).ne.1) cycle
        do k=1,3
          c(k,nres2+3)=0.5D0*(c(k,j)+c(k,j+1))
         enddo
       enddo
 ! Check for p-p overlaps
       do j=1,3
-       c(j,nres2+4)=0.5D0*(c(j,i)+c(j,i+1))
+       c(j,nres2+3)=0.5D0*(c(j,i)+c(j,i+1))
       enddo
       do j=nnt,i-2
+!        if (molnum(j).eq.1) then
         itelj=itel(j)
        do k=1,3
          c(k,nres2+4)=0.5D0*(c(k,j)+c(k,j+1))
         enddo
 !d      print *,'overlap, p-p: i=',i,' j=',j,
 !d   &         ' dist=',dist(maxres2+1,maxres2+2)
+        if (molnum(j).eq.1) then
         if(iteli.ne.0.and.itelj.ne.0)then
         if (dist(nres2+3,nres2+4).lt.rpp(iteli,itelj)*redfac) then
           overlap=.true.
           return
         endif
         endif
+        else if (molnum(j).eq.2) then
+        if (dist(nres2+3,nres2+4).lt.3.0) then
+          overlap=.true.
+          return
+        endif
+      endif
       enddo
       return
       end function overlap
       return
       end function gen_phi
 !-----------------------------------------------------------------------------
-      real(kind=8) function gen_theta(it,gama,gama1)
+      real(kind=8) function gen_theta(it,gama,gama1,mnum)
       use random,only:binorm,ran_number
 !      implicit real*8 (a-h,o-z)
 !      include 'DIMENSIONS'
       real(kind=8),dimension(2) :: y,z
       real(kind=8) :: theta_max,theta_min,sig,ak
 !el local variables
-      integer :: j,it,k
+      integer :: j,it,k,mnum
       real(kind=8) :: gama,gama1,thet_pred_mean,theta_temp
 !     print *,'gen_theta: it=',it
       theta_min=0.05D0*pi
       endif 
       if (it.eq.ntyp1) then
       gen_theta=ran_number(theta_max/2.0,theta_max)
-      else         
+      else if (mnum.eq.1) then
+             
       thet_pred_mean=a0thet(it)
 !      write(iout,*),it,thet_pred_mean,"gen_thet"
       do k=1,2
       if (theta_temp.gt.theta_max) theta_temp=theta_max
       gen_theta=theta_temp
 !     print '(a)','Exiting GENTHETA.'
-      endif
+      else if (mnum.eq.2) then
+       gen_theta=2.0d0 + ran_number(0.0d0,0.34d0)
+      else
+              gen_theta=ran_number(theta_max/2.0,theta_max)
+       endif
       return
       end function gen_theta
 !-----------------------------------------------------------------------------
-      subroutine gen_side(it,the,al,om,fail)
+      subroutine gen_side(it,the,al,om,fail,mnum)
       use random, only:ran_number,mult_norm1
 !      implicit real*8 (a-h,o-z)
 !      include 'DIMENSIONS'
       real(kind=8) :: Big=10.0D0
       logical :: lprint,fail,lcheck
 !el local variables
-      integer :: it,i,j,k,l,nlobit,ial,iom,iii,ilob
+      integer :: it,i,j,k,l,nlobit,ial,iom,iii,ilob,mnum
       real(kind=8) :: the,al,om,detApi,wart,y2,wykl,radmax
       real(kind=8) :: tant,zz1,W1i,radius,zk,fac,dV,sum,sum1
       real(kind=8) :: which_lobe
       lcheck=.false.
       lprint=.false.
       fail=.false.
+      if (mnum.eq.1) then
       if (the.eq.0.0D0 .or. the.eq.pi) then
 #ifdef MPI
         write (*,'(a,i4,a,i3,a,1pe14.5)') &
         fail=.true.
         return
       endif
+      if (nlobit.eq.0) then
+         al=ran_number(0.05d0,pi/2)
+         om=ran_number(-pi,pi)
+         return
+      endif
       tant=dtan(the-pipol)
       nlobit=nlob(it)
       allocate(z(3,nlobit))
       if (fail) return
       al=y(1)
       om=pinorm(y(2))
+      else if (mnum.eq.2) then
+       al=0.7+ran_number(0.0d0,0.2d0)
+       om=ran_number(0.0d0,3.14d0)
+      endif
+      
 !d    print *,'al=',al,' om=',om
 !d    stop
       return
             nsi=0
             fail=.true.
             do while (fail.and.nsi.le.maxsi)
-              call gen_side(iti,theta(i+1),alph(i),omeg(i),fail)
+              call gen_side(iti,theta(i+1),alph(i),omeg(i),fail,molnum(i))
               nsi=nsi+1
             enddo
             if(fail) goto 999
       chiom1=chi1*om1
       chiom2=chi2*om2
       facsig=om1*chiom1+om2*chiom2-2.0D0*om1om2*chiom12
+!      print *,"TUT?",om1*chiom1,facsig,om1,om2,om12
       sigsq=1.0D0-facsig*faceps1_inv
       sigsq_om1=(chiom1-chiom12*om2)*faceps1_inv
       sigsq_om2=(chiom2-chiom12*om1)*faceps1_inv
        do j=1,3
          gcart(j,1)=gcart(j,1)+gloc(1,icg)*dphi(j,1,4) &
            +gloc(nres-2,icg)*dtheta(j,1,3)      
+!         write(iout,*) "pierwszy gcart", gcart(j,2)
           if ((itype(2,1).ne.10).and.&
-          (itype(2,molnum(2)).ne.ntyp1_molec(molnum(2)))) then
+          (itype(2,molnum(2)).ne.ntyp1_molec(molnum(2)).and.(molnum(2).ne.5))) then
           gcart(j,1)=gcart(j,1)+gloc(ialph(2,1),icg)*dalpha(j,1,2)+ &
           gloc(ialph(2,1)+nside,icg)*domega(j,1,2)             
         endif
        do j=1,3
          gcart(j,2)=gcart(j,2)+gloc(1,icg)*dphi(j,2,4)+ &
         gloc(nres-2,icg)*dtheta(j,2,3)+gloc(nres-1,icg)*dtheta(j,1,4)
-        if(itype(2,1).ne.10) then
+!         write(iout,*) "drugi gcart", gcart(j,2)
+        if((itype(2,1).ne.10).and.(molnum(2).ne.5)) then
           gcart(j,2)=gcart(j,2)+gloc(ialph(2,1),icg)*dalpha(j,2,2)+ &
           gloc(ialph(2,1)+nside,icg)*domega(j,2,2)
         endif
 !   The side-chain vector derivatives
         do i=2,nres-1
          if(itype(i,1).ne.10 .and.  &
-           itype(i,molnum(i)).ne.ntyp1_molec(molnum(i))) then  
+           itype(i,molnum(i)).ne.ntyp1_molec(molnum(i)).and.&
+             (molnum(i).ne.5)) then    
             do j=1,3   
               gxcart(j,i)=gxcart(j,i)+gloc(ialph(i,1),icg)*dalpha(j,3,i) &
               +gloc(ialph(i,1)+nside,icg)*domega(j,3,i)
 ! INTERTYP=3 SC...Ca...Ca...SC
 !   calculating dE/ddc1      
   18   continue
+!         write(iout,*) "przed sccor gcart", gcart(1,2)
+
 !       do i=1,nres
 !       gloc(i,icg)=0.0D0
 !          write (iout,*) "poczotkoawy",i,gloc_sc(1,i,icg)
        if (nres.lt.2) return
        if ((nres.lt.3).and.(itype(1,1).eq.10)) return
        if ((itype(1,1).ne.10).and. &
-        (itype(1,molnum(1)).ne.ntyp1_molec(molnum(1)))) then
+        (itype(1,molnum(1)).ne.ntyp1_molec(molnum(1))).and.(molnum(1).ne.5)) then
         do j=1,3
 !c Derviative was calculated for oposite vector of side chain therefore
 ! there is "-" sign before gloc_sc
          gcart(j,1)=gcart(j,1)+gloc_sc(1,0,icg)* &
            dtauangle(j,1,2,3)
           if ((itype(2,1).ne.10).and. &
-        (itype(2,molnum(2)).ne.ntyp1_molec(molnum(2)))) then
+        (itype(2,molnum(2)).ne.ntyp1_molec(molnum(2))).and.(molnum(2).ne.5)) then
          gxcart(j,1)= gxcart(j,1) &
                      -gloc_sc(3,0,icg)*dtauangle(j,3,1,3)
          gcart(j,1)=gcart(j,1)+gloc_sc(3,0,icg)* &
 !   ommited 
 !     &     +gloc_sc(intertyp,nres-2,icg)*dtheta(j,1,3)  
 
+!         write(iout,*) "przed dE/ddc2 gcart", gcart(1,2)
+
 !     Calculating the remainder of dE/ddc2
        do j=1,3
          if((itype(2,1).ne.10).and. &
-           (itype(2,molnum(2)).ne.ntyp1_molec(molnum(2)))) then
+           (itype(2,molnum(2)).ne.ntyp1_molec(molnum(2)).and.(molnum(2).ne.5))) then
            if ((itype(1,1).ne.10).and.&
-              ((itype(1,molnum(1)).ne.ntyp1_molec(molnum(1)))))&
+              ((itype(1,molnum(1)).ne.ntyp1_molec(molnum(1)))).and.(molnum(1).ne.5))&
             gxcart(j,2)=gxcart(j,2)+ &
                                gloc_sc(3,0,icg)*dtauangle(j,3,3,3)
-        if ((itype(3,1).ne.10).and.(nres.ge.3).and.(itype(3,molnum(3)).ne.ntyp1_molec(3))) &
+        if ((itype(3,1).ne.10).and.(nres.ge.3).and.(itype(3,molnum(3)).ne.ntyp1_molec(3)).and.molnum(3).ne.5) &
          then
            gxcart(j,2)=gxcart(j,2)-gloc_sc(3,1,icg)*dtauangle(j,3,1,4)
 !c                  the   - above is due to different vector direction
            gxcart(j,2)=gxcart(j,2)-gloc_sc(1,1,icg)*dtauangle(j,1,1,4)
 !c                  the   - above is due to different vector direction
            gcart(j,2)=gcart(j,2)+gloc_sc(1,1,icg)*dtauangle(j,1,2,4)
-!          write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,2,4),"gcart"
+!          write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,2,4),"gcart",gcart(j,2)
 !           write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,1,4),"gx"
           endif
          endif
          if ((itype(1,1).ne.10).and.&
-         (itype(1,molnum(1)).ne.ntyp1_molec(molnum(1)))) then
+         (itype(1,molnum(1)).ne.ntyp1_molec(molnum(1))).and.(molnum(1).ne.5)) then
           gcart(j,2)=gcart(j,2)+gloc_sc(1,0,icg)*dtauangle(j,1,3,3)
 !           write(iout,*)  gloc_sc(1,0,icg),dtauangle(j,1,3,3)
         endif
-         if ((itype(3,1).ne.10).and.(nres.ge.3)) then
+         if ((itype(3,1).ne.10).and.(nres.ge.3).and.(molnum(3).ne.5)) then
           gcart(j,2)=gcart(j,2)+gloc_sc(2,1,icg)*dtauangle(j,2,2,4)
 !           write(iout,*) gloc_sc(2,1,icg),dtauangle(j,2,2,4)
          endif
-         if ((itype(4,1).ne.10).and.(nres.ge.4)) then
+         if ((itype(4,1).ne.10).and.(nres.ge.4).and.(molnum(4).ne.5)) then
           gcart(j,2)=gcart(j,2)+gloc_sc(2,2,icg)*dtauangle(j,2,1,5)
 !           write(iout,*) gloc_sc(2,2,icg),dtauangle(j,2,1,5)
          endif
 
 !      write(iout,*) gcart(j,2),itype(2,1),itype(1,1),itype(3,1), "gcart2"
        enddo
+!         write(iout,*) "po dE/ddc2 gcart", gcart(1,2)
+
 !    If there are more than five residues
       if(nres.ge.5) then                        
         do i=3,nres-2
          do j=1,3
 !          write(iout,*) "before", gcart(j,i)
           if ((itype(i,1).ne.10).and.&
-          (itype(i,molnum(i)).ne.ntyp1_molec(molnum(i)))) then
+          (itype(i,molnum(i)).ne.ntyp1_molec(molnum(i))).and.(molnum(i).ne.5)) then
           gxcart(j,i)=gxcart(j,i)+gloc_sc(2,i-2,icg) &
           *dtauangle(j,2,3,i+1) &
           -gloc_sc(1,i-1,icg)*dtauangle(j,1,1,i+2)
 !     &  gcart(j,i),gloc_sc(1,i-1,icg),dtauangle(j,1,2,i+2)
 !          if (itype(i-1,1).ne.10) then
           if ((itype(i-1,1).ne.10).and.&
-          (itype(i-1,molnum(i-1)).ne.ntyp1_molec(molnum(i-1)))) then
+          (itype(i-1,molnum(i-1)).ne.ntyp1_molec(molnum(i-1))).and.(molnum(i-1).eq.5)) then
 
            gxcart(j,i)=gxcart(j,i)+gloc_sc(3,i-2,icg) &
       *dtauangle(j,3,3,i+1)
           endif
 !          if (itype(i+2,1).ne.10) then
           if ((itype(i+2,1).ne.10).and.&
-          (itype(i+2,molnum(i+2)).ne.ntyp1_molec(molnum(i+2)))) then
+          (itype(i+2,molnum(i+2)).ne.ntyp1_molec(molnum(i+2))).and.(molnum(i+2).ne.5)) then
            gcart(j,i)=gcart(j,i)+gloc_sc(2,i,icg)* &
            dtauangle(j,2,1,i+3)
           endif
       if(nres.ge.4) then
          do j=1,3
          if ((itype(nres-1,1).ne.10).and.&
-       (itype(nres-1,molnum(nres-1)).ne.ntyp1_molec(molnum(nres-1)))) then
+       (itype(nres-1,molnum(nres-1)).ne.ntyp1_molec(molnum(nres-1))).and.(molnum(nres-1).ne.5)) then
          gxcart(j,nres-1)=gxcart(j,nres-1)+gloc_sc(2,nres-3,icg) &
           *dtauangle(j,2,3,nres)
 !          write (iout,*) "gxcart(nres-1)", gloc_sc(2,nres-3,icg),
 !     &     dtauangle(j,2,3,nres), gxcart(j,nres-1)
 !         if (itype(nres-2,1).ne.10) then
          if ((itype(nres-2,1).ne.10).and.&
-       (itype(nres-2,molnum(nres-2)).ne.ntyp1_molec(molnum(nres-2)))) then
+       (itype(nres-2,molnum(nres-2)).ne.ntyp1_molec(molnum(nres-2))).and.(molnum(nres-2).ne.5)) then
        gxcart(j,nres-1)=gxcart(j,nres-1)+gloc_sc(3,nres-3,icg) &
           *dtauangle(j,3,3,nres)
           endif
          if ((itype(nres,1).ne.10).and.&
-         (itype(nres,molnum(nres)).ne.ntyp1_molec(molnum(nres)))) then
+         (itype(nres,molnum(nres)).ne.ntyp1_molec(molnum(nres))).and.(molnum(nres).ne.5)) then
         gxcart(j,nres-1)=gxcart(j,nres-1)-gloc_sc(3,nres-2,icg) &
           *dtauangle(j,3,1,nres+1)
         gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(3,nres-2,icg) &
           endif
          endif
          if ((itype(nres-2,1).ne.10).and.&
-         (itype(nres-2,molnum(nres-2)).ne.ntyp1_molec(molnum(nres-2)))) then
+         (itype(nres-2,molnum(nres-2)).ne.ntyp1_molec(molnum(nres-2))).and.(molnum(nres-2).ne.5)) then
             gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(1,nres-3,icg)* &
          dtauangle(j,1,3,nres)
          endif
-          if ((itype(nres,1).ne.10).and.(itype(nres,molnum(nres)).ne.ntyp1_molec(molnum(nres)))) then
+          if ((itype(nres,1).ne.10).and.(itype(nres,molnum(nres)).ne.ntyp1_molec(molnum(nres))).and.(molnum(nres).ne.5)) then
             gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(2,nres-2,icg)* &
            dtauangle(j,2,2,nres+1)
 !           write (iout,*) "gcart(nres-1)", gloc_sc(2,nres-2,icg),
       endif
 !  Settind dE/ddnres       
        if ((nres.ge.3).and.(itype(nres,1).ne.10).and. &
-          (itype(nres,molnum(nres)).ne.ntyp1_molec(molnum(nres))))then
+          (itype(nres,molnum(nres)).ne.ntyp1_molec(molnum(nres))).and.(molnum(nres).ne.5))then
        do j=1,3
         gxcart(j,nres)=gxcart(j,nres)+gloc_sc(3,nres-2,icg) &
        *dtauangle(j,3,3,nres+1)+gloc_sc(2,nres-2,icg) &
        *dtauangle(j,2,3,nres+1)
         enddo
        endif
+!       write(iout,*) "final gcart",gcart(1,2)
 !   The side-chain vector derivatives
 !       print *,"gcart",gcart(:,:)
       return
         do i=1,nres
          if (molnum(i).eq.5) then
           c(1,i)=dmod(c(1,i),boxxsize)
+          if (c(1,i).lt.0) c(1,i)=c(1,i)+boxxsize
           c(2,i)=dmod(c(2,i),boxysize)
+          if (c(2,i).lt.0) c(2,i)=c(2,i)+boxysize
           c(3,i)=dmod(c(3,i),boxzsize)
+          if (c(3,i).lt.0) c(3,i)=c(3,i)+boxzsize
           c(1,i+nres)=dmod(c(1,i+nres),boxxsize)
           c(2,i+nres)=dmod(c(2,i+nres),boxysize)
           c(3,i+nres)=dmod(c(3,i+nres),boxzsize)