Statistiques
| Révision :

root / src / cmshft.f90 @ 4

Historique | Voir | Annoter | Télécharger (1,61 ko)

1 1 equemene
subroutine cmshft(natom,rx,ry,rz,rmass,cmx,cmy,cmz,ishift)
2 1 equemene
  !c
3 1 equemene
  !c      shifts all x, y, and z coordinates passed in rx,ry,rz to keep
4 1 equemene
  !c      the center of mass at the origin if ishift is not zero. otherwise
5 1 equemene
  !c      cmx, cmy, and cmz return the center of mass coordinates and no
6 1 equemene
  !c      shift is performed. coordinate and mass units arbitrary.
7 1 equemene
  !c
8 1 equemene
9 1 equemene
  use VarTypes
10 1 equemene
  use Io_module
11 1 equemene
12 1 equemene
  IMPLICIT NONE
13 1 equemene
14 1 equemene
15 1 equemene
! Number of atoms
16 1 equemene
  INTEGER(KINT), INTENT(IN) :: NAtom
17 1 equemene
! Coordinates and masses
18 1 equemene
  REAL(KREAL), DIMENSION(NAtom) :: rx,ry,rz,rmass
19 1 equemene
! Center of mass coordinates
20 1 equemene
  real(KREAL) :: cmx,cmy,cmz
21 1 equemene
! Flag if user wants to shift center of mass to origin
22 1 equemene
  INTEGER(KINT) :: IShift
23 1 equemene
24 1 equemene
  REAL(KREAL), parameter :: zero=0.d0,one=1.d0
25 1 equemene
  INTEGER(KINT) :: i,j
26 1 equemene
  REAL(KREAL) :: TmassI, tmass
27 1 equemene
28 1 equemene
  if(natom.le.0) then
29 1 equemene
     if(IOOUT.gt.0) write(IOOUT,'(/2a/)')  &
30 1 equemene
          '  *** error, illegal array dimension in cmshft,', &
31 1 equemene
          ' return without action ***'
32 1 equemene
     return
33 1 equemene
  end if
34 1 equemene
  !c
35 1 equemene
  !c      calculate center of mass coordinates
36 1 equemene
  !c
37 1 equemene
  tmass=rmass(1)
38 1 equemene
  do j=2,natom
39 1 equemene
     tmass=tmass+rmass(j)
40 1 equemene
  END DO
41 1 equemene
  !c
42 1 equemene
  !c     DO i=1,natom
43 1 equemene
  !c       write(IOOUT,'(4F15.3)') rmass(i),rx(i),ry(i),rz(i)
44 1 equemene
  !c     END DO
45 1 equemene
46 1 equemene
  cmx=zero
47 1 equemene
  cmy=zero
48 1 equemene
  cmz=zero
49 1 equemene
  do j=1,natom
50 1 equemene
     cmx=rmass(j)*rx(j)+cmx
51 1 equemene
     cmy=rmass(j)*ry(j)+cmy
52 1 equemene
     cmz=rmass(j)*rz(j)+cmz
53 1 equemene
  END DO
54 1 equemene
55 1 equemene
  tmassi=one/tmass
56 1 equemene
  cmx=cmx*tmassi
57 1 equemene
  cmy=cmy*tmassi
58 1 equemene
  cmz=cmz*tmassi
59 1 equemene
  !c
60 1 equemene
  !c      optional shift of all cartesian coordinates
61 1 equemene
  !c
62 1 equemene
  if(ishift.ne.0) then
63 1 equemene
     do j=1,natom
64 1 equemene
        rx(j)=rx(j)-cmx
65 1 equemene
        ry(j)=ry(j)-cmy
66 1 equemene
        rz(j)=rz(j)-cmz
67 1 equemene
     END DO
68 1 equemene
  end if
69 1 equemene
70 1 equemene
  return
71 1 equemene
end subroutine cmshft