31
32
33
34
35
36
37
38#include "implicit_f.inc"
39
40
41
42 my_real ,
INTENT(IN) :: dmin,dmax,nod_x,nod_y,nod_z,
43 . ax,ay,az,bx,by,bz,cx,cy,cz
45
46
47
48 my_real :: abx,aby,abz,acx,acy,acz,bcx,bcy,bcz,vecx,vecy,vecz,nx,ny,nz,
49 . ux,uy,uz,vx,vy,vz,wx,wy,wz,qx,qy,qz,qa_x,qa_y,qa_z,qb_x,qb_y,qb_z,
50 . qc_x,qc_y,qc_z,
area,a1,a2,sx,sy,sz,
alpha,
alpha2,d1,d2,d3,len,
norm
51
52
53
54 abx = bx - ax
55 aby = by - ay
56 abz = bz - az
57 acx = cx - ax
58 acy = cy - ay
59 acz = cz - az
60 bcx = cx - bx
61 bcy = cy - by
62 bcz = cz - bz
63 ux = nod_x - ax
64 uy = nod_y - ay
65 uz = nod_z - az
66
67 nx = aby*acz - abz*acy
68 ny = abz*acx - abx*acz
69 nz = abx*acy - aby*acx
70 norm = sqrt(nx*nx + ny*ny + nz*nz)
71
72 dist = abs(nx*ux + ny*uy + nz*uz) /
norm
73
74 IF (dist > dmax .or. dist < dmin) RETURN ! distance is outside of valid range
75
76
77
78
79 qx = nod_x - dist*nx /
norm
80 qy = nod_y - dist*ny /
norm
81 qz = nod_z - dist*nz /
norm
82 qa_x = ax - qx
83 qa_y = ay - qy
84 qa_z = az - qz
85 qb_x = bx - qx
86 qb_y = by - qy
87 qb_z = bz - qz
88 qc_x = cx - qx
89 qc_y = cy - qy
90 qc_z = cz - qz
91
92
93
94 sx = qa_y * qb_z - qa_z * qb_y
95 sy = qa_z * qb_x - qa_x * qb_z
96 sz = qa_x * qb_y - qa_y * qb_x
97 a1 = sqrt(sx*sx + sy*sy + sz*sz) * half
98 sx = qc_y * qa_z - qc_z * qa_y
99 sy = qc_z * qa_x - qc_x * qa_z
100 sz = qc_x * qa_y - qc_y * qa_x
101 a2 = sqrt(sx*sx + sy*sy + sz*sz) * half
103
104 IF (a1 + a2 >
area)
THEN
105
106
107 d1 = sqrt(ux**2 + uy**2 + uz**2)
108 vx = nod_x - bx
109 vy = nod_y - by
110 vz = nod_z - bz
111 d2 = sqrt(vx**2 + vy**2 + vz**2)
113 wx = nod_x - cx
114 wy = nod_y - cy
115 wz = nod_z - cz
116 d3 = sqrt(wx**2 + wy**2 + wz**2)
118
119 len = sqrt(abx**2 + aby**2 + abz**2)
120 alpha = (ux*abx + uy*aby + uz*abz) / len
122 qx = ax +
alpha * abx
123 qy = ay +
alpha * aby
124 qz = az +
alpha * abz
125 d1 = sqrt((nod_x - qx)**2 + (nod_y - qy)**2 + (nod_z - qz)**2)
127 END IF
128
129 len = sqrt(bcx**2 + bcy**2 + bcz**2)
130 alpha = (vx*bcx + vy*bcy + vz*bcz) / len
132 qx = bx +
alpha * bcx
133 qy = by +
alpha * bcy
134 qz = bz +
alpha * bcz
135 d2 = sqrt((nod_x - qx)**2 + (nod_y - qy)**2 + (nod_z - qz)**2)
137 END IF
138
139 len = sqrt(acx**2 + acy**2 + acz**2)
140 alpha = (ux*acx + uy*acy + uz*acz) / len
142 qx = ax +
alpha * acx
143 qy = ay +
alpha * acy
144 qz = az +
alpha * acz
145 d3 = sqrt((nod_x - qx)**2 + (nod_y - qy)**2 + (nod_z - qz)**2)
147 END IF
148
149 END IF
150
151 RETURN
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
subroutine area(d1, x, x2, y, y2, eint, stif0)