Statistiques
| Révision :

root / src / Tensor.f90 @ 4

Historique | Voir | Annoter | Télécharger (2,88 ko)

1
subroutine tensor(natom,rx,ry,rz,Tinert,CoordG,rmass)
2
  ! c
3
  ! c      elements of inertial tensor for a set of atomic systems.
4
  ! c
5
  ! c      rx,ry,rz : arrays natom with cartesian coordinates of natom particles; input
6
  ! c      txx,tyy,tzz,txy,txz,tyz: elements of inertial tensors ; output
7
  ! c      a,b,c    :  returning center of mass coordinates.
8
  ! c      rmass    : vector of length natom with particle masses; input
9
  ! c      natom    : number of particles per system; input
10
  ! c      IOOUT     : unit number for messages, silent for IOOUT.le.0; input
11
  ! c      subroutines called: cmshft                   m. lewerenz jul/92
12
  ! c
13

    
14
  use Io_module
15

    
16
  IMPLICIT NONE
17

    
18
  REAL(KREAL), parameter :: zero=0.d0,one=1.d0
19

    
20
  INTEGER(KINT), INTENT(IN) :: Natom
21
  real(KREAL) :: rx(Natom),ry(Natom),rz(Natom),rmass(Natom)
22
  real(KREAL) :: a,b,c,Tinert(3,3),CoordG(3)
23

    
24
  INTEGER(KINT) :: jover, I, J
25
  REAL(KREAL) :: Txx, Tyy, Tzz, Txy, Txz, Tyz, Txxi
26
  REAL(KREAL) :: Ryb, Rzc, Rxa, Rmj2, ryb2, rzc2, rxa2, Rmj
27

    
28

    
29
  if(natom.le.0) then
30
     if(IOOUT.gt.0) write(IOOUT,'(/2a/)')   &
31
          '  *** error, illegal array dimension(s) in tensor,', &
32
          ' return without action ***'
33
  else if(natom.eq.1) then
34
     a=rx(1)
35
     b=ry(1)
36
     c=rz(1)
37
     txx=zero
38
     tyy=zero
39
     tzz=zero
40
     txy=zero
41
     txz=zero
42
     tyz=zero
43
  else
44
     !c
45
     !c      first center of mass coordinates, then tensor elements
46
     !c
47
     call cmshft(natom,rx,ry,rz,rmass,a,b,c,0)
48
     CoordG(1)=a
49
     CoordG(2)=b
50
     CoordG(3)=c
51
1000 FORMAT(3F15.3)
52
     !c       WRITE(IOOUT,1000) (CoordG(i),i=1,3)
53
     jover=mod(natom,2)
54
     if(jover.eq.0) then
55
        txx=zero
56
        tyy=zero
57
        tzz=zero
58
        txy=zero
59
        txz=zero
60
        tyz=zero
61
     else
62
        rmj=rmass(1)
63
        ryb=b-ry(1)
64
        rzc=c-rz(1)
65
        tyz=-rmj*ryb*rzc
66
        rxa=a-rx(1)
67
        txz=(-rmj*rxa)*rzc
68
        txy=(-rmj*rxa)*ryb
69
        txx=rmj*((ryb*ryb)+(rzc*rzc))
70
        tyy=rmj*((rxa*rxa)+(rzc*rzc))
71
        tzz=rmj*((rxa*rxa)+(ryb*ryb))
72
     end if
73
!c
74
!c      force vectorization of inner loop if necessary (ibm-3090)
75
!c
76
     do j=jover+1,natom,2
77
        rmj=rmass(j)
78
        rmj2=rmass(j+1)
79
        ryb=b-ry(j)
80
        rzc=c-rz(j)
81
        txxi=txx+rmj*((ryb*ryb)+(rzc*rzc))
82
        ryb2=b-ry(j+1)
83
        rzc2=c-rz(j+1)
84
        txx=txxi+rmj2*((ryb2*ryb2)+(rzc2*rzc2))
85
        tyz=tyz-rmj*ryb*rzc-rmj2*ryb2*rzc2
86
        rxa=a-rx(j)
87
        rxa2=a-rx(j+1)
88
        txy=txy-(rmj*rxa)*ryb-(rmj2*rxa2)*ryb2
89
        txz=txz-(rmj*rxa)*rzc-(rmj2*rxa2)*rzc2
90
        tyy=tyy+rmj*((rxa*rxa)+(rzc*rzc))  &
91
             +rmj2*((rxa2*rxa2)+(rzc2*rzc2))
92
        tzz=tzz+rmj*((rxa*rxa)+(ryb*ryb))   &
93
             +rmj2*((rxa2*rxa2)+(ryb2*ryb2)) 
94
     END DO
95
  end if
96
  Tinert(1,1)=txx
97
  Tinert(1,2)=txy
98
  Tinert(1,3)=txz
99
  Tinert(2,1)=txy
100
  Tinert(2,2)=tyy
101
  Tinert(2,3)=tyz
102
  Tinert(3,1)=txz
103
  Tinert(3,2)=tyz
104
  Tinert(3,3)=tzz
105
  return
106
end subroutine tensor