X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=source%2Funres%2Fsrc_MD-M-newcorr%2Frefsys.f;fp=source%2Funres%2Fsrc_MD-M-newcorr%2Frefsys.f;h=8c58a829d238d92bba7e63c85d5958936f42f2a7;hb=d101c97dea752458d76055fdbae49c26fff03c1f;hp=0000000000000000000000000000000000000000;hpb=325eda160c9ad2982501e091ca40606a29043712;p=unres.git diff --git a/source/unres/src_MD-M-newcorr/refsys.f b/source/unres/src_MD-M-newcorr/refsys.f new file mode 100644 index 0000000..8c58a82 --- /dev/null +++ b/source/unres/src_MD-M-newcorr/refsys.f @@ -0,0 +1,68 @@ + subroutine refsys(i2,i3,i4,e1,e2,e3,fail) +c This subroutine calculates unit 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. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + logical fail + double precision e1(3),e2(3),e3(3) + double precision u(3),z(3) + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + double precision coinc/1.0D-13/,align /1.0D-13/ + fail=.false. + s1=0.0 + s2=0.0 + 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. +c do 3 i=1,3 +c 3 c(i,i1)=0.0D0 + return + 2 if (s2.gt.coinc) goto 4 + write(iout,1000) i3,i4,i1 + fail=.true. + do 5 i=1,3 + 5 c(i,i1)=0.0D0 + 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=dsqrt(v1*v1+v2*v2+v3*v3) + if (anorm.gt.align) goto 6 + write (iout,1010) i2,i3,i4,i1 + fail=.true. +c do 7 i=1,3 +c 7 c(i,i1)=0.0D0 + return + 6 anorm=1.0D0/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.', + 1 'coordinates of atom',i4,' are set to zero.') + 1010 format (/1x,' * * * Error - atoms',2(i4,2h, ),i4,' form a linear', + 1 ' fragment. coordinates of atom',i4,' are set to zero.') + return + end