49
50
51
56 use intbufdef_mod
57 use margin_reduction_mod , only : margin_reduction
58
59
60
61#include "implicit_f.inc"
62
63
64
65#include "mvsiz_p.inc"
66
67
68
69#include "units_c.inc"
70#include "com01_c.inc"
71#include "com04_c.inc"
72#include "vect07_c.inc"
73#include "scr06_c.inc"
74
75
76
77 INTEGER NMN, NRTM, NSN, NOINT,I_STOK,MULTIMP,ISTF,IGAP,
78 . INACTI,I_MEM,NIN,IREMNODE,FLAGREMNODE
79 INTEGER IRECT(4,*),NSV(*),NSEG(*),MWA(*)
80 INTEGER MSR(*),IDDLEVEL
81 INTEGER ITAB(*),NCONT,ICURV,KREMNODE(*),REMNODE(*)
83 . stf(*),stfn(*),x(3,*),xyzm(6,2),gap_s(*),gap_m(*),
84 . dist,bumult,gap,tzinf,gapmin,gapmax,
85 . gap_s_l(*),gap_m_l(*),bgapsmx, drad
86 my_real ,
INTENT(IN) :: dgapload
87 INTEGER ID
88 CHARACTER(LEN=NCHARTITLE) :: TITR
89 TYPE(INTERSURFP) :: INTERCEP(3,NINTER)
90 integer, intent(in) :: npari
91 integer, dimension(npari), intent(inout) :: ipari
92 type(intbuf_struct_), intent(inout) :: intbuf_tab
93 LOGICAL,INTENT(IN) :: IS_USED_WITH_LAW151
94
95
96
97 INTEGER NRTM_L
98 INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX
99 INTEGER NBX,NBY,NBZ
100 INTEGER (KIND=8) :: NBX8,NBY8,NBZ8,RES8,LVOXEL8
101 INTEGER I, J, K, I_ADD, L, LOC_PROC, N, ISZNSNR,
102 . N1, N2, N3, N4, NCONTACT,I_BID,I_STOK_OLD,
103 . IX1,IY1,IZ1,IX2,IY2,IZ2,IX,IY,IZ
105 . marge, aaa,tzinf_st,marge_st
107 . dx1,dy1,dz1,
108 . dx3,dy3,dz3,
109 . dx4,dy4,dz4,
110 . dx6,dy6,dz6,
111 . dd1,dd2,dd3,dd4,dd,dd0,xmin,ymin,zmin,
112 . xmax_m,ymax_m,zmax_m,xmin_m,ymin_m,zmin_m,
113 . xmax_s,ymax_s,zmax_s,xmin_s,ymin_s,zmin_s,
114 . xmax,
ymax,zmax,xxx,yyy,zzz,
115 . xminb, yminb, zminb, xmaxb, ymaxb, zmaxb,
116 . mean_x, mean_y, mean_z, dev_x, dev_y, dev_z,
117 . gapv(mvsiz),c_max,
118 . tstart,tstop,
119 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,
120 . xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4,zz1,zz2,zz3,zz4
121 my_real,
DIMENSION(:),
ALLOCATABLE :: curv_max
122 INTEGER, DIMENSION(:),ALLOCATABLE :: IIX,IIY,IIZ,LOCAL_NEXT_NOD
123
124 LOGICAL :: TYPE18
125 INTEGER (KIND=8) :: IONE,IHUNDRED
126
127
128
129 ione=1
130 ihundred=100
131
132 ALLOCATE( index(nrtm) )
133 ALLOCATE( curv_max(nrtm) )
134 ALLOCATE(local_next_nod(nsn))
135 ALLOCATE(iix(nsn))
136 ALLOCATE(iiy(nsn))
137 ALLOCATE(iiz(nsn))
138 type18=.false.
139 IF(inacti==7)type18=.true.
140
141 mwa(1:numnod+numfakenodigeo) = 0
142 ncontact = multimp * ncont
143 c_max = zero
144 IF(icurv/=0)THEN
145 DO i=1,nrtm
146 xxx=
max(x(1,irect(1,i)),x(1,irect(2,i)),
147 . x(1,irect(3,i)),x(1,irect(4,i)))
148 . -
min(x(1,irect(1,i)),x(1,irect(2,i)),
149 . x(1,irect(3,i)),x(1,irect(4,i)))
150 yyy=
max(x(2,irect(1,i)),x(2,irect(2,i)),
151 . x(2,irect(3,i)),x(2,irect(4,i)))
152 . -
min(x(2,irect(1,i)),x(2,irect(2,i)),
153 . x(2,irect(3,i)),x(2,irect(4,i)))
154 zzz=
max(x(3,irect(1,i)),x(3,irect(2,i)),
155 . x(3,irect(3,i)),x(3,irect(4,i)))
156 . -
min(x(3,irect(1,i)),x(3,irect(2,i)),
157 . x(3,irect(3,i)),x(3,irect(4,i)))
158 curv_max(i) = half *
max(xxx,yyy,zzz)
159 c_max =
max(c_max,curv_max(i))
160 ENDDO
161 ELSE
162 DO i=1,nrtm
163 curv_max(i)=zero
164 ENDDO
165 ENDIF
166
167 dd=zero
168 DO 10 l=1,nrtm
169
170 n1=irect(1,l)
171 n2=irect(2,l)
172 n3=irect(3,l)
173 n4=irect(4,l)
174
175 dx1=(x(1,n1)-x(1,n2))
176 dy1=(x(2,n1)-x(2,n2))
177 dz1=(x(3,n1)-x(3,n2))
178 dd1=sqrt(dx1**2+dy1**2+dz1**2)
179
180 dx3=(x(1,n1)-x(1,n4))
181 dy3=(x(2,n1)-x(2,n4))
182 dz3=(x(3,n1)-x(3,n4))
183 dd2=sqrt(dx3**2+dy3**2+dz3**2)
184
185 dx4=(x(1,n3)-x(1,n2))
186 dy4=(x(2,n3)-x(2,n2))
187 dz4=(x(3,n3)-x(3,n2))
188 dd3=sqrt(dx4**2+dy4**2+dz4**2)
189
190 dx6=(x(1,n4)-x(1,n3))
191 dy6=(x(2,n4)-x(2,n3))
192 dz6=(x(3,n4)-x(3,n3))
193 dd4=sqrt(dx6**2+dy6**2+dz6**2)
194 dd=dd+ (dd1+dd2+dd3+dd4)
195 10 CONTINUE
196 dd0=dd/nrtm/four
197 IF(nrtm >0 .AND. nrtm <= 3 .AND. .not. is_used_with_law151) THEN
198 call margin_reduction(x,numnod,irect,nrtm,nsv,nsn,drad,gap,dgapload,bumult,stfn,dd0)
199 ENDIF
200 dd =dd0
201
202
203
204
205
206
207 marge = bumult*dd
208 tzinf = marge +
max(gap+dgapload,drad)
209
210 marge_st = bmul0*dd
211
212
213 IF(iddlevel==0) marge_st = marge
214 tzinf_st = marge_st +
max(gap+dgapload,drad)
215
216 dist = zero
217
218
219
220 xmax_m=-ep30
221 ymax_m=-ep30
222 zmax_m=-ep30
223 xmin_m=ep30
224 ymin_m=ep30
225 zmin_m=ep30
226 100 CONTINUE
227 i_stok = 0
228 i_mem = 0
229
230 DO loc_proc=1,nspmd
231 nrtm_l=0
232 DO i=1,nrtm
233 IF(intercep(1,nin)%P(i)==loc_proc)THEN
234 nrtm_l=nrtm_l+1
235 index(nrtm_l)=i
236 END IF
237 END DO
238
239
240
241 IF(nrtm_l == 0)cycle
242 mean_x=zero
243 mean_y=zero
244 mean_z=zero
245 DO k=1,nrtm_l
246 i = index(k)
247 j=irect(1,i)
248 xmax_m=
max(xmax_m,x(1,j))
249 ymax_m=
max(ymax_m,x(2,j))
250 zmax_m=
max(zmax_m,x(3,j))
251 xmin_m=
min(xmin_m,x(1,j))
252 ymin_m=
min(ymin_m,x(2,j))
253 zmin_m=
min(zmin_m,x(3,j))
254 mean_x=mean_x+x(1,j)
255 mean_y=mean_y+x(2,j)
256 mean_z=mean_z+x(3,j)
257 j=irect(2,i)
258 xmax_m=
max(xmax_m,x(1,j))
259 ymax_m=
max(ymax_m,x(2,j))
260 zmax_m=
max(zmax_m,x(3,j))
261 xmin_m=
min(xmin_m,x(1,j))
262 ymin_m=
min(ymin_m,x(2,j))
263 zmin_m=
min(zmin_m,x(3,j))
264 mean_x=mean_x+x(1,j)
265 mean_y=mean_y+x(2,j)
266 mean_z=mean_z+x(3,j)
267 j=irect(3,i)
268 xmax_m=
max(xmax_m,x(1,j))
269 ymax_m=
max(ymax_m,x(2,j))
270 zmax_m=
max(zmax_m,x(3,j))
271 xmin_m=
min(xmin_m,x(1,j))
272 ymin_m=
min(ymin_m,x(2,j))
273 zmin_m=
min(zmin_m,x(3,j))
274 mean_x=mean_x+x(1,j)
275 mean_y=mean_y+x(2,j)
276 mean_z=mean_z+x(3,j)
277 j=irect(4,i)
278 xmax_m=
max(xmax_m,x(1,j))
279 ymax_m=
max(ymax_m,x(2,j))
280 zmax_m=
max(zmax_m,x(3,j))
281 xmin_m=
min(xmin_m,x(1,j))
282 ymin_m=
min(ymin_m,x(2,j))
283 zmin_m=
min(zmin_m,x(3,j))
284 mean_x=mean_x+x(1,j)
285 mean_y=mean_y+x(2,j)
286 mean_z=mean_z+x(3,j)
287 END DO
288
289
290 xmin=xmin_m-tzinf_st
291 ymin=ymin_m-tzinf_st
292 zmin=zmin_m-tzinf_st
293 xmax=xmax_m+tzinf_st
295 zmax=zmax_m+tzinf_st
296
297
298
299 mean_x=mean_x/
max((4*nrtm_l),1)
300 mean_y=mean_y/
max((4*nrtm_l),1)
301 mean_z=mean_z/
max((4*nrtm_l),1)
302
303 dev_x=zero
304 dev_y=zero
305 dev_z=zero
310 DO k=1,nrtm_l
311 i = index(k)
312 n1 = irect(1,i)
313 n2 = irect(2,i)
314 n3 = irect(3,i)
315 n4 = irect(4,i)
316 xx1=x(1,n1)
317 xx2=x(1,n2)
318 xx3=x(1,n3)
319 xx4=x(1,n4)
320 xmaxe=
max(xx1,xx2,xx3,xx4)
321 xmine=
min(xx1,xx2,xx3,xx4)
322 dev_x=dev_x+(xx1-mean_x)**2+(xx2-mean_x)**2
323 . +(xx3-mean_x)**2+(xx4-mean_x)**2
324 yy1=x(2,n1)
325 yy2=x(2,n2)
326 yy3=x(2,n3)
327 yy4=x(2,n4)
328 ymaxe=
max(yy1,yy2,yy3,yy4)
329 ymine=
min(yy1,yy2,yy3,yy4)
330 dev_y=dev_y+(yy1-mean_y)**2+(yy2-mean_y)**2
331 . +(yy3-mean_y)**2+(yy4-mean_y)**2
332 zz1=x(3,n1)
333 zz2=x(3,n2)
334 zz3=x(3,n3)
335 zz4=x(3,n4
336 zmaxe=
max(zz1,zz2,zz3,zz4)
337 zmine=
min(zz1,zz2,zz3,zz4)
338 dev_z=dev_z+(zz1-mean_z)**2+(zz2-mean_z)**2
339 . +(zz3-mean_z)**2+(zz4-mean_z)**2
340
341
342
343 ix1=int(nbx*(xmine-tzinf_st-xmin)/(xmax-xmin))
344 iy1=int(nby*(ymine-tzinf_st-ymin)/(
ymax-ymin))
345 iz1=int(nbz*(zmine-tzinf_st-zmin)/(zmax-zmin))
349 ix2=int(nbx*(xmaxe+tzinf_st-xmin)/(xmax-xmin))
350 iy2=int(nby*(ymaxe+tzinf_st-ymin)/(
ymax-ymin))
351 iz2=int(nbz*(zmaxe+tzinf_st-zmin)/(zmax-zmin))
355
356 DO iz = iz1, iz2
357 DO iy = iy1, iy2
358 DO ix = ix1, ix2
360 END DO
361 END DO
362 END DO
363
364 END DO
365 dev_x=sqrt(dev_x/
max(4*nrtm_l,1))
366 dev_y=sqrt(dev_y/
max(4*nrtm_l,1))
367 dev_z=sqrt(dev_z/
max(4*nrtm_l,1))
368
369 xminb=
max(mean_x-2*dev_x,xmin)
370 yminb=
max(mean_y-2*dev_y,ymin)
371 zminb=
max(mean_z-2*dev_z,zmin)
372 xmaxb=
min(mean_x+2*dev_x,xmax)
374 zmaxb=
min(mean_z+2*dev_z,zmax)
375
376 IF(abs(xminb-xmaxb) < em10)THEN
377 xminb=xmin
378 xmaxb=xmax
379 END IF
380 IF(abs(yminb-ymaxb) < em10)THEN
381 yminb=ymin
383 END IF
384 IF(abs(zminb-zmaxb) < em10)THEN
385 zminb=zmin
386 zmaxb=zmax
387 END IF
388
389 xyzm(1,1) = xmin
390 xyzm(2,1) = ymin
391 xyzm(3,1) = zmin
392 xyzm(4,1) = xmax
394 xyzm(6,1) = zmax
395 xyzm(1,2) = xminb
396 xyzm(2,2) = yminb
397 xyzm(3,2) = zminb
398 xyzm(4,2) = xmaxb
399 xyzm(5,2) = ymaxb
400 xyzm(6,2) = zmaxb
401
402 aaa = sqrt(nmn /
403 . ((xmaxb-xminb)*(ymaxb-yminb)
404 . +(ymaxb-yminb)*(zmaxb-zminb)
405 . +(zmaxb-zminb)*(xmaxb-xminb)))
406 aaa = 0.75*aaa
407
408 nbx = nint(aaa*(xmaxb-xminb))
409 nby = nint(aaa*(ymaxb-yminb))
410 nbz = nint(aaa*(zmaxb-zminb))
414
415 nbx8=nbx
416 nby8=nby
417 nbz8=nbz
418 res8=(nbx8+2)*(nby8+2)*(nbz8+2)
420
421 IF(res8 > lvoxel8) THEN
423 aaa = aaa/((nbx8+2)*(nby8+2)*(nbz8+2))
424 aaa = aaa**(third)
425 nbx = int((nbx+2)*aaa)-2
426 nby = int((nby+2)*aaa)-2
427 nbz = int((nbz+2)*aaa)-2
431 ENDIF
432
433 nbx8=nbx
434 nby8=nby
435 nbz8=nbz
436 res8=(nbx8+2)*(nby8+2)*(nbz8+2)
437
438 IF(res8 > lvoxel8) THEN
439 nbx =
min(ihundred,
max(nbx8,ione))
440 nby =
min(ihundred,
max(nby8,ione))
441 nbz =
min(ihundred,
max(nbz8,ione))
442 ENDIF
443
444
445 DO i=
inivoxel,(nbx+2)*(nby+2)*(nbz+2)
447 ENDDO
449
450 200 CONTINUE
451
452!$omp parallel
454 1 nsn ,i_mem ,irect ,x ,stf ,
455 2 stfn ,xyzm ,nsv ,
456 3 ncontact ,noint ,tzinf_st ,gap_s_l ,gap_m_l ,
457 4
voxel1 ,nbx ,nby ,nbz ,nrtm_l ,
458 5 igap ,gap ,gap_s ,gap_m ,gapmin ,
459 6 gapmax ,marge_st,curv_max ,bgapsmx ,istf ,
460 7 i_stok ,nin,
461 8
id ,titr ,drad ,index ,
462 9 iremnode,flagremnode,kremnode,remnode,
463 1 dgapload,ipari,intbuf_tab,
464 2 iix,iiy,iiz,local_next_nod,nrtm,is_used_with_law151 )
465
466
467
468 IF (i_mem == 2)THEN
469 RETURN
470 ENDIF
471
472
473 IF(i_mem==1)THEN
474 i_mem = 0
475 GO TO 100
476 ELSE IF(i_mem==2) THEN
477 marge_st = three_over_4*marge_st
478 tzinf_st = marge_st +
max(gap,drad)
479 i_mem = 0
480 IF(marge_st<em03) THEN
482 . msgtype=msgerror,
483 . anmode=aninfo,
485 . c1=titr)
486 ENDIF
487 GO TO 100
488 ENDIF
489
490 END DO
491
492 IF(.NOT.type18)THEN
493 IF(nsn/=0)THEN
494 WRITE(iout,*)' POSSIBLE IMPACT NUMBER:',i_stok,' (<=',
495 . 1+(i_stok-1)/nsn,'*NSN)'
496
497
498 ELSE
500 . msgtype=msgwarning,
501 . anmode=aninfo_blind_2,
503 . c1=titr)
504 ENDIF
505 endif
506
507 DEALLOCATE( index )
508 DEALLOCATE( curv_max )
509 DEALLOCATE(local_next_nod)
510 DEALLOCATE(iix)
511 DEALLOCATE(iiy)
512 DEALLOCATE(iiz)
513 RETURN
subroutine i7trivox1(nsn, i_mem, irect, x, stf, stfn, xyzm, nsv, mulnsn, noint, tzinf, gap_s_l, gap_m_l, voxel, nbx, nby, nbz, nrtm_l, igap, gap, gap_s, gap_m, gapmin, gapmax, marge, curv_max, bgapsmx, istf, i_stok, nin, id, titr, drad, index, iremnode, flagremnode, kremnode, remnode, dgapload, ipari, intbuf_tab, iix, iiy, iiz, local_next_nod, nrtm, is_used_with_law151)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
integer, parameter nchartitle
integer, dimension(lvoxel) voxel1
integer, dimension(0:lrvoxel, 0:lrvoxel) crvoxel
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)