38 SUBROUTINE m5in3(PM,MAT,M151_ID,DETONATORS,TB,IPARG,X,IX,NIX)
48#include "implicit_f.inc"
59#include "vect01_c.inc"
65 INTEGER :: MAT(*),IPARG(NPARG),NIX,IX(NIX,*)
66 INTEGER,
INTENT(IN) :: M151_ID
67 my_real :: pm(npropm,nummat), tb(*), x(3, *)
72 INTEGER I, N, MTL,IOPT, NPE2
73 INTEGER NDETPS, NDETSG, NECRAN, NDETPL, NDETCORD, NDETPS_NO_SHADOW
74LOGICAL HAS_DETONATOR(MVSIZ)
76 . x1(mvsiz), x2(mvsiz), x3(mvsiz), x4(mvsiz),
77 . x5(mvsiz), x6(mvsiz), x7(mvsiz), x8(mvsiz),
78 . y1(mvsiz), y2(mvsiz), y3(mvsiz), y4(mvsiz),
79 . y5(mvsiz), y6(mvsiz), y7(mvsiz), y8(mvsiz),
80 . z1(mvsiz), z2(mvsiz), z3(mvsiz), z4(mvsiz),
81 . z5(mvsiz), z6(mvsiz), z7(mvsiz), z8(mvsiz),
82 . xc(mvsiz), yc(mvsiz), zc(mvsiz),
83 . bt(mvsiz), dl(mvsiz),
84 . alt , xlp, ylp, zlp, xlp1, ylp1, zlp1,
86 . yl1 , zl1, xl2, yl2, zl2, ps1, ps2,
87 . dl1, dl2, s1, s2, s3,
88 . nx, ny, nz, nn, vdet,vdet2
89 INTEGER :: NODE1, NODE2, NODE3, NODE4, NODE5, NODE6, NODE7, NODE8, II
90 INTEGER :: GRNOD_ID, INOD, NNOD, NODE_ID
91 INTEGER :: I_SHADOW_FLAG
94 ndetps = detonators%N_DET_POINT
95 ndetsg = detonators%N_DET_LINE
96 necran = detonators%N_DET_WAVE_SHAPER
97 ndetpl = detonators%N_DET_PLANE
98 ndetcord = detonators%N_DET_CORD
100 ndetps = detonators%N_DET_POINT
101 ndetsg = detonators%N_DET_LINE
102 necran = detonators%N_DET_WAVE_SHAPER
103 ndetpl = detonators%N_DET_PLANE
104 ndetcord = detonators%N_DET_CORD
109 DO i = 1, detonators%N_DET_POINT
110 i_shadow_flag = detonators%POINT(i)%SHADOW
111 IF(i_shadow_flag == 0)
THEN
112 ndetps_no_shadow = ndetps_no_shadow + 1
114 ndetps_shadow = ndetps_shadow + 1
120 IF(detonators%N_DET - ndetps_shadow > 0)
THEN
195 has_detonator(i)=.false.
197 IF(iparg(28) == 4)
THEN
198 xc(i)=fourth*(x1(i)+x2(i)+x3(i)+x4(i))
199 yc(i)=fourth*(y1(i)+y2(i)+y3(i)+y4(i))
200 zc(i)=fourth*(z1(i)+z2(i)+z3(i)+z4(i))
202 xc(i)=one_over_8*(x1(i)+x2(i)+x3(i)+x4(i)+x5(i)+x6(i)+x7(i)+x8(i))
203 yc(i)=one_over_8*(y1(i)+y2(i)+y3(i)+y4(i)+y5(i)+y6(i)+y7(i)+y8
204 zc(i)=one_over_8*(z1(i)+z2(i)+z3(i)+z4(i)+z5(i)+z6(i)+z7(i)+z8(i))
219 i_shadow_flag = detonators%POINT(n)%SHADOW
220 IF(i_shadow_flag /= 0)cycle
221 mtl=detonators%POINT(n)%MAT
222 grnod_id=detonators%POINT(n)%GRNOD_ID
223 IF(mtl == 0 .OR. mtl == mat(i) .OR. mtl == m151_id)
THEN
225 IF(grnod_id == 0)
THEN
226 alt=detonators%POINT(n)%TDET
227 xlp=detonators%POINT(n)%XDET
228 ylp=detonators%POINT(n)%YDET
229 zlp=detonators%POINT(n)%ZDET
230 dl(i) =(xc(i)-xlp)**2+(yc(i)-ylp)**2+(zc(i)-zlp)**2
232 bt(i) =alt+dl(i)/pm(38,mat(i))
233 IF(bt(i) < abs(tb(i))) tb(i)=-bt(i)
234 has_detonator(i)=.true.
237 nnod = detonators%POINT(n)%NNOD
238 alt=detonators%POINT(n)%TDET
239 has_detonator(i)=.true.
241 node_id=detonators%POINT(n)%NODLIST(inod)
245 dl(i) =(xc(i)-xlp)**2+(yc(i)-ylp)**2+(zc(i)-zlp)**2
247 bt(i) =alt+dl(i)/pm(38,mat(i))
248 IF(bt(i) < abs(tb(i))) tb(i)=-bt(i)
261 alt=detonators%LINE(n)%TDET
262 mtl=detonators%LINE(n)%MAT
263 xlp1=detonators%LINE(n)%XDET_1
264 ylp1=detonators%LINE(n)%YDET_1
265 zlp1=detonators%LINE(n)%ZDET_1
266 xlp2=detonators%LINE(n)%XDET_2
267 ylp2=detonators%LINE(n)%YDET_2
268 zlp2=detonators%LINE(n)%ZDET_2
270 IF(mtl == 0 .OR. mtl == mat(i) .OR. mtl == m151_id)
THEN
280 ps1 =xl1*xl0+yl1*yl0+zl1*zl0
281 ps2 =xl2*xl0+yl2*yl0+zl2*zl0
282 IF(ps1*ps2 > zero)
THEN
283 dl1 =sqrt(xl1**2+yl1**2+zl1**2)
284 dl2 =sqrt(xl2**2+yl2**2+zl2**2)
287 s1 =yl1*zl0 - zl1*yl0
288 s2 =zl1*xl0 - xl1*zl0
289 s3 =xl1*yl0 - yl1*xl0
290 dl(i)=sqrt((s1**2+s2**2+s3**2)/(xl0**2+yl0**2+zl0**2))
292 bt(i) =alt+dl(i)/pm(38,mat(i))
293 IF(bt(i) < abs(tb(i))) tb(i)=-bt(i)
294 has_detonator(i)=.true.
305 alt=detonators%PLANE(n)%TDET
306 mtl=detonators%PLANE(n)%MAT
307 xlp=detonators%PLANE(n)%XDET
308 ylp=detonators%PLANE(n)%YDET
309 zlp=detonators%PLANE(n)%ZDET
310 nx=detonators%PLANE(n)%NX
311 ny=detonators%PLANE(n)%NY
312 nz=detonators%PLANE(n)%NZ
313 nn=sqrt(nx**2+ny**2+nz**2)
315 dl1=xlp*nx + ylp*ny + zlp*nz
318 IF(mtl == 0 .OR. mtl == mat(i) .OR. mtl == m151_id)
THEN
323 dl(i) = (xc(i)-xlp)*nx + (yc(i)-ylp)*ny + (zc(i)-zlp)*nz
326 bt(i) =alt+dl(i)/pm(38,mat(i))
327 IF(bt(i) < abs(tb(i))) tb(i)=-bt(i)
328 has_detonator(i)=.true.
338 IF(ndetcord /= 0)
THEN
340 alt = detonators%CORD(n)%TDET
341 mtl = detonators%CORD(n)%MAT
342 vdet2 = detonators%CORD(n)%VDET
343 iopt = detonators%CORD(n)%IOPT
344 npe2 = detonators%CORD(n)%NUMNOD
347 IF(vdet == zero)vdet=pm(38,mat(1))
348 IF(mtl /= mat(1) .AND. mtl /= 0 .AND. mtl /= m151_id) cycle
350 CALL detcord(detonators%CORD(n),x,xc,yc,zc,vdto,vdet2,alt,bt,tb,has_detonator,iopt)