--- /dev/null
+ subroutine geom_to_var(n,x)
+C
+C Transfer the geometry parameters to the variable array.
+C The positions of variables are as follows:
+C 1. Virtual-bond torsional angles: 1 thru nres-3
+C 2. Virtual-bond valence angles: nres-2 thru 2*nres-5
+C 3. The polar angles alpha of local SC orientation: 2*nres-4 thru
+C 2*nres-4+nside
+C 4. The torsional angles omega of SC orientation: 2*nres-4+nside+1
+C thru 2*nre-4+2*nside
+C
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.VAR'
+ include 'COMMON.GEO'
+ include 'COMMON.CHAIN'
+ double precision x(n)
+cd print *,'nres',nres,' nphi',nphi,' ntheta',ntheta,' nvar',nvar
+ do i=4,nres
+ x(i-3)=phi(i)
+cd print *,i,i-3,phi(i)
+ enddo
+ if (n.eq.nphi) return
+ do i=3,nres
+ x(i-2+nphi)=theta(i)
+cd print *,i,i-2+nphi,theta(i)
+ enddo
+ if (n.eq.nphi+ntheta) return
+ do i=2,nres-1
+ if (ialph(i,1).gt.0) then
+ x(ialph(i,1))=alph(i)
+ x(ialph(i,1)+nside)=omeg(i)
+cd print *,i,ialph(i,1),ialph(i,1)+nside,alph(i),omeg(i)
+ endif
+ enddo
+ return
+ end
+C--------------------------------------------------------------------
+ subroutine var_to_geom(n,x)
+C
+C Update geometry parameters according to the variable array.
+C
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.VAR'
+ include 'COMMON.CHAIN'
+ include 'COMMON.GEO'
+ include 'COMMON.IOUNITS'
+ dimension x(n)
+ logical change,reduce
+ change=reduce(x)
+ if (n.gt.nphi+ntheta) then
+ do i=1,nside
+ ii=ialph(i,2)
+ alph(ii)=x(nphi+ntheta+i)
+ omeg(ii)=pinorm(x(nphi+ntheta+nside+i))
+ enddo
+ endif
+ do i=4,nres
+ phi(i)=x(i-3)
+ enddo
+ if (n.eq.nphi) return
+ do i=3,nres
+ theta(i)=x(i-2+nphi)
+ if (theta(i).eq.pi) theta(i)=0.99d0*pi
+ x(i-2+nphi)=theta(i)
+ enddo
+ return
+ end
+c-------------------------------------------------------------------------
+ logical function convert_side(alphi,omegi)
+ implicit none
+ double precision alphi,omegi
+ double precision pinorm
+ include 'COMMON.GEO'
+ convert_side=.false.
+C Apply periodicity restrictions.
+ if (alphi.gt.pi) then
+ alphi=dwapi-alphi
+ omegi=pinorm(omegi+pi)
+ convert_side=.true.
+ endif
+ return
+ end
+c-------------------------------------------------------------------------
+ logical function reduce(x)
+C
+C Apply periodic restrictions to variables.
+C
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.VAR'
+ include 'COMMON.CHAIN'
+ include 'COMMON.GEO'
+ logical zm,zmiana,convert_side
+ dimension x(nvar)
+ zmiana=.false.
+ do i=4,nres
+ x(i-3)=pinorm(x(i-3))
+ enddo
+ if (nvar.gt.nphi+ntheta) then
+ do i=1,nside
+ ii=nphi+ntheta+i
+ iii=ii+nside
+ x(ii)=thetnorm(x(ii))
+ x(iii)=pinorm(x(iii))
+C Apply periodic restrictions.
+ zm=convert_side(x(ii),x(iii))
+ zmiana=zmiana.or.zm
+ enddo
+ endif
+ if (nvar.eq.nphi) return
+ do i=3,nres
+ ii=i-2+nphi
+ iii=i-3
+ x(ii)=dmod(x(ii),dwapi)
+C Apply periodic restrictions.
+ if (x(ii).gt.pi) then
+ zmiana=.true.
+ x(ii)=dwapi-x(ii)
+ if (iii.gt.0) x(iii)=pinorm(x(iii)+pi)
+ if (i.lt.nres) x(iii+1)=pinorm(x(iii+1)+pi)
+ ii=ialph(i-1,1)
+ if (ii.gt.0) then
+ x(ii)=dmod(pi-x(ii),dwapi)
+ x(ii+nside)=pinorm(-x(ii+nside))
+ zm=convert_side(x(ii),x(ii+nside))
+ endif
+ else if (x(ii).lt.-pi) then
+ zmiana=.true.
+ x(ii)=dwapi+x(ii)
+ ii=ialph(i-1,1)
+ if (ii.gt.0) then
+ x(ii)=dmod(pi-x(ii),dwapi)
+ x(ii+nside)=pinorm(-pi-x(ii+nside))
+ zm=convert_side(x(ii),x(ii+nside))
+ endif
+ else if (x(ii).lt.0.0d0) then
+ zmiana=.true.
+ x(ii)=-x(ii)
+ if (iii.gt.0) x(iii)=pinorm(x(iii)+pi)
+ if (i.lt.nres) x(iii+1)=pinorm(x(iii+1)+pi)
+ ii=ialph(i-1,1)
+ if (ii.gt.0) then
+ x(ii+nside)=pinorm(-x(ii+nside))
+ zm=convert_side(x(ii),x(ii+nside))
+ endif
+ endif
+ enddo
+ reduce=zmiana
+ return
+ end
+c--------------------------------------------------------------------------
+ double precision function thetnorm(x)
+C This function puts x within [0,2Pi].
+ implicit none
+ double precision x,xx
+ include 'COMMON.GEO'
+ xx=dmod(x,dwapi)
+ if (xx.lt.0.0d0) xx=xx+dwapi
+ if (xx.gt.0.9999d0*pi) xx=0.9999d0*pi
+ thetnorm=xx
+ return
+ end
+C--------------------------------------------------------------------
+ subroutine var_to_geom_restr(n,xx)
+C
+C Update geometry parameters according to the variable array.
+C
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.VAR'
+ include 'COMMON.CHAIN'
+ include 'COMMON.GEO'
+ include 'COMMON.IOUNITS'
+ dimension x(maxvar),xx(maxvar)
+ logical change,reduce
+
+ call xx2x(x,xx)
+ change=reduce(x)
+ do i=1,nside
+ ii=ialph(i,2)
+ alph(ii)=x(nphi+ntheta+i)
+ omeg(ii)=pinorm(x(nphi+ntheta+nside+i))
+ enddo
+ do i=4,nres
+ phi(i)=x(i-3)
+ enddo
+ do i=3,nres
+ theta(i)=x(i-2+nphi)
+ if (theta(i).eq.pi) theta(i)=0.99d0*pi
+ x(i-2+nphi)=theta(i)
+ enddo
+ return
+ end
+c-------------------------------------------------------------------------