39 . ITAB,NODES,GEO,ADDCNEL,CNEL,
40 . IXS,IXC,IXT,IXP,IXR,IXTG,
41 . SIZE_ADDCNEL,SIZE_CNEL,
42 . numelsg,numelqg,numelcg,numeltrg,numelpg,
43 . numelrg,numeltgg,ixs10 )
59! -
the list of surface
where the node is defined
68 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
69#include "implicit_f.inc"
80#include "tabsiz_c.inc"
85 INTEGER,
INTENT(in) :: SIZE_ADDCNEL,SIZE_CNEL
86 integer,
intent(in) :: numelsg
87 integer,
intent(in) ::
88 integer,
intent(in) :: numelcg
89 integer,
intent(in) :: numeltrg
90 integer,
intent(in) :: numelpg
91 integer,
intent(in) :: numelrg
92 integer,
intent(in) :: numeltgg
93 INTEGER,
DIMENSION(NPARI,NINTER),
INTENT(in) :: IPARI
94 INTEGER,
DIMENSION(2,NSPMD+1),
INTENT(in) :: IAD_ELEM
95 INTEGER,
DIMENSION(SFR_ELEM),
INTENT(in) :: FR_ELEM
97 TYPE(intbuf_struct_),
DIMENSION(NINTER),
INTENT(inout) :: INTBUF_TAB
98 INTEGER,
DIMENSION(NUMNOD),
INTENT(in) :: ITAB
99 type(nodal_arrays_),
INTENT(INOUT) :: NODES
100 my_real,
DIMENSION(NPROPG,NUMGEO),
INTENT(in) :: geo
101 INTEGER,
DIMENSION(0:SIZE_ADDCNEL),
INTENT(in) :: ADDCNEL
102 INTEGER,
DIMENSION(0:SIZE_CNEL),
INTENT(in) :: CNEL
103 INTEGER,
DIMENSION(NIXS,NUMELS),
TARGET,
INTENT(in) :: IXS
104 INTEGER,
DIMENSION(NIXC,NUMELC),
TARGET,
INTENT(in) :: IXC
105 INTEGER,
DIMENSION(NIXT,NUMELT),
TARGET,
INTENT(in) :: IXT
106 INTEGER,
DIMENSION(NIXP,NUMELP),
TARGET,
INTENT(in) :: IXP
107 INTEGER,
DIMENSION(NIXR,NUMELR),
TARGET,
INTENT(in) :: IXR
108 INTEGER,
DIMENSION(NIXTG,NUMELTG),
TARGET,
INTENT(in) :: IXTG
109 INTEGER,
DIMENSION(6,NUMELS10),
INTENT(in) :: IXS10
113 LOGICAL :: TYPE_INTER
114 INTEGER :: NIN,ITY,NSN,NMN,NRTM,NRTS,IDEL,IDELKEEP,NRTMG
116 INTEGER :: NODE_ID,SHIFT,SHIFT_INTER,NEXT_INTER
117 INTEGER :: TMP_,MY_ERROR,NB_PROC,NB_NODE_SURF,NB_SURF,NB_REAL_NODE
118 INTEGER :: NB_EDGE,NB_EDGE_2
119 INTEGER :: N1,N2,N3,N4
120 INTEGER :: MAX_NB_NODE_PER_SURFACE
122 INTEGER,
DIMENSION(4) :: LIST_NODE_ID
123 INTEGER,
DIMENSION(4) :: GLOBAL_NODE_ID
124 INTEGER,
DIMENSION(:),
ALLOCATABLE :: WORK_ARRAY,WORK_ARRAY_2,WORK_ARRAY_3
125 INTEGER,
DIMENSION(:),
ALLOCATABLE :: SORT_ARRAY,PERM
127 TYPE(
array_type),
DIMENSION(:),
ALLOCATABLE :: BUFFER_SECOND,BUFFER_MAIN
128 TYPE(
array_type),
DIMENSION(:),
ALLOCATABLE :: R_BUFFER_SECOND
130 INTEGER,
DIMENSION(MPI_STATUS_SIZE)
131INTEGER :: MSGTYP,,IERROR
133 INTEGER,
DIMENSION(NSPMD) :: REQUEST_S,REQUEST_R
134 INTEGER,
DIMENSION(NSPMD) :: REQUEST_S2
135INTEGER,
DIMENSION(NSPMD) :: REQUEST_S3,REQUEST_R3
137 INTEGER :: SIZ,OLD_SIZE
139 INTEGER :: NB_PROC_1,NB_PROC_2,NB_RESULT_INTERSECT
140INTEGER,
DIMENSION(:),
ALLOCATABLE :: INTERSECT_1,INTERSECT_2,RESULT_INTERSECT
141 INTEGER,
DIMENSION(2,NSPMD) :: S_BUFFER_2_INT,R_BUFFER_2_INT
142 INTEGERDIMENSION(NSPMD) :: SIZE_BUFFER_MAIN,SIZE_BUFFER_SECOND
143 INTEGER,
DIMENSION(NSPMD) :: R_SIZE_BUFFER_MAIN,R_SIZE_BUFFER_SECOND
151 shoot_struct%offset_elem%sol_low_bound = 0
152 shoot_struct%offset_elem%sol_up_bound = numelsg
154 shoot_struct%offset_elem%quad_low_bound = shoot_struct%offset_elem%sol_up_bound + 1
155 shoot_struct%offset_elem%quad_up_bound = shoot_struct%offset_elem%sol_up_bound + numelqg
157 shoot_struct%offset_elem%shell_low_bound = shoot_struct%offset_elem%quad_up_bound + 1
158 shoot_struct%offset_elem%shell_up_bound = shoot_struct%offset_elem%quad_up_bound + numelcg
160 shoot_struct%offset_elem%truss_low_bound = shoot_struct%offset_elem%shell_up_bound + 1
161 shoot_struct%offset_elem%truss_up_bound = shoot_struct%offset_elem%shell_up_bound + numeltrg
163 shoot_struct%offset_elem%beam_low_bound = shoot_struct%offset_elem%truss_up_bound + 1
164 shoot_struct%offset_elem%beam_up_bound = shoot_struct%offset_elem%truss_up_bound + numelpg
166 shoot_struct%offset_elem%spring_low_bound = shoot_struct%offset_elem%truss_up_bound + 1
167 shoot_struct%offset_elem%spring_up_bound = shoot_struct%offset_elem%truss_up_bound + numelrg
169 shoot_struct%offset_elem%shell3n_low_bound = shoot_struct%offset_elem%spring_up_bound + 1
170 shoot_struct%offset_elem%shell3n_up_bound = shoot_struct%offset_elem%spring_up_bound + numeltgg
174 ALLOCATE( buffer_second(nspmd) )
175 ALLOCATE( buffer_main(nspmd) )
176 ALLOCATE( r_buffer_second(nspmd) )
177 ALLOCATE( r_buffer_main(nspmd) )
179 buffer_second(1:nspmd)%SIZE_INT_ARRAY_1D = 0
180 buffer_main(1:nspmd)%SIZE_INT_ARRAY_1D = 0
181 r_buffer_second(1:nspmd)%SIZE_INT_ARRAY_1D = 0
182 r_buffer_main(1:nspmd)%SIZE_INT_ARRAY_1D = 0
190 IF(
ALLOCATED(shoot_struct%SHIFT_S_NODE) )
DEALLOCATE( shoot_struct%SHIFT_S_NODE )
191 ALLOCATE( shoot_struct%SHIFT_S_NODE(numnod+1) )
192 shoot_struct%SHIFT_S_NODE(1:numnod+1) = 0
196 idel = ipari(17,nin)! idel option
197 idelkeep = ipari(61,nin)
198 IF((ity==7.OR.ity==10.OR.ity==22.OR.ity==24.OR.ity==25).AND.idel>=1.AND.idelkeep/=1)
THEN
203 IF(node_id<=numnod) shoot_struct%SHIFT_S_NODE(node_id+1) = shoot_struct%SHIFT_S_NODE(node_id+1) + 1
208 shoot_struct%SIZE_SEC_NODE = 0
213 shoot_struct%SIZE_SEC_NODE = shoot_struct%SHIFT_S_NODE(numnod+1)
216 IF(
ALLOCATED(shoot_struct%INTER_SEC_NODE) )
DEALLOCATE( shoot_struct%INTER_SEC_NODE )
217 ALLOCATE( shoot_struct%INTER_SEC_NODE(shoot_struct%SIZE_SEC_NODE) )
218 IF(
ALLOCATED(shoot_struct%SEC_NODE_ID) )
DEALLOCATE( shoot_struct%SEC_NODE_ID )
219 ALLOCATE( shoot_struct%SEC_NODE_ID(shoot_struct%SIZE_SEC_NODE) )
222 ALLOCATE( work_array(numnod) )
223 work_array(1:numnod) = 0
228 idelkeep = ipari(61,nin)
229 IF((ity==7.OR.ity==10.OR.ity==22.OR.ity==24.OR.ity==25).AND.idel>=1.AND.idelkeep/=1)
THEN
231 node_id = intbuf_tab(nin)%NSV(i)
232 IF(node_id<=numnod)
THEN
233 work_array(node_id) = work_array(node_id) + 1
234 shift = work_array(node_id) + shoot_struct%SHIFT_S_NODE(node_id)
235 shoot_struct%INTER_SEC_NODE( shift ) = nin
236 shoot_struct%SEC_NODE_ID( shift ) = i
242 DEALLOCATE( work_array )
249 IF(
ALLOCATED(shoot_struct%SHIFT_M_NODE_PROC) )
DEALLOCATE( shoot_struct%SHIFT_M_NODE_PROC )
250 ALLOCATE( shoot_struct%SHIFT_M_NODE_PROC(numnod+1) )
251 shoot_struct%SHIFT_M_NODE_PROC(2:numnod+1) = 1
252 shoot_struct%SHIFT_M_NODE_PROC(1) = 0
258 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
260 shoot_struct%SHIFT_M_NODE_PROC(node_id+1) = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) + 1
264 shoot_struct%SHIFT_M_NODE_PROC(i+1) = shoot_struct%SHIFT_M_NODE_PROC(i+1) + shoot_struct%SHIFT_M_NODE_PROC(i)
267 shoot_struct%SIZE_M_NODE_PROC = shoot_struct%SHIFT_M_NODE_PROC(numnod+1)
272 IF(
ALLOCATED(shoot_struct%M_NODE_PROC) )
DEALLOCATE( shoot_struct%M_NODE_PROC )
273 ALLOCATE( shoot_struct%M_NODE_PROC( shoot_struct%SIZE_M_NODE_PROC ) )
274 shoot_struct%M_NODE_PROC(1:shoot_struct%SIZE_M_NODE_PROC) = -1
275 ALLOCATE( work_array(numnod) )
276 work_array(1:numnod) = 0
280 work_array(i) = work_array(i) + 1
281 shift = work_array(i) + shoot_struct%SHIFT_M_NODE_PROC(i)
282 shoot_struct%M_NODE_PROC( shift ) = ispmd+1
286 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
288 work_array(node_id) = work_array(node_id) + 1
289 shift = work_array(node_id) + shoot_struct%SHIFT_M_NODE_PROC(node_id)
290 shoot_struct%M_NODE_PROC( shift ) = i
294 shoot_struct%MAX_PROC_NB = 0
296 shift = shoot_struct%SHIFT_M_NODE_PROC(i)
297 nb_proc = shoot_struct%SHIFT_M_NODE_PROC(i+1) - shoot_struct%SHIFT_M_NODE_PROC(i)
298 shoot_struct%MAX_PROC_NB =
max(shoot_struct%MAX_PROC_NB,nb_proc)
300 ALLOCATE( sort_array(nb_proc),perm(nb_proc) )
301 sort_array(1:nb_proc) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc )
302 CALL myqsort_int(nb_proc, sort_array, perm, my_error)
303 shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc ) = sort_array(1:nb_proc)
304 DEALLOCATE( sort_array,perm )
305 ELSEIF(nb_proc==2)
THEN
306 IF(shoot_struct%M_NODE_PROC(shift+1)>shoot_struct%M_NODE_PROC(shift+2))
THEN
307 tmp_ = shoot_struct%M_NODE_PROC(shift+2)
308 shoot_struct%M_NODE_PROC(shift+2) = shoot_struct%M_NODE_PROC(shift+1)
309 shoot_struct%M_NODE_PROC(shift+1) = tmp_
316 ! compute
the index
for the surface/edge array
317 IF(
ALLOCATED(shoot_struct%SHIFT_M_NODE_SURF) )
DEALLOCATE( shoot_struct%SHIFT_M_NODE_SURF
318 ALLOCATE( shoot_struct%SHIFT_M_NODE_SURF(numnod+1) )
319 shoot_struct%SHIFT_M_NODE_SURF(1:numnod+1) = 0
320 IF(
ALLOCATED(shoot_struct%SHIFT_M_NODE_EDGE) )
DEALLOCATE( shoot_struct%SHIFT_M_NODE_EDGE )
321 ALLOCATE( shoot_struct%SHIFT_M_NODE_EDGE(numnod+1) )
322 shoot_struct%SHIFT_M_NODE_EDGE(1:numnod+1) = 0
323 IF(
ALLOCATED(shoot_struct%SHIFT_S_NODE_EDGE) )
DEALLOCATE( shoot_struct%SHIFT_S_NODE_EDGE )
324 ALLOCATE( shoot_struct%SHIFT_S_NODE_EDGE(numnod+1) )
325 shoot_struct%SHIFT_S_NODE_EDGE(1:numnod+1) = 0
334 IF((ity==7.OR.ity==10.OR.ity==22.OR.ity==24.OR.ity==25).AND.idel>=1)
THEN
337 n1 = intbuf_tab(nin)%IRECTM((i-1)*4+1)
338 n2 = intbuf_tab(nin)%IRECTM((i-1)*4+2)
339 n3 = intbuf_tab(nin)%IRECTM((i-1)*4+3)
340 n4 = intbuf_tab(nin)%IRECTM(
341 shoot_struct%SHIFT_M_NODE_SURF(n1+1) = shoot_struct%SHIFT_M_NODE_SURF(n1+1) + 1
342 shoot_struct%SHIFT_M_NODE_SURF(n2+1) = shoot_struct%SHIFT_M_NODE_SURF(n2+1) + 1
343 shoot_struct%SHIFT_M_NODE_SURF(n3+1) = shoot_struct%SHIFT_M_NODE_SURF(n3+1) + 1
344 IF(n3/=n4) shoot_struct%SHIFT_M_NODE_SURF(n4+1)
348 ELSEIF(ity == 11)
THEN
352 n1 = intbuf_tab(nin)%IRECTM((i-1)*2+1)
353 n2 = intbuf_tab(nin)%IRECTM((i-1)*2+2)
354 shoot_struct%SHIFT_M_NODE_EDGE(n1+1) = shoot_struct%SHIFT_M_NODE_EDGE(n1+1) + 1
355 shoot_struct%SHIFT_M_NODE_EDGE
361 n1 = intbuf_tab(nin)%IRECTS((i-1)*2+1)
362 n2 = intbuf_tab(nin)%IRECTS((i-1)*2+2)
363 shoot_struct%SHIFT_S_NODE_EDGE(n1+1) = shoot_struct%SHIFT_S_NODE_EDGE(n1+1) + 1
364 shoot_struct%SHIFT_S_NODE_EDGE(n2+1) = shoot_struct%SHIFT_S_NODE_EDGE(n2+1) + 1
372 shoot_struct%SHIFT_M_NODE_SURF(i+1) = shoot_struct%SHIFT_M_NODE_SURF(i+1) + shoot_struct%SHIFT_M_NODE_SURF(i)
373 shoot_struct%SHIFT_M_NODE_EDGE(i+1) = shoot_struct%SHIFT_M_NODE_EDGE(i+1) + shoot_struct%SHIFT_M_NODE_EDGE(i
374 shoot_struct%SHIFT_S_NODE_EDGE(i+1) = shoot_struct%SHIFT_S_NODE_EDGE(i+1) + shoot_struct%SHIFT_S_NODE_EDGE(i)
376 shoot_struct%SIZE_M_NODE_SURF = shoot_struct%SHIFT_M_NODE_SURF(numnod+1)
377 IF(
ALLOCATED(shoot_struct%M_NODE_SURF) )
DEALLOCATE( shoot_struct%M_NODE_SURF )
378 ALLOCATE( shoot_struct%M_NODE_SURF( shoot_struct%SIZE_M_NODE_SURF) )
379 IF(
ALLOCATED(shoot_struct%M_NODE_EDGE) )
DEALLOCATE( shoot_struct%M_NODE_EDGE )
380 shoot_struct%SIZE_M_NODE_EDGE = shoot_struct%SHIFT_M_NODE_EDGE(numnod+1)
381 ALLOCATE( shoot_struct%M_NODE_EDGE( shoot_struct%SIZE_M_NODE_EDGE) )
382 shoot_struct%SIZE_S_NODE_EDGE = shoot_struct%SHIFT_S_NODE_EDGE(numnod+1)
383 IF(
ALLOCATED(shoot_struct%S_NODE_EDGE) )
DEALLOCATE( shoot_struct%S_NODE_EDGE )
384 ALLOCATE( shoot_struct%S_NODE_EDGE( shoot_struct%SIZE_S_NODE_EDGE) )
387 shoot_struct%MAX_SURF_NB = 0
388 shoot_struct%MAX_EDGE_NB = 0
390 nb_surf = shoot_struct%SHIFT_M_NODE_SURF(i+1) - shoot_struct%SHIFT_M_NODE_SURF
391 shoot_struct%MAX_SURF_NB =
max(shoot_struct%MAX_SURF_NB,nb_surf)
393 nb_edge = shoot_struct%SHIFT_M_NODE_EDGE(i+1) - shoot_struct%SHIFT_M_NODE_EDGE(i)
394 nb_edge_2 = shoot_struct%SHIFT_S_NODE_EDGE(i+1) - shoot_struct%SHIFT_S_NODE_EDGE(i)
395 nb_edge =
max(nb_edge,nb_edge_2)
396 shoot_struct%MAX_EDGE_NB =
max(shoot_struct%MAX_EDGE_NB,nb_edge)
400 work_array(1:numnod) = 0
401 ALLOCATE( work_array_2(numnod) )
402 work_array_2(1:numnod) = 0
403 ALLOCATE( work_array_3(numnod) )
404 work_array_3(1:numnod) = 0
405 IF(
ALLOCATED(shoot_struct%SHIFT_INTERFACE) )
DEALLOCATE( shoot_struct%SHIFT_INTERFACE )
406 IF(
ALLOCATED(shoot_struct%SHIFT_INTERFACE2) )
DEALLOCATE( shoot_struct%SHIFT_INTERFACE2 )
407 ALLOCATE( shoot_struct%SHIFT_INTERFACE(ninter+1,2) )
408 ALLOCATE( shoot_struct%SHIFT_INTERFACE2(ninter) )
418 nrtmg = ipari(74,nin)
420 IF((ity==7.OR.ity==10.OR.ity==22.OR.ity==24.OR.ity==25).AND.idel>=1)
THEN
423 n3 = intbuf_tab(nin)%IRECTM((i-1)*4+3)
424 n4 = intbuf_tab(nin)%IRECTM((i-1)*4+4)
426 IF(n3==n4) nb_node_surf = 3
428 node_id = intbuf_tab(nin)%IRECTM((i-1)*4+j)
429 work_array(node_id) = work_array(node_id) + 1
430 shift = work_array(node_id) + shoot_struct%SHIFT_M_NODE_SURF(node_id)
431 shoot_struct%M_NODE_SURF( shift ) = shift_inter - 1 + i
440 node_id = intbuf_tab(nin)%IRECTM((i-1)*2+j)
441 work_array_2(node_id) = work_array_2(node_id) + 1
442 shift = work_array_2(node_id) + shoot_struct%SHIFT_M_NODE_EDGE(node_id)
443 shoot_struct%M_NODE_EDGE( shift ) = shift_inter - 1 + i
451 node_id = intbuf_tab(nin)%IRECTS((i-1)*2+j)
452 work_array_3(node_id) = work_array_3(node_id) + 1
453 shift = work_array_3(node_id) + shoot_struct%SHIFT_S_NODE_EDGE(node_id)
454 shoot_struct%S_NODE_EDGE( shift ) = shift_inter - 1 + i
461 next_inter = next_inter + 1
462 shoot_struct%SHIFT_INTERFACE(next_inter,1) = shift_inter
463 shoot_struct%SHIFT_INTERFACE(next_inter,2) = nin
465 IF(nrtmg>0.AND.(ity==25.AND.ipari(100,nin)/=0))
THEN
466 shoot_struct%SHIFT_INTERFACE2(nin) = shift_inter2
467 shift_inter2 = shift_inter2 + nrtmg
470 shift_inter = shift_inter + nrtm + nrts
472 shoot_struct%SHIFT_INTERFACE(next_inter
473 shoot_struct%SHIFT_INTERFACE(ninter+1,1) = shift_inter + 1
474 shoot_struct%SHIFT_INTERFACE(ninter+1,2) = next_inter
477 DEALLOCATE( work_array )
479 ALLOCATE( intersect_1(nspmd) )
480 ALLOCATE( intersect_2(nspmd) )
481 ALLOCATE( result_intersect(nspmd) )
483 size_buffer_main(1:nspmd) = 0
484 size_buffer_second(1:nspmd) = 0
485 max_nb_node_per_surface = 4
486 chunk = 2 + max_nb_node_per_surface
493 type_inter = (ity==7.OR.ity==10.OR.ity==11.OR.ity==22.OR.ity==24)
494 type_inter = (type_inter.OR.(ity==25.AND.ipari(100,nin)==0))
495 type_inter = (type_inter.AND.(idel==1))
497 IF((type_inter.AND.(idel==1)).OR.(ity==25.AND.ipari(100,nin)/=0))
THEN
498 IF(.NOT.
ALLOCATED(shoot_struct%INTER))
ALLOCATE(shoot_struct%INTER(ninter))
499 if(.NOT.
ALLOCATED(shoot_struct%INTER(nin)%REMOTE_ELM_M))
THEN
500 ALLOCATE( shoot_struct%INTER(nin)%REMOTE_ELM_M(nrtm) )
502 shoot_struct%INTER(nin)%REMOTE_ELM_M(1:nrtm) = 0
504 IF(.NOT.
ALLOCATED(shoot_struct%INTER(nin)%REMOTE_ELM_S))
THEN
505 ALLOCATE( shoot_struct%INTER(nin)%REMOTE_ELM_S(nrts) )
507 shoot_struct%INTER(nin)%REMOTE_ELM_S(1:nrts) = 0
508 IF(ity==25.AND.ipari(100,nin)/=0)
THEN
509 IF(.NOT.
ALLOCATED(shoot_struct%INTER))
ALLOCATE(shoot_struct%INTER(ninter))
510 ALLOCATE( shoot_struct%INTER(nin)%NB_ELM_M(nrtm) )
511 shoot_struct%INTER(nin)%NB_ELM_M(1:nrtm) = 0
517 IF( (type_inter.OR.(ity==25.AND.ipari(100,nin)/=0)).AND.nspmd>1 )
THEN
519 IF(.NOT.
ALLOCATED(buffer_second(i)%INT_ARRAY_1D))
THEN
520 buffer_second(i)%SIZE_INT_ARRAY_1D = numnod/4+1
524IF(.NOT.
ALLOCATED(buffer_main(i)%INT_ARRAY_1D))
THEN
525 buffer_main(i)%SIZE_INT_ARRAY_1D = numnod/4+1
530 IF(ity==11) nb_node_surf = 2
534 list_node_id(1) = intbuf_tab(nin)%IRECTM((i-1)*nb_node_surf+1)
535 list_node_id(2) = intbuf_tab(nin)%IRECTM((i-1)*nb_node_surf+2)
538 global_node_id(1) = itab(list_node_id(1))
539 global_node_id(2) = itab(list_node_id(2))
540 global_node_id(3) = 0
541 global_node_id(4) = 0
544 IF(ity==7.OR.ity==10.OR.ity==22.OR.ity==24.OR.ity==25)
THEN
545 list_node_id(3) = intbuf_tab(nin)%IRECTM((i-1)*nb_node_surf+3)
546 list_node_id(4) = intbuf_tab(nin)%IRECTM((i-1)*nb_node_surf+4)
547 global_node_id(3) = itab(list_node_id(3))
548 global_node_id(4) = itab(list_node_id(4)) ! global node
id n4
550 IF(list_node_id(3)==list_node_id(4)) nb_real_node = 3
553 nb_proc_1 = shoot_struct%SHIFT_M_NODE_PROC(list_node_id(1)+1)
554 . - shoot_struct%SHIFT_M_NODE_PROC(list_node_id(1))
555 nb_proc_2 = shoot_struct%SHIFT_M_NODE_PROC(list_node_id(2)+1)
556 . - shoot_struct%SHIFT_M_NODE_PROC(list_node_id(2))
557 nb_result_intersect = 0
560 shift = shoot_struct%SHIFT_M_NODE_PROC(list_node_id(1))
561 intersect_1(1:nb_proc_1) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_1 )
564 DO j = 1,nb_real_node-1
565 IF(nb_proc_1>1.AND.nb_proc_2>1)
THEN
567 shift = shoot_struct%SHIFT_M_NODE_PROC(list_node_id(j+1))
568 nb_proc_2 = shoot_struct%SHIFT_M_NODE_PROC(list_node_id(j+1)+1)
569 . - shoot_struct%SHIFT_M_NODE_PROC(list_node_id(j+1))
570 intersect_2(1:nb_proc_2) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_2 )
572 CALL intersect_2_sorted_sets( intersect_1,nb_proc_1,
574 . result_intersect,nb_result_intersect )
576 nb_proc_1 = nb_result_intersect
577 intersect_1(1:nb_result_intersect) = result_intersect(1:nb_result_intersect)
579 nb_result_intersect = 0
585 IF(nb_result_intersect>1)
THEN
588 DO j=1,nb_result_intersect
589 proc_id = result_intersect(j)
590 IF(proc_id/=ispmd+1)
THEN
591 IF(size_buffer_main(proc_id)+chunk>buffer_main(proc_id)%SIZE_INT_ARRAY_1D)
THEN
592 old_size = buffer_main(proc_id)%SIZE_INT_ARRAY_1D
593 ALLOCATE( work_array(old_size) )
594 work_array(1:old_size) =
595 . buffer_main(proc_id)%INT_ARRAY_1D(1:old_size)
597 buffer_main(proc_id)%SIZE_INT_ARRAY_1D = chunk * (old_size + chunk)
599 buffer_main(proc_id)%INT_ARRAY_1D(1:old_size) = work_array(1:old_size)
600 DEALLOCATE( work_array )
603 size_buffer_main(proc_id) = size_buffer_main(proc_id) + 1
604 buffer_main(proc_id)%INT_ARRAY_1D( size_buffer_main(proc_id) ) = nin
606 size_buffer_main(proc_id) = size_buffer_main(proc_id) + 1
607 buffer_main(proc_id)%INT_ARRAY_1D( size_buffer_main(proc_id) ) = i
609 size_buffer_main(proc_id) = size_buffer_main(proc_id) + 1
610 buffer_main(proc_id)%INT_ARRAY_1D( size_buffer_main(proc_id) ) = global_node_id(1)
612 size_buffer_main(proc_id) = size_buffer_main(proc_id) + 1
613 buffer_main(proc_id)%INT_ARRAY_1D
615 size_buffer_main(proc_id) = size_buffer_main(proc_id) + 1
616 buffer_main(proc_id)%INT_ARRAY_1D( size_buffer_main(proc_id) ) = global_node_id(3)
618 size_buffer_main(proc_id) = size_buffer_main(proc_id) + 1
619 buffer_main(proc_id)%INT_ARRAY_1D( size_buffer_main(proc_id) ) = global_node_id(4)
628 ! loop over
the secondary nodes
630 n1 = intbuf_tab(nin)%IRECTS((i-1)*2+1)
631 n2 = intbuf_tab(nin)%IRECTS((i-1)*2+2)
632 nb_proc_1 = shoot_struct%SHIFT_M_NODE_PROC(n1+1) - shoot_struct%SHIFT_M_NODE_PROC(n1)
633 nb_proc_2 = shoot_struct%SHIFT_M_NODE_PROC(n2+1) - shoot_struct%SHIFT_M_NODE_PROC(n2)
634 IF(nb_proc_1>1.AND.nb_proc_2>1)
THEN
635 shift = shoot_struct%SHIFT_M_NODE_PROC(n1)
636 intersect_1(1:nb_proc_1) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_1 )
637 shift = shoot_struct%SHIFT_M_NODE_PROC(n2)
638 intersect_2(1:nb_proc_2) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_2 )
640 nb_result_intersect = 0
641 CALL intersect_2_sorted_sets( intersect_1,nb_proc_1,
642 . intersect_2,nb_proc_2,
645 IF(nb_result_intersect>1)
THEN
646 DO j=1,nb_result_intersect
647 proc_id = result_intersect(j)
648 IF(proc_id/=ispmd+1)
THEN
649 IF(size_buffer_second(proc_id)+chunk>buffer_second(proc_id)%SIZE_INT_ARRAY_1D)
THEN
650 old_size = buffer_second(proc_id)%SIZE_INT_ARRAY_1D
651 ALLOCATE( work_array(old_size) )
652 work_array(1:old_size) =
653 . buffer_second(proc_id)%INT_ARRAY_1D(1:old_size)
655 buffer_second(proc_id)%SIZE_INT_ARRAY_1D =
656 . chunk * (buffer_second(proc_id)%SIZE_INT_ARRAY_1D + chunk)
658 buffer_second(proc_id)%INT_ARRAY_1D(1:old_size) = work_array(1:old_size)
659 DEALLOCATE( work_array )
662 size_buffer_second(proc_id) = size_buffer_second(proc_id) + 1
663 buffer_second(proc_id)%INT_ARRAY_1D( size_buffer_second(proc_id) ) = nin
665 size_buffer_second(proc_id) = size_buffer_second(proc_id) + 1
666 buffer_second(proc_id)%INT_ARRAY_1D( size_buffer_second(proc_id) ) = i
668 size_buffer_second(proc_id) = size_buffer_second(proc_id) + 1
669 buffer_second(proc_id)%INT_ARRAY_1D( size_buffer_second(proc_id) ) = itab(n1)
671 size_buffer_second(proc_id) = size_buffer_second(proc_id) + 1
672 buffer_second(proc_id)%INT_ARRAY_1D( size_buffer_second(proc_id) ) = itab(n2)
674 size_buffer_second(proc_id) = size_buffer_second(proc_id) + 1
675 buffer_second(proc_id)%INT_ARRAY_1D( size_buffer_second(proc_id) ) = 0
677 size_buffer_second(proc_id) = size_buffer_second
678 buffer_second(proc_id)%INT_ARRAY_1D( size_buffer_second(proc_id
691 IF(ity==25.AND.ipari(100,nin)/=0)
THEN
694 IF(intbuf_tab(nin)%STFM(i)<zero)
THEN
695 shoot_struct%INTER(nin)%NB_ELM_M(i) = shoot_struct%INTER(nin)%NB_ELM_M(i) + 1
696 IF(intbuf_tab(nin)%IELEM_M(2*(i-1)+2)/=0)
THEN
697 shoot_struct%INTER(nin)%NB_ELM_M(i) = shoot_struct%INTER(nin)%NB_ELM_M(i) + 1
702 ! ----------------------------------------
709 r_size_buffer_main(i) = 0
710 r_size_buffer_second(i) = 0
711 siz = iad_elem(1,i+1)-iad_elem(1,i)
712 IF(i/=ispmd+1.AND.siz>0)
THEN
713 s_buffer_2_int(1,i) = size_buffer_main(i)
714 s_buffer_2_int(2,i) = size_buffer_second(i)
715 CALL mpi_isend(s_buffer_2_int(1,i),2,mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_s(i),ierror)
717 IF(i/=ispmd+1.AND.siz>0)
THEN
718 CALL mpi_irecv(r_buffer_2_int(1,i),2,mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_r(i),ierror)
724 siz = iad_elem(1,i+1)-iad_elem(1,i)
725 IF(i/=ispmd+1.AND.siz>0)
THEN
726 CALL mpi_wait(request_s(i),statu,ierror)
727 CALL mpi_wait(request_r(i),statu,ierror)
728 r_size_buffer_main(i) = r_buffer_2_int(1,i)
729 r_size_buffer_second(i) = r_buffer_2_int(2,i)
733 IF(r_size_buffer_main(i)>0)
THEN
734 r_buffer_main(i)%SIZE_INT_ARRAY_1D = r_size_buffer_main(i)
736 CALL mpi_irecv( r_buffer_main(i)%INT_ARRAY_1D,r_buffer_main(i)%SIZE_INT_ARRAY_1D,
737 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_r2(i),ierror )
739 IF(r_size_buffer_second(i)>0)
THEN
740 r_buffer_second(i)%SIZE_INT_ARRAY_1D = r_size_buffer_second(i)
742 CALL mpi_irecv( r_buffer_second(i)%INT_ARRAY_1D,r_buffer_second(i)%SIZE_INT_ARRAY_1D,
743 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world
745 IF(size_buffer_main(i)>0)
THEN
746 CALL mpi_isend( buffer_main(i)%INT_ARRAY_1D,size_buffer_main(i),
747 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_s2(i),ierror )
749 IF(size_buffer_second(i)>0)
THEN
750 CALL mpi_isend( buffer_second(i)%INT_ARRAY_1D,size_buffer_second(i),
751 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_s3(i),ierror )
755 siz = iad_elem(1,i+1)-iad_elem(1,i)
756 IF(size_buffer_main(i)>0)
CALL mpi_wait(request_s2(i),statu,ierror)
757 IF(r_size_buffer_main(i)>0)
CALL mpi_wait(request_r2(i),statu,ierror)
758 IF(size_buffer_second(i)>0)
CALL mpi_wait(request_s3(i),statu,ierror)
759 IF(r_size_buffer_second(i)>0)
CALL mpi_wait(request_r3(i
762 IF(r_buffer_main(i)%SIZE_INT_ARRAY_1D>0)
THEN
764 . geo,ixs,ixc,ixt,ixp,ixr,ixtg,addcnel,nodes,cnel,chunk,ixs10)
765 CALL mpi_isend( r_buffer_main(i)%INT_ARRAY_1D,r_buffer_main
766 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_s2(i),ierror )
769 IF(r_buffer_second(i)%SIZE_INT_ARRAY_1D>0)
THEN
771 . geo,ixs,ixc,ixt,ixp,ixr,ixtg,addcnel,nodes,cnel,chunk,ixs10 )
772 CALL mpi_isend( r_buffer_second(i)%INT_ARRAY_1D,r_buffer_second(i)%SIZE_INT_ARRAY_1D
773 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_s3(i),ierror)
775 IF(size_buffer_main(i)>0)
THEN
776 CALL mpi_irecv( buffer_main(i)%INT_ARRAY_1D,size_buffer_main(i),
777 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_r2(i),ierror )
779 IF(size_buffer_second(i)>0)
THEN
780 CALL mpi_irecv( buffer_second(i)%INT_ARRAY_1D,size_buffer_second(i),
781 . mpi_integer,it_spmd(i),msgtyp,spmd_comm_world,request_r3(i),ierror )
785 siz = iad_elem(1,i+1)-iad_elem(1,i)
786 IF(r_buffer_main(i)%SIZE_INT_ARRAY_1D>0)
THEN
787 CALL mpi_wait(request_s2(i),statu,ierror)
790 IF(size_buffer_main(i)>0)
THEN
791 CALL mpi_wait(request_r2(i),statu,ierror)
792 CALL count_nb_elem_edge( 1,size_buffer_main(i),buffer_main(i)%INT_ARRAY_1D,shoot_struct,chunk)
795 IF(r_buffer_second(i)%SIZE_INT_ARRAY_1D>0)
THEN
796 CALL mpi_wait(request_s3(i),statu,ierror)
799 IF(size_buffer_second(i)>0)
THEN
800 CALL mpi_wait(request_r3(i),statu,ierror)
801 CALL count_nb_elem_edge( 2,size_buffer_second(i),buffer_second(i)%INT_ARRAY_1D,shoot_struct,chunk)
809 DEALLOCATE( work_array_2 )
810 DEALLOCATE( work_array_3 )
812 DEALLOCATE( intersect_1 )
813 DEALLOCATE( intersect_2 )
814 DEALLOCATE( result_intersect )
816 DEALLOCATE( buffer_second )
817 DEALLOCATE( buffer_main )
818 DEALLOCATE( r_buffer_second )
819 DEALLOCATE( r_buffer_main )
823 IF(.NOT.
ALLOCATED(shoot_struct%GLOBAL_NB_ELEM_OFF))
THEN
824 ALLOCATE( shoot_struct%GLOBAL_NB_ELEM_OFF(nthread) )
829 shoot_struct%NUMBER_REMOTE_SURF = 0
830 shoot_struct%SIZE_REMOTE_SURF = 0
831 IF(
ALLOCATED(shoot_struct%REMOTE_SURF))
DEALLOCATE( shoot_struct%REMOTE_SURF )
832 ALLOCATE( shoot_struct%REMOTE_SURF( shoot_struct%SIZE_REMOTE_SURF ) )
837 shoot_struct%NUMBER_NEW_SURF = 0
838 shoot_struct%SIZE_NEW_SURF = 0
839 IF(
ALLOCATED(shoot_struct%NEW_SURF))
DEALLOCATE( shoot_struct%NEW_SURF )
840 ALLOCATE( shoot_struct%NEW_SURF( shoot_struct%SIZE_NEW_SURF ) )