33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 USE loads_mod
50
51
52
53#include "implicit_f.inc"
54
55
56
57
58#include "com01_c.inc"
59
60#include "com04_c.inc"
61
62#include "param_c.inc"
63
64
65
66 TYPE(LOADS_),INTENT(INOUT) :: LOADS
67 INTEGER ,DIMENSION(LISKN,NUMFRAM+1) ,INTENT(IN) :: IFRAME
68
69
70
71 LOGICAL :: NEXT_OPERATION
72 INTEGER :: I,J,K
73 INTEGER :: NUMBER_SEGMENT,LOCAL_NUMBER_SEG,NUMBER_NODE
74 INTEGER :: NODE_ID,MY_PROC,MY_SIZE,FRAME_ID
75 INTEGER :: NUMBER_PROC,NUMBER_PROC_1,NUMBER_PROC_2
76 INTEGER, DIMENSION(NSPMD) :: LIST_1,LIST_2
77 INTEGER :: NB_RESULT_INTERSECT
78 INTEGER, DIMENSION(NSPMD) :: RESULT_INTERSECT
79 INTEGER, DIMENSION(NSPMD) :: PROC_ARRAY
80 LOGICAL, DIMENSION(:), ALLOCATABLE :: BOOL
81 INTEGER, DIMENSION(:), ALLOCATABLE :: TEMP_ARRAY
82 TYPE(array_type_int_1d), DIMENSION(:), ALLOCATABLE :: LOCAL_ARRAY
83 INTEGER :: NB_LOCAL_ARRAY
84 INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX_LOCAL_ARRAY
85
86
87
88 ALLOCATE( bool(numnod) )
89 bool(1:numnod) = .true.
90 nb_local_array = 0
91 ALLOCATE( index_local_array(numnod) )
92 ALLOCATE( local_array(numnod) )
93 local_array(1:numnod)%SIZE_INT_ARRAY_1D = 0
94
95 IF(.NOT.ALLOCATED(loads%CYL_RESTART)) ALLOCATE( loads%CYL_RESTART(loads%NLOAD_CYL) )
96
97
98 DO i=1,loads%NLOAD_CYL
99 number_segment = loads%LOAD_CYL(i)%NSEG
100
101
102 DO j=1,number_segment
103 DO k=1,4
104 node_id = loads%LOAD_CYL(i)%SEGNOD(j,k)
105 number_proc = 0
106 IF(node_id/=0) THEN
107 IF(bool(node_id)) THEN
109 bool(node_id) = .false.
110 local_array(node_id)%SIZE_INT_ARRAY_1D = number_proc
112 local_array(node_id)%INT_ARRAY_1D(1:number_proc) = proc_array(1:number_proc)
113 nb_local_array = nb_local_array + 1
114 index_local_array(nb_local_array) = node_id
115 ENDIF
116 ENDIF
117 ENDDO
118 ENDDO
119
120
121
122 IF(.NOT.ALLOCATED(loads%CYL_RESTART(i)%SEGMENT_TO_PROC)) THEN
123 ALLOCATE( loads%CYL_RESTART(i)%SEGMENT_TO_PROC(number_segment) )
124 ENDIF
125 IF(.NOT.ALLOCATED(loads%CYL_RESTART(i)%PROC)) ALLOCATE( loads%CYL_RESTART(i)%PROC(nspmd) )
126 DO j=1,nspmd
127 loads%CYL_RESTART(i)%PROC(j)%LOCAL_SEGMENT_NUMBER = 0
128 loads%CYL_RESTART(i)%PROC(j)%S_LOCAL_SEGMENT = number_segment / nspmd + 4
129 my_size = loads%CYL_RESTART(i)%PROC(j)%S_LOCAL_SEGMENT
130 IF(ALLOCATED(loads%CYL_RESTART(i)%PROC(j)%LOCAL_SEGMENT)) THEN
131 DEALLOCATE( loads%CYL_RESTART(i)%PROC(j)%LOCAL_SEGMENT )
132 ENDIF
133 ALLOCATE( loads%CYL_RESTART(i)%PROC(j)%LOCAL_SEGMENT(my_size) )
134 ENDDO
135
136 DO j=1,number_segment
137 number_node = 4
138 node_id = loads%LOAD_CYL(i)%SEGNOD(j,4)
139 IF(node_id==0) number_node = 3
140
141 node_id = loads%LOAD_CYL(i)%SEGNOD(j,1)
142 number_proc_1 = local_array(node_id)%SIZE_INT_ARRAY_1D
143 list_1(1:number_proc_1) = local_array(node_id)%INT_ARRAY_1D(1:number_proc_1)
144 next_operation = .true.
145
146
147
148
149 DO k=2,number_node
150 node_id = loads%LOAD_CYL(i)%SEGNOD(j,k)
151 number_proc_2 = local_array(node_id)%SIZE_INT_ARRAY_1D
152 list_2(1:number_proc_2) = local_array(node_id)%INT_ARRAY_1D(1:number_proc_2)
153
154
155 IF(next_operation) THEN
156 CALL intersect_2_sorted_sets( list_1,number_proc_1,
157 . list_2,number_proc_2,
158 . result_intersect,nb_result_intersect )
159 IF(nb_result_intersect>0) THEN
160 list_1(1:nb_result_intersect) = result_intersect(1:nb_result_intersect)
161 number_proc_1 = nb_result_intersect
162 ENDIF
163 ELSE
164 nb_result_intersect = 0
165 ENDIF
166 next_operation = (nb_result_intersect>0)
167
168
169 ENDDO
170
171
172 IF(nb_result_intersect>0) THEN
173 my_proc = list_1(1)
174 ELSE
175 my_proc = list_1(1)
176 DO k=1,number_node
177 node_id = loads%LOAD_CYL(i)%SEGNOD(j,k)
179 ENDDO
180 ENDIF
181
182
183 loads%CYL_RESTART(i)%SEGMENT_TO_PROC(j) = my_proc
184 local_number_seg = loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT_NUMBER
185
186
187 my_size = loads%CYL_RESTART(i)%PROC(my_proc)%S_LOCAL_SEGMENT
188 IF(my_size< local_number_seg + 1 ) THEN
189 ALLOCATE(temp_array(local_number_seg))
190 temp_array(1:local_number_seg) =
191 . loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT(1:local_number_seg)
192 DEALLOCATE( loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT )
193 loads%CYL_RESTART(i)%PROC(my_proc)%S_LOCAL_SEGMENT = my_size *1.2 + 4
194 my_size = loads%CYL_RESTART(i)%PROC(my_proc)%S_LOCAL_SEGMENT
195 ALLOCATE( loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT(my_size) )
196 loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT(1:local_number_seg) =
197 . temp_array(1:local_number_seg)
198 DEALLOCATE(temp_array)
199 ENDIF
200 local_number_seg = local_number_seg + 1
201 loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT_NUMBER = local_number_seg
202 loads%CYL_RESTART(i)%PROC(my_proc)%LOCAL_SEGMENT( local_number_seg ) = j
203 ENDDO
204
205
206
207
208 DO j=1,nspmd
209 IF(loads%CYL_RESTART(i)%PROC(j)%LOCAL_SEGMENT_NUMBER>0) THEN
210 frame_id = loads%LOAD_CYL(i)%IFRAME + 1
211 IF(frame_id > 0 .and. iframe(5,frame_id) > 0) THEN
212 DO k=1,2
213 node_id = iframe(k,frame_id)
215 ENDDO
216 ENDIF
217 ENDIF
218 ENDDO
219
220 ENDDO
221
222
223
224 DO j=1,nb_local_array
225 node_id = index_local_array(j)
227 ENDDO
228
229
230 DEALLOCATE( bool )
231 DEALLOCATE( local_array )
232 RETURN
subroutine ifrontplus(n, p)