64
65
66
67#ifndef HYPERMESH_LIB
69#endif
71
72
73
74#include "implicit_f.inc"
75
76
77
78#include "mvsiz_p.inc"
79
80
81
82#include "units_c.inc"
83#include "com04_c.inc"
84#include "vect07_c.inc"
85#include "scr06_c.inc"
86
87
88
89 INTEGER NMN, NRTM, NSN, NOINT,I_STOK,MULTIMP,ISTF,IGAP,
90 . INACTI,MVOISN(4,*),IPARTNS(*),IPEN0,IRTSE(*),
91 . IS2SE(*) ,IS2PT(*),NRTSE ,NSNE
92 INTEGER IRECT(4,*),NSV(*),NSEG(*),MWA(*)
93 INTEGER CAND_E(*),CAND_N(*),MSR(*),MAXSIZ,IDDLEVEL
94 INTEGER ITAB(*),NBINFLG(*),MBINFLG(*),ILEV,MSEGTYP(*)
95 INTEGER IXS(*), IXS10(6,*), IXS16(8,*), IXS20(12,*)
96
97 my_real ,
INTENT(IN) :: dgapload
99 . stf(*),stfn(*),x(3,*),xyzm(6,*),gap_s(*),gap_m(*),
100 . dist,bumult,gap,tzinf,maxbox,minbox,gapmin,gapmax,
101 . gap_s_l(*),gap_m_l(*),marge,gap_n(12,*),penmax,xfic(3,*)
102 INTEGER ID
103 LOGICAL, INTENT(in) :: FLAG_REMOVED_NODE
104 INTEGER, INTENT(in) :: S_KREMNODE
105 INTEGER, INTENT(in) :: S_REMNODE
106 INTEGER, DIMENSION(S_KREMNODE), INTENT(in) :: KREMNODE
107 INTEGER, DIMENSION(S_REMNODE), INTENT(in) :: REMNODE
108 CHARACTER(LEN=NCHARTITLE) :: TITR
109 INTEGER, DIMENSION(MVSIZ), INTENT(INOUT) ::PROV_N,PROV_E
110 INTEGER, DIMENSION(MVSIZ), INTENT(INOUT) :: IX1,IX2,IX3,IX4,NSVG
111 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: x1,x2,x3,x4
112 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: y1,y2,y3,y4
113 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: z1,z2,z3,z4
114 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: xi,yi,zi,stif
115 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: x0,y0,z0
116 my_real,
DIMENSION(MVSIZ),
INTENT(IN) :: n11,n21,n31,pene
117 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: nx1,ny1
118 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: nx2,ny2,nz2
119 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: nx3,ny3,nz3
120 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: nx4,ny4,nz4
121 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: p1,p2,p3,p4
122 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: lb1,lb2,lb3,lb4
123 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) :: lc1,lc2,lc3,lc4
124
125
126
127 INTEGER I, J, L, N1, N2, N3, N4, I_AMAX,I_MEM,N_SOL
128 INTEGER I_ADD, ADESTK, NB_NC, NB_EC, ADNSTK, IBID
129 INTEGER IP1, IP2, IP21, IP22, IP31,J_STOK,I_BID,NB_N_B,
130 + NPT_E,NSN0,LWORK,NUMNODT
131
133 . dx1,dy1,dz1,
134 . dx3,dy3,dz3,
135 . dx4,dy4,dz4,
136 . dx6,dy6,dz6,
137 . dd1,dd2,dd3,dd4,dd,dd0,xmin,ymin,zmin,
138 . xmax,
ymax,zmax,tzinf0,minbox0,maxbox0,gapsmax,
139 . bid,tzinf_st,marge_st,gapv(mvsiz),dd_st,d_max,pensol,d_moy
140 INTEGER ,
141 . DIMENSION(:),ALLOCATABLE :: IWORK
143 . DIMENSION(:,:),ALLOCATABLE :: xten
144 INTEGER, DIMENSION(:), ALLOCATABLE :: TAG_REMOVED_NODE
145
146 ALLOCATE( tag_removed_node(numnod) )
147 tag_removed_node(1:numnod) = 0
148 gapmax=ep30
149 gapmin=zero
150
151 nsn0 = nsn - nsne
152 IF (nsne >0) THEN
153 numnodt =numnod+nsne
154 ALLOCATE(xten(3,numnodt))
155 xten=zero
156 xten(1:3,1:numnod) = x(1:3,1:numnod)
157 npt_e = 3
158 CALL i24xfic_ini(nrtse ,irtse ,nsne ,is2se ,is2pt ,
159 + nsn ,nsv ,x ,xfic ,npt_e )
160 xten(1:3,numnod+1:numnodt) = xfic(1:3,1:nsne)
161 maxsiz =
max(numnodt,nrtm+100)
162 ip1 = 1
163 ip2 = ip1+maxsiz
164
165 ip21= ip2+3*maxsiz
166 ip22= ip21+numnodt
167 ip31= ip22+numnodt
168
169 lwork = ip31 + 2000
170 ALLOCATE(iwork(lwork))
171 END IF
172
173
174
175
176
177
178 dd=zero
179 dd_st=zero
180 pensol=ep30
181 d_moy = zero
182 n_sol = 0
183 DO 10 l=1,nrtm
184
185 n1=irect(1,l)
186 n2=irect(2,l)
187 n3=irect(3,l)
188 n4=irect(4,l)
189
190 dx1=(x(1,n1)-x(1,n2))
191 dy1=(x(2,n1)-x(2,n2))
192 dz1=(x(3,n1)-x(3,n2))
193 dd1=sqrt(dx1**2+dy1**2+dz1**2)
194
195 dx3=(x(1,n1)-x(1,n4))
196 dy3=(x(2,n1)-x(2,n4))
197 dz3=(x(3,n1)-x(3,n4))
198 dd2=sqrt(dx3**2+dy3**2+dz3**2)
199
200 dx4=(x(1,n3)-x(1,n2))
201 dy4=(x(2,n3)-x(2,n2))
202 dz4=(x(3,n3)-x(3,n2))
203 dd3=sqrt(dx4**2+dy4**2+dz4**2)
204
205 dx6=(x(1,n4)-x(1,n3))
206 dy6=(x(2,n4)-x(2,n3))
207 dz6=(x(3,n4)-x(3,n3))
208 dd4=sqrt(dx6**2+dy6**2+dz6**2)
209 dd=dd+ (dd1+dd2+dd3+dd4)
210
211 IF (msegtyp(l)==0.OR.msegtyp(l)>nrtm) THEN
212 d_max=
max(dd1,dd2,dd3,dd4)
213 d_max=
min(d_max,gap_n(1,l))
214
215 gap_n(1,l)=d_max
216 dd_st=
max(dd_st,d_max)
217 n_sol = n_sol + 1
218 d_moy = d_moy + d_max
219 END IF
220
221 10 CONTINUE
222
223
224
225 dd0=dd/nrtm/four
226 dd=dd0
227
228
229 marge = bumult*dd
230
231 tzinf = marge + gap + dgapload
232
233 marge_st = bmul0*dd
234
235 IF (inacti /=0 ) THEN
236
237 IF (penmax /= zero) THEN
238 marge_st =
max(marge_st,penmax)
239#ifndef HYPERMESH_LIB
240 IF (iddlevel == 1 ) WRITE(iout,2400) penmax
241#endif
242 ELSE
243 IF (n_sol>0) THEN
244 d_moy = d_moy/n_sol
245 dd_st = d_moy
246 END IF
247 pensol =
min(half*dd_st,pensol)
248 marge_st =
max(marge_st,pensol)
249
250 pensol =
max(pensol,half*gap)
251 penmax = pensol
252#ifndef HYPERMESH_LIB
253 IF (iddlevel == 1 ) WRITE(iout,2500) penmax
254#endif
256 ELSE
257
258 penmax =
max(pensol,gap)
259 END IF
260
261 IF(iddlevel==0) marge_st = marge
262 tzinf_st = marge_st + gap + dgapload
263 bid = four_over_5*dd
264 IF (inacti/=7.AND.tzinf>bid) THEN
265 ibid = nint(tzinf/dd0)
266 ibid =(2*ibid+4)*ibid*2
267 ENDIF
268
269
270 maxbox= half*(dd + 2*tzinf)
271 minbox= half*maxbox
272 tzinf0 = tzinf
273 minbox0 = minbox
274 maxbox0 = maxbox
275
276 dist = zero
277
278
279
280 xmin=ep30
281 xmax=-ep30
282 ymin=ep30
284 zmin=ep30
285 zmax=-ep30
286
287 DO 20 i=1,nmn
288 j=msr(i)
289 xmin=
min(xmin,x(1,j))
290 ymin=
min(ymin,x(2,j))
291 zmin=
min(zmin,x(3,j))
292 xmax=
max(xmax,x(1,j))
294 zmax=
max(zmax,x(3,j))
295 20 CONTINUE
296 xmin=xmin-tzinf_st
297 ymin=ymin-tzinf_st
298 zmin=zmin-tzinf_st
299 xmax=xmax+tzinf_st
301 zmax=zmax+tzinf_st
302 DO 25 i=1,nsn0
303 j=nsv(i)
304 xmin=
min(xmin,x(1,j))
305 ymin=
min(ymin,x(2,j))
306 zmin=
min(zmin,x(3,j))
307 xmax=
max(xmax,x(1,j))
309 zmax=
max(zmax,x(3,j))
310 25 CONTINUE
311
312
313
314
315 nb_n_b = 1
316 i_mem = 0
317
318
319 100 CONTINUE
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349 IF (nsne >0) THEN
350 iwork(ip31) = 0
351 iwork(ip31+1) = 0
352 iwork(ip31+2) = 0
353 iwork(ip31+3) = 0
354 i_add = 1
355 i_amax = 1
356 xyzm(1,i_add) = xmin
357 xyzm(2,i_add) = ymin
358 xyzm(3,i_add) = zmin
359 xyzm(4,i_add) = xmax
361 xyzm(6,i_add) = zmax
362 i_stok = 0
363 j_stok = 0
364 adnstk = 0
365 adestk = 0
366 nb_nc = nsn
367 nb_ec = nrtm
368 DO i=1,nb_ec
369 iwork(ip1+i-1) = i
370 END DO
371 DO i=1,nb_nc
372 iwork(ip21+i-1) = i
373 END DO
374
375 ELSE
376 maxsiz =
max(numnod,nrtm+100)
377 ip1 = 1
378 ip2 = ip1+maxsiz
379
380 ip21= ip2+3*maxsiz
381 ip22= ip21+numnod
382 ip31= ip22+numnod
383
384
385
386
387
388
389
390
391 mwa(ip31) = 0
392 mwa(ip31+1) = 0
393 mwa(ip31+2) = 0
394 mwa(ip31+3) = 0
395 i_add = 1
396 i_amax = 1
397 xyzm(1,i_add) = xmin
398 xyzm(2,i_add) = ymin
399 xyzm(3,i_add) = zmin
400 xyzm(4,i_add) = xmax
402 xyzm(6,i_add) = zmax
403 i_stok = 0
404 j_stok = 0
405 adnstk = 0
406 adestk = 0
407 nb_nc = nsn
408 nb_ec = nrtm
409
410
411
412 DO 120 i=1,nb_ec
413 mwa(ip1+i-1) = i
414 120 CONTINUE
415 DO 140 i=1,nb_nc
416 mwa(ip21+i-1) = i
417 140 CONTINUE
418 END IF
419
420
421
422
423 200 CONTINUE
424
425
426 IF (nsne >0) THEN
428 1 iwork(ip1),iwork(ip2),iwork(ip21),iwork(ip22),
429 + iwork(ip31+2*(i_add-2)),
430 2 irect ,xten ,nb_nc ,nb_ec ,xyzm ,
431 3 i_add ,nsv ,i_amax ,xmax ,
ymax ,
432 4 zmax ,3*maxsiz,i_stok ,i_mem ,nb_n_b ,
433 5 cand_n ,cand_e ,nsn ,noint ,tzinf_st ,
434 6 maxbox ,minbox ,stf ,stfn ,j_stok ,
435 7 multimp ,istf , itab ,gap ,gap_s ,
436 8 gap_m ,igap ,gapmin ,gapmax ,marge_st ,
437 9 gap_s_l,gap_m_l ,
id ,titr ,ilev ,
438 a nbinflg,mbinflg ,mvoisn ,ixs ,ixs10 ,
439 b ixs16 ,ixs20 ,ipartns ,ipen0 ,inacti ,
440 c msegtyp,marge ,nrtm ,irtse ,is2se ,
441 d ix1 ,ix2 ,ix3 ,ix4 ,nsvg ,
442 e x1 ,x2 ,x3 ,x4 ,y1 ,
443 f y2 ,y3 ,y4 ,z1 ,z2 ,
444 g z3 ,z4 ,xi ,yi ,zi ,
445 h x0 ,y0 ,z0 ,stif ,nx1 ,
446 i ny1 ,nz1 ,nx2 ,ny2 ,nz2 ,
447 j nx3 ,ny3 ,nz3 ,nx4 ,ny4 ,
448 k nz4 ,p1 ,p2 ,p3 ,p4 ,
449 l lb1 ,lb2 ,lb3 ,lb4 ,lc1 ,
450 m lc2 ,lc3 ,lc4 ,pene ,prov_n ,
451 n prov_e ,n11 ,n21 ,n31 ,dgapload,
452 o s_kremnode,s_remnode,kremnode,remnode,
453 p tag_removed_node,flag_removed_node)
454
455 ELSE
457 1 mwa(ip1),mwa(ip2),mwa(ip21),mwa(ip22),mwa(ip31+2*(i_add-2)),
458 2 irect ,x ,nb_nc ,nb_ec ,xyzm ,
459 3 i_add ,nsv ,i_amax ,xmax ,
ymax ,
460 4 zmax ,3*maxsiz,i_stok ,i_mem ,nb_n_b ,
461 5 cand_n ,cand_e ,nsn ,noint ,tzinf_st ,
462 6 maxbox ,minbox ,stf ,stfn ,j_stok ,
463 7 multimp ,istf , itab ,gap ,gap_s ,
464 8 gap_m ,igap ,gapmin ,gapmax ,marge_st ,
465 9 gap_s_l,gap_m_l ,
id ,titr ,ilev ,
466 a nbinflg,mbinflg ,mvoisn ,ixs ,ixs10 ,
467 b ixs16 ,ixs20 ,ipartns ,ipen0 ,inacti ,
468 c msegtyp,marge ,nrtm ,irtse ,is2se ,
469 d ix1 ,ix2 ,ix3 ,ix4 ,nsvg ,
470 e x1 ,x2 ,x3 ,x4 ,y1 ,
471 f y2 ,y3 ,y4 ,z1 ,z2 ,
472 g z3 ,z4 ,xi ,yi ,zi ,
473 h x0 ,y0 ,z0 ,stif ,nx1 ,
474 i ny1 ,nz1 ,nx2 ,ny2 ,nz2 ,
475 j nx3 ,ny3 ,nz3 ,nx4 ,ny4 ,
476 k nz4 ,p1 ,p2 ,p3 ,p4 ,
477 l lb1 ,lb2 ,lb3 ,lb4 ,lc1 ,
478 m lc2 ,lc3 ,lc4 ,pene ,prov_n ,
479 n prov_e ,n11 ,n21 ,n31 ,dgapload,
480 o s_kremnode,s_remnode,kremnode,remnode,
481 p tag_removed_node,flag_removed_node)
482 END IF
483
484 IF (i_mem == 2)THEN
485 IF (nsne >0) DEALLOCATE(xten,iwork)
486 RETURN
487 ENDIF
488
489
490 IF(i_mem==1)THEN
491 nb_n_b = nb_n_b + 1
492 i_mem = 0
493 GO TO 100
494 ENDIF
495 IF(i_add/=0) GO TO 200
496
497
498 IF(j_stok/=0)THEN
499 lft = 1
500 llt = j_stok
501 IF (nsne >0) THEN
502 CALL i7cor3(xten ,irect,nsv ,prov_e ,prov_n,
503 .
504 . gap_s,gap_m,istf ,gapmin ,gapmax,
505 . gap_s_l,gap_m_l ,zero ,ix1 ,ix2 ,
506 5 ix3 ,ix4 ,nsvg,x1 ,x2 ,
507 6 x3 ,x4 ,y1 ,y2 ,y3 ,
508 7 y4 ,z1 ,z2 ,z3 ,z4 ,
509 8 xi ,yi ,zi ,stif ,dgapload,
510 9 j_stok)
511 ELSE
512 CALL i7cor3(x ,irect,nsv ,prov_e ,prov_n,
513 . stf ,stfn ,gapv ,igap ,gap ,
514 . gap_s,gap_m,istf ,gapmin ,gapmax,
515 . gap_s_l,gap_m_l ,zero ,ix1 ,ix2 ,
516 5 ix3 ,ix4 ,nsvg,x1 ,x2 ,
517 6 x3 ,x4 ,y1 ,y2 ,y3 ,
518 7 y4 ,z1 ,z2 ,z3 ,z4 ,
519 8 xi ,yi ,zi ,stif ,dgapload,
520 9 j_stok)
521 END IF
522 CALL i7dst3(ix3,ix4,x1 ,x2 ,x3 ,
523 1 x4 ,y1 ,y2 ,y3 ,y4 ,
524 2 z1 ,z2 ,z3 ,z4 ,xi ,
525 3 yi ,zi ,x0 ,y0 ,z0 ,
526 4 nx1,ny1,nz1,nx2,ny2,
527 5 nz2,nx3,ny3,nz3,nx4,
528 6 ny4,nz4,p1 ,p2 ,p3 ,
529 7 p4 ,lb1,lb2,lb3,lb4,
530 8 lc1,lc2,lc3,lc4,j_stok)
531
532 CALL i7pen3(marge_st,gapv,n11,n21,n31,
533 1 pene ,nx1 ,ny1,nz1,nx2,
534 2 ny2 ,nz2 ,nx3,ny3,nz3,
535 3 nx4 ,ny4 ,nz4,p1 ,p2 ,
536 4 p3 ,p4,j_stok)
537
538 IF (ilev==2)
CALL i24s1s2(prov_n,prov_e,nbinflg,mbinflg,pene)
539 IF(i_stok+j_stok<multimp*nsn) THEN
540 CALL i7cmp3(i_stok,cand_e ,cand_n,1,pene,
541 1 prov_n,prov_e)
542 ELSE
543 i_bid = 0
544 CALL i7cmp3(i_bid,cand_e,cand_n,0,pene,
545 1 prov_n,prov_e)
546 IF(i_stok+i_bid<multimp*nsn) THEN
547 CALL i7cmp3(i_stok,cand_e,cand_n,1,pene,
548 1 prov_n,prov_e)
549 ELSE
550 i_mem = 2
551 IF (nsne >0) DEALLOCATE(xten,iwork)
552 RETURN
553 ENDIF
554 ENDIF
555 ENDIF
556
557
558#ifndef HYPERMESH_LIB
559 IF(nsn/=0)THEN
560 WRITE(iout,*)' POSSIBLE IMPACT NUMBER, NSN:',i_stok,nsn
561
562 ELSE
564 . msgtype=msgwarning,
565 . anmode=aninfo_blind_2,
567 . c1=titr)
568 ENDIF
569#endif
570
571
572
573
574 DO i=1,numnod+nsne
575 mwa(i)=0
576 ENDDO
577
578#ifndef HYPERMESH_LIB
579 2400
FORMAT(2x,/,'user-defined(ipen_max)searching distance
for initial penetrations
',
580 + 1PG20.13,'is used',/)
581 2500 FORMAT(2X,/,'computed searching distance
for initial penetrations
',1PG20.13,
582 + 'is used',/)
583#endif
584
585
586 IF (NSNE >0) DEALLOCATE(XTEN,IWORK)
587 DEALLOCATE( TAG_REMOVED_NODE )
588 RETURN
if(complex_arithmetic) id
subroutine i24s1s2(prov_n, prov_e, nbinflg, mbinflg, pene)
subroutine i24xfic_ini(nrtse, irtse, nsne, is2se, is2pt, nsn, nsv, x, xfic, npt)
subroutine i24tri(bpe, pe, bpn, pn, add, irect, x, nb_nc, nb_ec, xyzm, i_add, nsv, i_amax, xmax, ymax, zmax, maxsiz, i_stok, i_mem, nb_n_b, cand_n, cand_e, nsn, noint, tzinf, maxbox, minbox, stf, stfn, j_stok, multimp, istf, itab, gap, gap_s, gap_m, igap, gapmin, gapmax, marge, gap_s_l, gap_m_l, id, titr, ilev, nbinflg, mbinflg, mvoisn, ixs, ixs10, ixs16, ixs20, ipartns, ipen0, inacti, msegtyp, marge_sh, nrtm, irtse, is2se, ix1, ix2, ix3, ix4, nsvg, x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, xi, yi, zi, x0, y0, z0, stif, nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4, p1, p2, p3, p4, lb1, lb2, lb3, lb4, lc1, lc2, lc3, lc4, pene, prov_n, prov_e, n11, n21, n31, dgapload, s_kremnode, s_remnode, kremnode, remnode, tag_removed_node, flag_removed_node)
subroutine i7cmp3(i_stok, cand_e, cand_n, iflag, pene, prov_n, prov_e)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
for(i8=*sizetab-1;i8 >=0;i8--)
integer, parameter nchartitle
subroutine i7cor3(x, irect, nsv, cand_e, cand_n, stf, stfn, gapv, igap, gap, gap_s, gap_m, istf, gapmin, gapmax, gap_s_l, gap_m_l, drad, ix1, ix2, ix3, ix4, nsvg, x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, xi, yi, zi, stif, dgapload, last)
subroutine i7dst3(ix3, ix4, x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, xi, yi, zi, x0, y0, z0, nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4, p1, p2, p3, p4, lb1, lb2, lb3, lb4, lc1, lc2, lc3, lc4, last)
subroutine i7pen3(marge, gapv, n1, n2, n3, pene, nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4, p1, p2, p3, p4, last)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)