Added refsys.f to src_CSA_DiL
authorAdam Liwo <jal47@matrix.chem.cornell.edu>
Mon, 18 Feb 2013 07:10:29 +0000 (02:10 -0500)
committerAdam Liwo <jal47@matrix.chem.cornell.edu>
Mon, 18 Feb 2013 07:10:29 +0000 (02:10 -0500)
source/unres/src_CSA_DiL/refsys.f [new file with mode: 0644]

diff --git a/source/unres/src_CSA_DiL/refsys.f b/source/unres/src_CSA_DiL/refsys.f
new file mode 100644 (file)
index 0000000..b57c201
--- /dev/null
@@ -0,0 +1,60 @@
+      subroutine refsys(i2,i3,i4,e1,e2,e3,fail)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+c this subroutine calculates unity vectors of a local reference system
+c defined by atoms (i2), (i3), and (i4). the x axis is the axis from
+c atom (i3) to atom (i2), and the xy plane is the plane defined by atoms
+c (i2), (i3), and (i4). z axis is directed according to the sign of the
+c vector product (i3)-(i2) and (i3)-(i4). sets fail to .true. if atoms
+c (i2) and (i3) or (i3) and (i4) coincide or atoms (i2), (i3), and (i4)
+c form a linear fragment. returns vectors e1, e2, and e3.
+      logical fail
+      double precision e1(3),e2(3),e3(3)
+      double precision u(3),z(3)
+      include 'COMMON.IOUNITS'
+      include "COMMON.CHAIN"
+      data coinc /1.0d-13/,align /1.0d-13/
+      fail=.false.
+      s1=0.0d0
+      s2=0.0d0
+      do 1 i=1,3
+      zi=c(i,i2)-c(i,i3)
+      ui=c(i,i4)-c(i,i3)
+      s1=s1+zi*zi
+      s2=s2+ui*ui
+      z(i)=zi
+    1 u(i)=ui
+      s1=sqrt(s1)
+      s2=sqrt(s2)
+      if (s1.gt.coinc) goto 2
+      write (iout,1000) i2,i3,i1
+      fail=.true.
+      return
+    2 if (s2.gt.coinc) goto 4
+      write(iout,1000) i3,i4,i1
+      fail=.true.
+      return
+    4 s1=1.0/s1
+      s2=1.0/s2
+      v1=z(2)*u(3)-z(3)*u(2)
+      v2=z(3)*u(1)-z(1)*u(3)
+      v3=z(1)*u(2)-z(2)*u(1)
+      anorm=sqrt(v1*v1+v2*v2+v3*v3)
+      if (anorm.gt.align) goto 6
+      write (iout,1010) i2,i3,i4,i1
+      fail=.true.
+      return
+    6 anorm=1.0/anorm
+      e3(1)=v1*anorm
+      e3(2)=v2*anorm
+      e3(3)=v3*anorm
+      e1(1)=z(1)*s1
+      e1(2)=z(2)*s1
+      e1(3)=z(3)*s1
+      e2(1)=e1(3)*e3(2)-e1(2)*e3(3)
+      e2(2)=e1(1)*e3(3)-e1(3)*e3(1)
+      e2(3)=e1(2)*e3(1)-e1(1)*e3(2)
+ 1000 format (/1x,' * * * error - atoms',i4,' and',i4,' coincide.')
+ 1010 format (/1x,' * * * error - atoms',2(i4,2h, ),i4,' form a linear')
+      return
+      end