1 subroutine pcmar2 ( hetare, filare, merare,
2 > famare, posifa, facare,
3 > aretri, hettri, nivtri,
5 > arequa, hetqua, nivqua,
9 > ulsort, langue, codret )
10 c ______________________________________________________________________
14 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
16 c Version originale enregistree le 18 juin 1996 sous le numero 96036
17 c aupres des huissiers de justice Simart et Lavoir a Clamart
18 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
19 c aupres des huissiers de justice
20 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
22 c HOMARD est une marque deposee d'Electricite de France
28 c ______________________________________________________________________
30 c aPres adaptation - Conversion de MAillage - Recollements - phase 2
32 c Reperage des aretes de raccordement non conforme
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . hetare . e . nbarto . historique de l'etat des aretes .
38 c . filare . e . nbarto . fille ainee de chaque arete .
39 c . merare . e . nbarto . mere de chaque arete .
40 c . famare . es . nbarto . famille des aretes .
41 c . posifa . e .0:nbarto. pointeur sur tableau facare .
42 c . facare . e . nbfaar . liste des faces contenant une arete .
43 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
44 c . hettri . e . nbtrto . historique de l'etat des triangles .
45 c . nivtri . e . nbtrto . niveau des triangles .
46 c . voltri . e .2*nbtrto. numeros des 2 volumes par triangle .
47 c . . . . voltri(i,k) definit le i-eme voisin de k .
48 c . . . . 0 : pas de voisin .
49 c . . . . j>0 : tetraedre j .
50 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
51 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
52 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
53 c . nivqua . e . nbquto . niveau des quadrangles .
54 c . nbanci . e . 1 . nombre de non conformites initiales .
55 c . nbenrc . e . 1 . nombre d'entites par recollement unitaire .
56 c . arreca . e .2*nbanci. liste des aretes recouvrant une autre .
57 c . nparrc . s . 1 . nombre de paires d'aretes a recoller .
58 c . arerec . s .2*nbarto. paires des aretes a recoller .
59 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
60 c . langue . e . 1 . langue des messages .
61 c . . . . 1 : francais, 2 : anglais .
62 c . codret . es . 1 . code de retour des modules .
63 c . . . . 0 : pas de probleme .
64 c . . . . 1 : probleme .
65 c ______________________________________________________________________
68 c 0. declarations et dimensionnement
71 c 0.1. ==> generalites
77 parameter ( nompro = 'PCMAR2' )
96 integer hetare(nbarto), filare(nbarto), merare(nbarto)
97 integer famare(nbarto)
98 integer posifa(0:nbarto), facare(nbfaar)
99 integer aretri(nbtrto,3), hettri(nbtrto), nivtri(nbtrto)
100 integer voltri(2,nbtrto)
101 integer arequa(nbquto,4), hetqua(nbquto), nivqua(nbquto)
102 integer nbanci, nbenrc
103 integer arreca(nbenrc*nbanci)
105 integer arerec(2,nbarto)
107 integer ulsort, langue, codret
109 c 0.4. ==> variables locales
111 integer iaux, jaux, kaux, laux
113 integer nbar2d, nbar3d
114 integer larete, lareta
116 #ifdef _DEBUG_HOMARD_
123 parameter ( nbmess = 30 )
124 character*80 texte(nblang,nbmess)
126 c 0.5. ==> initialisations
127 c ______________________________________________________________________
135 #ifdef _DEBUG_HOMARD_
136 write (ulsort,texte(langue,1)) 'Entree', nompro
140 texte(1,4) = '(''On ne devrait pas passer dans '',a)'
141 texte(1,5) = '(''Examen du '',a,''numero '',i10)'
143 > '(2x,''Nombre de paires de '',a,''a recoller :'',i10)'
145 > '(''.. Modification de la famille du '',a,''numero '',i10)'
147 > '(''.. Modification de l''''etat du '',a,''numero '',i10)'
148 texte(1,10) = '(5x,''==> avant :'',i5,'', apres :'',i5)'
149 texte(1,11) = '(''Nombre de non-conformites initiales :'',i10))'
150 texte(1,12) = '(''. de fils :'',2i10))'
151 texte(1,13) = '(''. Etat du '',a,''numero '',i10,'' :'',i10)'
152 texte(1,14) = '(2x,''Apres la phase de limites de zone :'')'
153 texte(1,15) = '(2x,''Apres les non conformites initiales :'')'
154 texte(1,19) = '(''. Famille du '',a,''numero '',i10,'' :'',i10)'
155 texte(1,20) = '(''Impossible d''''avoir des groupes internes'')'
157 texte(2,4) = '(a,'' should not be called.'')'
158 texte(2,5) = '(''Examination of '',a,'',# '',i10)'
159 texte(2,6) = '(2x,''Number of pairs of '',a,''to glue :'',i10)'
161 > '(''.. Modification of the family of '',a,'',# '',i10)'
163 > '(''.. Modification of the state of '',a,'',# '',i10)'
164 texte(2,10) = '(5x,''==> old :'',i5,'', new :'',i5)'
165 texte(2,11) = '(''Number of non-conformal situations :'',i10))'
166 texte(2,12) = '(''. with sons :'',2i10))'
167 texte(2,13) = '(''. State for '',a,''# '',i10,'' :'',i10)'
168 texte(2,14) = '(2x,''After zone limit analysis :'')'
169 texte(2,15) = '(2x,''After initial non conforming :'')'
170 texte(2,19) = '(''. Family for '',a,''# '',i10,'' :'',i10)'
171 texte(2,20) = '(''Impossible d''''avoir des groupes internes'')'
180 c 2. recherche des aretes a la limite entre deux zones de
181 c raffinement de niveau different, sans tenir compte du
185 if ( codret.eq.0 ) then
187 call gmalot ( noelre, 'entier ', nbarto, adelre, codret )
191 if ( codret.eq.0 ) then
193 #ifdef _DEBUG_HOMARD_
194 write (ulsort,texte(langue,3)) 'UTBOAR', nompro
198 > nbarto, nbtrto, nbquto, nbteto, nbfaar,
201 > aretri, hettri, voltri,
203 > nbar2d, nbar3d, imem(adelre),
204 > ulsort, langue, codret )
208 cgn call gmprsx (nompro,noelre)
210 c 3. examen des aretes en fonction de la limite de zone
212 #ifdef _DEBUG_HOMARD_
213 write (ulsort,90002) '3. examen des aretes ; codret', codret
216 if ( codret.eq.0 ) then
218 do 31 , larete = 1 , nbarto
220 #ifdef _DEBUG_HOMARD_
221 if ( larete.eq.-7 ) then
227 #ifdef _DEBUG_HOMARD_
228 if ( glop.ne.0 ) then
229 write (ulsort,texte(langue,5)) mess14(langue,1,1), larete
230 write (ulsort,90002) 'borare', imem(adelre-1+larete)
234 iaux = imem(adelre-1+larete)
236 c 3.1. ==> L'arete est a la limite entre 2 zones de niveaux de
237 c raffinement differents. Si elle est active, on doit lui
238 c attribuer la famille supplementaire ainsi qu'a son aieule
240 if ( iaux.eq.1 ) then
242 if ( mod(hetare(larete),10).eq.0 ) then
244 c 3.1.1. ==> L'arete est a modifier
246 #ifdef _DEBUG_HOMARD_
247 if ( glop.ne.0 ) then
248 write (ulsort,texte(langue,8)) mess14(langue,1,1), larete
249 write (ulsort,texte(langue,10)) famare(larete), nbfare
252 famare(larete) = nbfare
254 c 3.1.2. ==> Reperage de l'aieule qui borde 2 surfaces
255 c on cherche l'ascendant le plus ancien qui se trouve
258 lareta = merare(larete)
261 cgn write(ulsort,90002) '... lareta', lareta
263 if ( imem(adelre-1+lareta).eq.1 ) then
264 lareta = merare(lareta)
267 cgn write(ulsort,90112) 'famare', lareta, famare(lareta)
269 c 3.1.3. ==> Cet aieul doit faire partie du maillage de calcul. Pour
270 c cela, sa famille doit valoir la famille supplementaire et
271 c il doit passer actif.
272 C Remarque : il se peut que la famille d'une telle arete soit
273 c deja la famille supplementaire. Il ne faut pas
274 c filtrer la-dessus car sinon on ne mettra pas son
275 c etat a 0 ; or cela est indispensable pour
276 c etre detectee en tant qu'element de calcul.
278 #ifdef _DEBUG_HOMARD_
279 if ( glop.ne.0 ) then
280 write (ulsort,texte(langue,8)) mess14(langue,1,1), lareta
281 write (ulsort,texte(langue,10)) famare(lareta), nbfare
284 famare(lareta) = nbfare
286 if ( mod(hetare(lareta),10).ne.0 ) then
287 #ifdef _DEBUG_HOMARD_
288 if ( glop.ne.0 ) then
289 write (ulsort,texte(langue,9)) mess14(langue,1,1), lareta
290 write (ulsort,texte(langue,10)) hetare(lareta), 0
297 arerec(1,nparrc) = lareta
298 arerec(2,nparrc) = larete
304 c 3.2. ==> L'arete est interne au domaine. Si elle est de la famille
305 c supplementaire, on doit la ramener a la famille libre
306 c Remarque : bug possible si des elements internes ont ete
307 c mis dans des groupes au depart ...
309 if ( famare(larete).eq.nbfare ) then
311 #ifdef _DEBUG_HOMARD_
312 if ( glop.ne.0 ) then
313 write (ulsort,texte(langue,8)) mess14(langue,1,1), larete
314 write (ulsort,texte(langue,10)) famare(larete), 1
320 #ifdef _DEBUG_HOMARD_
321 elseif ( famare(larete).ne.1 ) then
323 write (ulsort,texte(langue,19))
324 > mess14(langue,1,1), larete , famare(larete)
325 write (ulsort,texte(langue,20))
337 #ifdef _DEBUG_HOMARD_
338 if ( codret.eq.0 ) then
339 write (ulsort,texte(langue,14))
340 write (ulsort,texte(langue,6)) mess14(langue,3,1), nparrc
346 c 4. chaque arete de la non conformite initiale doit devenir
347 c un element si elle apparait
348 c on va s'interesser aux aretes recouvrantes qui sont
349 c decoupees en 2 et dont aucune des faces voisines n'est
350 c decoupee ; cela correspond en effet a la situation semblable
353 #ifdef _DEBUG_HOMARD_
354 write (ulsort,90002) '4. non conf initiale ; codret', codret
357 #ifdef _DEBUG_HOMARD_
358 write (ulsort,texte(langue,11)) nbanci
359 write (ulsort,90002) 'nbenrc', nbenrc
362 if ( nbanci.gt.0 ) then
364 if ( codret.eq.0 ) then
368 do 41 , iaux = 1 , jaux
370 larete = arreca(iaux)
372 #ifdef _DEBUG_HOMARD_
373 if ( larete.eq.12 ) then
379 #ifdef _DEBUG_HOMARD_
380 if ( glop.ne.0 ) then
381 write (ulsort,texte(langue,5)) mess14(langue,1,1), larete
385 if ( mod(hetare(larete),10).eq.2 ) then
387 #ifdef _DEBUG_HOMARD_
388 if ( glop.ne.0 ) then
389 write (ulsort,texte(langue,12)) filare(larete), filare(larete)+1
390 write (ulsort,texte(langue,13))
391 > mess14(langue,1,1), filare(larete) , hetare(filare(larete))
392 write (ulsort,texte(langue,13))
393 > mess14(langue,1,1), filare(larete)+1, hetare(filare(larete)+1)
397 c 4.1. ==> Si on a deja traite cette arete, on passe a la suite
399 do 411 , kaux = nparrc, 1, -1
401 if ( arerec(1,kaux).eq.larete .or.
402 > arerec(2,kaux).eq.larete ) then
408 c 4.2. ==> Si une de ses faces voisines est decoupee, on passe
411 kdeb = posifa(larete-1)+1
412 kfin = posifa(larete)
413 do 412 , kaux = kdeb , kfin
416 if ( laux.gt.0 ) then
417 #ifdef _DEBUG_HOMARD_
418 if ( glop.ne.0 ) then
419 write (ulsort,texte(langue,5)) mess14(langue,1,2), laux
420 write (ulsort,texte(langue,13))
421 > mess14(langue,1,2), laux, hettri(laux)
424 if ( mod(hettri(laux),10).ne.0 ) then
429 #ifdef _DEBUG_HOMARD_
430 if ( glop.ne.0 ) then
431 write (ulsort,texte(langue,5)) mess14(langue,1,4), laux
432 write (ulsort,texte(langue,13))
433 > mess14(langue,1,4), laux, hetqua(laux)
436 if ( mod(hetqua(laux),100).ne.0 ) then
444 c 4.3. ==> L'arete mere est a modifier
446 #ifdef _DEBUG_HOMARD_
447 if ( glop.ne.0 ) then
448 write (ulsort,texte(langue,8)) mess14(langue,1,1), larete
449 write (ulsort,texte(langue,10)) famare(larete), nbfare
450 write (ulsort,texte(langue,10)) hetare(larete), 0
454 famare(larete) = nbfare
457 c 4.4. ==> Ses filles sont a modifier
459 do 414 , lareta = filare(larete), filare(larete)+1
461 if ( famare(lareta).ne.nbfare ) then
463 #ifdef _DEBUG_HOMARD_
464 if ( glop.ne.0 ) then
465 write (ulsort,texte(langue,8)) mess14(langue,1,1), lareta
466 write (ulsort,texte(langue,10)) famare(lareta), nbfare
469 famare(lareta) = nbfare
471 if ( mod(hetare(lareta),10).ne.0 ) then
472 #ifdef _DEBUG_HOMARD_
473 if ( glop.ne.0 ) then
474 write (ulsort,texte(langue,9)) mess14(langue,1,1), lareta
475 write (ulsort,texte(langue,10)) hetare(lareta), 0
484 arerec(1,nparrc) = lareta
485 arerec(2,nparrc) = larete
497 #ifdef _DEBUG_HOMARD_
498 if ( codret.eq.0 ) then
499 write (ulsort,texte(langue,15))
500 write (ulsort,texte(langue,6)) mess14(langue,3,1), nparrc
508 #ifdef _DEBUG_HOMARD_
509 write (ulsort,90002) '5. Bilan ; codret', codret
512 if ( codret.eq.0 ) then
514 call gmlboj ( noelre, codret )
522 if ( codret.ne.0 ) then
526 write (ulsort,texte(langue,1)) 'Sortie', nompro
527 write (ulsort,texte(langue,2)) codret
531 #ifdef _DEBUG_HOMARD_
532 write (ulsort,texte(langue,1)) 'Sortie', nompro