37 1 NSN ,I_MEM ,IRECT ,X ,STF ,
39 3 MULNSN ,NOINT ,TZINF ,GAP_S_L ,GAP_M_L ,
40 4 VOXEL ,NBX ,NBY ,NBZ ,NRTM_L ,
41 5 IGAP ,GAP ,GAP_S ,GAP_M ,GAPMIN ,
42 6 GAPMAX ,MARGE ,CURV_MAX ,BGAPSMX ,ISTF ,
44 8 ID ,TITR ,DRAD ,INDEX ,
45 9 IREMNODE,FLAGREMNODE,KREMNODE,REMNODE,
46 1 DGAPLOAD,ipari,intbuf_tab,
47 2 iix,iiy,iiz,local_next_nod,nrtm,IS_USED_WITH_LAW151 )
54 use inter_save_candidate_mod ,
only : inter_save_candidate
60#include "implicit_f.inc"
67 parameter(nvecsz = mvsiz)
112 integer,
intent(in) :: nrtm
113 integer,
intent(in) :: nrtm_l
115 . MULNSN,NOINT,IGAP,NBX,NBY,NBZ,IREMNODE,FLAGREMNODE,
117 . IRECT(4,NRTM), VOXEL(NBX+2,NBY+2,NBZ+2),ISTF,
119 . INDEX(*),KREMNODE(*),REMNODE(*)
121 . X(3,*),XYZM(6,2),STF(*),STFN(*),GAP_S(*),GAP_M(*),
122 . TZINF,MARGE,GAP,GAPMIN,GAPMAX,BGAPSMX,DRAD,
123 . curv_max(*),gap_s_l(*),gap_m_l(*)
125 CHARACTER(LEN=NCHARTITLE)::TITR
126 integer,
intent(in) :: nin
127 integer,
dimension(npari),
intent(inout) :: ipari
128 type(intbuf_struct_),
intent(inout) :: intbuf_tab
129 INTEGER,
dimension(nsn),
intent(inout) :: iix,iiy,iiz,local_next_nod
130 LOGICAL,
INTENT(IN) :: IS_USED_WITH_LAW151
134 INTEGER NB_NCN,NB_NCN1,NB_ECN,I,J,DIR,NB_NC,NB_EC,
135 . n1,n2,n3,n4,nn,ne,k,l,ncand_prov,ii,jj,kk,
136 . nsnf, nsnl, i_bid,delnod
138 . dx,dy,dz,xs,ys,zs,xx,sx,sy,sz,s2,
139 . xmin, xmax,ymin,
ymax,zmin, zmax, tz, gapsmx, gapl,
140 . xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4,zz1,zz2,zz3,zz4,
141 . d1x,d1y,d1z,d2x,d2y,d2z,dd1,dd2,d2,a2,gs,gapv(mvsiz)
142 INTEGER LAST_NOD(NSN)
144 INTEGER IX,IY,IZ,NEXT,M1,M2,M3,M4,
145 . ix1,iy1,iz1,ix2,iy2,iz2
146 integer,
dimension(mvsiz) :: prov_n,prov_e
148 . xminb,yminb,zminb,xmaxb,ymaxb,zmaxb,
149 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,aaa,tstart,tstop
150 my_real ,
INTENT(IN) :: dgapload
151 INTEGER FIRST,NEW,LAST,M
152 INTEGER,
DIMENSION(MVSIZ) :: IX11,IX12,IX13,IX14,
153 my_real,
DIMENSION(MVSIZ) :: x1,x2,x3,x4
154 my_real,
DIMENSION(MVSIZ) :: y1,y2,y3,y4
155 my_real,
DIMENSION(MVSIZ) :: z1,z2,z3,z4
156 my_real,
DIMENSION(MVSIZ) :: xi,yi,zi
157 my_real,
DIMENSION(MVSIZ) :: x0,y0,z0
158 my_real,
DIMENSION(MVSIZ) :: nx1,ny1,nz1
159 my_real,
DIMENSION(MVSIZ) :: nx2,ny2,nz2
160 my_real,
DIMENSION(MVSIZ) :: nx3,ny3,nz3
161 my_real,
DIMENSION(MVSIZ) :: nx4,ny4,nz4
162 my_real,
DIMENSION(MVSIZ) :: p1,p2,p3,p4
163 my_real,
DIMENSION(MVSIZ) :: lb1,lb2,lb3,lb4
164 my_real,
DIMENSION(MVSIZ) :: lc1,lc2,lc3,lc4
165 my_real,
DIMENSION(MVSIZ) :: n11,n21,n31
166 my_real,
DIMENSION(MVSIZ) :: stif,pene
168 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAGNOD
170 integer ,
external :: omp_get_thread_num,omp_get_num_threads
171 integer :: itask,nthreads
172 integer :: my_old_size,my_address
173 integer :: local_i_stok,multimp
174 integer :: local_cand_n_size,local_cand_e_size
176 integer,
save :: i_stok_old
177 integer,
dimension(:),
allocatable,
save :: cand_n_size,cand_e_size
178 integer,
dimension(:),
allocatable,
save :: address_cand_n,address_cand_e
180 type(array_type_int_1d) :: local_cand_e
182 integer :: my_size,mode
183 integer,
dimension(:),
allocatable :: my_index
184 integer,
dimension(:,:),
allocatable :: sort_array,save_array
185 integer,
dimension(70000) :: work
189 itask = omp_get_thread_num()
190 nthreads = omp_get_num_threads()
191 local_cand_n_size =
size(intbuf_tab%cand_n) / nthreads
192 local_cand_e_size =
size(intbuf_tab%cand_e) / nthreads
194 local_cand_n%size_int_array_1d = local_cand_n_size
195 local_cand_e%size_int_array_1d = local_cand_e_size
219 allocate( cand_n_size(nthreads+1),cand_e_size(nthreads+1) )
220 allocate( address_cand_n(nthreads+1),address_cand_e(nthreads+1) )
221 cand_n_size(1:nthreads+1) = 0
222 cand_e_size(1:nthreads+1) = 0
223 address_cand_n(1:nthreads+1) = 0
224 address_cand_e(1:nthreads+1) = 0
230 IF(stfn(i) == zero)cycle
234 ix=int(
lrvoxel*(x(1,j)-xmin)/(xmax-xmin))
235 IF(ix < 0 .OR. ix >
lrvoxel) cycle
237 IF(iy < 0 .OR. iy >
lrvoxel) cycle
238 iz=int(
lrvoxel*(x(3,j)-zmin)/(zmax-zmin))
239 IF(iz < 0 .OR. iz >
lrvoxel) cycle
240 IF(.NOT.(btest(
crvoxel(iy,iz),ix))) cycle
243 IF( (x(1,j)-xminb)/(xmaxb-xminb) > one )
THEN
246 iix(i)=int(
max(nbx*(x(1,j)-xminb)/(xmaxb-xminb),-one))
248 IF( (x(2,j)-yminb)/(ymaxb-yminb) > one )
THEN
251 iiy(i)=int(
max(nby*(x(2,j)-yminb)/(ymaxb-yminb),-one))
253 IF( (x(3,j)-zminb)/(zmaxb-zminb) > one )
THEN
256 iiz(i)=int(
max(nbz*(x(3,j)-zminb)/(zmaxb-zminb),-one))
260 iix(i)=
max(1,2+iix(i))
261 iiy(i)=
max(1,2+iiy(i))
262 iiz(i)=
max(1,2+iiz(i))
264 first = voxel(iix(i),iiy(i),iiz(i))
267 voxel(iix(i),iiy(i),iiz(i)) = i
268 local_next_nod(i) = 0
270 ELSEIF(last_nod(first) == 0)
THEN
273 local_next_nod(first) = i
275 local_next_nod(i) = 0
279 last = last_nod(first)
280 local_next_nod(last) = i
282 local_next_nod(i) = 0
293 stagnod = numnod+numfakenodigeo
294 IF(is_used_with_law151) stagnod = stagnod + numels
295 ALLOCATE(tagnod(stagnod)) ; tagnod(1:stagnod) = 0
302 IF(stf(ne) == zero)cycle
304 IF(flagremnode==2.AND.iremnode==2)
THEN
308 tagnod(remnode(m)) = 1
313 aaa = tzinf+curv_max(ne)
315 aaa = marge+curv_max(ne)+
max(
min(gapmax,
max(gapmin,bgapsmx+gap_m(ne)))+dgapload,drad)
327 xmaxe=
max(xx1,xx2,xx3,xx4)
328 xmine=
min(xx1,xx2,xx3,xx4)
334 ymaxe=
max(yy1,yy2,yy3,yy4)
335 ymine=
min(yy1,yy2,yy3,yy4)
341 zmaxe=
max(zz1,zz2,zz3,zz4)
342 zmine=
min(zz1,zz2,zz3,zz4)
347 sx = (yy3-yy1)*(zz4-zz2) - (zz3-zz1)*(yy4-yy2)
348 sy = (zz3-zz1)*(xx4-xx2) - (xx3-xx1)*(zz4-zz2)
349 sz = (xx3-xx1)*(yy4-yy2) - (yy3-yy1)*(xx4-xx2)
350 s2 = sx*sx + sy*sy + sz*sz
353 IF( (xmine - aaa - xminb)/(xmaxb-xminb) > one
THEN
356 ix1=int(
max(nbx*(xmine-aaa-xminb)/(xmaxb-xminb),-one))
358 IF( (ymine - aaa - yminb)/(ymaxb-yminb) > one )
THEN
361 iy1=int(
max(nby*(ymine-aaa-yminb)/(ymaxb-yminb),-one))
363 IF( (zmine - aaa - zminb)/(zmaxb-zminb) > one )
THEN
366 iz1=int(
max(nbz*(zmine-aaa-zminb)/(zmaxb-zminb),-one))
373 IF( (xmaxe + aaa - xminb)/(xmaxb-xminb
THEN
376 ix2=int(
max(nbx*(xmaxe+aaa-xminb)/(xmaxb-xminb),-one))
378 IF( (ymaxe + aaa - yminb)/(ymaxb-yminb) > one )
THEN
381 iy2=int(
max(nby*(ymaxe+aaa-yminb)/(ymaxb-yminb),-one))
383 IF( (zmaxe + aaa - zminb)/(zmaxb-zminb) > one )
THEN
386 iz2=int(
max(nbz*(zmaxe+aaa-zminb)/(zmaxb-zminb),-one))
402 IF(tagnod(nn) == 1 )
GOTO 300
412 aaa = marge+curv_max(ne)+
max(
min(gapmax,
max(gapmin,gap_s(jj)+gap_m(ne)))+dgapload,drad)
414 IF(xs<=xmine-aaa)
GOTO 300
415 IF(xs>=xmaxe+aaa)
GOTO 300
416 IF(ys<=ymine-aaa)
GOTO 300
417 IF(ys>=ymaxe+aaa)
GOTO 300
418 IF(zs<=zmine-aaa)
GOTO 300
419 IF(zs>=zmaxe+aaa)
GOTO 300
429 dd1 = d1x*sx+d1y*sy+d1z*sz
430 dd2 = d2x*sx+d2y*sy+d2z*sz
431 IF(dd1*dd2 > zero)
THEN
432 d2 =
min(dd1*dd1,dd2*dd2)
439 IF(j_stok == nvsiz)
THEN
440 CALL i7cor3(x ,irect,nsv ,prov_e ,prov_n,
441 . stf ,stfn ,gapv ,igap ,gap ,
442 . gap_s,gap_m,istf ,gapmin ,gapmax,
443 . gap_s_l,gap_m_l ,drad ,ix11,ix12,
444 5 ix13 ,ix14 ,nsvg,x1 ,x2 ,
446 7 y4 ,z1 ,z2 ,z3 ,z4 ,
447 8 xi ,yi ,zi ,stif ,dgapload,
449 CALL i7dst3(ix13,ix14,x1 ,x2 ,x3 ,
450 1 x4 ,y1 ,y2 ,y3 ,y4 ,
451 2 z1 ,z2 ,z3 ,z4 ,xi ,
452 3 yi ,zi ,x0 ,y0 ,z0 ,
453 4 nx1,ny1,nz1,nx2,ny2,
455 6 ny4,nz4,p1 ,p2 ,p3 ,
456 7 p4 ,lb1,lb2,lb3,lb4,
457 8 lc1,lc2,lc3,lc4,j_stok)
458 CALL i7pen3(marge,gapv,n11,n21,n31,
459 1 pene ,nx1 ,ny1,nz1,nx2,
460 2 ny2 ,nz2 ,nx3,ny3,nz3,
461 3 nx4 ,ny4 ,nz4,p1 ,p2 ,
463 call inter_save_candidate( local_i_stok,j_stok,prov_n,prov_e,pene,local_cand_n,local_cand_e )
468 jj = local_next_nod(jj)
474 IF(flagremnode==2.AND.iremnode==2)
THEN
478 tagnod(remnode(m)) = 0
487 CALL i7cor3(x ,irect,nsv ,prov_e ,prov_n,
488 . stf ,stfn ,gapv ,igap ,gap ,
489 . gap_s,gap_m,istf ,gapmin ,gapmax,
490 . gap_s_l,gap_m_l ,drad ,ix11,ix12,
491 5 ix13 ,ix14 ,nsvg,x1 ,x2 ,
492 6 x3 ,x4 ,y1 ,y2 ,y3 ,
493 7 y4 ,z1 ,z2 ,z3 ,z4 ,
494 8 xi ,yi ,zi ,stif ,dgapload,
496 CALL i7dst3(ix13,ix14,x1 ,x2 ,x3 ,
497 1 x4 ,y1 ,y2 ,y3 ,y4 ,
498 2 z1 ,z2 ,z3 ,z4 ,xi ,
499 3 yi ,zi ,x0 ,y0 ,z0 ,
500 4 nx1,ny1,nz1,nx2,ny2,
501 5 nz2,nx3,ny3,nz3,nx4,
502 6 ny4,nz4,p1 ,p2 ,p3 ,
503 7 p4 ,lb1,lb2,lb3,lb4,
504 8 lc1,lc2,lc3,lc4,j_stok)
505 CALL i7pen3(marge,gapv,n11,n21,n31,
506 1 pene ,nx1 ,ny1,nz1,nx2,
507 2 ny2 ,nz2 ,nx3,ny3,nz3,
508 3 nx4 ,ny4 ,nz4,p1 ,p2 ,
510 call inter_save_candidate( local_i_stok,j_stok,prov_n,prov_e,pene,local_cand_n,local_cand_e )
515 cand_n_size(itask+1) = local_i_stok
516 cand_e_size(itask+1) = local_i_stok
522 address_cand_n(1) = 0
523 address_cand_e(1) = 0
526 address_cand_n(i+1) = cand_n_size(i) + address_cand_n(i)
527 address_cand_e(i+1) = cand_e_size(i) + address_cand_e(i)
529 cand_n_size(nthreads+1) = cand_n_size(nthreads+1) + cand_n_size(i)
530 cand_e_size(nthreads+1) = cand_e_size(nthreads+1) + cand_e_size(i)
536 my_old_size = ipari(18)*ipari(23)
538 i_stok = i_stok + cand_n_size(nthreads+1)
539 if(i_stok > my_old_size)
then
540 multimp = i_stok/ipari(18) + 1
549 my_address = i_stok_old + address_cand_n(itask+1)
550 intbuf_tab%cand_n(my_address+1:my_address+local_i_stok) = local_cand_n%int_array_1d(1:local_i_stok)
551 my_address = i_stok_old + address_cand_e(itask+1)
552 intbuf_tab%cand_e(my_address+1:my_address+local_i_stok) = local_cand_e%int_array_1d(1:local_i_stok)
564 my_size = cand_n_size(nthreads+1)
565 allocate(my_index(2*my_size))
566 allocate(sort_array(2,my_size))
567 allocate(save_array(2,my_size))
569 my_address = i_stok_old + address_cand_n(1)
570 sort_array(1,1:my_size) = intbuf_tab%cand_n(my_address+1:my_address+my_size)
571 my_address = i_stok_old + address_cand_e(1)
572 sort_array(2,1:my_size) = intbuf_tab%cand_e(my_address+1:my_address+my_size)
576 save_array(1:2,1:my_size) = sort_array(1:2,1:my_size)
579 call my_orders( mode,work,sort_array,my_index,my_size,2)
580 my_address = i_stok_old + address_cand_n(1)
582 intbuf_tab%cand_n(my_address+i) = save_array(1,my_index(i))
584 my_address = i_stok_old + address_cand_e(1)
586 intbuf_tab%cand_e(my_address+i) = save_array(2,my_index(i))
589 deallocate(sort_array)
590 deallocate(save_array)
597 voxel(iix(i),iiy(i),iiz(i))=0
603 deallocate( cand_n_size,cand_e_size )
604 deallocate( address_cand_n,address_cand_e )