33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
52
53
54
55#include "implicit_f.inc"
56
57
58
59#include "com04_c.inc"
60
61
62
63 TYPE(INVERTGROUP_STRUCT_) :: INV_GROUP
64 TYPE (SET_) :: CLAUSE
65 INTEGER, INTENT(IN) :: NUMSPH
66
67
68
69 INTEGER ID,IE,EL,IP,EL_FIRST,EL_LAST,SIZE,IND,SZELMAX,I
70 INTEGER IWORK(70000)
71 INTEGER, DIMENSION(:), ALLOCATABLE :: INDX,SORT
72
73 szelmax =
max(numels,numelq,numelc,numeltg,numeltria,numelt,numelp,numelr,numsph)
74 ALLOCATE(indx(szelmax*2))
75 ALLOCATE(sort(szelmax))
76
77
78 IF (numels > 0) THEN
79 SIZE = 0
80 DO id=1,clause%NB_PART
82 el_first = inv_group%INDPARTS(ip)
83 el_last = inv_group%INDPARTS(ip+1)
84 SIZE = SIZE + el_last - el_first
85 ENDDO
86 clause%NB_SOLID = SIZE
87 ALLOCATE( clause%SOLID(size) )
88
89 ind = 0
90 DO id=1,clause%NB_PART
92 el_first = inv_group%INDPARTS(ip)
93 el_last = inv_group%INDPARTS(ip+1)-1
94 DO el=el_first,el_last
95 ind = ind+1
96 ie = inv_group%PARTS(el)
97 clause%SOLID(ind) = ie
98 ENDDO
99 ENDDO
100
101 iwork(1:70000) = 0
102 sort(1:clause%NB_SOLID) = clause%SOLID(1:clause%NB_SOLID)
103 CALL my_orders(0,iwork,sort,indx,clause%NB_SOLID,1)
104
105 DO i=1,clause%NB_SOLID
106 clause%SOLID(i) = sort(indx(i))
107 ENDDO
108
109 ENDIF
110
111
112 IF (numsph > 0) THEN
113 SIZE = 0
114 DO id=1,clause%NB_PART
116 el_first = inv_group%INDPARTSPH(ip)
117 el_last = inv_group%INDPARTSPH(ip+1)
118 SIZE = SIZE + el_last - el_first
119 ENDDO
120 clause%NB_SPHCEL = SIZE
121 ALLOCATE( clause%SPHCEL(size) )
122
123 ind = 0
124 DO id=1,clause%NB_PART
126 el_first = inv_group%INDPARTSPH(ip)
127 el_last = inv_group%INDPARTSPH(ip+1)-1
128 DO el=el_first,el_last
129 ind = ind+1
130 ie = inv_group%PARTSPH(el)
131 clause%SPHCEL(ind) = ie
132 ENDDO
133 ENDDO
134
135 iwork(1:70000) = 0
136 sort(1:clause%NB_SPHCEL) = clause%SPHCEL(1:clause%NB_SPHCEL)
137 CALL my_orders(0,iwork,sort,indx,clause%NB_SPHCEL,1)
138
139 DO i=1,clause%NB_SPHCEL
140 clause%SPHCEL(i) = sort(indx(i))
141 ENDDO
142 ENDIF
143
144
145 IF (numelq > 0) THEN
146 SIZE = 0
147 DO id=1,clause%NB_QUAD
149 el_first = inv_group%INDPARTQ(ip)
150 el_last = inv_group%INDPARTQ(ip+1)
151 SIZE = SIZE + el_last - el_first
152 ENDDO
153 clause%NB_QUAD = SIZE
154 ALLOCATE( clause%QUAD(size) )
155
156 ind = 0
159 el_first = inv_group%INDPARTQ(ip)
160 el_last = inv_group%INDPARTQ(ip+1)-1
161 DO el=el_first,el_last
162 ind = ind+1
163 ie = inv_group%PARTQ(el)
164 clause%QUAD(ind) = ie
165 ENDDO
166 ENDDO
167
168 iwork(1:70000) = 0
169 sort(1:clause%NB_QUAD) = clause%QUAD(1:clause%NB_QUAD)
170 CALL my_orders(0,iwork,sort,indx,clause%NB_QUAD,1)
171
172 DO i=1,clause%NB_QUAD
173 clause%QUAD(i) = sort(indx(i))
174 ENDDO
175
176 ENDIF
177
178
179 IF (numelc > 0) THEN
180 SIZE = 0
181 DO id=1,clause%NB_PART
183 el_first = inv_group%INDPARTC(ip)
184 el_last = inv_group%INDPARTC(ip+1)
185 SIZE = SIZE + el_last - el_first
186 ENDDO
187 clause%NB_SH4N = SIZE
188 ALLOCATE( clause%SH4N(size) )
189
190 ind = 0
191 DO id=1,clause%NB_PART
193 el_first = inv_group%INDPARTC(ip)
194 el_last = inv_group%INDPARTC(ip+1)-1
195 DO el=el_first,el_last
196 ind = ind+1
197 ie = inv_group%PARTC(el)
198 clause%SH4N(ind) =
199 ENDDO
200 ENDDO
201
202 iwork(1:70000) = 0
203 sort(1:clause%NB_SH4N) = clause%SH4N(1:clause%NB_SH4N)
204 CALL my_orders(0,iwork,sort,indx,clause%NB_SH4N,1)
205
206 DO i=1,clause%NB_SH4N
207 clause%SH4N(i) = sort(indx(i))
208 ENDDO
209
210 ENDIF
211
212
213
214 IF (numeltg > 0) THEN
215 SIZE = 0
216 DO id=1,clause%NB_PART
218 el_first = inv_group%INDPARTTG(ip)
219 el_last = inv_group%INDPARTTG(ip+1)
220 SIZE = SIZE + el_last - el_first
221 ENDDO
222 clause%NB_SH3N = SIZE
223 ALLOCATE( clause%SH3N(size) )
224
225 ind=0
226 DO id=1,clause%NB_PART
228 el_first = inv_group%INDPARTTG(ip)
229 el_last = inv_group%INDPARTTG(ip+1)-1
230 DO el=el_first,el_last
231 ind = ind+1
232 ie = inv_group%PARTTG(el)
233 clause%SH3N(ind) = ie
234 ENDDO
235 ENDDO
236 iwork(1:70000) = 0
237 sort(1:clause%NB_SH3N) = clause%SH3N(1:clause%NB_SH3N)
238 CALL my_orders(0,iwork,sort,indx,clause%NB_SH3N,1)
239
240 DO i=1,clause%NB_SH3N
241 clause%SH3N(i) = sort(indx(i))
242 ENDDO
243
244 ENDIF
245
246
247
248 IF (numeltria > 0) THEN
249 SIZE = 0
250 DO id=1,clause%NB_PART
252 el_first = inv_group%INDPARTTRIA(ip)
253 el_last = inv_group%INDPARTTRIA(ip+1)
254 SIZE = SIZE + el_last - el_first
255 ENDDO
256 clause%NB_TRIA = SIZE
257 ALLOCATE( clause%TRIA(size) )
258
259 ind = 0
260 DO id=1,clause%NB_PART
262 el_first = inv_group%INDPARTTRIA(ip)
263 el_last = inv_group%INDPARTTRIA(ip+1)-1
264 DO el=el_first,el_last
265 ind = ind+1
266 ie = inv_group%PARTTRIA(el)
267 clause%TRIA(ind) = ie
268 ENDDO
269 ENDDO
270 iwork(1:70000) = 0
271 sort(1:clause%NB_TRIA) = clause%SH3N(1:clause%NB_TRIA)
272 CALL my_orders(0,iwork,sort,indx,clause%NB_TRIA,1)
273
274 DO i=1,clause%NB_TRIA
275 clause%SH3N(i) = sort(indx(i))
276 ENDDO
277
278 ENDIF
279
280! truss
281 IF (numelt > 0) THEN
282 SIZE = 0
283 DO id=1,clause%NB_PART
285 el_first = inv_group%INDPARTT(ip)
286 el_last = inv_group%INDPARTT(ip+1)
287 SIZE = SIZE + el_last - el_first
288 ENDDO
289 clause%NB_TRUSS = SIZE
290 ALLOCATE( clause%TRUSS(size) )
291
292 ind = 0
293 DO id=1,clause%NB_PART
295 el_first = inv_group%INDPARTT(ip)
296 el_last = inv_group%INDPARTT(ip+1)-1
297 DO el=el_first,el_last
298 ind = ind+1
299 ie = inv_group%PARTT(el)
300 clause%TRUSS(ind) = ie
301 ENDDO
302 ENDDO
303
304 iwork(1:70000) = 0
305 sort(1:clause%NB_TRUSS) = clause%TRUSS(1:clause%NB_TRUSS)
306 CALL my_orders(0,iwork,sort,indx,clause%NB_TRUSS,1)
307
308 DO i=1,clause%NB_TRUSS
309 clause%TRUSS(i) = sort(indx(i))
310 ENDDO
311
312 ENDIF
313
314
315 IF (numelp > 0) THEN
316
317 SIZE = 0
318 DO id=1,clause%NB_PART
320 el_first = inv_group%INDPARTP(ip)
321 el_last = inv_group%INDPARTP(ip+1)
322 SIZE = SIZE + el_last - el_first
323 ENDDO
324
325 clause%NB_BEAM = SIZE
326 ALLOCATE( clause%BEAM(size) )
327
328 ind = 0
329 DO id=1,clause%NB_PART
331 el_first = inv_group%INDPARTP(ip)
332 el_last = inv_group%INDPARTP(ip+1)-1
333 DO el=el_first,el_last
334 ind = ind+1
335 ie = inv_group%PARTP(el)
336 clause%BEAM(ind) = ie
337 ENDDO
338 ENDDO
339 iwork(1:70000) = 0
340 sort(1:clause%NB_BEAM) = clause%BEAM(1:clause%NB_BEAM)
341 CALL my_orders(0,iwork,sort,indx,clause%NB_BEAM,1)
342
343 DO i=1,clause%NB_BEAM
344 clause%BEAM(i) = sort(indx(i))
345 ENDDO
346
347 ENDIF
348
349
350
351
352 IF (numelr > 0) THEN
353
354 SIZE = 0
355 DO id=1,clause%NB_PART
357 el_first = inv_group%INDPARTR(ip)
358 el_last = inv_group%INDPARTR(ip+1)
359 SIZE = SIZE + el_last - el_first
360 ENDDO
361
362 clause%NB_SPRING = SIZE
363 ALLOCATE( clause%SPRING(size) )
364
365 ind = 0
366 DO id=1,clause%NB_PART
368 el_first = inv_group%INDPARTR(ip)
369 el_last = inv_group%INDPARTR(ip+1)-1
370 DO el=el_first,el_last
371 ind = ind+1
372 ie = inv_group%PARTR(el)
373 clause%SPRING(ind) = ie
374 ENDDO
375 ENDDO
376 iwork(1:70000) = 0
377 sort(1:clause%NB_SPRING) = clause%SPRING(1:clause%NB_SPRING)
378 CALL my_orders(0,iwork,sort,indx,clause%NB_SPRING,1)
379
380 DO i=1,clause%NB_SPRING
381 clause%SPRING(i) = sort(indx(i))
382 ENDDO
383
384 ENDIF
385
386
387 RETURN
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)