35 . NGROUP,NPARG,IGROUPS,IPARG )
51#include "implicit_f.inc"
60 INTEGER,
DIMENSION(NIXS,NUMELS),
TARGET,
INTENT(in) :: IXS
61 INTEGER,
DIMENSION(6,NUMELS10),
TARGET,
INTENT(in) :: IXS10
62 INTEGER,
DIMENSION(NIXC,NUMELC),
TARGET,
INTENT(in) :: IXC
63 INTEGER,
DIMENSION(NIXTG,NUMELTG),
TARGET,
INTENT(in) :: IXTG
64 INTEGER,
DIMENSION(NUMNOD),
INTENT(in) :: ITAB
65 INTEGER,
INTENT(in) :: NGROUP,NPARG
66 INTEGER,
DIMENSION(NUMELS),
INTENT(in) :: IGROUPS
67 INTEGER,
DIMENSION(NPARG,NGROUP),
INTENT(in) :: IPARG
73 INTEGER :: NODE_ID,NODE_ID_2,ELEM_ID
74 INTEGER :: OFFSET_SOLID,OFFSET_QUAD,OFFSET_SHELL,OFFSET_TRUSS
75 INTEGER :: OFFSET_BEAM,OFFSET_SPRING,OFFSET_TRIANGLE,OFFSET_UR
76 INTEGER,
DIMENSION(4,6),
TARGET :: FACES
77 INTEGER,
DIMENSION(4,5),
TARGET :: FACES6
78 INTEGER,
DIMENSION(3,4),
TARGET :: FACES4
79 INTEGER,
DIMENSION(3,16),
TARGET :: FACES10
80 INTEGER,
DIMENSION(4,1),
TARGET :: FACES_SHELL
81 INTEGER,
DIMENSION(:,:),
POINTER :: POINTER_FACE,IX,IX_TETRA10
83 LOGICAL :: DO_COMPUTATION
84 INTEGER :: SHIFT,SHIFT_ELM,OLD_SIZE
85 INTEGER :: SURFACE_NUMBER
86 INTEGER :: NB_PROC_1,NB_PROC_2,NODE_SURF_NB,SEVERAL_PROC,SEVERAL_SURF
87 INTEGER :: NB_RESULT_INTERSECT,NB_RESULT_INTERSECT_2,NB_SURFACE_1,NB_SURFACE_2
88 INTEGER,
DIMENSION(:),
ALLOCATABLE :: RESULT_INTERSECT,INTERSECT_1,INTERSECT_2
89 INTEGER,
DIMENSION(:),
ALLOCATABLE :: RESULT_INTERSECT_2,INTERSECT_3,INTERSECT_4
90 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TMP_ARRAY
91 INTEGER,
DIMENSION(4) :: LOCAL_NODE
92 INTEGER :: DICHOTOMIC_SEARCH_I_ASC
94 INTEGER :: KIND_SOLID,OLD_J,MERGED_NODE,ERROR
95 INTEGER,
DIMENSION(4) :: LIST_NODE_ID,PERM_LIST_NODE_ID,NB_APPAREANCE
96 LOGICAL :: NEED_COMPUTE
97 INTEGER :: N1,N2,N3,N4
100 faces_shell(1:4,1) = (/1,2,3,4/)
102 faces(1:4,1) = (/1,2,3,4/)
103 faces(1:4,2) = (/1,2,6,5/)
104 faces(1:4,3) = (/2,3,7,6/)
105 faces(1:4,4) = (/3,4,8,7/)
106 faces(1:4,5) = (/1,5,8,4/)
107 faces(1:4,6) = (/5,6,7,8/)
109 faces4(1:3,1) = (/2,3,6/)
110 faces4(1:3,2) = (/2,3,5/)
111 faces4(1:3,3) = (/2,6,5/)
112 faces4(1:3,4) = (/3,6,5/)
114 faces6(1:4,1) = (/1,2,3,1/)
115 faces6(1:4,2) = (/1,2,6,5/)
116 faces6(1:4,3) = (/2,3,7,6/)
117 faces6(1:4,4) = (/3,4,8,7/)
118 faces6(1:4,5) = (/5,6,7,5/)
120 faces10(1:3,1) = (/1,11,14/)
121 faces10(1:3,2) = (/3,11,15/)
122 faces10(1:3,3) = (/5,14,15/)
123 faces10(1:3,4) = (/11,14,15/)
124 faces10(1:3,5) = (/1,13,14/)
125 faces10(1:3,6) = (/6,13,16/)
126 faces10(1:3,7) = (/5,14,16/)
127 faces10(1:3,8) = (/13,14,16/)
128 faces10(1:3,9) = (/3,11,12/)
129 faces10(1:3,10) = (/6,12,13/)
130 faces10(1:3,11) = (/1,11,13/)
131 faces10(1:3,12) = (/11,12,13/)
132 faces10(1:3,13) = (/3,12,15/)
133 faces10(1:3,14) = (/6,12,16/)
134 faces10(1:3,15) = (/5,15,16/)
135 faces10(1:3,16) = (/12,15,16/)
139 offset_quad=offset_solid+numels
140 offset_shell=offset_quad+numelq
141 offset_truss=offset_shell+numelc
142 offset_beam=offset_truss+numelt
143 offset_spring=offset_beam+numelp
144 offset_triangle=offset_spring+numelr
145 offset_ur=offset_triangle+numeltg
150 shoot_struct%S_SAVE_SURFACE = 4*shoot_struct%S_GLOBAL_ELEM_INDEX
151 ALLOCATE( shoot_struct%SAVE_SURFACE( shoot_struct%S_SAVE_SURFACE ) )
152 shoot_struct%SAVE_SURFACE_NB = 0
153 shoot_struct%SAVE_SURFACE( 1:shoot_struct%S_SAVE_SURFACE ) = 0
156 shoot_struct%S_SAVE_PROC = 5*shoot_struct%S_GLOBAL_ELEM_INDEX
157 ALLOCATE( shoot_struct%SAVE_PROC( shoot_struct%S_SAVE_PROC ) )
158 shoot_struct%SAVE_PROC_NB = 0
159 shoot_struct%SAVE_PROC( 1:shoot_struct%S_SAVE_PROC ) = 0
162 ALLOCATE( result_intersect( shoot_struct%MAX_SURF_NB ) )
163 ALLOCATE( intersect_1( shoot_struct%MAX_SURF_NB ) )
164 ALLOCATE( intersect_2( shoot_struct%MAX_SURF_NB ) )
166 ALLOCATE( result_intersect_2( shoot_struct%MAX_PROC_NB ) )
167 ALLOCATE( intersect_3( shoot_struct%MAX_PROC_NB ) )
168 ALLOCATE( intersect_4( shoot_struct%MAX_PROC_NB ) )
170 DO i=1,shoot_struct%S_GLOBAL_ELEM_INDEX
171 elem_id = shoot_struct%GLOBAL_ELEM_INDEX(i)
172 do_computation = .true.
176 IF(elem_id<=numels8)
THEN
199 group_number = igroups
200 kind_solid = iparg(28,group_number)
203 IF(kind_solid==4)
THEN
206 pointer_face => faces4(1:3,1:4)
209 ELSEIF(kind_solid==6)
THEN
212 pointer_face => faces6(1:4,1:5)
219 pointer_face => faces(1:4,1:6)
222 ix => ixs(1:nixs,1:numels)
223 shift_elm = offset_solid
224 ELSEIF(elem_id<=numels8+numels10)
THEN
237 ix => ixs(1:nixs,1:numels)
238 ix_tetra10 => ixs10(1:6,1:numels10)
239 pointer_face => faces10(1:3,1:16)
243 ELSEIF(elem_id<=numels)
THEN
252 ix => ixs(1:nixs,1:numels)
253 pointer_face => faces(1:4,1:6)
255 shift_elm = offset_solid
256 ELSEIF(elem_id<=offset_shell)
THEN
258 do_computation = .false.
259 ELSEIF(elem_id<=offset_truss)
THEN
267 ix => ixc(1:nixc,1:numelc)
268 pointer_face => faces_shell(1:4,1:1)
270 shift_elm = offset_shell
271 ELSEIF(elem_id<=offset_beam)
THEN
273 do_computation = .false.
274 ELSEIF(elem_id<=offset_spring)
THEN
276 do_computation = .false.
277 ELSEIF(elem_id<=offset_triangle)
THEN
279 do_computation = .false.
280 ELSEIF(elem_id<=offset_ur)
THEN
288 ix => ixtg(1:nixtg,1:numeltg)
289 pointer_face => faces_shell(1:4,1:1)
291 shift_elm = offset_triangle
294 do_computation = .false.
297 IF(do_computation)
THEN
300 DO k=1,surface_number
303 need_compute = .true.
307 IF(kind_solid==8)
THEN
311 n = pointer_face(j,k)
312 list_node_id(j) = ix(n+1,elem_id-shift_elm)
314 CALL myqsort_int(4,list_node_id,perm_list_node_id,error)
318 ! check
if the face has 3 or 4 nodes
319 node_id = list_node_id(1)
322 nb_appareance(2:4) = 0
326 IF(node_id/=list_node_id(j))
THEN
327 nb_appareance(j) = nb_appareance(j) + 1
328 node_id = list_node_id(j)
331 nb_appareance(old_j) = nb_appareance(old_j) + 1
340 IF(nb_appareance(j)>=3) need_compute=.false.
341 IF(nb_appareance(j)==2) merged_node = merged_node + 1
343 IF(merged_node>1) need_compute=.false.
347 IF(need_compute)
THEN
352 n = pointer_face(j,k)
354 node_id = ix(n+1,elem_id-shift_elm)
356 node_id = ix_tetra10(n-10,elem_id-shift_elm)
358 local_node(j) = node_id
360 IF(node_surf_nb==3) local_node(4) = local_node(3)
365 node_id = local_node(1)
367 nb_result_intersect = shoot_struct%SHIFT_M_NODE_SURF(node_id+1) - shoot_struct%SHIFT_M_NODE_SURF(node_id)
368 shift = shoot_struct%SHIFT_M_NODE_SURF(node_id)
369 result_intersect(1:nb_result_intersect) = shoot_struct%M_NODE_SURF( shift+1:shift+nb_result_intersect )
371 nb_result_intersect_2 = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
372 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
373 result_intersect_2(1:nb_result_intersect_2) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_result_intersect_2 )
375 IF(nb_result_intersect_2>1)
THEN
377 ELSEIF(nb_result_intersect_2<1)
THEN
383 nb_surface_1 = nb_result_intersect
384 intersect_1(1:nb_surface_1) = result_intersect(1:nb_result_intersect)
386 n = pointer_face(j,k)
387 node_id = local_node(j)
390 nb_surface_2 = shoot_struct%SHIFT_M_NODE_SURF
391 shift = shoot_struct%SHIFT_M_NODE_SURF(node_id)
392 intersect_2(1:nb_surface_2) = shoot_struct%M_NODE_SURF( shift+1:shift+nb_surface_2 )
393 IF(nb_surface_1>0.AND.nb_surface_2>0)
THEN
394 CALL intersect_2_sorted_sets( intersect_1,nb_surface_1,
395 . intersect_2,nb_surface_2,
396 . result_intersect,nb_result_intersect )
398 nb_result_intersect = 0
405 nb_proc_1 = nb_result_intersect_2
406 intersect_3(1:nb_proc_1) = result_intersect_2(1:nb_proc_1)
408 nb_proc_2 = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id) ! get
the number of processor of
the node
409 IF(nb_proc_1>1.AND.nb_proc_2>1)
THEN
410 several_proc = several_proc + 1
413 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
414 intersect_4(1:nb_proc_2) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_2 )
416 CALL intersect_2_sorted_sets( intersect_3,nb_proc_1,
417 . intersect_4,nb_proc_2,
418 . result_intersect_2,nb_result_intersect_2 )
420 ELSEIF(nb_proc_2<1)
THEN
423 nb_result_intersect_2 = 0
431 IF(nb_result_intersect>0)
THEN
435 IF( shoot_struct%SAVE_SURFACE_NB+nb_result_intersect>shoot_struct%S_SAVE_SURFACE)
THEN
436 ALLOCATE( tmp_array(shoot_struct%S_SAVE_SURFACE) )
437 tmp_array(1:shoot_struct%S_SAVE_SURFACE) =
438 . shoot_struct%SAVE_SURFACE(1:shoot_struct%S_SAVE_SURFACE)
440 DEALLOCATE( shoot_struct%SAVE_SURFACE )
441 old_size = shoot_struct%S_SAVE_SURFACE
442 shoot_struct%S_SAVE_SURFACE = 1.20*(shoot_struct%S_SAVE_SURFACE+5*nb_result_intersect
443 ALLOCATE( shoot_struct%SAVE_SURFACE( shoot_struct%S_SAVE_SURFACE ) )
444 shoot_struct%SAVE_SURFACE(1:old_size) = tmp_array(1:old_size)
445 DEALLOCATE( tmp_array )
447 DO j=1,nb_result_intersect
448 shoot_struct%SAVE_SURFACE_NB = shoot_struct%SAVE_SURFACE_NB + 1
449 shoot_struct%SAVE_SURFACE( shoot_struct%SAVE_SURFACE_NB ) = result_intersect(j)
452 IF(nb_result_intersect_2>1)
THEN
459 IF( shoot_struct%SAVE_PROC_NB+5*(nb_result_intersect_2-1)>shoot_struct%S_SAVE_PROC)
THEN
460 ALLOCATE( tmp_array(shoot_struct%S_SAVE_PROC) )
461 tmp_array(1:shoot_struct%S_SAVE_PROC) =
462 . shoot_struct%SAVE_PROC(1:shoot_struct%S_SAVE_PROC)
464 DEALLOCATE( shoot_struct%SAVE_PROC )
465 old_size = shoot_struct%S_SAVE_PROC
466 shoot_struct%S_SAVE_PROC = 1.20*(shoot_struct%SAVE_PROC_NB+5*(nb_result_intersect_2-1))
467 ALLOCATE( shoot_struct%SAVE_PROC( shoot_struct%S_SAVE_PROC ) )
468 shoot_struct%SAVE_PROC(1:old_size) = tmp_array(1:old_size)
469 DEALLOCATE( tmp_array )
472 DO j=1,nb_result_intersect_2
473 IF(result_intersect_2(j)/=ispmd+1)
THEN
474 shoot_struct%SAVE_PROC_NB = shoot_struct%SAVE_PROC_NB + 1
475 shoot_struct%SAVE_PROC( shoot_struct%SAVE_PROC_NB ) = result_intersect_2(j) !
save the remote proc
id
477 IF(node_surf_nb==3) local_node(4) = local_node(3)
479 shoot_struct%SAVE_PROC_NB = shoot_struct%SAVE_PROC_NB + 1
480 shoot_struct%SAVE_PROC( shoot_struct%SAVE_PROC_NB ) = itab(local_node
499 DEALLOCATE( result_intersect )
500 DEALLOCATE( intersect_1
501 DEALLOCATE( intersect_2 )
504 DEALLOCATE( intersect_3 )
505 DEALLOCATE( intersect_4 )