Statistiques
| Révision :

root / src / ConvertZmat_cart.f90

Historique | Voir | Annoter | Télécharger (4,57 ko)

1 1 pfleura2
!C================================================================
2 1 pfleura2
!C       Converti les positions Zmat en coordonnes cartesiennes
3 1 pfleura2
!C================================================================
4 1 pfleura2
5 1 pfleura2
        SUBROUTINE ConvertZmat_cart(iat,ind_zmat,val_zmat,x,y,z)
6 1 pfleura2
7 12 pfleura2
!----------------------------------------------------------------------
8 12 pfleura2
!  Copyright 2003-2014 Ecole Normale Supérieure de Lyon,
9 12 pfleura2
!  Centre National de la Recherche Scientifique,
10 12 pfleura2
!  Université Claude Bernard Lyon 1. All rights reserved.
11 12 pfleura2
!
12 12 pfleura2
!  This work is registered with the Agency for the Protection of Programs
13 12 pfleura2
!  as IDDN.FR.001.100009.000.S.P.2014.000.30625
14 12 pfleura2
!
15 12 pfleura2
!  Authors: P. Fleurat-Lessard, P. Dayal
16 12 pfleura2
!  Contact: optnpath@gmail.com
17 12 pfleura2
!
18 12 pfleura2
! This file is part of "Opt'n Path".
19 12 pfleura2
!
20 12 pfleura2
!  "Opt'n Path" is free software: you can redistribute it and/or modify
21 12 pfleura2
!  it under the terms of the GNU Affero General Public License as
22 12 pfleura2
!  published by the Free Software Foundation, either version 3 of the License,
23 12 pfleura2
!  or (at your option) any later version.
24 12 pfleura2
!
25 12 pfleura2
!  "Opt'n Path" is distributed in the hope that it will be useful,
26 12 pfleura2
!  but WITHOUT ANY WARRANTY; without even the implied warranty of
27 12 pfleura2
!
28 12 pfleura2
!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29 12 pfleura2
!  GNU Affero General Public License for more details.
30 12 pfleura2
!
31 12 pfleura2
!  You should have received a copy of the GNU Affero General Public License
32 12 pfleura2
!  along with "Opt'n Path". If not, see <http://www.gnu.org/licenses/>.
33 12 pfleura2
!
34 12 pfleura2
! Contact The Office of Technology Licensing, valorisation@ens-lyon.fr,
35 12 pfleura2
! for commercial licensing opportunities.
36 12 pfleura2
!----------------------------------------------------------------------
37 12 pfleura2
38 1 pfleura2
        use Path_module, only : Nat, KINT, KREAL
39 1 pfleura2
40 1 pfleura2
        IMPLICIT NONE
41 1 pfleura2
42 1 pfleura2
        integer(KINT) :: iat,n1,n2,n3
43 1 pfleura2
        real(KREAL)    :: x(nat),y(nat),z(nat)
44 1 pfleura2
        real(KREAL)    :: val_zmat(Nat,3)
45 1 pfleura2
        integer(KINT) :: ind_zmat(Nat,5)
46 1 pfleura2
47 1 pfleura2
        real(KREAL) ::  vx1,vy1,vz1,norm1
48 1 pfleura2
        real(KREAL) ::  vvx1,vvy1,vvz1,normv1
49 1 pfleura2
        real(KREAL) ::  vx2,vy2,vz2,norm2
50 1 pfleura2
        real(KREAL) ::  vvx2,vvy2,vvz2,normv2
51 2 pfleura2
        real(KREAL) ::  vx4, vy4, vz4
52 2 pfleura2
        real(KREAL) ::  d, a_val, a_dih
53 1 pfleura2
        real(KREAL) ::  a11_z1,a12_z1
54 1 pfleura2
        real(KREAL) ::  a11_z2,a12_z2
55 1 pfleura2
        real(KREAL) ::  a11_y,a12_y
56 1 pfleura2
57 1 pfleura2
58 1 pfleura2
59 1 pfleura2
!C ind_zmat(1) contient le numero de l'atome, (2) celui par rapport auquel on definit la distance...
60 1 pfleura2
61 1 pfleura2
          n1=ind_zmat(iat,2)
62 1 pfleura2
          n2=ind_zmat(iat,3)
63 1 pfleura2
          n3=ind_zmat(iat,4)
64 1 pfleura2
65 1 pfleura2
!          WRITE(*,*) iat,n1,n2,n3
66 1 pfleura2
67 1 pfleura2
          d=val_zmat(iat,1)
68 1 pfleura2
          a_val=val_zmat(iat,2)/180.*3.141592654
69 1 pfleura2
          a_dih=val_zmat(iat,3)/180.*3.141592654
70 1 pfleura2
71 1 pfleura2
!          WRITE(*,*) "d,val,di",d,a_val,a_dih,a_val*180./3.141592654
72 1 pfleura2
73 1 pfleura2
          CALL vecteur(n1,n2,x,y,z,vx1,vy1,vz1,norm1)
74 1 pfleura2
          CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
75 1 pfleura2
76 1 pfleura2
          vvx1=vx1
77 1 pfleura2
          vvy1=vy1
78 1 pfleura2
          vvz1=vz1
79 1 pfleura2
80 1 pfleura2
!c rotation autour de z de v1 et v2 de phi (a11_z1=cos(phi) et a12_z1=sin(phi) ) tq
81 1 pfleura2
!C  v1 soit dans le plan ????
82 1 pfleura2
83 1 pfleura2
          normv1=dsqrt(vvx1*vvx1+vvy1*vvy1)
84 1 pfleura2
85 1 pfleura2
          IF (normv1 .GE. 1.D-6) THEN
86 1 pfleura2
             a11_z1 = vvx1/normv1
87 1 pfleura2
             a12_z1 = vvy1/normv1
88 1 pfleura2
           ELSE
89 1 pfleura2
             a11_z1 = 1
90 1 pfleura2
             a12_z1 = 0
91 1 pfleura2
          END IF
92 1 pfleura2
93 1 pfleura2
             CALL rota_z(vx1,vy1,vz1,a11_z1,-a12_z1)
94 1 pfleura2
             CALL rota_z(vx2,vy2,vz2,a11_z1,-a12_z1)
95 1 pfleura2
96 1 pfleura2
97 1 pfleura2
!c rotation autour de y de v1 et v2 de theta (a11_y=cos(theta) et a12_y=sin(theta) ) tq
98 1 pfleura2
!C  v1 soit dans le plan ????
99 1 pfleura2
100 1 pfleura2
101 1 pfleura2
          IF (norm1 .GE. 1.D-8) THEN
102 1 pfleura2
             a11_y = vz1/norm1
103 1 pfleura2
             a12_y = vx1/norm1
104 1 pfleura2
          ELSE
105 1 pfleura2
             a11_y = 1
106 1 pfleura2
             a12_y = 0
107 1 pfleura2
          END IF
108 1 pfleura2
109 1 pfleura2
             CALL rota_y(vx1,vy1,vz1,a11_y,a12_y)
110 1 pfleura2
             CALL rota_y(vx2,vy2,vz2,a11_y,a12_y)
111 1 pfleura2
112 1 pfleura2
113 1 pfleura2
!c rotation autour de z de v1 et v2 de psi (a11_z2=cos(psi) et a12_z2=sin(psi) ) tq
114 1 pfleura2
!C  v1 soit dans le plan ????
115 1 pfleura2
116 1 pfleura2
          vvx2=vx2
117 1 pfleura2
          vvy2=vy2
118 1 pfleura2
          vvz2=vz2
119 1 pfleura2
          normv2=dsqrt(vvx2*vvx2+vvy2*vvy2)
120 1 pfleura2
121 1 pfleura2
          IF (normv2 .GE. 1.D-8) THEN
122 1 pfleura2
             a11_z2 = vvx2/normv2
123 1 pfleura2
             a12_z2 = vvy2/normv2
124 1 pfleura2
          ELSE
125 1 pfleura2
             a11_z2 = 1
126 1 pfleura2
             a12_z2 = 0
127 1 pfleura2
          END IF
128 1 pfleura2
129 1 pfleura2
             CALL rota_z(vx1,vy1,vz1,a11_z2,-a12_z2)
130 1 pfleura2
             CALL rota_z(vx2,vy2,vz2,a11_z2,-a12_z2)
131 1 pfleura2
132 1 pfleura2
133 1 pfleura2
!c calcul le vecteur de l atome dans la nouvelle orientation
134 1 pfleura2
135 1 pfleura2
          vx4=d*dsin(a_val)*dcos(a_dih)
136 1 pfleura2
          vy4=-d*dsin(a_val)*dsin(a_dih)
137 1 pfleura2
           vz4=d*cos(a_val)
138 1 pfleura2
139 1 pfleura2
!c calcul le vecteur de l atome
140 1 pfleura2
!c on tourne en sens invers
141 1 pfleura2
          CALL rota_z(vx4,vy4,vz4,a11_z2, a12_z2)
142 1 pfleura2
          CALL rota_y(vx4,vy4,vz4,a11_y ,-a12_y )
143 1 pfleura2
          CALL rota_z(vx4,vy4,vz4,a11_z1, a12_z1)
144 1 pfleura2
145 1 pfleura2
!c calcul l atome a partir de v4
146 1 pfleura2
          x(iat)=vx4+x(n1)
147 1 pfleura2
          y(iat)=vy4+y(n1)
148 1 pfleura2
          z(iat)=vz4+z(n1)
149 1 pfleura2
150 1 pfleura2
        END