Statistiques
| Révision :

root / src / ConvXyzMixed.f90

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

1
SUBROUTINE ConvXyzMixed(nb,ncart,x,y,z,ind_zmat,val_zmat)
2

    
3
!----------------------------------------------------------------------
4
!  Copyright 2003-2014 Ecole Normale Supérieure de Lyon, 
5
!  Centre National de la Recherche Scientifique,
6
!  Université Claude Bernard Lyon 1. All rights reserved.
7
!
8
!  This work is registered with the Agency for the Protection of Programs 
9
!  as IDDN.FR.001.100009.000.S.P.2014.000.30625
10
!
11
!  Authors: P. Fleurat-Lessard, P. Dayal
12
!  Contact: optnpath@gmail.com
13
!
14
! This file is part of "Opt'n Path".
15
!
16
!  "Opt'n Path" is free software: you can redistribute it and/or modify
17
!  it under the terms of the GNU Affero General Public License as
18
!  published by the Free Software Foundation, either version 3 of the License,
19
!  or (at your option) any later version.
20
!
21
!  "Opt'n Path" is distributed in the hope that it will be useful,
22
!  but WITHOUT ANY WARRANTY; without even the implied warranty of
23
!
24
!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25
!  GNU Affero General Public License for more details.
26
!
27
!  You should have received a copy of the GNU Affero General Public License
28
!  along with "Opt'n Path". If not, see <http://www.gnu.org/licenses/>.
29
!
30
! Contact The Office of Technology Licensing, valorisation@ens-lyon.fr,
31
! for commercial licensing opportunities.
32
!----------------------------------------------------------------------
33

    
34
  IMPLICIT NONE
35

    
36
  INTEGER, PARAMETER :: KINT=KIND(1)
37
  INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
38

    
39

    
40

    
41
  INTEGER(KINT), INTENT(IN) :: nb,ncart,ind_zmat(nb,5)
42
  REAL(KREAL), INTENT(IN) :: x(Nb),y(nb),z(nb)
43
  REAL(KREAL), INTENT(INOUT) :: val_zmat(nb,3)
44

    
45
  integer(KINT) :: n1,n2,n3,n4
46
  integer(KINT) :: i, ibeg
47

    
48
  real(KREAL) ::  vx1,vy1,vz1,norm1
49
  real(KREAL) ::  vx2,vy2,vz2,norm2
50
  real(KREAL) ::  vx3,vy3,vz3,norm3
51
  real(KREAL) ::  vx4,vy4,vz4,norm4
52
  real(KREAL) ::  vx5,vy5,vz5,norm5
53
  real(KREAL) ::  val,val_d
54

    
55
  INTERFACE
56
     function valid(string) result (isValid)
57
       CHARACTER(*), intent(in) :: string
58
       logical                  :: isValid
59
     END function VALID
60

    
61
     FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
62
        use Path_module, only :  Pi,KINT, KREAL
63
       real(KREAL) ::  v1x,v1y,v1z,norm1
64
       real(KREAL) ::  v2x,v2y,v2z,norm2
65
       real(KREAL) ::  angle
66
     END FUNCTION ANGLE
67

    
68
     FUNCTION SinAngle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
69
        use Path_module, only :  Pi,KINT, KREAL
70
       real(KREAL) ::  v1x,v1y,v1z,norm1
71
       real(KREAL) ::  v2x,v2y,v2z,norm2
72
       real(KREAL) ::  SinAngle
73
     END FUNCTION SINANGLE
74

    
75

    
76
     FUNCTION angle_d(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2,v3x,v3y,v3z,norm3)
77
        use Path_module, only :  Pi,KINT, KREAL
78
       real(KREAL) ::  v1x,v1y,v1z,norm1
79
       real(KREAL) ::  v2x,v2y,v2z,norm2
80
       real(KREAL) ::  v3x,v3y,v3z,norm3
81
       real(KREAL) ::  angle_d,ca,sa
82
     END FUNCTION ANGLE_D
83

    
84
  END INTERFACE
85

    
86
  DO I=1,NCart
87
     val_zmat(I,1)=x(ind_zmat(I,1))
88
     val_zmat(I,2)=y(ind_zmat(I,1))
89
     val_zmat(I,3)=z(ind_zmat(I,1))
90
  END DO
91

    
92
  SELECT CASE (Ncart)
93
     CASE (1)
94
        i=2
95
        n1=ind_zmat(i,1)
96
        n2=ind_zmat(i,2)
97

    
98
        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
99
     !           write(*,11) n1,n2,norm1
100

    
101
        val_zmat(i,1)=norm1
102
        val_zmat(i,2)=0.0
103
        val_zmat(i,3)=0.0
104
     i=3
105
     n1=ind_zmat(i,1)
106
     n2=ind_zmat(i,2)
107
     n3=ind_zmat(i,3)
108

    
109
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
110

    
111
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
112
     val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
113

    
114
     val_zmat(i,1)=norm1
115
     val_zmat(i,2)=val
116
     val_zmat(i,3)=0.0
117

    
118
     Ibeg=4
119
     CASE (2)
120

    
121
     i=3
122
     n1=ind_zmat(i,1)
123
     n2=ind_zmat(i,2)
124
     n3=ind_zmat(i,3)
125

    
126
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
127

    
128
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
129
     val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
130

    
131
     val_zmat(i,1)=norm1
132
     val_zmat(i,2)=val
133
     val_zmat(i,3)=0.0
134
     Ibeg=4
135
  CASE DEFAULT
136
     Ibeg=Ncart+1
137
  END SELECT
138
  DO i=IBeg,nb
139
     !        write(*,*) 'Debut procedure Xyz_Zmat4'
140
     n1=ind_zmat(i,1)
141
     n2=ind_zmat(i,2)
142
     n3=ind_zmat(i,3)
143
     n4=ind_zmat(i,4)
144

    
145
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
146

    
147
     !        write(*,*) 'Debut procedure Xyz_Zmat42'
148
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
149
     val=angle(vx1,vy1,vz1,norm1, vx2,vy2,vz2,norm2)
150

    
151
     !        write(*,*) 'Debut procedure Xyz_Zmat43'
152
     CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
153
     CALL produit_vect(vx1,vy1,vz1,vx2,vy2,vz2,vx4,vy4,vz4,norm4)
154
     CALL produit_vect(vx3,vy3,vz3,vx2,vy2,vz2,vx5,vy5,vz5,norm5)
155
     val_d=angle_d(vx4,vy4,vz4,norm4, vx5,vy5,vz5,norm5,vx2,vy2,vz2,norm2)
156

    
157
     !               write(*,11) n1,n2,norm1,n3,val,n4,val_d
158
!11   format (2(1x,i3),1x,f8.4,2(1x,i3,1x,f8.3))
159

    
160
     val_zmat(i,1)=norm1
161
     val_zmat(i,2)=val
162
     val_zmat(i,3)=val_d
163

    
164
  END DO
165
  RETURN
166
END SUBROUTINE ConvXyzMixed