34 1 IXC,IXTG,IXQ,IXT,IXP,
35 2 IXR,GEO,NGROUP,IGROUPS,IPARG )
48 use element_mod ,
only : nixs,nixq,nixc,nixt,nixp,nixr,nixtg
52#include "implicit_f.inc"
62 INTEGER,
DIMENSION(NIXS,NUMELS),
TARGET,
INTENT(in) :: IXS
63 INTEGER,
DIMENSION(6,NUMELS10),
TARGET,
INTENT(in) :: IXS10
64 INTEGER,
DIMENSION(NIXC,NUMELC),
TARGET,
INTENT(in) :: IXC
65 INTEGER,
DIMENSION(NIXTG,NUMELTG),
TARGET,
INTENT(in) :: IXTG
66 INTEGER,
DIMENSION(NIXQ,NUMELQ),
TARGET,
INTENT(in) :: IXQ
67 INTEGER,
DIMENSION(NIXT,NUMELT),
TARGET,
INTENT(in) :: IXT
68 INTEGER,
DIMENSION(NIXP,NUMELP),
TARGET,
INTENT(in) :: IXP
69 INTEGER,
DIMENSION(NIXR,NUMELR),
TARGET,
INTENT(in) :: IXR
70 INTEGER,
DIMENSION(NUMNOD),
INTENT(in) :: ITAB
71 my_real,
DIMENSION(NPROPG,NUMGEO),
INTENT(in) :: geo
72 INTEGER,
INTENT(in) :: NGROUP
73 INTEGER,
DIMENSION(NUMELS),
INTENT(in) :: IGROUPS
74 INTEGER,
DIMENSION(NPARG,NGROUP),
INTENT(in) :: IPARG
75 TYPE(shooting_node_type),
INTENT(inout) :: SHOOT_STRUCT
81 INTEGER :: I,J,K,N,IJK
82 INTEGER :: NODE_ID,NODE_ID_1,NODE_ID_2,ELEM_ID
83 INTEGER :: OFFSET_SOLID,OFFSET_QUAD,OFFSET_SHELL,OFFSET_TRUSS
84 INTEGER :: OFFSET_BEAM,OFFSET_SPRING,OFFSET_TRIANGLE,OFFSET_UR
85 INTEGER,
DIMENSION(2,12),
TARGET :: EDGES_SOL
86 INTEGER,
DIMENSION(2,6),
TARGET :: EDGES_TETRA4
87 INTEGER,
DIMENSION(2,9),
TARGET :: EDGES_PENTA6
88 INTEGER,
DIMENSION(2,24),
TARGET :: EDGES_TETRA10
89 INTEGER,
DIMENSION(2,4),
TARGET :: EDGES_SHELL
90 INTEGER,
DIMENSION(2,3),
TARGET :: EDGES_TRI
91 INTEGER,
DIMENSION(2,1),
TARGET :: EDGES_2DELM
92 INTEGER,
DIMENSION(2,2),
TARGET :: EDGES_SPRING_TYP12
93 INTEGER,
DIMENSION(:,:),
POINTER :: POINTER_EDGE,IX,IX_TETRA10
95 LOGICAL :: NO_EDGE,DO_COMPUTATION
96 INTEGER :: SHIFT,SHIFT_ELM,OLD_SIZE
97 INTEGER :: EDGE_NUMBER
98 INTEGER :: NB_PROC_1,NB_PROC_2,NODE_EDGE_NB,SEVERAL_PROC,SEVERAL_EDGE
99 INTEGER :: NB_RESULT_INTERSECT,NB_RESULT_INTERSECT_2,NB_EDGE_1,NB_EDGE_2
100 INTEGER :: NB_RESULT_INTERSECT_3
101 INTEGER,
DIMENSION(:),
ALLOCATABLE :: RESULT_INTERSECT,INTERSECT_1,INTERSECT_2
102 INTEGER,
DIMENSION(:),
ALLOCATABLE :: RESULT_INTERSECT_2,INTERSECT_3,INTERSECT_4
103 INTEGER,
DIMENSION(:),
ALLOCATABLE :: RESULT_INTERSECT_3
104 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TMP_ARRAY
105 INTEGER,
DIMENSION(4) :: LOCAL_NODE
106 INTEGER :: GROUP_NUMBER
107 INTEGER :: KIND_SOLID
109 edges_shell(1:2,1) = (/1,2/)
110 edges_shell(1:2,2) = (/2,3/)
111 edges_shell(1:2,3) = (/3,4/)
112 edges_shell(1:2,4) = (/4,1/)
114 edges_tri(1:2,1) = (/1,2/)
115 edges_tri(1:2,2) = (/2,3/)
116 edges_tri(1:2,3) = (/3,1/)
118 edges_spring_typ12(1:2,1) = (/1,2/)
119 edges_spring_typ12(1:2,2) = (/2,3/)
121 edges_2delm(1:2,1) = (/1,2/)
123 edges_tetra4(1:2,1) = (/2,3/)
124 edges_tetra4(1:2,2) = (/3,6/)
125 edges_tetra4(1:2,3) = (/2,6/)
126 edges_tetra4(1:2,4) = (/2,5/)
127 edges_tetra4(1:2,5) = (/3,5/)
128 edges_tetra4(1:2,6) = (/6,5/)
130 edges_penta6(1:2,1) = (/1,2/)
131 edges_penta6(1:2,2) = (/2,3/)
132 edges_penta6(1:2,3) = (/3,1/)
133 edges_penta6(1:2,4) = (/2,6/)
134 edges_penta6(1:2,5) = (/6,5/)
135 edges_penta6(1:2,6) = (/5,1/)
136 edges_penta6(1:2,7) = (/3,7/)
137 edges_penta6(1:2,8) = (/7,6/)
138 edges_penta6(1:2,9) = (/7,5/)
140 edges_sol(1:2,1) = (/1,2/)
141 edges_sol(1:2,2) = (/2,3/)
142 edges_sol(1:2,3) = (/3,4/)
143 edges_sol(1:2,4) = (/4,1/)
144 edges_sol(1:2,5) = (/2,6/)
145 edges_sol(1:2,6) = (/6,5/)
146 edges_sol(1:2,7) = (/5,1/)
147 edges_sol(1:2,8) = (/3,7/)
148 edges_sol(1:2,9) = (/7,6/)
149 edges_sol(1:2,10) = (/4,8/)
150 edges_sol(1:2,11) = (/8,7/)
151 edges_sol(1:2,12) = (/5,8/)
153 edges_tetra10(1:2,1) = (/1,11/)
154 edges_tetra10(1:2,2) = (/11,14/)
155 edges_tetra10(1:2,3) = (/14,1 /)
156 edges_tetra10(1:2,4) = (/ 3,11/)
157 edges_tetra10(1:2,5) = (/11,15/)
158 edges_tetra10(1:2,6) = (/15,3 /)
159 edges_tetra10(1:2,7) = (/ 5,14/)
160 edges_tetra10(1:2,8) = (/14,15/)
161 edges_tetra10(1:2,9) = (/15,5 /)
162 edges_tetra10(1:2,10) = (/ 1,13/)
163 edges_tetra10(1:2,11) = (/13,14/)
164 edges_tetra10(1:2,12) = (/ 6,13/)
165 edges_tetra10(1:2,13) = (/13,16/)
166 edges_tetra10(1:2,14) = (/16,6 /)
167 edges_tetra10(1:2,15) = (/14,16/)
168 edges_tetra10(1:2,16) = (/16,5 /)
169 edges_tetra10(1:2,17) = (/11,12/)
170 edges_tetra10(1:2,18) = (/12,3 /)
171 edges_tetra10(1:2,19) = (/ 6,12/)
172 edges_tetra10(1:2,20) = (/12,13/)
173 edges_tetra10(1:2,21) = (/11,13/)
174 edges_tetra10(1:2,22) = (/12,15/)
175 edges_tetra10(1:2,23) = (/12,16/)
176 edges_tetra10(1:2,24) = (/15,16/)
180 offset_quad=offset_solid+numels
181 offset_shell=offset_quad+numelq
182 offset_truss=offset_shell+numelc
183 offset_beam=offset_truss+numelt
184 offset_spring=offset_beam+numelp
185 offset_triangle=offset_spring+numelr
186 offset_ur=offset_triangle+numeltg
191 shoot_struct%S_SAVE_M_EDGE = 2*shoot_struct%S_GLOBAL_ELEM_INDEX
192 ALLOCATE( shoot_struct%SAVE_M_EDGE( shoot_struct%S_SAVE_M_EDGE ) )
193 shoot_struct%S_SAVE_S_EDGE = 2*shoot_struct%S_GLOBAL_ELEM_INDEX
194 ALLOCATE( shoot_struct%SAVE_S_EDGE( shoot_struct%S_SAVE_S_EDGE ) )
196 shoot_struct%SAVE_M_EDGE_NB = 0
197 shoot_struct%SAVE_S_EDGE_NB = 0
198 shoot_struct%SAVE_M_EDGE( 1:shoot_struct%S_SAVE_M_EDGE ) = 0
199 shoot_struct%SAVE_S_EDGE( 1:shoot_struct%S_SAVE_S_EDGE ) = 0
202 shoot_struct%S_SAVE_PROC_EDGE = 3*shoot_struct%S_GLOBAL_ELEM_INDEX
204 ALLOCATE( shoot_struct%SAVE_PROC_EDGE( shoot_struct%S_SAVE_PROC_EDGE ) )
205 shoot_struct%SAVE_PROC_NB_EDGE = 0
206 shoot_struct%SAVE_PROC_EDGE( 1:shoot_struct%S_SAVE_PROC_EDGE ) = 0
209 ALLOCATE( result_intersect( shoot_struct%MAX_EDGE_NB ) )
210 ALLOCATE( result_intersect_3( shoot_struct%MAX_EDGE_NB ) )
211 ALLOCATE( intersect_1( shoot_struct%MAX_EDGE_NB ) )
212 ALLOCATE( intersect_2( shoot_struct%MAX_EDGE_NB ) )
214 ALLOCATE( result_intersect_2( shoot_struct%MAX_PROC_NB ) )
215 ALLOCATE( intersect_3( shoot_struct%MAX_PROC_NB ) )
216 ALLOCATE( intersect_4( shoot_struct%MAX_PROC_NB ) )
220 DO i=1,shoot_struct%S_GLOBAL_ELEM_INDEX
221 elem_id = shoot_struct%GLOBAL_ELEM_INDEX(i)
222 do_computation = .true.
226 IF(elem_id<=numels8)
THEN
249 group_number = igroups(elem_id)
250 kind_solid = iparg(28,group_number)
253 IF(kind_solid==4)
THEN
255 pointer_edge => edges_tetra4(1:2,1:6)
258 ELSEIF(kind_solid==6)
THEN
260 pointer_edge => edges_penta6(1:2,1:9)
266 pointer_edge => edges_sol(1:2,1:12)
269 ix => ixs(1:nixs,1:numels)
270 shift_elm = offset_solid
271 ELSEIF(elem_id<=numels8+numels10)
THEN
284 ix => ixs(1:nixs,1:numels)
285 ix_tetra10 => ixs10(1:6,1:numels10)
286 pointer_edge => edges_tetra10(1:2,1:24)
288 ELSEIF(elem_id<=numels)
THEN
297 ix => ixs(1:nixs,1:numels)
298 pointer_edge => edges_sol(1:2,1:12)
299 shift_elm = offset_solid
300 ELSEIF(elem_id<=offset_shell)
THEN
308 ix => ixq(1:nixq,1:numelq)
309 pointer_edge => edges_shell(1:2,1:4)
310 shift_elm = offset_quad
311 do_computation = .false.
312 ELSEIF(elem_id<=offset_truss)
THEN
320 ix => ixc(1:nixc,1:numelc)
321 pointer_edge => edges_shell(1:2,1:4)
322 shift_elm = offset_shell
323 ELSEIF(elem_id<=offset_beam)
THEN
328 ix => ixt(1:nixt,1:numelt)
329 pointer_edge => edges_2delm(1:2,1:1)
330 shift_elm = offset_truss
331 ELSEIF(elem_id<=offset_spring)
THEN
336 ix => ixp(1:nixp,1:numelp)
337 pointer_edge => edges_2delm(1:2,1:1)
338 shift_elm = offset_beam
339 ELSEIF(elem_id<=offset_triangle)
THEN
344 ix => ixr(1:nixr,1:numelr)
345 pointer_edge => edges_2delm(1:2,1:1)
346 shift_elm = offset_spring
347 IF(nint(geo(12,ixr(1,elem_id-shift_elm)))==12)
THEN
352 pointer_edge => edges_spring_typ12(1:2,1:2)
354 ELSEIF(elem_id<=offset_ur)
THEN
362 ix => ixtg(1:nixtg,1:numeltg)
363 pointer_edge => edges_tri(1:2,1:3)
364 shift_elm = offset_triangle
367 do_computation = .false.
370 IF(do_computation)
THEN
380 n = pointer_edge(1,k)
382 node_id = ix(n+1,elem_id-shift_elm)
384 node_id = ix_tetra10(n-10,elem_id-shift_elm)
387 local_node(1) = node_id
388 nb_edge_1 = shoot_struct%SHIFT_M_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_M_NODE_EDGE(node_id)
389 shift = shoot_struct%SHIFT_M_NODE_EDGE(node_id)
390 intersect_1(1:nb_edge_1) = shoot_struct%M_NODE_EDGE( shift+1:shift+nb_edge_1 )
392 nb_proc_1 = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
393 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
394 intersect_3(1:nb_proc_1) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_1 )
397 n = pointer_edge(2,k)
399 node_id = ix(n+1,elem_id-shift_elm)
401 node_id = ix_tetra10(n-10,elem_id-shift_elm)
404 local_node(2) = node_id
405 nb_edge_2 = shoot_struct%SHIFT_M_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_M_NODE_EDGE(node_id)
406 shift = shoot_struct%SHIFT_M_NODE_EDGE(node_id)
407 intersect_2(1:nb_edge_2) = shoot_struct%M_NODE_EDGE( shift+1:shift+nb_edge_2 )
409 nb_proc_2 = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
410 shift = shoot_struct%SHIFT_M_NODE_PROC
411 intersect_4(1:nb_proc_2) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_2 )
414 IF( node_id_1 /= node_id_2 )
THEN
417 nb_result_intersect = 0
418 IF(nb_edge_1>0.AND.nb_edge_2>0)
THEN
419 CALL intersect_2_sorted_sets( intersect_1,nb_edge_1,
420 . intersect_2,nb_edge_2,
421 . result_intersect,nb_result_intersect )
423 nb_result_intersect = 0
428 ! -----------------------
430 IF(nb_proc_1>1.AND.nb_proc_2>1)
THEN
431 CALL intersect_2_sorted_sets( intersect_3,nb_proc_1,
432 . intersect_4,nb_proc_2,
433 . result_intersect_2,nb_result_intersect_2 )
435 nb_result_intersect_2 = 0
440 nb_result_intersect = 0
441 nb_result_intersect_2 = 0
448 n = pointer_edge(1,k)
450 node_id = ix(n+1,elem_id-shift_elm)
452 node_id = ix_tetra10(n-10,elem_id-shift_elm)
454 local_node(3) = node_id
455 nb_edge_1 = shoot_struct%SHIFT_S_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_S_NODE_EDGE(node_id)
456 shift = shoot_struct%SHIFT_S_NODE_EDGE(node_id)
457 intersect_1(1:nb_edge_1) = shoot_struct%S_NODE_EDGE
460 n = pointer_edge(2,k)
462 node_id = ix(n+1,elem_id-shift_elm)
464 node_id = ix_tetra10(n-10,elem_id-shift_elm)
466 local_node(4) = node_id
467 nb_edge_2 = shoot_struct%SHIFT_S_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_S_NODE_EDGE(node_id)
468 shift = shoot_struct%SHIFT_S_NODE_EDGE(node_id)
469 intersect_2(1:nb_edge_2) = shoot_struct%S_NODE_EDGE( shift+1:shift
472 IF( node_id_1 /= node_id_2 )
THEN
475 nb_result_intersect_3 = 0
476 IF(nb_edge_1>0.AND.nb_edge_2>0)
THEN
477 CALL intersect_2_sorted_sets( intersect_1,nb_edge_1,
478 . intersect_2,nb_edge_2,
479 . result_intersect_3,nb_result_intersect_3 )
481 nb_result_intersect_3 = 0
486 nb_result_intersect_3 = 0
489 IF(nb_result_intersect>0)
THEN
492 IF( shoot_struct%SAVE_M_EDGE_NB+nb_result_intersect>shoot_struct%S_SAVE_M_EDGE)
THEN
493 ALLOCATE( tmp_array(shoot_struct%S_SAVE_M_EDGE) )
494 tmp_array(1:shoot_struct%S_SAVE_M_EDGE) = shoot_struct%SAVE_M_EDGE(1:shoot_struct%S_SAVE_M_EDGE)
496 DEALLOCATE( shoot_struct%SAVE_M_EDGE )
497 old_size = shoot_struct%S_SAVE_M_EDGE
498 shoot_struct%S_SAVE_M_EDGE = 1.20*(shoot_struct%S_SAVE_M_EDGE+5*nb_result_intersect)
499 ALLOCATE( shoot_struct%SAVE_M_EDGE( shoot_struct%S_SAVE_M_EDGE ) )
500 shoot_struct%SAVE_M_EDGE(1:old_size) = tmp_array(1:old_size)
501 DEALLOCATE( tmp_array )
503 DO j=1,nb_result_intersect
504 shoot_struct%SAVE_M_EDGE_NB = shoot_struct%SAVE_M_EDGE_NB + 1
509 IF(nb_result_intersect_2>1)
THEN
517 IF( shoot_struct%SAVE_PROC_NB_EDGE+3*(nb_result_intersect_2-1)>
518 . shoot_struct%S_SAVE_PROC_EDGE)
THEN
519 ALLOCATE( tmp_array(shoot_struct%S_SAVE_PROC_EDGE) )
520 tmp_array(1:shoot_struct%S_SAVE_PROC_EDGE) =
521 . shoot_struct%SAVE_PROC_EDGE(1:shoot_struct%S_SAVE_PROC_EDGE)
523 DEALLOCATE( shoot_struct%SAVE_PROC_EDGE )
524 old_size = shoot_struct%S_SAVE_PROC_EDGE
525 shoot_struct%S_SAVE_PROC_EDGE =
526 . 1.20*(shoot_struct%SAVE_PROC_NB_EDGE+3*(nb_result_intersect_2-1))
527 ALLOCATE( shoot_struct%SAVE_PROC_EDGE( shoot_struct%S_SAVE_PROC_EDGE ) )
528 shoot_struct%SAVE_PROC_EDGE(1:old_size) = tmp_array(1:old_size)
529 DEALLOCATE( tmp_array )
532 DO j=1,nb_result_intersect_2
533 IF(result_intersect_2(j)/=ispmd+1)
THEN
534 shoot_struct%SAVE_PROC_NB_EDGE = shoot_struct%SAVE_PROC_NB_EDGE + 1
535 shoot_struct%SAVE_PROC_EDGE( shoot_struct%SAVE_PROC_NB_EDGE ) = result_intersect_2(j)
538 shoot_struct%SAVE_PROC_NB_EDGE =
539 . shoot_struct%SAVE_PROC_NB_EDGE + 1
540 shoot_struct%SAVE_PROC_EDGE( shoot_struct%SAVE_PROC_NB_EDGE ) =
541 . itab(local_node(ijk))
549 IF(nb_result_intersect_3>0)
THEN
553 IF( shoot_struct%SAVE_S_EDGE_NB+nb_result_intersect_3>
554 . shoot_struct%S_SAVE_S_EDGE)
THEN
555 ALLOCATE( tmp_array(shoot_struct%S_SAVE_S_EDGE) )
556 tmp_array(1:shoot_struct%S_SAVE_S_EDGE) = shoot_struct%SAVE_S_EDGE(1:shoot_struct%S_SAVE_S_EDGE)
558 DEALLOCATE( shoot_struct%SAVE_S_EDGE )
559 old_size = shoot_struct%S_SAVE_S_EDGE
560 shoot_struct%S_SAVE_S_EDGE = 1.20*(shoot_struct%S_SAVE_S_EDGE+5*nb_result_intersect_3)
561 ALLOCATE( shoot_struct%SAVE_S_EDGE( shoot_struct%S_SAVE_S_EDGE ) )
562 shoot_struct%SAVE_S_EDGE(1:old_size) = tmp_array(1:old_size)
563 DEALLOCATE( tmp_array )
565 DO j=1,nb_result_intersect_3
566 shoot_struct%SAVE_S_EDGE_NB = shoot_struct%SAVE_S_EDGE_NB +
567 shoot_struct%SAVE_S_EDGE( shoot_struct%SAVE_S_EDGE_NB ) = result_intersect_3(j)
579 DEALLOCATE( result_intersect )
580 DEALLOCATE( result_intersect_3 )
581 DEALLOCATE( intersect_1 )
582 DEALLOCATE( intersect_2 )
584 DEALLOCATE( result_intersect_2 )
585 DEALLOCATE( intersect_3 )
586 DEALLOCATE( intersect_4 )