35
36
37
38
39
40
41
42
43
44
45 USE intbufdef_mod
47
48
49
50#include "implicit_f.inc"
51
52
53
54#include "task_c.inc"
55#include "com04_c.inc"
56#include "param_c.inc"
57
58
59
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(NIXQ,NUMELQ),TARGET, INTENT(in) :: IXQ
65 INTEGER, DIMENSION(NIXT,NUMELT),TARGET, INTENT(in) :: IXT
66 INTEGER, DIMENSION(NIXP,NUMELP),TARGET, INTENT(in) :: IXP
67 INTEGER, DIMENSION(NIXR,NUMELR),TARGET, INTENT(in) :: IXR
68 INTEGER, DIMENSION(NUMNOD), INTENT(in) :: ITAB
69 my_real,
DIMENSION(NPROPG,NUMGEO),
INTENT(in) :: geo
70 INTEGER, INTENT(in) :: NGROUP
71 INTEGER, DIMENSION(NUMELS), INTENT(in) :: IGROUPS
72 INTEGER, DIMENSION(NPARG,NGROUP), INTENT(in) :: IPARG
73 TYPE(shooting_node_type), INTENT(inout) :: SHOOT_STRUCT
74
75
76
77
78
79 INTEGER :: I,J,K,N,IJK
80 INTEGER :: NODE_ID,NODE_ID_1,NODE_ID_2,ELEM_ID
81 INTEGER :: OFFSET_SOLID,OFFSET_QUAD,OFFSET_SHELL,OFFSET_TRUSS
82 INTEGER :: OFFSET_BEAM,OFFSET_SPRING,OFFSET_TRIANGLE,OFFSET_UR
83 INTEGER, DIMENSION(2,12), TARGET :: EDGES_SOL
84 INTEGER, DIMENSION(2,6), TARGET :: EDGES_TETRA4
85 INTEGER, DIMENSION(2,9), TARGET :: EDGES_PENTA6
86 INTEGER, DIMENSION(2,24), TARGET :: EDGES_TETRA10
87 INTEGER, DIMENSION(2,4), TARGET :: EDGES_SHELL
88 INTEGER, DIMENSION(2,3), TARGET :: EDGES_TRI
89 INTEGER, DIMENSION(2,1), TARGET :: EDGES_2DELM
90 INTEGER, DIMENSION(2,2), TARGET :: EDGES_SPRING_TYP12
91 INTEGER,DIMENSION(:,:), POINTER :: POINTER_EDGE,IX,IX_TETRA10
92
93 LOGICAL :: NO_EDGE,DO_COMPUTATION
94 INTEGER :: SHIFT,SHIFT_ELM,OLD_SIZE
95 INTEGER :: EDGE_NUMBER
96 INTEGER :: NB_PROC_1,NB_PROC_2,NODE_EDGE_NB,SEVERAL_PROC,SEVERAL_EDGE
97 INTEGER :: NB_RESULT_INTERSECT,NB_RESULT_INTERSECT_2,NB_EDGE_1,NB_EDGE_2
98 INTEGER :: NB_RESULT_INTERSECT_3
99 INTEGER, DIMENSION(:), ALLOCATABLE :: RESULT_INTERSECT,INTERSECT_1,INTERSECT_2
100 INTEGER, DIMENSION(:), ALLOCATABLE :: RESULT_INTERSECT_2,INTERSECT_3,INTERSECT_4
101 INTEGER, DIMENSION(:), ALLOCATABLE :: RESULT_INTERSECT_3
102 INTEGER, DIMENSION(:), ALLOCATABLE :: TMP_ARRAY
103 INTEGER, DIMENSION(4) :: LOCAL_NODE
104 INTEGER :: GROUP_NUMBER
105 INTEGER :: KIND_SOLID
106
107 edges_shell(1:2,1) = (/1,2/)
108 edges_shell(1:2,2) = (/2,3/)
109 edges_shell(1:2,3) = (/3,4/)
110 edges_shell(1:2,4) = (/4,1/)
111
112 edges_tri(1:2,1) = (/1,2/)
113 edges_tri(1:2,2) = (/2,3/)
114 edges_tri(1:2,3) = (/3,1/)
115
116 edges_spring_typ12(1:2,1) = (/1,2/)
117 edges_spring_typ12(1:2,2) = (/2,3/)
118
119 edges_2delm(1:2,1) = (/1,2/)
120
121 edges_tetra4(1:2,1) = (/2,3/)
122 edges_tetra4(1:2,2) = (/3,6/)
123 edges_tetra4(1:2,3) = (/2,6/)
124 edges_tetra4(1:2,4) = (/2,5/)
125 edges_tetra4(1:2,5) = (/3,5/)
126 edges_tetra4(1:2,6) = (/6,5/)
127
128 edges_penta6(1:2,1) = (/1,2/)
129 edges_penta6(1:2,2) = (/2,3/)
130 edges_penta6(1:2,3) = (/3,1/)
131 edges_penta6(1:2,4) = (/2,6/)
132 edges_penta6(1:2,5) = (/6,5/)
133 edges_penta6(1:2,6) = (/5,1/)
134 edges_penta6(1:2,7) = (/3,7/)
135 edges_penta6(1:2,8) = (/7,6/)
136 edges_penta6(1:2,9) = (/7,5/)
137
138 edges_sol(1:2,1) = (/1,2/)
139 edges_sol(1:2,2) = (/2,3/)
140 edges_sol(1:2,3) = (/3,4/)
141 edges_sol(1:2,4) = (/4,1/)
142 edges_sol(1:2,5) = (/2,6/)
143 edges_sol(1:2,6) = (/6,5/)
144 edges_sol(1:2,7) = (/5,1/)
145 edges_sol(1:2,8) = (/3,7/)
146 edges_sol(1:2,9) = (/7,6/)
147 edges_sol(1:2,10) = (/4,8/)
148 edges_sol(1:2,11) = (/8,7/)
149 edges_sol(1:2,12) = (/5,8/)
150
151 edges_tetra10(1:2,1) = (/1,11/)
152 edges_tetra10(1:2,2) = (/11,14/)
153 edges_tetra10(1:2,3) = (/14,1 /)
154 edges_tetra10(1:2,4) = (/ 3,11/)
155 edges_tetra10(1:2,5) = (/11,15/)
156 edges_tetra10(1:2,6) = (/15,3 /)
157 edges_tetra10(1:2,7) = (/ 5,14/)
158 edges_tetra10(1:2,8) = (/14,15/)
159 edges_tetra10(1:2,9) = (/15,5 /)
160 edges_tetra10(1:2,10) = (/ 1,13/)
161 edges_tetra10(1:2,11) = (/13,14/)
162 edges_tetra10(1:2,12) = (/ 6,13/)
163 edges_tetra10(1:2,13) = (/13,16/)
164 edges_tetra10(1:2,14) = (/16,6 /)
165 edges_tetra10(1:2,15) = (/14,16/)
166 edges_tetra10(1:2,16) = (/16,5 /)
167 edges_tetra10(1:2,17) = (/11,12/)
168 edges_tetra10(1:2,18) = (/12,3 /)
169 edges_tetra10(1:2,19) = (/ 6,12/)
170 edges_tetra10(1:2,20) = (/12,13/)
171 edges_tetra10(1:2,21) = (/11,13/)
172 edges_tetra10(1:2,22) = (/12,15/)
173 edges_tetra10(1:2,23) = (/12,16/)
174 edges_tetra10(1:2,24) = (/15,16/)
175
176
177 offset_solid = 0
178 offset_quad=offset_solid+numels
179 offset_shell=offset_quad+numelq
180 offset_truss=offset_shell+numelc
181 offset_beam=offset_truss+numelt
182 offset_spring=offset_beam+numelp
183 offset_triangle=offset_spring+numelr
184 offset_ur=offset_triangle+numeltg
185 ! --------------------------
186
187
188
189 shoot_struct%S_SAVE_M_EDGE = 2*shoot_struct%S_GLOBAL_ELEM_INDEX
190 ALLOCATE( shoot_struct%SAVE_M_EDGE( shoot_struct%S_SAVE_M_EDGE ) )
191 shoot_struct%S_SAVE_S_EDGE = 2*shoot_struct%S_GLOBAL_ELEM_INDEX
192 ALLOCATE( shoot_struct%SAVE_S_EDGE( shoot_struct%S_SAVE_S_EDGE ) )
193
194 shoot_struct%SAVE_M_EDGE_NB = 0
195 shoot_struct%SAVE_S_EDGE_NB = 0
196 shoot_struct%SAVE_M_EDGE( 1:shoot_struct%S_SAVE_M_EDGE ) = 0
197 shoot_struct%SAVE_S_EDGE( 1:shoot_struct%S_SAVE_S_EDGE ) = 0
198
199
200 shoot_struct%S_SAVE_PROC_EDGE = 3*shoot_struct%S_GLOBAL_ELEM_INDEX
201
202 ALLOCATE( shoot_struct%SAVE_PROC_EDGE( shoot_struct%S_SAVE_PROC_EDGE ) )
203 shoot_struct%SAVE_PROC_NB_EDGE = 0
204 shoot_struct%SAVE_PROC_EDGE( 1:shoot_struct%S_SAVE_PROC_EDGE ) = 0
205
206
207 ALLOCATE( result_intersect( shoot_struct%MAX_EDGE_NB ) )
208 ALLOCATE( result_intersect_3( shoot_struct%MAX_EDGE_NB ) )
209 ALLOCATE( intersect_1( shoot_struct%MAX_EDGE_NB ) )
210 ALLOCATE( intersect_2( shoot_struct%MAX_EDGE_NB ) )
211
212 ALLOCATE( result_intersect_2( shoot_struct%MAX_PROC_NB ) )
213 ALLOCATE( intersect_3( shoot_struct%MAX_PROC_NB ) )
214 ALLOCATE( intersect_4( shoot_struct%MAX_PROC_NB ) )
215
216 node_edge_nb = 2
217
218 DO i=1,shoot_struct%S_GLOBAL_ELEM_INDEX
219 elem_id = shoot_struct%GLOBAL_ELEM_INDEX(i)
220 do_computation = .true.
221
222 kind_solid = 0
223 ix_tetra10 => null()
224 IF(elem_id<=numels8) THEN
225
226
227
228
229
230
231
232
233
234
235
236
237
238 ! o----o
239
240
241
242
243
244
245
246
247 group_number = igroups(elem_id)
248 kind_solid = iparg(28,group_number)
249
250
251 IF(kind_solid==4) THEN
252 edge_number = 6
253 pointer_edge => edges_tetra4(1:2,1:6)
254 ! -------------
255
256 ELSEIF(kind_solid==6) THEN
257 edge_number = 9
258 pointer_edge => edges_penta6(1:2,1:9)
259
260
261 ELSE
262 kind_solid = 8
263 edge_number = 12
264 pointer_edge => edges_sol(1:2,1:12)
265 ENDIF
266
267 ix => ixs(1:nixs,1:numels)
268 shift_elm = offset_solid
269 ELSEIF(elem_id<=numels8+numels10) THEN
270
271
272
273
274
275
276
277
278
279
280
281 edge_number = 24
282 ix => ixs(1:nixs,1:numels)
283 ix_tetra10 => ixs10(1:6,1:numels10)
284 pointer_edge => edges_tetra10(1:2,1:24)
285 shift_elm = numels8
286 ELSEIF(elem_id<=numels) THEN
287
288
289 ! /| /|
290
291
292
293
294 edge_number = 12
295 ix => ixs(1:nixs,1:numels)
296 pointer_edge => edges_sol(1:2,1:12)
297 shift_elm = offset_solid
298 ELSEIF(elem_id<=offset_shell) THEN
299
300
301
302
303
304
305 edge_number = 4
306 ix => ixq(1:nixq,1:numelq)
307 pointer_edge => edges_shell(1:2,1:4)
308 shift_elm = offset_quad
309 do_computation = .false.
310 ELSEIF(elem_id<=offset_truss) THEN
311
312
313
314
315
316
317 edge_number = 4
318 ix => ixc(1:nixc,1:numelc)
319 pointer_edge => edges_shell(1:2,1:4)
320 shift_elm = offset_shell
321 ELSEIF(elem_id<=offset_beam) THEN
322
323
324
325 edge_number = 1
326 ix => ixt(1:nixt,1:numelt)
327 pointer_edge => edges_2delm(1:2,1:1)
328 shift_elm = offset_truss
329 ELSEIF(elem_id<=offset_spring) THEN
330
331
332
333 edge_number = 1
334 ix => ixp(1:nixp,1:numelp)
335 pointer_edge => edges_2delm(1:2,1:1)
336 shift_elm = offset_beam
337 ELSEIF(elem_id<=offset_triangle) THEN
338
339
340
341 edge_number = 1
342 ix => ixr(1:nixr,1:numelr)
343 pointer_edge => edges_2delm(1:2,1:1)
344 shift_elm = offset_spring
345 IF(nint(geo(12,ixr(1,elem_id-shift_elm)))==12) THEN
346
347
348
349 edge_number = 2
350 pointer_edge => edges_spring_typ12(1:2,1:2)
351 ENDIF
352 ELSEIF(elem_id<=offset_ur) THEN
353
354
355
356
357
358
359 edge_number = 3
360 ix => ixtg(1:nixtg,1:numeltg)
361 pointer_edge => edges_tri(1:2,1:3)
362 shift_elm = offset_triangle
363 ELSE
364
365 do_computation = .false.
366 ENDIF
367
368 IF(do_computation) THEN
369
370
371 DO k=1,edge_number
372 several_proc = 0
373 several_edge = 0
374 no_edge = .false.
375
376
377
378 n = pointer_edge(1,k)
379 IF(n<10) THEN
380 node_id = ix(n+1,elem_id-shift_elm)
381 ELSE
382 node_id = ix_tetra10(n-10,elem_id-shift_elm)
383 ENDIF
384 node_id_1 = node_id
385 local_node(1) = node_id
386 nb_edge_1 = shoot_struct%SHIFT_M_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_M_NODE_EDGE(node_id)
387 shift = shoot_struct%SHIFT_M_NODE_EDGE(node_id)
388 intersect_1(1:nb_edge_1) = shoot_struct%M_NODE_EDGE( shift+1:shift+nb_edge_1 )
389
390 nb_proc_1 = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
391 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
392 intersect_3(1:nb_proc_1) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_1 )
393
394
395 n = pointer_edge(2,k)
396 IF(n<10) THEN
397 node_id = ix(n+1,elem_id-shift_elm)
398 ELSE
399 node_id = ix_tetra10(n-10,elem_id-shift_elm)
400 ENDIF
401 node_id_2 = node_id
402 local_node(2) = node_id
403 nb_edge_2 = shoot_struct%SHIFT_M_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_M_NODE_EDGE(node_id)
404 shift = shoot_struct%SHIFT_M_NODE_EDGE(node_id)
405 intersect_2(1:nb_edge_2) = shoot_struct%M_NODE_EDGE( shift+1:shift+nb_edge_2 )
406
407 nb_proc_2 = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
408 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
409 intersect_4(1:nb_proc_2) = shoot_struct%M_NODE_PROC( shift+1:shift+nb_proc_2 )
410
411
412 IF( node_id_1 /= node_id_2 ) THEN
413
414
415 nb_result_intersect = 0
416 IF(nb_edge_1>0.AND.nb_edge_2>0) THEN
417 CALL intersect_2_sorted_sets( intersect_1,nb_edge_1,
418 . intersect_2,nb_edge_2,
419 . result_intersect,nb_result_intersect )
420 ELSE
421 nb_result_intersect = 0
422 ENDIF
423
424
425
426
427
428 IF(nb_proc_1>1.AND.nb_proc_2>1) THEN
429 CALL intersect_2_sorted_sets( intersect_3,nb_proc_1,
430 . intersect_4,nb_proc_2,
431 . result_intersect_2,nb_result_intersect_2 )
432 ELSE
433 nb_result_intersect_2 = 0
434 ENDIF
435
436
437 ELSE
438 nb_result_intersect = 0
439 nb_result_intersect_2 = 0
440 ENDIF
441
442
443
444
445
446 n = pointer_edge(1,k)
447 IF(n<10) THEN
448 node_id = ix(n+1,elem_id-shift_elm)
449 ELSE
450 node_id = ix_tetra10(n-10,elem_id-shift_elm)
451 ENDIF
452 local_node(3) = node_id
453 nb_edge_1 = shoot_struct%SHIFT_S_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_S_NODE_EDGE(node_id)
454 shift = shoot_struct%SHIFT_S_NODE_EDGE(node_id)
455 intersect_1(1:nb_edge_1) = shoot_struct%S_NODE_EDGE( shift+1:shift+nb_edge_1 )
456
457
458 n = pointer_edge(2,k)
459 IF(n<10) THEN
460 node_id = ix(n+1,elem_id-shift_elm)
461 ELSE
462 node_id = ix_tetra10(n-10,elem_id-shift_elm)
463 ENDIF
464 local_node(4) = node_id
465 nb_edge_2 = shoot_struct%SHIFT_S_NODE_EDGE(node_id+1) - shoot_struct%SHIFT_S_NODE_EDGE(node_id)
466 shift = shoot_struct%SHIFT_S_NODE_EDGE(node_id)
467 intersect_2(1:nb_edge_2) = shoot_struct%S_NODE_EDGE( shift+1:shift+nb_edge_2 )
468
469
470 IF( node_id_1 /= node_id_2 ) THEN
471
472
473 nb_result_intersect_3 = 0
474 IF(nb_edge_1>0.AND.nb_edge_2>0) THEN
475 CALL intersect_2_sorted_sets( intersect_1,nb_edge_1,
476 . intersect_2,nb_edge_2,
477 . result_intersect_3,nb_result_intersect_3 )
478 ELSE
479 nb_result_intersect_3 = 0
480 ENDIF
481
482
483 ELSE
484 nb_result_intersect_3
485 ENDIF
486
487 IF(nb_result_intersect>0) THEN
488
489
490 IF( shoot_struct%SAVE_M_EDGE_NB+nb_result_intersect>shoot_struct%S_SAVE_M_EDGE) THEN
491 ALLOCATE( tmp_array(shoot_struct%S_SAVE_M_EDGE) )
492 tmp_array(1:shoot_struct%S_SAVE_M_EDGE) = shoot_struct%SAVE_M_EDGE(1:shoot_struct%S_SAVE_M_EDGE)
493
494 DEALLOCATE( shoot_struct%SAVE_M_EDGE )
495 old_size = shoot_struct%S_SAVE_M_EDGE
496 shoot_struct%S_SAVE_M_EDGE = 1.20*(shoot_struct%S_SAVE_M_EDGE+5*nb_result_intersect)
497 ALLOCATE( shoot_struct%SAVE_M_EDGE( shoot_struct%S_SAVE_M_EDGE ) )
498 shoot_struct%SAVE_M_EDGE(1:old_size) = tmp_array(1
499 DEALLOCATE( tmp_array )
500 ENDIF
501 DO j=1,nb_result_intersect
502 shoot_struct%SAVE_M_EDGE_NB = shoot_struct%SAVE_M_EDGE_NB + 1
503 shoot_struct%SAVE_M_EDGE( shoot_struct%SAVE_M_EDGE_NB ) = result_intersect
504 ENDDO
505 ENDIF
506
507 IF(nb_result_intersect_2>1) THEN
508
509
510
511
512
513
514
515 IF( shoot_struct%SAVE_PROC_NB_EDGE+3*(nb_result_intersect_2-1)>
516 . shoot_struct%S_SAVE_PROC_EDGE) THEN
517 ALLOCATE( tmp_array(shoot_struct%S_SAVE_PROC_EDGE) )
518 tmp_array(1:shoot_struct%S_SAVE_PROC_EDGE) =
519 . shoot_struct%SAVE_PROC_EDGE(1:shoot_struct%S_SAVE_PROC_EDGE)
520
521 DEALLOCATE( shoot_struct%SAVE_PROC_EDGE )
522 old_size = shoot_struct%S_SAVE_PROC_EDGE
523 shoot_struct%S_SAVE_PROC_EDGE =
524 . 1.20*(shoot_struct%SAVE_PROC_NB_EDGE+3*(nb_result_intersect_2-1))
525 ALLOCATE( shoot_struct%SAVE_PROC_EDGE( shoot_struct%S_SAVE_PROC_EDGE ) )
526 shoot_struct%SAVE_PROC_EDGE(1:old_size) = tmp_array(1:old_size
527 DEALLOCATE( tmp_array )
528 ENDIF
529
530 DO j=1,nb_result_intersect_2
531 IF(result_intersect_2(j)/=ispmd+1) THEN
532 shoot_struct%SAVE_PROC_NB_EDGE = shoot_struct%SAVE_PROC_NB_EDGE + 1
533 shoot_struct%SAVE_PROC_EDGE( shoot_struct%SAVE_PROC_NB_EDGE ) = result_intersect_2(j)
534
535 DO ijk=1,2
536 shoot_struct%SAVE_PROC_NB_EDGE =
537 . shoot_struct%SAVE_PROC_NB_EDGE + 1
538 shoot_struct%SAVE_PROC_EDGE( shoot_struct%SAVE_PROC_NB_EDGE )
539 . itab(local_node(ijk))
540 ENDDO
541 ENDIF
542 ENDDO
543 ELSE
544
545 ENDIF
546
547 IF(nb_result_intersect_3>0) THEN
548
549
550
551 IF( shoot_struct%SAVE_S_EDGE_NB+nb_result_intersect_3>
552 . shoot_struct%S_SAVE_S_EDGE) THEN
553 ALLOCATE( tmp_array(shoot_struct%S_SAVE_S_EDGE) )
554 tmp_array(1:shoot_struct%S_SAVE_S_EDGE) = shoot_struct%SAVE_S_EDGE(1:shoot_struct%S_SAVE_S_EDGE)
555
556 DEALLOCATE( shoot_struct%SAVE_S_EDGE )
557 old_size = shoot_struct%S_SAVE_S_EDGE
558 shoot_struct%S_SAVE_S_EDGE = 1.20*(shoot_struct%S_SAVE_S_EDGE+5*nb_result_intersect_3)
559 ALLOCATE( shoot_struct%SAVE_S_EDGE( shoot_struct%S_SAVE_S_EDGE ) )
560
561 DEALLOCATE( tmp_array )
562 ENDIF
563 DO j=1,nb_result_intersect_3
564 shoot_struct%SAVE_S_EDGE_NB = shoot_struct%SAVE_S_EDGE_NB
565 shoot_struct%SAVE_S_EDGE( shoot_struct%SAVE_S_EDGE_NB
566 ENDDO
567 ENDIF
568 ENDDO
569
570
571 ENDIF
572 ENDDO
573
574
575
576
577 DEALLOCATE( result_intersect )
578 DEALLOCATE( result_intersect_3 )
579 DEALLOCATE( intersect_1 )
580 DEALLOCATE( intersect_2 )
581
582 DEALLOCATE( result_intersect_2 )
583 DEALLOCATE( intersect_3 )
584 DEALLOCATE( intersect_4 )
585
586
587 RETURN