root / src / cmshft.f90 @ 3
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 |