1 subroutine vcmare ( areele, somare, np2are,
2 > hetare, filare, merare,
3 > coexar, arenoe, insoar,
4 > nnosho, nnosca, narsho,
5 > narsca, fameel, noeele,
6 > typele, povoso, voisom,
8 > arsref, dearef, dejavu,
10 > ulsort, langue, codret )
11 c ______________________________________________________________________
15 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
17 c Version originale enregistree le 18 juin 1996 sous le numero 96036
18 c aupres des huissiers de justice Simart et Lavoir a Clamart
19 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
20 c aupres des huissiers de justice
21 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
23 c HOMARD est une marque deposee d'Electricite de France
29 c ______________________________________________________________________
31 c aVant adaptation - Conversion de Maillage - AREtes
33 c ______________________________________________________________________
35 c but : etablit la table de connectivite des mailles par arete
36 c initialisation des tableaux lies aux aretes
37 c Si l'estimation nbar00 est trop petite, on retourne une
38 c valeur negative pour nbarto.
39 c ______________________________________________________________________
41 c . nom . e/s . taille . description .
42 c .____________________________________________________________________.
43 c . areele . s . nbelem . aretes des elements .
45 c . somare . s .2*nbar00. numeros des extremites d'arete .
46 c . np2are . s . nbar00 . noeud milieux des aretes .
47 c . hetare . s . rbar00 . historique de l'etat des aretes .
48 c . filare . s . rbar00 . premiere fille des aretes .
49 c . merare . s . rbar00 . mere des aretes .
50 c . coexar . s . nbar00*. codes externes sur les aretes .
51 c . . . nctfar . 1 : famille MED .
52 c . . . . 2 : type de segment .
53 c . arenoe . es . nbnoto . 0 pour un sommet, le numero de l'arete pour.
54 c . . . . un noeud milieu .
55 c . insoar . s . nbar00 . information sur les sommets des aretes .
56 c . . . . 0 : ses deux sommets appartiennent .
57 c . . . . exclusivement a un element soumis a .
58 c . . . . l'adaptation .
59 c . . . . -1 : son 1er sommet appartient a un element.
61 c . . . . le 2nd sommet appartient exclusivement.
62 c . . . . a un element soumis a l'adaptation .
63 c . . . . -2 : son 2nd sommet appartient a un element.
65 c . . . . le 1er sommet appartient exclusivement.
66 c . . . . a un element soumis a l'adaptation
67 c . . . . 2 : ses deux sommets appartiennent a un .
68 c . . . . element ignore .
69 c . nnosho . e . rsnoac . numero des noeuds dans HOMARD .
70 c . nnosca . e . rsnoto . numero des noeuds dans le calcul .
71 c . narsho . s . rsarac . numero des aretes dans HOMARD .
72 c . narsca . s . rbar00 . numero des aretes du calcul .
73 c . fameel . e . nbelem . famille med des elements .
74 c . noeele . e . nbelem . noeuds des elements .
76 c . typele . e . nbelem . type des elements pour le code de calcul .
77 c . povoso . e .0:nbnoto. pointeur des voisins par sommet .
78 c . voisom . e . nvosom . voisins des sommets en stockage morse .
79 c . preare . a . nbnoto . premiere arete partant d'un sommet .
80 c . arsref . e .0:tehmax. numero local de l'arete reliee a un sommet .
81 c . . . *10*3 . 1er champ : type de l'element de reference .
82 c . . . . 2e champ : numero local du sommet concerne .
83 c . . . . 3e champ : rang de l'arete envisagee .
84 c . dearef . e .0:tehmax. description des aretes par les numeros .
85 c . . . *6*3 . locaux des noeuds sans se preoccuper .
86 c . . . . d'orientation .
87 c . . . .1er champ : type de l'element de reference .
88 c . . . .2e champ : numero local de l'arete envisagee.
89 c . . . .3e champ : 1 et 2 pour chaque extremite, .
90 c . . . . 3 pour le milieu .
91 c . dejavu . a . rbar00 . controle des doublons .
92 c . trav2a . e . nbnoto . tableau de travail numero 2 .
93 c . . . . 1, pour un noeud appartenant a au moins un .
94 c . . . . element ignore
96 c . . . . Il servira dans vcmare .
97 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
98 c . langue . e . 1 . langue des messages .
99 c . . . . 1 : francais, 2 : anglais .
100 c . codret . es . 1 . code de retour des modules .
101 c . . . . 0 : pas de probleme .
102 c . . . . 2313 : maille double .
103 c . . . . 232 : noeud bizarre .
104 c ______________________________________________________________________
107 c 0. declarations et dimensionnement
110 c 0.1. ==> generalites
116 parameter ( nompro = 'VCMARE' )
141 integer areele(nbelem,nbmaae)
142 integer somare(2,nbar00)
143 integer np2are(nbar00)
144 integer nnosho(rsnoac), nnosca(rsnoto)
145 integer narsho(rsarac), narsca(rbar00)
146 integer hetare(nbar00), filare(nbar00), insoar(nbar00)
147 integer merare(nbar00)
148 integer coexar(nbar00,nctfar)
149 integer arenoe(nbnoto)
150 integer fameel(nbelem), noeele(nbelem,nbmane), typele(nbelem)
151 integer arsref(0:tehmax,10,3), dearef(0:tehmax,12,3)
152 integer voisom(nvosom), povoso(0:nbnoto), preare(nbnoto)
153 integer dejavu(nbar00)
154 integer trav2a(rsnoto)
156 integer ulsort, langue, codret
158 c 0.4. ==> variables locales
161 integer poinde, poinfi, point, nucode
162 integer mloc, n, nbas, nbnd, nloc, mglo, sommet, milieu
163 integer aloc, ar, larete, nuar, elem, typhom
164 #ifdef _DEBUG_HOMARD_
169 parameter ( nbmess = 20 )
170 character*80 texte(nblang,nbmess)
172 c 0.5. ==> initialisations
173 c ______________________________________________________________________
183 #ifdef _DEBUG_HOMARD_
184 write (ulsort,texte(langue,1)) 'Entree', nompro
188 texte(1,4) = '(/,''Les deux elements suivants sont doubles :'')'
189 texte(1,5) = '(''Numero dans le calcul : '',i10)'
190 texte(1,6) = '(''Famille MED : '',i4,'' ; type : '',i4)'
192 >'('' Ses noeuds (numerotation du calcul) : '',/,10i10)'
194 >'('' Ses noeuds (numerotation HOMARD) : '',/,10i10)'
195 texte(1,9) = '(''Le noeud'',i10,'' apparait plusieurs fois.'')'
197 >'(''. Element voisin (numero du calcul)'',i10,'' ('',a,'')'')'
198 texte(1,11) = '(''Estimation du nombre d''''aretes :'',i10)'
199 texte(1,12) = '(''Ce nombre est trop petit.'')'
201 texte(2,4) = '(/,''The following two elements are double:'')'
202 texte(2,5) = '(''# in calculation : '',i10)'
203 texte(2,6) = '(''MED family : '',i4,'' ; type : '',i4)'
205 > '('' Its nodes (with calculation #) : '',/,10i10)'
207 > '('' Its nodes (with HOMARD #) : '',/,10i10)'
208 texte(2,9) = '(''Node'',i10,'' is present several times.'')'
210 >'(''. Neighbour element (calculation #)'',i10,'' ('',a,'')'')'
211 texte(2,11) = '(''Estimation of the number of edges:'',i10)'
212 texte(2,12) = '(''This number is too low.'')'
216 c 1.2. ==> mise a zero
220 do 11 , sommet = 1 , nbnoto
225 do 12 , larete = 1 , rsarac
229 do 13 , nucode = 1 , nctfar
230 do 131 , larete = 1 , nbar00
231 coexar(larete,nucode) = 0
235 do 14 , larete = 1 , rbar00
242 c 2. on passe en revue chaque sommet
243 c remarque : l'exploration se fait dans la numerotation HOMARD
244 c ses elements voisins sont dans le tableau voisom, aux places
245 c comprises entre povoso(somm-1)+1 et povoso(somm), somm etant le
246 c numero dans le calcul correspondant au numero sommet dans
248 c remarque : si on ne tenait pas compte de certains elements, les
249 c quadrangles par exemple, cela est automatiquement traite avec
250 c les tableaux povoso/voisom.
253 #ifdef _DEBUG_HOMARD_
254 write (ulsort,90002) '2. chaque sommet ; codret', codret
257 do 21 , sommet = 1 , nbnoto
259 #ifdef _DEBUG_HOMARD_
260 if ( sommet.le.0 ) then
266 #ifdef _DEBUG_HOMARD_
267 if ( glop.ne.0 ) then
269 write (ulsort,90002) mess14(langue,2,-1), sommet
273 poinde = povoso(nnosca(sommet)-1) + 1
274 poinfi = povoso(nnosca(sommet))
276 cgn write(ulsort,90002) 'pointeur debut et fin', poinde, poinfi
278 do 22 , point = poinde , poinfi
280 c 2.1. ==> caracterisation de l'element
281 c elem : son numero global
282 c typhom : son type dans HOMARD
283 c nbnd : son nombre de noeuds
286 typhom = medtrf(typele(elem))
287 nbnd = nbnref(typhom,1)
288 #ifdef _DEBUG_HOMARD_
289 if ( glop.ne.0 ) then
290 iaux = typhom + mod(typhom,2)
292 write (ulsort,texte(langue,10)) elem, mess14(langue,1,iaux)
293 write (ulsort,texte(langue,7)) (noeele(elem,n),n=1,nbnd)
294 write (ulsort,texte(langue,8)) (nnosho(noeele(elem,n)),n=1,nbnd)
298 c 2.2. ==> recherche de nloc, numero local du sommet en cours d'examen
299 c vis-a-vis de la description de l'element de reference
301 do 221 , n = 1 , nbnd
302 if ( sommet.eq.nnosho(noeele(elem,n)) ) then
308 #ifdef _DEBUG_HOMARD_
309 if ( glop.ne.0 ) then
310 write(*,*) '. pour no =',sommet, ', nloc =',nloc
314 c 2.3. ==> on explore toutes les aretes qui partent de ce sommet de
316 c nbas : le nombre d'aretes qui partent de chaque sommet
317 c aloc : numero local de la a-eme arete envisagee
318 c mloc : numero local de l'autre extremite
319 c mglo : numero global de l'autre extremite, dans la
320 c numerotation homard
322 nbas = nasref(typhom)
323 c ATTENTION : verrue pour le dernier noeud de la pyramide
325 if ( typhom.eq.tyhpy1 .or. typhom.eq.tyhpy2 ) then
326 if ( nloc.eq.5 ) then
331 do 223 , iaux = 1 , nbas
333 aloc = arsref(typhom,nloc,iaux)
334 #ifdef _DEBUG_HOMARD_
335 if ( glop.ne.0 ) then
336 write(*,*) '.. iaux =',iaux,', aloc =',aloc
339 if ( dearef(typhom,aloc,1).eq.nloc ) then
340 mloc = dearef(typhom,aloc,2)
342 mloc = dearef(typhom,aloc,1)
344 mglo = nnosho(noeele(elem,mloc))
345 #ifdef _DEBUG_HOMARD_
346 if ( glop.ne.0 ) then
347 write(*,*) '.. mglo =',mglo
351 c 2.3.1. ==> . si la seconde extremite a un numero global plus grand que
352 c le sommet en cours d'examen, il faut chercher si l'arete
353 c de sommet vers somm2 a deja ete cree.
354 c la recherche de cette arete ne se fait pas parmi toutes les
355 c aretes deja creees, mais seulement parmi celles qui partent
356 c du sommet en cours. la premiere d'entre elles, si elle
357 c existe, est numerotee nuar=preare(sommet). Ce sont les
358 c dernieres aretes qui viennent d'etre creees, donc la
359 c recherche est rapide car elle ne porte que sur quelques
360 c aretes : au pire toutes celles partant du sommet en cours.
361 c . si la seconde extremite a un numero global egal a celui
362 c du sommet en cours d'examen, c'est qu'il y a un probleme
363 c dans le maillage de depart.
364 c . si la seconde extremite a un numero global plus petit que
365 c le sommet en cours d'examen, rien n'est a faire, car le
366 c traitement a deja ete fait lors de l'exploration de mglo.
368 if ( sommet.lt.mglo ) then
370 c 2.3.1.1. ==> recherche d'une eventuelle arete qui aurait deja ete
371 c creee entre sommet et mglo
374 nuar = preare(sommet)
375 if ( nuar.ne.0 ) then
376 do 2231 , ar = nuar , nbarto
377 if ( somare(2,ar).eq.mglo ) then
385 c 2.3.1.2. ==> Lorsque l'arete n'a pas ete trouvee, il faut la creer ;
386 c . elle est definie par ses deux extremites ;
387 c . on memorise le noeud milieu si on est en degre 2 ;
388 c . si l'arete n'est pas un element au sens du code de
389 c calcul, la caracteristique est nulle et il n'y a pas
390 c de probleme pour la renumerotation.
391 c Si aucune arete ne partait deja du sommet, on la
392 c memorise dans preare
393 c remarque : il ne faut pas oublier de tenir compte d'une
394 c eventuelle renumerotation des noeuds ; c'est fait
395 c auparavant pour les deux extremites, sommet et mglo, et
396 c il faut le faire pour le milieu eventuel.
398 if ( larete.eq.0 ) then
400 if ( nbarto.gt.nbar00 ) then
405 somare(1,larete) = sommet
406 somare(2,larete) = mglo
407 #ifdef _DEBUG_HOMARD_
408 if ( glop.ne.0 ) then
409 write(*,*) '... Creation de l''arete de ', sommet,' a ',mglo
410 write(*,*) '... Elle a pour numero',larete
413 if ( degre.eq.2 ) then
414 milieu = nnosho(noeele(elem,dearef(typhom,aloc,3)))
415 #ifdef _DEBUG_HOMARD_
416 if ( glop.ne.0 ) then
417 write(*,*) '... Noeud milieu',milieu
420 np2are(larete) = milieu
421 arenoe(milieu) = larete
423 if ( typhom.ne.tyhse1 .and. typhom.ne.tyhse2 ) then
424 coexar(larete,cofamd) = 0
425 coexar(larete,cotyel) = 0
426 if ( rbar00.ne.0 ) then
430 if ( preare(sommet).eq.0 ) then
431 preare(sommet) = larete
435 c 2.3.1.3. ==> si l'arete est un element au sens du calcul, il faut
436 c se souvenir de son type (linear beam, tapered beam, ...)
437 c et de sa famille MED.
438 c attention : il faut se poser la question a chaque fois,
439 c car l'arete a pu etre definie auparavant comme un cote
440 c de face et donc aura ete mise avec des caracteristiques
442 c en revanche, si on y est deja passe pour un autre
443 c element, il y a malaise : c'est un element double !
445 if ( typhom.eq.tyhse1 .or. typhom.eq.tyhse2 ) then
447 if ( dejavu(larete).ne.0 .and.
448 > dejavu(larete).ne.elem ) then
450 write(ulsort,texte(langue,4))
451 write(ulsort,texte(langue,5)) elem
452 write(ulsort,texte(langue,6)) fameel(elem),
454 write(ulsort,texte(langue,7))
455 > (noeele(elem,n),n=1,nbnd)
456 write(ulsort,texte(langue,8))
457 > (nnosho(noeele(elem,n)),n=1,nbnd)
458 write(ulsort,texte(langue,5)) dejavu(larete)
459 write(ulsort,texte(langue,6)) fameel(dejavu(larete)),
460 > typele(dejavu(larete))
461 write(ulsort,texte(langue,8))
462 > (noeele(dejavu(larete),n),n=1,nbnd)
463 write(ulsort,texte(langue,7))
464 > (nnosho(noeele(dejavu(larete),n)),n=1,nbnd)
469 coexar(larete,cofamd) = fameel(elem)
470 coexar(larete,cotyel) = typele(elem)
471 narsho(elem) = larete
472 narsca(larete) = elem
473 dejavu(larete) = elem
479 c 2.3.1.4. ==> on stocke le numero de l'arete dans la connectivite
480 c descendante de l'element
482 ccc write(*,*) 'elem =',elem,', aloc =',aloc,', larete =',larete
483 areele(elem,aloc) = larete
485 c 2.3.2. ==> probleme car le noeud apparait plusieurs fois
487 elseif ( sommet.eq.mglo ) then
489 write (ulsort,90002) mess14(langue,2,13), elem
490 write(ulsort,texte(langue,9)) sommet
491 write(ulsort,texte(langue,7)) (noeele(elem,n),n=1,nbnd)
492 write(ulsort,texte(langue,7))
493 > (nnosho(noeele(elem,n)),n=1,nbnd)
511 #ifdef _DEBUG_HOMARD_
512 write (ulsort,90002) '3. consequences ; codret', codret
515 if ( codret.eq.0 ) then
517 #ifdef _DEBUG_HOMARD_
518 write (ulsort,90002) 'nbarto', nbarto
521 c 3.1. ==> initialisations :
523 c . on suppose que l'on part d'un macro-maillage
524 c . la premiere caracteristique a ete initialisee, les autres sont
527 c . il n'y a ni fille, ni mere
539 do 32 , larete = 1 , nbarto
545 c 3.2. ==> nombres propres a la renumerotation des aretes
547 if ( rbar00 .ne. 0 ) then
556 c 4. Quand des elements sont ignores :
557 c informations supplementaires sur les aretes
558 c 2 : ses deux sommets appartiennent a un element ignore
559 c -1 : son 1er sommet appartient a un element ignore
560 c le 2nd appartient exclusivement a un element soumis
562 c -2 : son 2nd sommet appartient a un element ignore
563 c le 1er appartient exclusivement a un element soumis
565 c 0 : ses deux sommets appartiennent exclusivement a un
566 c element soumis a l'adaptation
568 #ifdef _DEBUG_HOMARD_
569 write (ulsort,90002) '4. ignores ; codret', codret
572 if ( codret.eq.0 ) then
574 if ( nbelig.ne.0 ) then
576 do 41 , larete = 1 , nbarto
578 if ( trav2a(nnosca(somare(1,larete))).eq.1 ) then
579 if ( trav2a(nnosca(somare(2,larete))).eq.1 ) then
584 elseif ( trav2a(nnosca(somare(2,larete))).eq.1 ) then
589 cgn print 1789,larete,nnosca(somare(1,larete)),
590 cgn > nnosca(somare(2,larete)),insoar(larete)
599 #ifdef _DEBUG_HOMARD_
600 if ( nbarto.lt.0 ) then
601 write (ulsort,texte(langue,11)) nbar00
602 write (ulsort,texte(langue,12))
610 if ( codret.ne.0 ) then
614 write (ulsort,texte(langue,1)) 'Sortie', nompro
615 write (ulsort,texte(langue,2)) codret
619 #ifdef _DEBUG_HOMARD_
620 write (ulsort,texte(langue,1)) 'Sortie', nompro