Statistiques
| Révision :

root / src / bib_oper.f90

Historique | Voir | Annoter | Télécharger (6,27 ko)

1 12 pfleura2
!----------------------------------------------------------------------
2 12 pfleura2
!  Copyright 2003-2014 Ecole Normale Supérieure de Lyon,
3 12 pfleura2
!  Centre National de la Recherche Scientifique,
4 12 pfleura2
!  Université Claude Bernard Lyon 1. All rights reserved.
5 12 pfleura2
!
6 12 pfleura2
!  This work is registered with the Agency for the Protection of Programs
7 12 pfleura2
!  as IDDN.FR.001.100009.000.S.P.2014.000.30625
8 12 pfleura2
!
9 12 pfleura2
!  Authors: P. Fleurat-Lessard, P. Dayal
10 12 pfleura2
!  Contact: optnpath@gmail.com
11 12 pfleura2
!
12 12 pfleura2
! This file is part of "Opt'n Path".
13 12 pfleura2
!
14 12 pfleura2
!  "Opt'n Path" is free software: you can redistribute it and/or modify
15 12 pfleura2
!  it under the terms of the GNU Affero General Public License as
16 12 pfleura2
!  published by the Free Software Foundation, either version 3 of the License,
17 12 pfleura2
!  or (at your option) any later version.
18 12 pfleura2
!
19 12 pfleura2
!  "Opt'n Path" is distributed in the hope that it will be useful,
20 12 pfleura2
!  but WITHOUT ANY WARRANTY; without even the implied warranty of
21 12 pfleura2
!
22 12 pfleura2
!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 12 pfleura2
!  GNU Affero General Public License for more details.
24 12 pfleura2
!
25 12 pfleura2
!  You should have received a copy of the GNU Affero General Public License
26 12 pfleura2
!  along with "Opt'n Path". If not, see <http://www.gnu.org/licenses/>.
27 12 pfleura2
!
28 12 pfleura2
! Contact The Office of Technology Licensing, valorisation@ens-lyon.fr,
29 12 pfleura2
! for commercial licensing opportunities.
30 12 pfleura2
!----------------------------------------------------------------------
31 1 pfleura2
32 1 pfleura2
!================================================================
33 1 pfleura2
!       vecteur
34 1 pfleura2
!================================================================
35 1 pfleura2
36 1 pfleura2
         SUBROUTINE vecteur(n1,n2,x,y,z,vx,vy,vz,norm)
37 1 pfleura2
38 1 pfleura2
        use Path_module, only : NAt, KINT, KREAL
39 1 pfleura2
40 1 pfleura2
41 1 pfleura2
        integer(KINT) :: n1,n2
42 1 pfleura2
        real(KREAL) ::  x(Nat),y(Nat),z(Nat)
43 1 pfleura2
        real(KREAL) ::  vx,vy,vz,norm
44 1 pfleura2
45 1 pfleura2
        vx=x(n2)-x(n1)
46 1 pfleura2
        vy=y(n2)-y(n1)
47 1 pfleura2
        vz=z(n2)-z(n1)
48 1 pfleura2
49 1 pfleura2
        !norm=dsqrt( vx*vx + vy*vy + vz*vz )
50 1 pfleura2
            norm=sqrt( vx*vx + vy*vy + vz*vz )
51 1 pfleura2
52 1 pfleura2
!       write(6,*)
53 1 pfleura2
!       write(6,*) vx,vy,vz,norm
54 1 pfleura2
!       write(6,*)
55 1 pfleura2
56 1 pfleura2
      RETURN
57 1 pfleura2
      END
58 1 pfleura2
59 1 pfleura2
!================================================================
60 1 pfleura2
!       angle
61 1 pfleura2
!================================================================
62 1 pfleura2
63 1 pfleura2
         FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
64 1 pfleura2
65 1 pfleura2
66 12 pfleura2
        use Path_module, only :  Pi,KREAL
67 1 pfleura2
68 1 pfleura2
        real(KREAL) ::  v1x,v1y,v1z,norm1
69 1 pfleura2
        real(KREAL) ::  v2x,v2y,v2z,norm2
70 1 pfleura2
        real(KREAL) ::  angle,ps
71 1 pfleura2
72 1 pfleura2
!       write(6,*)
73 1 pfleura2
!       write(6,*) v1x,v1y,v1z,norm1
74 1 pfleura2
!       write(6,*) v2x,v2y,v2z,norm2
75 1 pfleura2
!       write(6,*)
76 1 pfleura2
        IF (abs(norm1) .LT. 1.D-4) THEN
77 12 pfleura2
            STOP 'Angle: norm1 egale 0'
78 1 pfleura2
        ELSE IF (abs(norm2) .LT. 1.D-4) THEN
79 12 pfleura2
            STOP 'Angle: norm2 egale 0'
80 1 pfleura2
        ELSE
81 1 pfleura2
          ps=v1x*v2x+v1y*v2y+v1z*v2z
82 1 pfleura2
          angle=dacos(ps/(norm1*norm2))*180./Pi
83 1 pfleura2
        ENDIF
84 1 pfleura2
85 1 pfleura2
      RETURN
86 1 pfleura2
      END
87 1 pfleura2
88 1 pfleura2
89 1 pfleura2
!================================================================
90 1 pfleura2
!       angle oriente (dihedre)
91 1 pfleura2
!================================================================
92 1 pfleura2
93 1 pfleura2
         FUNCTION angle_d(v1x,v1y,v1z,norm1, &
94 1 pfleura2
                          v2x,v2y,v2z,norm2, &
95 1 pfleura2
                          v3x,v3y,v3z,norm3)
96 1 pfleura2
97 12 pfleura2
        use Path_module, only :  Pi, KREAL
98 1 pfleura2
99 1 pfleura2
        real(KREAL) ::  v1x,v1y,v1z,norm1
100 1 pfleura2
        real(KREAL) ::  v2x,v2y,v2z,norm2
101 1 pfleura2
        real(KREAL) ::  v3x,v3y,v3z,norm3
102 1 pfleura2
        real(KREAL) ::  angle_d,ca,sa
103 1 pfleura2
104 1 pfleura2
!       write(6,*)
105 1 pfleura2
!       write(6,*) v1x,v1y,v1z,norm1
106 1 pfleura2
!       write(6,*) v2x,v2y,v2z,norm2
107 1 pfleura2
!       write(6,*) v3x,v3y,v3z,norm3
108 1 pfleura2
!       write(6,*)
109 1 pfleura2
        !Print *, 'Inside angle_d'
110 1 pfleura2
        IF (abs(norm1) .LT. 1.D-4) THEN
111 12 pfleura2
            STOP 'Angle_d: norm1 egale 0'
112 1 pfleura2
         ELSE IF (abs(norm2) .LT. 1.D-4) THEN
113 12 pfleura2
            STOP 'Angle_d: norm2 egale 0'
114 1 pfleura2
        ELSE IF (abs(norm3) .LT. 1.D-4) THEN
115 12 pfleura2
            STOP 'Angle_d: norm3 egale 0'
116 1 pfleura2
        ELSE
117 1 pfleura2
          ca=(v1x*v2x+v1y*v2y+v1z*v2z)/(norm1*norm2)
118 1 pfleura2
          sa=(v1x*(v2y*v3z-v2z*v3y) &
119 1 pfleura2
             -v1y*(v2x*v3z-v2z*v3x) &
120 1 pfleura2
             +v1z*(v2x*v3y-v2y*v3x)) &
121 1 pfleura2
             /(norm1*norm2*norm3)
122 1 pfleura2
           angle_d=datan2(sa,ca)*180./Pi
123 1 pfleura2
!         write(*,*) sa,ca,angle_d,norm1,norm2,norm3
124 1 pfleura2
        ENDIF
125 1 pfleura2
        !Print *, 'End of angle_d'
126 1 pfleura2
      RETURN
127 1 pfleura2
      END
128 1 pfleura2
129 1 pfleura2
!================================================================
130 1 pfleura2
!       produit vectoriel
131 1 pfleura2
!================================================================
132 1 pfleura2
133 2 pfleura2
       SUBROUTINE produit_vect(v1x,v1y,v1z, &
134 2 pfleura2
                               v2x,v2y,v2z, &
135 1 pfleura2
                               v3x,v3y,v3z,norm3)
136 1 pfleura2
137 7 pfleura2
        use Path_module, only :   KREAL
138 1 pfleura2
139 2 pfleura2
        real(KREAL) ::  v1x,v1y,v1z ! what do you do with norm1, norm2???
140 2 pfleura2
        real(KREAL) ::  v2x,v2y,v2z
141 1 pfleura2
        real(KREAL) ::  v3x,v3y,v3z,norm3
142 1 pfleura2
143 1 pfleura2
        v3x= v1y*v2z-v1z*v2y
144 1 pfleura2
        v3y=-v1x*v2z+v1z*v2x
145 1 pfleura2
            v3z= v1x*v2y-v1y*v2x
146 1 pfleura2
147 1 pfleura2
        norm3=dsqrt( v3x*v3x + v3y*v3y + v3z*v3z )
148 1 pfleura2
149 1 pfleura2
150 1 pfleura2
      RETURN
151 1 pfleura2
      END
152 1 pfleura2
153 1 pfleura2
!================================================================
154 1 pfleura2
!       rotation suivant l axe x de phi tq a11=cos(phi) a12=sin(phi)
155 1 pfleura2
!================================================================
156 1 pfleura2
157 1 pfleura2
       SUBROUTINE rota_x(v1x,v1y,v1z,a11,a12)
158 1 pfleura2
159 12 pfleura2
        use Path_module, only :  KREAL
160 1 pfleura2
161 1 pfleura2
        real(KREAL) ::  v1x,v1y,v1z
162 1 pfleura2
        real(KREAL) ::  v2x,v2y,v2z
163 1 pfleura2
        real(KREAL) ::  a11,a12
164 1 pfleura2
165 1 pfleura2
        v2x=  v1x
166 1 pfleura2
        v2y=  a11*v1y - a12*v1z
167 1 pfleura2
        v2z=  a12*v1y + a11*v1z
168 1 pfleura2
169 1 pfleura2
170 1 pfleura2
        v1x=v2x
171 1 pfleura2
        v1y=v2y
172 1 pfleura2
        v1z=v2z
173 1 pfleura2
174 1 pfleura2
175 1 pfleura2
      RETURN
176 1 pfleura2
      END
177 1 pfleura2
178 1 pfleura2
179 1 pfleura2
!================================================================
180 1 pfleura2
!       rotation suivant l axe y de phi tq a11=cos(phi) a12=sin(phi)
181 1 pfleura2
!================================================================
182 1 pfleura2
183 1 pfleura2
       SUBROUTINE rota_y(v1x,v1y,v1z,a11,a12)
184 1 pfleura2
185 12 pfleura2
        use Path_module, only :   KREAL
186 1 pfleura2
187 1 pfleura2
        real(KREAL) ::  v1x,v1y,v1z
188 1 pfleura2
        real(KREAL) ::  v2x,v2y,v2z
189 1 pfleura2
        real(KREAL) ::  a11,a12
190 1 pfleura2
191 1 pfleura2
        v2x=  a11*v1x - a12*v1z
192 1 pfleura2
        v2y=  v1y
193 1 pfleura2
        v2z=  a12*v1x + a11*v1z
194 1 pfleura2
195 1 pfleura2
196 1 pfleura2
        v1x=v2x
197 1 pfleura2
        v1y=v2y
198 1 pfleura2
        v1z=v2z
199 1 pfleura2
200 1 pfleura2
201 1 pfleura2
        RETURN
202 1 pfleura2
        END
203 1 pfleura2
204 1 pfleura2
205 1 pfleura2
!================================================================
206 1 pfleura2
!       rotation suivant l axe z de phi tq a11=cos(phi) a12=sin(phi)
207 1 pfleura2
!================================================================
208 1 pfleura2
209 1 pfleura2
       SUBROUTINE rota_z(v1x,v1y,v1z,a11,a12)
210 1 pfleura2
211 12 pfleura2
        use Path_module, only :   KREAL
212 1 pfleura2
213 1 pfleura2
        real(KREAL) ::  v1x,v1y,v1z
214 1 pfleura2
        real(KREAL) ::  v2x,v2y,v2z
215 1 pfleura2
        real(KREAL) ::  a11,a12
216 1 pfleura2
217 1 pfleura2
        v2x=  a11*v1x - a12*v1y
218 1 pfleura2
        v2y=  a12*v1x + a11*v1y
219 1 pfleura2
        v2z=  v1z
220 1 pfleura2
221 1 pfleura2
222 1 pfleura2
        v1x=v2x
223 1 pfleura2
        v1y=v2y
224 1 pfleura2
        v1z=v2z
225 1 pfleura2
226 1 pfleura2
        RETURN
227 1 pfleura2
        END