1 subroutine dehom1 ( pilraf, pilder,
5 > arehom, homtri, quahom,
7 > ulsort, langue, codret )
8 c ______________________________________________________________________
12 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
14 c Version originale enregistree le 18 juin 1996 sous le numero 96036
15 c aupres des huissiers de justice Simart et Lavoir a Clamart
16 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
17 c aupres des huissiers de justice
18 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
20 c HOMARD est une marque deposee d'Electricite de France
26 c ______________________________________________________________________
28 c traitement des DEcisions - HOMologue - phase 1
30 c rmq : on ne peut pas utiliser les tables ho1are ... car elle ne
31 c sont plus a jour apres suppression de la conformite
33 c rmq : le raffinement est prioritaire sur le deraffinement
34 c ______________________________________________________________________
36 c . nom . e/s . taille . description .
37 c .____________________________________________________________________.
38 c . pilraf . e . 1 . pilotage du raffinement .
39 c . . . . -1 : raffinement uniforme .
40 c . . . . 0 : pas de raffinement .
41 c . . . . 1 : raffinement libre .
42 c . . . . 2 : raff. libre homogene en type d'element.
43 c . pilder . e . 1 . pilotage du deraffinement .
44 c . . . . -1 : deraffinement uniforme .
45 c . . . . 0 : pas de deraffinement .
46 c . . . . 1 : deraffinement libre .
47 c . hetare . e . nbarto . historique de l'etat des aretes .
48 c . hettri . e . nbtrto . historique de l'etat des triangles .
49 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
50 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
51 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
52 c . arehom . e . nbarto . ensemble des aretes homologues .
53 c . homtri . e . nbtrto . ensemble des triangles homologues .
54 c . quahom . e . nbquto . ensemble des quadrangles homologues .
55 c . decare . es . nbarto . decisions des aretes .
56 c . decfac . es . -nbquto. decision sur les faces (quad. + tri.) .
58 c . ulsort . e . 1 . unite logique de la sortie generale .
59 c . langue . e . 1 . langue des messages .
60 c . . . . 1 : francais, 2 : anglais .
61 c . codret . s . 1 . code de retour des modules .
62 c . . . . 0 : pas de probleme .
63 c . . . . 1 : probleme .
64 c ______________________________________________________________________
67 c 0. declarations et dimensionnement
70 c 0.1. ==> generalites
76 parameter ( nompro = 'DEHOM1' )
93 integer pilraf, pilder
94 integer hetare(nbarto)
95 integer hettri(nbtrto), aretri(nbtrto,3)
96 integer hetqua(nbquto), arequa(nbquto,4)
97 integer arehom(nbarto), homtri(nbtrto), quahom(nbquto)
98 integer decare(0:nbarto), decfac(-nbquto:nbtrto)
100 integer ulsort, langue, codret
102 c 0.4. ==> variables locales
105 integer arete1, arete2, face1, face2a, face2d, laface
107 integer etatar, etatfa
108 integer areloc, letria
109 integer nbarhd, nbarhg, nbarhr
110 integer nbtrhd, nbtrhr
111 integer nbquhd, nbquhr
112 integer option, nbento, nbaret
117 parameter (nbmess = 10 )
118 character*80 texte(nblang,nbmess)
119 c ______________________________________________________________________
127 #ifdef _DEBUG_HOMARD_
128 write (ulsort,texte(langue,1)) 'Entree', nompro
133 >'(/,7x,''Nombre de '',a,''a garder par equivalence :'',i10)'
135 >'(/,7x,''Nombre de '',a,''a decouper par equivalence :'',i10)'
137 >'(/,7x,''Nombre de '',a,''a reactiver par equivalence :'',i10)'
140 > '(/,7x,a,'' to keep due to equivalence :'',i10)'
142 > '(/,7x,a,'' to divide due to equivalence :'',i10)'
144 > '(/,7x,a,'' to reactivate due to equivalence :'',i10)'
159 c 2. dans le cas de deux aretes homologues, dont l'une est a reactiver
160 c et l'autre doit etre maintenue parce elle borde une face a couper :
161 c il faut empecher le deraffinement.
162 c cela se produit apres une suppression de conformite
164 c chiffres arabes : decision sur les faces (decfac)
165 c chiffres romains : decision sur les aretes (decare)
168 c maillage n : on derafine a gauche et on raffine a droite
169 c apres l'initialisation des decisions on en est a :
175 c -I x.......x -I I . . . I
177 c . .-1 . . . 1 . 0 .
178 c . -1 . . -1 . . . .
180 c x--------x--------x x--------x--------x
184 c maillage n apres suppression de la conformite :
190 c -I x.......x -I I . . I
195 c x--------x--------x x--------x--------x
198 c Il faut donc inhiber le -I sur l'arete homologue de gauche :
204 c -I x.......x -I I . . I
209 c x--------x--------x x--------x--------x
224 c x--------x--------x x--------x--------x
226 c il faut commencer par cette inhibition et ensuite seulement
227 c transferer arete par arete
230 if ( homolo.ge.2 ) then
232 if ( pilder.gt.0 .and. nbiter.ne.0 ) then
234 do 21, letria = 1, nbtrto
236 if ( decfac(letria).eq.4 ) then
238 do 211 , areloc = 1, 3
239 arete1 = aretri(letria,areloc)
240 arete2 = abs(arehom(arete1))
241 if ( arete2.ne.0 ) then
242 if ( decare(arete2).eq.-1 ) then
245 #ifdef _DEBUG_HOMARD_
246 write(ulsort,*) 'Gar. arete1 = ',arete1,' ==> arete2 ',arete2
261 c 3. on complete les tables de decisions pour les faces en 3D
262 c attention, il faut le faire avant les aretes pour pouvoir unifier
263 c les decisions sur toutes les aretes
266 if ( homolo.ge.3 ) then
268 do 3 , option = 2, 4, 2
270 if ( option.eq.2 ) then
278 do 30, face1 = 1 , nbento
280 if ( option.eq.2) then
282 face2a = abs(homtri(face1))
286 face2a = abs(quahom(face1))
290 if ( face2a.ne.0 ) then
292 c 3.1. ==> unification du deraffinement
294 if ( decfac(laface).eq.-1 .and. decfac(face2d).eq.0 ) then
296 c 3.1.1. ==> on controle si toutes les aretes de face2 sont a deraffiner
300 if ( option.eq.2) then
301 do 311 , areloc = 1, nbaret
302 arete(areloc) = aretri(face2a,areloc)
305 do 312 , areloc = 1, nbaret
306 arete(areloc) = arequa(face2a,areloc)
310 do 313 , areloc = 1, nbaret
311 if ( decare(arete(areloc)).gt.0 ) then
316 c 3.1.2. ==> les aretes de face2 sont toutes a deraffiner ==> on
317 c deraffine la face face2 et ses aretes
320 #ifdef _DEBUG_HOMARD_
321 write(ulsort,*) 'Der. face1 = ',laface,' ==> face2 ',face2d
324 if ( option.eq.2 ) then
330 do 314 , areloc = 1, nbaret
331 if ( decare(arete(areloc)).ne.-1 ) then
332 decare(arete(areloc)) = -1
334 #ifdef _DEBUG_HOMARD_
335 write(ulsort,*) 'Der. arete1 = ',arete(areloc)
343 c 3.2. ==> unification du raffinement
345 if ( decfac(laface).eq.4 .and. decfac(face2d).ne.4 ) then
347 if ( option.eq.2 ) then
348 etatfa = mod(hettri(face2a),10)
350 etatfa = mod(hetqua(face2a),100)
352 if ( etatfa.eq.0 ) then
354 if ( option.eq.2 ) then
359 #ifdef _DEBUG_HOMARD_
360 write(ulsort,*) 'Raf. face1 = ',laface,' ==> face2 ',face2d
364 do 321 , areloc = 1, nbaret
365 if ( option.eq.2 ) then
366 arete1 = aretri(face2a,areloc)
368 arete1 = arequa(face2a,areloc)
370 etatar = mod( hetare(arete1) , 10 )
371 if ( decare(arete1).ne.2 .and. etatar.eq.0 ) then
374 #ifdef _DEBUG_HOMARD_
375 write(ulsort,*) ' ==> Raf. arete1 = ',arete1
391 c 4. on complete les tables de decisions pour les aretes
392 c pour chaque entite qui est "a decouper" et qui possede une entite
393 c homologue, on declare "a decouper" l'entite homologue si elle ne
394 c l'est pas deja (ce qui permet d'en faire le compte)
397 if ( homolo.ge.2 ) then
399 do 41, arete1 = 1, nbarto
401 arete2 = abs(arehom(arete1))
403 if ( arete2.ne.0 ) then
405 c 4.1. ==> unification du deraffinement
406 c A condition que l'arete homologue ne soit pas grand-mere !
407 c Sinon, on inhibe le deraffinement sur la premiere
409 if ( decare(arete1).eq.-1 .and. decare(arete2).eq.0 ) then
410 etatar = mod( hetare(arete2) , 10 )
411 if ( etatar.eq.9 ) then
415 #ifdef _DEBUG_HOMARD_
416 write(ulsort,*) 'Der. arete1 = ',arete1,' ==> arete2 ',arete2
423 c 4.2. ==> unification du raffinement
425 if ( decare(arete1).eq.2 .and. decare(arete2).ne.2 ) then
426 etatar = mod( hetare(arete2) , 10 )
427 if ( etatar.eq.0 ) then
428 #ifdef _DEBUG_HOMARD_
429 write(ulsort,*) 'Raf. arete1 = ',arete1,' ==> arete2 ',arete2
445 if ( homolo.ge.2 ) then
447 if ( pilder.gt.0 ) then
448 write(ulsort,texte(langue,6)) mess14(langue,3,1), nbarhd
449 write(ulsort,texte(langue,4)) mess14(langue,3,1), nbarhg
451 if ( pilraf.gt.0 ) then
452 write(ulsort,texte(langue,5)) mess14(langue,3,1), nbarhr
457 if ( homolo.ge.3 ) then
459 if ( pilder.gt.0 ) then
460 if ( nbtrto.gt.0 ) then
461 write(ulsort,texte(langue,4)) mess14(langue,3,2), nbtrhd
463 if ( nbquto.gt.0 ) then
464 write(ulsort,texte(langue,4)) mess14(langue,3,4), nbquhd
467 if ( pilraf.gt.0 ) then
468 if ( nbtrto.gt.0 ) then
469 write(ulsort,texte(langue,5)) mess14(langue,3,2), nbtrhr
471 if ( nbquto.gt.0 ) then
472 write(ulsort,texte(langue,5)) mess14(langue,3,4), nbquhr
482 if ( codret.ne.0 ) then
486 write (ulsort,texte(langue,1)) 'Sortie', nompro
487 write (ulsort,texte(langue,2)) codret
491 #ifdef _DEBUG_HOMARD_
492 write (ulsort,texte(langue,1)) 'Sortie', nompro