47
48
49
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "mvsiz_p.inc"
59
60 INTEGER NVECSZ
61 parameter(nvecsz = mvsiz)
62
63
64
65#include "com01_c.inc"
66#include "com04_c.inc"
67#include "param_c.inc"
68#include "task_c.inc"
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 INTEGER I_MEM,ESHIFT,NSN,ISZNSNR,NRTM,NIN,ITASK,
106 . MULNSN,NOINT,NSNR,NBX,NBY,NBZ,IEDGE,NSNE,
107 . NSV(*),CAND_N(*),CAND_E(*),
108 . IRECT(4,*), VOXEL(NBX+2,NBY+2,NBZ+2),II_STOK,ITAB(*),
109 . NBINFLG(*),MBINFLG(*),ILEV,MSEGTYP(*),CAND_T(*),
110 . ISEADD(*) ,ISEDGE(*),FLAGREMNODE,KREMNOD(*),REMNOD(*),CAND_A(*),
111 . RENUM(*),NSNROLD,IRTSE(5,*),IS2SE(2,*)
112 INTEGER, INTENT(IN) :: INTHEAT
113 INTEGER, INTENT(IN) :: IDT_THERM
114 INTEGER, INTENT(IN) :: NODADT_THERM
115
117 . x(3,*),v(3,*),xyzm(6),stf(*),stfn(*),gap_s(*),
118 . gap_m(*),curv_max(*),pene_old(5,nsn),edge_l2(*),
119 . marge,bgapsmx,pmax_gap,vmaxdt
120 my_real ,
INTENT(IN) :: dgapload
121
122
123
124 INTEGER I,J,
125 . NN,NE,K,L,J_STOK,JJ,
126 . PROV_N(MVSIZ),PROV_E(MVSIZ),
127 . OLDNUM(ISZNSNR), NSNF, NSNL,M,NSE,NS
128
130 . xs,ys,zs,sx,sy,sz,s2,
131 . xmin, xmax,ymin,
ymax,zmin, zmax,
132 . xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4,zz1,zz2,zz3,zz4,
133 . d1x,d1y,d1z,d2x,d2y,d2z,dd1,dd2,d2,a2
134
135 INTEGER LAST_NOD(NSN+NSNR)
136 INTEGER IX,IY,IZ,M1,M2,M3,M4,
137 . IX1,IY1,IZ1,IX2,IY2,IZ2
138 INTEGER, DIMENSION(:),ALLOCATABLE :: IIX,IIY,IIZ
140 . xminb,yminb,zminb,xmaxb,ymaxb,zmaxb,
141 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,aaa
142 INTEGER FIRST,LAST
143 SAVE iix,iiy,iiz
144 INTEGER, DIMENSION(NUMNOD+NSNE) :: TAG
145
146
147
148 INTEGER IK1(4),IK2(4),IED,NS1,NS2,NS1ID,NS2ID
149 DATA ik1 /1,2,3,4/
150 DATA ik2 /2,3,4,1/
151
152 IF(itask == 0)THEN
154 ALLOCATE(iix(nsn+nsnr))
155 ALLOCATE(iiy(nsn+nsnr))
156 ALLOCATE(iiz(nsn+nsnr))
157 END IF
158
160
161
162 xmin = xyzm(1)
163 ymin = xyzm(2)
164 zmin = xyzm(3)
165 xmax = xyzm(4)
167 zmax = xyzm(6)
168
169
170 xminb = xmin
171 yminb = ymin
172 zminb = zmin
173 xmaxb = xmax
175 zmaxb = zmax
176
177
178
179
180 IF(nspmd>1) THEN
181 CALL spmd_oldnumcd(renum,oldnum,isznsnr,nsnrold,intheat,idt_therm,nodadt_therm)
182 END IF
183
184
185
186
187
188
189
190 IF(itask == 0)THEN
191 DO i=1,nsn
192 iix(i)=0
193 iiy(i)=0
194 iiz(i)=0
195 IF(stfn(i) == zero)cycle
196 j=nsv(i)
197
198
199 IF(x(1,j) < xmin) cycle
200 IF(x(1,j) > xmax) cycle
201 IF(x(2,j) < ymin) cycle
202 IF(x(2,j) >
ymax) cycle
203 IF(x(3,j) < zmin) cycle
204 IF(x(3,j) > zmax) cycle
205
206 iix(i)=int(nbx*(x(1,j)-xminb)/(xmaxb-xminb))
207 iiy(i)=int(nby*(x(2,j)-yminb)/(ymaxb-yminb))
208 iiz(i)=int(nbz*(x(3,j)-zminb)/(zmaxb-zminb))
209
210 iix(i)=
max(1,2+
min(nbx,iix(i)))
211 iiy(i)=
max(1,2+
min(nby,iiy(i)))
212 iiz(i)=
max(1,2+
min(nbz,iiz(i)))
213
214 first = voxel(iix(i),iiy(i),iiz(i))
215 IF(first == 0)THEN
216
217 voxel(iix(i),iiy(i),iiz(i)) = i
219 last_nod(i) = 0
220 ELSEIF(last_nod(first) == 0)THEN
221
222
224 last_nod(first) = i
226 ELSE
227
228
229 last = last_nod(first)
231 last_nod(first) = i
233 ENDIF
234 ENDDO
235
236
237
238
239 DO j = 1, nsnr
240
241 IF(
irem(8,j)==-1) cycle
242
243
244 iix(nsn+j)=int(nbx*(xrem(1,j)-xminb)/(xmaxb-xminb))
245 iiy(nsn+j)=int(nby*(xrem(2,j)-yminb)/(ymaxb-yminb))
246 iiz(nsn+j)=int(nbz*(xrem(3,j)-zminb)/(zmaxb-zminb))
247 iix(nsn+j)=
max(1,2+
min(nbx,iix(nsn+j)))
248 iiy(nsn+j)=
max(1,2+
min(nby,iiy(nsn+j)))
249 iiz(nsn+j)=
max(1,2+
min(nbz,iiz(nsn+j)))
250
251 first = voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))
252 IF(first == 0)THEN
253
254 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j)) = nsn+j
256 last_nod(nsn+j) = 0
257 ELSEIF(last_nod(first) == 0)THEN
258
259
261 last_nod(first) = nsn+j
263 ELSE
264
265
266 last = last_nod(first)
268 last_nod(first) = nsn+j
270 ENDIF
271 ENDDO
272 END IF
273
275
276
277
278
279 j_stok = 0
280 IF(flagremnode == 2)THEN
281 DO i=1,numnod+nsne
282 tag(i) = 0
283 ENDDO
284 END IF
285
286 DO ne=1,nrtm
287
288 IF(stf(ne) == zero)cycle
289
290 aaa = marge+curv_max(ne)+bgapsmx+pmax_gap+vmaxdt
291 + + gap_m(ne)+dgapload
292
293
294
295
296
297 m1 = irect(1,ne)
298 m2 = irect(2,ne)
299 m3 = irect(3,ne)
300 m4 = irect(4,ne)
301
302 xx1=x(1,m1)
303 xx2=x(1,m2)
304 xx3=x(1,m3)
305 xx4=x(1,m4)
306 xmaxe=
max(xx1,xx2,xx3,xx4)
307 xmine=
min(xx1,xx2,xx3,xx4)
308
309 yy1=x(2,m1)
310 yy2=x(2,m2)
311 yy3=x(2,m3)
312 yy4=x(2,m4)
313 ymaxe=
max(yy1,yy2,yy3,yy4)
314 ymine=
min(yy1,yy2,yy3,yy4)
315
316 zz1=x(3,m1)
317 zz2=x(3,m2)
318 zz3=x(3,m3)
319 zz4=x(3,m4)
320 zmaxe=
max(zz1,zz2,zz3,zz4)
321 zmine=
min(zz1,zz2,zz3,zz4)
322
323
324
325
326 sx = (yy3-yy1)*(zz4-zz2) - (zz3-zz1)*(yy4-yy2)
327 sy = (zz3-zz1)*(xx4-xx2) - (xx3-xx1)*(zz4-zz2)
328 sz = (xx3-xx1)*(yy4-yy2) - (yy3-yy1)*(xx4-xx2)
329 s2 = sx*sx + sy*sy + sz*sz
330
331
332
333 ix1=int(nbx*(xmine-aaa-xminb)/(xmaxb-xminb))
334 iy1=int(nby*(ymine-aaa-yminb)/(ymaxb-yminb))
335 iz1=int(nbz*(zmine-aaa-zminb)/(zmaxb-zminb))
336
340
341 ix2=int(nbx*(xmaxe+aaa-xminb)/(xmaxb-xminb))
342 iy2=int(nby*(ymaxe+aaa-yminb)/(ymaxb-yminb))
343 iz2=int(nbz*(zmaxe+aaa-zminb)/(zmaxb-zminb))
344
348
349 IF(flagremnode == 2)THEN
350 k = kremnod(2*(ne-1)+1)+1
351 l = kremnod(2*(ne-1)+2)
352 DO i=k,l
353 tag(remnod(i)) = 1
354 ENDDO
356
357
358
359
360
361 DO iz = iz1,iz2
362 DO iy = iy1,iy2
363 DO ix = ix1,ix2
364
365
366
367 jj = voxel(ix,iy,iz)
368
369 DO WHILE(jj /= 0)
370
371
372
373 IF(jj<=nsn)THEN
374 nn=nsv(jj)
375 IF(nn == m1)GOTO 200
376 IF(nn == m2)GOTO 200
377 IF(nn == m3)GOTO 200
378 IF(nn == m4)GOTO 200
379 IF(flagremnode == 2)THEN
380 IF(tag(nn) == 1)GOTO 200
381 END IF
382
383 IF (nn >numnod) THEN
384 ns = nn-numnod
386 + ns1 ,ns2 )
387 IF(ns1 == m1 .OR. ns2 == m1) GOTO 200
388 IF(ns1 == m2 .OR. ns2 == m2) GOTO 200
389 IF(ns1 == m3 .OR. ns2 == m3) GOTO 200
390 IF(ns1 == m4 .OR. ns2 == m4) GOTO 200
391 END IF
392 xs = x(1,nn)
393 ys = x(2,nn)
394 zs = x(3,nn)
395
396
397
398
399
400 IF (iedge > 0) THEN
401 aaa = marge + curv_max(ne)
402 + +
max(gap_s(jj)+gap_m(ne)+edge_l2(jj)+dgapload
403 + ,pene_old(3,jj))+vmaxdt
404 ELSE
405 aaa = marge + curv_max(ne)
406 + +
max(gap_s(jj)+gap_m(ne)+dgapload
407 + ,pene_old(3,jj))+vmaxdt
408 END IF
409 ELSE
410 j=jj-nsn
411 IF(flagremnode == 2)THEN
412 k = kremnod(2*(ne-1)+2) + 1
413 l = kremnod(2*(ne-1)+3)
414 IF(
irem(8,j)==1)
THEN
415 DO m=k,l
416 IF(remnod(m) == -
irem(2,j) )
GOTO 200
417 ENDDO
418 ELSE
419 DO m=k,l
420 IF(remnod(m) == -
irem(2,j) )
GOTO 200
421 ENDDO
422 ENDIF
424
425
426
427
428 IF(
irem(8,j)==1)
THEN
429
436 IF (ns1id == itab(m1) .OR. ns2id == itab(m1)) GOTO 200
437 IF (ns1id == itab(m2) .OR. ns2id == itab(m2)) GOTO 200
438 IF (ns1id == itab(m3) .OR. ns2id == itab(m3)) GOTO 200
439 IF (ns1id == itab(m4) .OR. ns2id == itab(m4)) GOTO 200
440 ENDIF
441 xs = xrem(1,j)
442 ys = xrem(2,j)
443 zs = xrem(3,j)
444 aaa = marge+curv_max(ne)
445
446
447
449 + + vmaxdt
450 ENDIF
451
452 IF(xs<=xmine-aaa)GOTO 200
453 IF(xs>=xmaxe+aaa)GOTO 200
454 IF(ys<=ymine-aaa)GOTO 200
455 IF(ys>=ymaxe+aaa)GOTO 200
456 IF(zs<=zmine-aaa)GOTO 200
457 IF(zs>=zmaxe+aaa)GOTO 200
458
459
460
461
462
463 d1x = xs - xx1
464 d1y = ys - yy1
465 d1z = zs - zz1
466 d2x = xs - xx2
467 d2y = ys - yy2
468 d2z = zs - zz2
469 dd1 = d1x*sx+d1y*sy+d1z*sz
470 dd2 = d2x*sx+d2y*sy+d2z*sz
471 IF(dd1*dd2 > zero)THEN
472 d2 =
min(dd1*dd1,dd2*dd2)
473 a2 = aaa*aaa*s2
474 IF(d2 > a2)GOTO 200
475 ENDIF
476
477
478
479 j_stok = j_stok + 1
480 prov_n(j_stok) = jj
481 prov_e(j_stok) = ne
482 IF(j_stok == nvsiz)THEN
483
485 1 nvsiz ,irect ,x ,nsv ,ii_stok,
486 2 cand_n,cand_e ,mulnsn,noint ,marge ,
487 3 i_mem ,prov_n ,prov_e,eshift,v ,
488 4 nsn ,gap_s ,gap_m ,curv_max,nin ,
489 5 pene_old,nbinflg ,mbinflg,ilev,msegtyp,
490 6 edge_l2,iedge,iseadd ,isedge ,cand_t,itab,
491 7 cand_a,oldnum,nsnrold,dgapload)
492 IF(i_mem==2)GOTO 100
493 j_stok = 0
494 ENDIF
495
496 200 CONTINUE
497
499
500 ENDDO
501
502 ENDDO
503 ENDDO
504 ENDDO
505
506
507
508
509 IF(flagremnode == 2)THEN
510 k = kremnod(2*(ne-1)+1)+1
511 l = kremnod(2*(ne-1)+2)
512 DO i=k,l
513 tag(remnod(i)) = 0
514 ENDDO
515 END IF
516 ENDDO
517
518
519
520
522 1 j_stok,irect ,x ,nsv ,ii_stok,
523 2 cand_n,cand_e ,mulnsn,noint ,marge ,
524 3 i_mem ,prov_n ,prov_e,eshift,v ,
525 4 nsn ,gap_s ,gap_m ,curv_max,nin ,
526 5 pene_old,nbinflg,mbinflg,ilev ,msegtyp,
527 6 edge_l2,iedge,iseadd ,isedge ,cand_t
528 7 cand_a,oldnum,nsnrold,dgapload)
529
530
531
532
533 100 CONTINUE
534
535
537 nsnf = 1 + itask*nsn / nthread
538 nsnl = (itask+1)*nsn / nthread
539
540 DO i=nsnf,nsnl
541 IF(iix(i)/=0)THEN
542 voxel(iix(i),iiy(i),iiz(i))=0
543 ENDIF
544 ENDDO
545
546
547
548
549 nsnf = 1 + itask*nsnr / nthread
550 nsnl = (itask+1)*nsnr / nthread
551 DO j = nsnf, nsnl
552 IF(
irem(8,j)==-1)cycle
553 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))=0
554 ENDDO
555
556
558 IF(itask == 0)THEN
560 DEALLOCATE(iix)
561 DEALLOCATE(iiy)
562 DEALLOCATE(iiz)
563 ENDIF
564
565 RETURN
if(complex_arithmetic) id
subroutine i24sto(j_stok, irect, x, nsv, ii_stok, cand_n, cand_e, mulnsn, noint, marge, i_mem, prov_n, prov_e, eshift, v, nsn, gap_s, gap_m, curv_max, nin, pene_old, nbinflg, mbinflg, ilev, msegtyp, edge_l2, iedge, iseadd, isedge, cand_t, itab, cand_a, oldnum, nsnrold, dgapload)
subroutine i24fic_getn(ns, irtse, is2se, ie, ns1, ns2)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
integer, dimension(:), allocatable next_nod
integer, dimension(:,:), allocatable irem