34
35
36
37
38
39
40
41
42
43
44
45
46#include "implicit_f.inc"
47
48
49
50#include "com04_c.inc"
51#include "param_c.inc"
52#include "ige3d_c.inc"
53
54
55
56 INTEGER IXIG3D(*),KXIG3D(NIXIG3D,*),IGEO(NPROPGI,*),
57 . IPARTIG3D(*),TAB_NEWFCT(*),TAB_REMOVE(*),
58 . TAB_STAY(*),FLAG_PRE,EL_CONNECT(*),FLAG_DEBUG
59 my_real knotlocpc(deg_max,3,*),knotlocel(2,3,*)
60 my_real x_tmp(3,*),v_tmp(3,*),d_tmp(3,*),ms_tmp(*),wige_tmp(*)
61
62
63
64 INTEGER I,J,K,L,M,IAD_IXIG3D,INCTRL,L_TABWORK,WORK(70000),
65 . NDOUBLON_REMOVE, NDOUBLON_NEWFCT, L_REAL_REMOVE, L_REAL_NEWFCT,NVALEURS,
66 . DECALIXIG3D,DECALGEO,DECALGEOFINAL,
67 . NZERO_REMOVE,NZERO_NEWFCT,ITPATCH,NUMPCSTAY,NUMPCLEAVE,
68 . NCTRL,IPID,PX,PY,PZ,NDOUBLONIGE
69INTEGER TMPZ(4),TMPZY(4),TABPOSZ(64),TABPOSZY(64),TABPOSZYX(64)
71 INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX, TAB_REMOVE_TRI, TAB_NEWFCT_TRI
72 INTEGER, DIMENSION(:), ALLOCATABLE :: PERMIGE
73 my_real,
DIMENSION(:,:),
ALLOCATABLE :: x_trie
74
75
76 tol=em06
77
78
79
80
81
82 ALLOCATE(tab_remove_tri(l_tab_remove))
83 tab_remove_tri(:) = 0
84 ALLOCATE(index(2*l_tab_remove))
85 CALL my_orders(0, work, tab_remove, index, l_tab_remove , 1)
86 DO i=1,l_tab_remove
87 tab_remove_tri(i)=tab_remove(index(i))
88 ENDDO
89 DEALLOCATE(index)
90 DO i=1,l_tab_remove
91 tab_remove(i) = 0
92 ENDDO
93
94 ALLOCATE(tab_newfct_tri(l_tab_newfct))
95 tab_newfct_tri(:) = 0
96 ALLOCATE(index(2*l_tab_newfct))
98 DO i=1,l_tab_newfct
99 tab_newfct_tri(i)=tab_newfct(index(i))
100 ENDDO
101 DEALLOCATE(index)
102 DO i=1,l_tab_newfct
103 tab_newfct(i) = 0
104 ENDDO
105
106
107
108
109
110
111 ndoublon_remove = 0
112 IF(nbpart_ig3d>1) THEN
113 i = 1
114 DO WHILE (i<=l_tab_remove-ndoublon_remove-1)
115 nvaleurs = 0
116 tab_remove(i) = tab_remove_tri(i+ndoublon_remove)
117 DO WHILE (((i+ndoublon_remove+nvaleurs+1)<=l_tab_remove)
118 . .AND. (tab_remove(i+ndoublon_remove)==tab_remove(i+ndoublon_remove+nvaleurs+1)))
119 nvaleurs = nvaleurs + 1
120 ENDDO
121 ndoublon_remove = ndoublon_remove + nvaleurs
122 i = i + 1
123 ENDDO
124 ENDIF
125
126 l_real_remove = l_tab_remove - ndoublon_remove
127
128 ndoublon_newfct = 0
129 IF(nbpart_ig3d>1) THEN
130 i = 1
131 DO WHILE (i<=l_tab_newfct-ndoublon_newfct-1)
132 nvaleurs = 0
133 tab_newfct(i) = tab_newfct_tri(i+ndoublon_newfct)
134 DO WHILE (((i+ndoublon_newfct+nvaleurs+1)<=l_tab_newfct)
135 . .AND. (tab_newfct(i+ndoublon_newfct)==tab_newfct(i+ndoublon_newfct+nvaleurs+1)))
136 nvaleurs = nvaleurs + 1
137 ENDDO
138 ndoublon_newfct = ndoublon_newfct + nvaleurs
139 i = i + 1
140 ENDDO
141 ENDIF
142
143 l_real_newfct = l_tab_newfct - ndoublon_newfct
144
145
146
147
148
149 i=1
150 DO WHILE (i<=l_real_remove)
151 j=1
152 DO WHILE (j<=l_real_newfct)
153 IF(tab_remove_tri(i)==tab_newfct_tri(j)) THEN
154 tab_remove_tri(i) = 0
155 tab_newfct_tri(j) = 0
156 ENDIF
157 j=j+1
158 ENDDO
159 i=i+1
160 ENDDO
161
162 i = 1
163 nzero_remove = 0
164 DO WHILE (i<=l_real_remove-nzero_remove)
165 nvaleurs = 0
166 DO WHILE ((i+nzero_remove+nvaleurs)<=l_real_remove.AND.
167 . tab_remove_tri(i+nzero_remove+nvaleurs)==0)
168 nvaleurs=nvaleurs+1
169 ENDDO
170 nzero_remove = nzero_remove + nvaleurs
171 tab_remove_tri(i) = tab_remove_tri(i+nzero_remove)
172 i = i + 1
173 ENDDO
174
175 i = 1
176 nzero_newfct = 0
177 DO WHILE (i<=l_real_newfct-nzero_newfct)
178 nvaleurs = 0
179 DO WHILE ((i+nzero_newfct+nvaleurs)<=l_real_newfct.AND.
180 . tab_newfct_tri(i+nzero_newfct+nvaleurs)==0)
181 nvaleurs=nvaleurs+1
182 ENDDO
183 nzero_newfct = nzero_newfct + nvaleurs
184 tab_newfct_tri(i) = tab_newfct_tri(i+nzero_newfct)
185 i = i
186 ENDDO
187
188 l_real_remove = l_tab_remove - nzero_remove
189 l_real_newfct
190 nbnewx_final = l_real_newfct - l_real_remove
191
192
193
194
195
196
197
198
199 IF(flag_pre==1) THEN
200
201 i=1
202 DO WHILE (i<=l_real_remove)
203 x_tmp(:,tab_remove_tri(i)) = x_tmp(:,tab_newfct_tri(i))
204 d_tmp(:,tab_remove_tri(i)) = d_tmp(:,tab_newfct_tri(i))
205 v_tmp(:,tab_remove_tri(i)) = v_tmp(:,tab_newfct_tri(i))
206 ms_tmp(tab_remove_tri(i)) = ms_tmp(tab_newfct_tri(i))
207 wige_tmp(tab_remove_tri(i)) = wige_tmp(tab_newfct_tri
208 DO itpatch=1,numgeo
209
210
211 decalgeo=(itpatch-1)*(numnod
212 knotlocpc(:,1,decalgeo+tab_remove_tri(i)) = knotlocpc(:,1,decalgeo+tab_newfct_tri
213 knotlocpc(:,2,decalgeo+tab_remove_tri(i)) = knotlocpc(:,2,decalgeo+tab_newfct_tri(i))
214 knotlocpc(:,3,decalgeo+tab_remove_tri
215 ENDDO
216 j=1
217 DO WHILE(j<=sixig3d+addsixig3d)
218 DO WHILE(ixig3d(j)==tab_newfct_tri(i).AND.j<=sixig3d+addsixig3d)
219
220 ixig3d(j)=tab_remove_tri(i)
221 j=j+1
222 ENDDO
223 j=j+1
224 ENDDO
225 i=i+1
226 ENDDO
227
228 j=1
229 DO WHILE (i<=l_real_newfct)
230 x_tmp(:,numnodige0+j) = x_tmp
231 d_tmp(:,numnodige0+j) = d_tmp(:,tab_newfct_tri(i))
232 v_tmp(:,numnodige0+j) = v_tmp(:,tab_newfct_tri(i))
233 ms_tmp(numnodige0+j) = ms_tmp(tab_newfct_tri(i))
234 wige_tmp(numnodige0+j) = wige_tmp(tab_newfct_tri(i))
235 DO itpatch=1,numgeo
236 decalgeo=(itpatch-1)*(numnod+nbnewx_tmp)
237 knotlocpc(:,1,decalgeo+numnodige0+j) = knotlocpc
238 knotlocpc(:,2,decalgeo+numnodige0+j) = knotlocpc(:,2,decalgeo+tab_newfct_tri(i))
239 knotlocpc(:,3,decalgeo+numnodige0+j) = knotlocpc(:,
240 ENDDO
241 k=1
242 DO WHILE(k<=sixig3d+addsixig3d)
243 DO WHILE(ixig3d(k)==tab_newfct_tri(i).AND.k<=sixig3d+addsixig3d)
244
245 ixig3d(k)=numnodige0+j
246 k=k+1
247 ENDDO
248 k=k+1
249 ENDDO
250 i=i+1
251 j=j+1
252 ENDDO
253
254
255
256
257
258
259
260
261
262
263
264
265 IF(nbpart_ig3d>1) THEN
266 ALLOCATE(permige(numnod))
267 ALLOCATE(x_trie(3,numnod))
268 DO i=1,numnod
269 x_trie(:,i) = x_tmp(:,i)
270 ENDDO
272
273 i = 1
274 ndoublonige = 0
275 DO WHILE (i <= numnod-ndoublonige-1)
276 nvaleurs = 0
277 DO WHILE (((i+ndoublonige+nvaleurs+1) <= numnod)
278 . .AND. (abs(x_trie(1,i+ndoublonige)-x_trie(1,i+ndoublonige+nvaleurs+1)) <= tol)
279 . .AND. (abs(x_trie(2,i+ndoublonige)
280 . .AND. (abs(x_trie(3,i+ndoublonige)-x_trie(3,i+ndoublonige
281
282
283
284
285
286
287
288 numpcstay =0
289 numpcleave=0
290 DO k=1,l_tab_stay
291 IF(permige(i+ndoublonige)==tab_stay(k)) THEN
292 numpcstay = permige(i+ndoublonige)
293 numpcleave = permige(i+ndoublonige+nvaleurs+1)
294 EXIT
295 ENDIF
296 IF(permige(i+ndoublonige+nvaleurs+1)==tab_stayTHEN
297 numpcstay = permige(i+ndoublonige+nvaleurs+1)
298 numpcleave = permige(i+ndoublonige)
299 EXIT
300 ENDIF
301 ENDDO
302 IF(numpcstay==0.AND.numpcleave==0) THEN
303 numpcstay = permige(i+ndoublonige)
304 numpcleave = permige(i+ndoublonige+nvaleurs+1)
305
306
307
308 ENDIF
309
310 j=1
311 DO WHILE(j<=sixig3d+addsixig3d)
312 DO WHILE(ixig3d(j)==numpcleave.AND.j<=sixig3d+addsixig3d
313 ixig3d(j)=numpcstay
314 j=j+1
315 ENDDO
316 j=j+1
317 ENDDO
318
319
320
321 DO itpatch=1,nbpart_ig3d
322 decalgeo=(itpatch-1)*(numnod+nbnewx_tmp)
323
324 DO k=1,4
325 IF(knotlocpc(k,1,decalgeo+numpcleave)/=0) THEN
326 knotlocpc(:,1,decalgeo+numpcstay)=knotlocpc(:,1,decalgeo+numpcleave)
327 knotlocpc(:,2,decalgeo+numpcstay)=knotlocpc(:,2,decalgeo+numpcleave)
328 knotlocpc(:,3,decalgeo+numpcstay)=knotlocpc(:,3,decalgeo+numpcleave)
329 EXIT
330 ENDIF
331 ENDDO
332 ENDDO
333
334 nvaleurs = nvaleurs + 1
335
336 ENDDO
337 ndoublonige = ndoublonige + nvaleurs
338 i = i + 1
339 ENDDO
340
341
342
343
344
345 DEALLOCATE(permige)
346 DEALLOCATE(x_trie)
347 ENDIF
348
349 ENDIF
350
351 DEALLOCATE(tab_remove_tri)
352 DEALLOCATE(tab_newfct_tri)
353
354 IF(flag_pre==1) THEN
355
356
357
358
359
360
361
362 DO i=1,numelig3d0+addelig3d
363
364 IF(el_connect(i)/=1) cycle
365
366 decalixig3d=kxig3d(4,i)
367 decalgeo=(kxig3d(2,i)-1)*(numnod+nbnewx_tmp)
368 nctrl=kxig3d(3,i)
369 ipid=ipartig3d(i)
370 px = igeo(41,ipid)
371 py = igeo(42,ipid)
372 pz = igeo(43,ipid)
373
374 tabposz(:)=0
375 tmpz(:)=0
376 DO j=1,nctrl
377 DO k=1,pz
378 IF(knotlocpc(k,3,decalgeo+ixig3d(decalixig3d+j-1))<knotlocel(1,3,i)+tol.AND.
379 . knotlocpc(k+1,3,decalgeo+ixig3d(decalixig3d+j-1))>knotlocel(2,3,i)-tol) THEN
380
381 tmpz(k)=tmpz(k)+1
382 tabposz((k-1)*(px*py)+tmpz(k)) = ixig3d(decalixig3d+j-1)
383 ENDIF
384 ENDDO
385 ENDDO
386
387 tabposzy(:)=0
388 DO j=1,pz
389 tmpzy(:)=0
390 DO k=1,px*py
391 DO l=1,py
392 IF(knotlocpc(l,2,decalgeo+tabposz((j-1)*(px*py)+k))<knotlocel(1,2,i)+tol.AND.
393 . knotlocpc(l+1,2,decalgeo+tabposz((j-1)*(px*py)+k))>knotlocel(2,2,i)-tol) THEN
394
395 tmpzy(l)=tmpzy(l)+1
396 tabposzy((j-1)*(px*py)+(l-1)*py+tmpzy(l)) = tabposz((j-1)*(px*py)+k)
397 ENDIF
398 ENDDO
399 ENDDO
400 ENDDO
401
402 tabposzyx(:)=0
403 DO j=1,pz
404 DO k=1,py
405 DO l=1,px
406 DO m=1,px
407 IF(knotlocpc(m,1,decalgeo+tabposzy((j-1)*(px*py)+(k-1)*py+l))<knotlocel(1,1,i)+tol.AND.
408 . knotlocpc(m+1,1,decalgeo+tabposzy((j-1)*(px*py)+(k-1)*py+l))>knotlocel(2,1,i)-tol) THEN
409
410 tabposzyx((j-1)*(px*py)+(k-1)*py+m) = tabposzy((j
411 ENDIF
412 ENDDO
413 ENDDO
414 ENDDO
415 ENDDO
416
417
418
419
420
421
422 DO j=1,nctrl
423 ixig3d(decalixig3d+j-1)=tabposzyx(j)
424 ENDDO
425
426
427
428
429
430
431 IF(flag_debug==1) THEN
432 DO j=1,kxig3d(3,i)
433 inctrl=ixig3d(kxig3d(4,i)+j-1)
434 IF(knotlocel(1,1,i)<knotlocpc(1,1,decalgeo+inctrl)-em06 .OR.
435 . knotlocel(2,1,i)>knotlocpc(4,1,decalgeo+inctrl)+em06 .OR.
436 . knotlocel(1,2,i)<knotlocpc(1,2,decalgeo+inctrl)-em06 .OR.
437 . knotlocel(2,2,i)>knotlocpc(4,2,decalgeo+inctrl)+em06 .OR.
438 . knotlocel(1,3,i)<knotlocpc(1,3,decalgeo+inctrl)-em06 .OR.
439 . knotlocel(2,3,i)>knotlocpc(4,3,decalgeo+inctrl)+em06) THEN
440 print*,'DECALAGE : element : ',i,'point',inctrl
441 print*,'*************'
442 DO k=1,kxig3d(3,i)
443 print*,ixig3d(decalixig3d+k-1)
444 ENDDO
445 ENDIF
446 ENDDO
447
448
449
450
451
452 DO j=1,pz-1
453 DO k=1,py-1
454 DO l=1,px-1
455
456 itnctrl=(px*py)*(j-1)+px*(k-1)+l
457
458 inctrl=ixig3d(kxig3d(4,i)+itnctrl-1)
459 inctrl2=ixig3d(kxig3d(4,i)+itnctrl-1+1)
460 IF(knotlocpc(1,1,decalgeo+inctrl)<knotlocpc(1,1,decalgeo+inctrl2)) THEN
461 print*,'MAUVAIS RANGEMENT DANS IXIG3D : element : ',i,'point',inctrl
462 ENDIF
463
464 inctrl3=ixig3d(kxig3d(4,i)+itnctrl-1+px)
465 IF(knotlocpc(1,2,decalgeo+inctrl)<knotlocpc(1,2,decalgeo+inctrl3)) THEN
466 print*,'MAUVAIS RANGEMENT DANS IXIG3D : element : ',i,'point',inctrl
467 ENDIF
468
469 inctrl4=ixig3d(kxig3d(4,i)+itnctrl-1+px*py)
470 IF(knotlocpc(1,3,decalgeo+inctrl)<knotlocpc(1,3,decalgeo+inctrl4)) THEN
471 print*,'MAUVAIS RANGEMENT DANS IXIG3D : element : ',i,'point',inctrl
472 ENDIF
473
474 ENDDO
475
476 ENDDO
477 ENDDO
478
479 ENDIF
480
481 ENDDO
482
483 ENDIF
484
485 RETURN
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
subroutine myqsort3d(n, x, perm)