37
38
39
42
43
44
45#include "implicit_f.inc"
46
47
48
49#include "com04_c.inc"
50#include "com08_c.inc"
51
52
53
54 INTEGER ,INTENT(IN) :: IFUNC
57 my_real ,
DIMENSION(3) ,
INTENT(IN) :: a,b,c,n1,dir
58 TYPE (TTABLE), DIMENSION(NTABLE) ,INTENT(IN) :: TABLE
60
61
62
63 INTEGER :: NPT
64 my_real :: a11,a12,a21,a22,b1,b2,det,
alpha,beta,gamma,f1,f2,r,s,
65 . r1,r2,r3,rmax,p1,p2,p3,dydx
66 my_real,
DIMENSION(3) :: ab,ac,an,p,ap,bp,cp
68
69
70
71
72
73
74
75
76
77 ab(1) = b(1) - a(1)
78 ab(2) = b(2) - a(2)
79 ab(3) = b(3) - a(3)
80 ac(1) = c(1) - a(1)
81 ac(2) = c(2) - a(2)
82 ac(3) = c(3) - a(3)
83 an(1) = n1(1) - a(1)
84 an(2) = n1(2) - a(2)
85 an(3) = n1(3) - a(3)
87 beta = dir(2)
88 gamma = dir(3)
89 npt = SIZE(table(ifunc)%X(1)%VALUES)
90 rmax = table(ifunc)%X(1)%VALUES(npt) * xfacr
91 p1 = zero
92 p2 = zero
93 p3 = zero
94
95 IF (
alpha /= zero)
THEN
98 b1 = an(2) - f1 * an(1)
99 b2 = an(3) - f2 * an(1)
100 a11 = ab(2) - f1 * ab(1)
101 a12 = ac(2) - f1 * ac(1)
102 a21 = ab(3) - f2 * ab(1)
103 a22 = ac(3) - f2 * ac(1)
104 ELSE IF (beta /= zero) THEN
106 f2 = gamma / beta
107 b1 = an(1) - f1 * an(2)
108 b2 = an(3) - f2 * an(2)
109 a11 = ab(1) - f1 * ab(2)
110 a12 = ac(1) - f1 * ac(2)
111 a21 = ab(3) - f2 * ab(2)
112 a22 = ac(3) - f2 * ac(2)
113 ELSE IF (gamma /= zero) THEN
115 f2 = beta / gamma
116 b1 = an(1) - f1 * an(3)
117 b2 = an(2) - f2 * an(3)
118 a11 = ab(1) - f1 * ab(3)
119 a12 = ac(1) - f1 * ac(3)
120 a21 = ab(2) - f2 * ab(3)
121 a22 = ac(2) - f2 * ac(3)
122 ELSE
123 f1 = 0
124 f2 = 0
125 b1 = 0
126 b2 = 0
127 a11 = 0
128 a12 = 0
129 a21 = 0
130 a22 = 0
131 END IF
132
133 det = a11*a22 - a12*a21
134 IF(det .NE. zero) THEN
135 r = (a22 * b1 - a12 * b2) / det
136 s = (a11 * b2 - a21 * b1) / det
137 ELSE
138 r = 0
139 s = 0
140 END IF
141
142 p(1)= a(1) + r*ab(1) + s*ac(1)
143 p(2)= a(2) + r*ab(2) + s*ac(2)
144 p(3)= a(3) + r*ab(3) + s*ac(3)
145 ap(1) = p(1) - a(1)
146 ap(2) = p(2) - a(2)
147 ap(3) = p(3) - a(3)
148 bp(1) = p(1) - b(1)
149 bp(2) = p(2) - b(2)
150 bp(3) = p(3) - b(3)
151 cp(1) = p(1) - c(1)
152 cp(2) = p(2) - c(2)
153 cp(3) = p(3) - c(3)
154 r1 = sqrt(ap(1)**2 + ap(2)**2 + ap(3)**2)
155 r2 = sqrt(bp(1)**2 + bp(2)**2 + bp(3)**2)
156 r3 = sqrt(cp(1)**2 + cp(2)**2 + cp(3)**2)
157 cosp = (dir(1) * ap(1) + dir(2) * ap(2) + dir(3) * ap(3)) /
max(r1,em20)
158 sinp =
max(sqrt(one - cosp**2), em20)
159 p1 = zero
160 p2 = zero
161 p3 = zero
162 xx(2) = tt / xfact
163
164
165 cosp = (dir(1) * ap(1) + dir(2) * ap(2) + dir(3) * ap(3)) /
max(r1,em20)
166 sinp =
max(sqrt(one - cosp**2), em20)
167 r1 = r1 * sinp
168 IF (r1 <= rmax) THEN
169 xx(1) = r1/xfacr
171 END IF
172
173 cosp = (dir(1) * bp(1) + dir(2) * bp(2) + dir(3) * bp(3)) /
max(r2,em20)
174 sinp =
max(sqrt(one - cosp**2), em20)
175 r2 = r2 * sinp
176 IF (r2 <= rmax) THEN
177 xx(1) = r2/xfacr
179 END IF
180
181 cosp = (dir(1) * cp(1) + dir(2) * cp(2) + dir(3) * cp(3)) /
max(r3,em20)
182 sinp =
max(sqrt(one - cosp**2), em20)
183 r3 = r3 * sinp
184 IF (r3 <= rmax) THEN
185 xx(1) = r3/xfacr
187 END IF
188 press = (p1 + p2 + p3) * third
189 IF (press > zero) THEN
190
191 nx = ab(2) * ac(3) - ab(3) * ac(2)
192 ny = ab(3) * ac(1) - ab(1) * ac(3)
193 nz = ab(1) * ac(2) - ab(2) * ac(1)
194 norm = sqrt(nx**2 + ny**2 + nz**2)
195 cosp = abs(nx *
alpha + ny * beta + nz * gamma) /
norm
196 press = press * cosp
197 END IF
198
199 RETURN
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB