1 subroutine vcorie ( eleinc, noeele, areele, typele,
2 > somare, aretri, arequa,
3 > nnosho, narsho, ntrsho, nqusho,
5 > tritet, cotrte, ntesho,
6 > quahex, coquhe, nhesho,
7 > facpen, cofape, npesho,
8 > facpyr, cofapy, npysho,
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 aVant adaptation - Conversion - ORIEntation
32 c ______________________________________________________________________
34 c . nom . e/s . taille . description .
35 c ______________________________________________________________________
36 c . eleinc . e . 1 . elements incompatibles .
37 c . . . . 0 : on bloque s'il y en a .
38 c . . . . 1 : on les ignore s'il y en a .
39 c . noeele . e . nbelem . noeuds des elements .
41 c . areele . e . nbelem . aretes des elements .
43 c . typele . e . nbelem . type des elements pour le code de calcul .
44 c . somare . e .2*nbarto. numeros des extremites d'arete .
45 c . aretri . es .nbtrto*3. numeros des 3 aretes des triangles .
46 c . arequa . es .nbquto*4. numeros des 4 aretes des quadrangles .
47 c . nnosho . e . rsnoac . numero des noeuds dans HOMARD .
48 c . narsho . e . rsarac . numero des aretes dans HOMARD .
49 c . ntrsho . e . rstrac . numero des triangles dans HOMARD .
50 c . nqusho . e . rsquac . numero des quadrangles dans HOMARD .
51 c . coexar . es . nbarto*. codes de conditions aux limites portants .
52 c . . . nctfar . sur les aretes .
53 c . tritet . e .nbtecf*4. numeros des 4 triangles des tetraedres .
54 c . cotrte . s .nbtecf*4. code des 4 triangles des tetraedres .
55 c . ntesho . e . rsteac . numero des tetraedres dans HOMARD .
56 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
57 c . coquhe . s .nbhecf*6. codes des 6 quadrangles des hexaedres .
58 c . nhesho . e . rsheac . numero des hexaedres dans HOMARD .
59 c . facpen . e .nbpecf*5. numeros des 5 faces des pentaedres .
60 c . cofape . s .nbpecf*5. codes des 5 faces des pentaedres .
61 c . npesho . e . rspeac . numero des pentaedres dans HOMARD .
62 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
63 c . cofapy . s .nbpycf*5. codes des faces des pyramides .
64 c . npyrho . e . repyac . numero des pyramides dans HOMARD .
65 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
66 c . langue . e . 1 . langue des messages .
67 c . . . . 1 : francais, 2 : anglais .
68 c . codret . es . 1 . code de retour des modules .
69 c . . . . 0 : pas de probleme .
70 c . . . . 1 : probleme .
71 c ______________________________________________________________________
74 c 0. declarations et dimensionnement
77 c 0.1. ==> generalites
83 parameter ( nompro = 'VCORIE' )
111 integer noeele(nbelem,nbmane)
112 integer areele(nbelem,nbmaae)
113 integer typele(nbelem)
114 integer somare(2,nbarto), aretri(nbtrto,3)
115 integer arequa(nbquto,4)
116 integer nnosho(rsnoac), narsho(rsarac)
117 integer ntrsho(rstrac), nqusho(rsquac)
118 integer coexar(nbarto,nctfar)
119 integer tritet(nbtecf,4), cotrte(nbtecf,4)
120 integer ntesho(rsteac)
121 integer quahex(nbhecf,6), coquhe(nbhecf,6)
122 integer nhesho(rsheac)
123 integer facpen(nbpecf,5), cofape(nbpecf,5)
124 integer npesho(rspeac)
125 integer facpyr(nbpycf,5), cofapy(nbpycf,5)
126 integer npysho(rspyac)
128 integer ulsort, langue, codret
130 c 0.4. ==> variables locales
133 integer elemen, typhom
135 integer letria, lequad
136 integer letetr, lehexa, lepent, lapyra
138 integer sa1a2, sa1a3, sa1a4, sa2a3, sa3a4
139 integer a1, a2, a3, a4
142 #ifdef _DEBUG_HOMARD_
147 parameter ( nbmess = 10 )
148 character*80 texte(nblang,nbmess)
150 c 0.5. ==> initialisations
151 c ______________________________________________________________________
159 #ifdef _DEBUG_HOMARD_
160 write (ulsort,texte(langue,1)) 'Entree', nompro
164 texte(1,4) = '(''Element'',i10,'', de type HOMARD'',i4)'
166 > '(4x,''==> '',a,i10,'', face de numero local'',i2,'' :'')'
167 texte(1,7) = '(''Impossible de trouver le code'')'
169 texte(2,4) = '(''Element'',i10,'', with HOMARD type'',i4)'
170 texte(2,5) = '(4x,''==> '',a,i10,'', local face position'',i2)'
171 texte(2,7) = '(''Code cannot be found'')'
176 c 2. determination de l'orientation des aretes, des triangles et
180 do 20 , elemen = 1 , nbelem
182 typhom = medtrf(typele(elemen))
184 #ifdef _DEBUG_HOMARD_
185 if ( elemen.eq.-12 ) then
191 #ifdef _DEBUG_HOMARD_
192 if ( glop.ne.0 ) then
193 write (ulsort,texte(langue,4)) elemen, typhom
197 c 2.1. ==> on saute si c'est un element incompatible avec le mode
198 c d'utilisation de HOMARD
200 if ( eleinc.ne.0 ) then
201 if ( tyeref(typhom).ne.0 ) then
206 c 2.2. ==> les aretes
208 c code de calcul : x--------x HOMARD : x---------x
211 if ( typhom.eq.tyhse1 .or. typhom.eq.tyhse2 ) then
212 #ifdef _DEBUG_HOMARD_
213 if ( glop.ne.0 ) then
214 write (ulsort,90002) mess14(langue,1,1), narsho(elemen)
218 c s1 = numero dans HOMARD du 1er noeud de l'element dans MED
220 s1 = nnosho(noeele(elemen,1))
222 c iaux = numero dans HOMARD du 1er noeud de l'arete
223 c narsho(elemen) correspondant a l'element elemen dans MED
225 iaux = somare(1,narsho(elemen))
227 if ( iaux.eq.s1 ) then
233 coexar(narsho(elemen),coorfa) = orient
235 c 2.3. ==> les triangles
236 c en fonction du positionnement relatif des noeuds, on a une valeur
238 c il y a 6 possibilites :
239 c . la valeur absolue est le numero local MED du sommet en face
241 c . on note positif quand la description par
242 c aretes (HOMARD) tourne dans le meme sens que la description
243 c par noeuds (MED), negatif pour le sens inverse :
248 c a2/ 1 \a1 a1/ 2 \a3 a3/ 3 \a2
250 c /________\ /________\ /________\
251 c s1 a3 s2 s1 a2 s2 s1 a1 s2
256 c a3/ -1 \a1 a1/ -2 \a2 a2/ -3 \a3
258 c /________\ /________\ /________\
259 c s1 a2 s2 s1 a3 s2 s1 a1 s2
261 c on va modifier la description du triangle pour faire coincider
262 c les numero si et les sommets des aretes ai, saiaj :
266 c MED : / \ HOMARD : a3/ \a2
269 c s1 s2 sa1a3 a1 sa1a2
271 elseif ( typhom.eq.tyhtr1 .or. typhom.eq.tyhtr2 ) then
272 #ifdef _DEBUG_HOMARD_
273 if ( glop.ne.0 ) then
274 write (ulsort,90002) mess14(langue,1,2), ntrsho(elemen)
278 c numeros dans HOMARD du 1er et 2eme noeud
279 c de l'element elemen dans MED
281 s1 = nnosho(noeele(elemen,1))
282 s2 = nnosho(noeele(elemen,2))
284 c ak = numero dans HOMARD de la k-eme arete
285 c du triangle ntrsho(elemen) correspondant a l'element elemen
287 c sajak = numero dans HOMARD du noeud
288 c commun aux aretes aj et ak
290 a1 = aretri(ntrsho(elemen),1)
291 a2 = aretri(ntrsho(elemen),2)
292 a3 = aretri(ntrsho(elemen),3)
294 if ( somare(1,a1) .eq. somare(1,a3) .or.
295 > somare(1,a1) .eq. somare(2,a3) ) then
296 c le 1er noeud de l'arete 1 est un des sommets de a3 ;
297 c donc le 2nd noeud de l'arete 1 est un des sommets de a2
301 c le 1er noeud de l'arete 1 n'est pas un des sommets de a3 ;
302 c donc c'est qu'il est un des sommets de a2
303 c donc le 2nd noeud de l'arete 1 est un des sommets de a3
308 c comparaison des deux numerotations
310 if ( s1 .eq. sa1a3 ) then
311 if ( s2 .eq. sa1a2 ) then
313 aretri(ntrsho(elemen),1) = a2
314 aretri(ntrsho(elemen),2) = a3
315 aretri(ntrsho(elemen),3) = a1
318 aretri(ntrsho(elemen),1) = a2
319 aretri(ntrsho(elemen),2) = a1
320 aretri(ntrsho(elemen),3) = a3
322 elseif ( s1 .eq. sa1a2 ) then
323 if ( s2 .eq. sa1a3 ) then
325 aretri(ntrsho(elemen),1) = a3
326 aretri(ntrsho(elemen),3) = a1
329 aretri(ntrsho(elemen),1) = a3
330 aretri(ntrsho(elemen),2) = a1
331 aretri(ntrsho(elemen),3) = a2
334 c on a alors s1 .eq. sa2a3
335 if ( s2 .ne. sa1a3 ) then
337 aretri(ntrsho(elemen),2) = a3
338 aretri(ntrsho(elemen),3) = a2
344 c 2.4. ==> les quadrangles
345 c en fonction du positionnement relatif des noeuds, on a une valeur
347 c il y a 8 possibilites :
348 c . on note positif quand la description par
349 c aretes (HOMARD) tourne dans le meme sens que la description
350 c par noeuds (MED), negatif pour le sens inverse
351 c . la valeur absolue est le numero local MED du sommet commun
352 c aux aretes a1 et a4 si >0, a1 et a2 si <0
354 c remarque : entre deux orientations de signes opposes,
355 c les aretes 1 et 3 sont a la meme place et
356 c les aretes 2 et 4 sont permutees.
359 c s1 a4 s4 s1 a3 s4 s1 a2 s4 s1 a1 s4
360 c .________. .________. .________. .________.
363 c a1. 1 .a3 a4. 2 .a2 a3. 3 .a1 a2. 4 .a4
365 c .________. .________. .________. .________.
366 c s2 a2 s3 s2 a1 s3 s2 a4 s3 s2 a3 s3
370 c s1 a2 s4 s1 a3 s4 s1 a4 s4 s1 a1 s4
371 c .________. .________. .________. .________.
374 c a1. -1 .a3 a2. -2 .a4 a3. -3 .a1 a4. -4 .a2
376 c .________. .________. .________. .________.
377 c s2 a4 s3 s2 a1 s3 s2 a2 s3 s2 a3 s3
379 c on va modifier la description du quadrangle pour faire coincider
380 c les numero si et les sommets des aretes ai, saiaj :
383 c s1 s4 sa4a1 a4 sa3a4
384 c .________. .________.
387 c MED : . . HOMARD : a1. .a3
389 c .________. .________.
390 c s2 s3 sa1a2 a2 sa2a3
393 elseif ( typhom.eq.tyhqu1 .or. typhom.eq.tyhqu2 ) then
394 #ifdef _DEBUG_HOMARD_
395 if ( glop.ne.0 ) then
396 write (ulsort,90002) mess14(langue,1,4), nqusho(elemen)
400 c numeros dans HOMARD du 1er et 2eme noeud
401 c de l'element elemen dans MED
403 s1 = nnosho(noeele(elemen,1))
404 s2 = nnosho(noeele(elemen,2))
406 c ak = numero dans HOMARD de la k-eme arete
407 c du quadrangle nqusho(elemen) correspondant a l'element elemen
409 c sajak = numero dans HOMARD du noeud
410 c commun aux aretes aj et ak
412 c on commence par regarder si le sommet s1 est une extremite de
415 a1 = arequa(nqusho(elemen),1)
416 a2 = arequa(nqusho(elemen),2)
417 a3 = arequa(nqusho(elemen),3)
418 a4 = arequa(nqusho(elemen),4)
420 if ( somare(1,a1) .eq. somare(1,a2) .or.
421 > somare(1,a1) .eq. somare(2,a2) ) then
422 c le 1er noeud de l'arete 1 est un des sommets de a2 ;
423 c donc le 2nd noeud de l'arete 1 est un des sommets de a4
427 c le 1er noeud de l'arete 1 n'est pas un des sommets de a2 ;
428 c donc c'est qu'il est un des sommets de a4
429 c donc le 2nd noeud de l'arete 1 est un des sommets de a2
434 if ( s1 .eq. sa1a4 ) then
435 if ( s2 .ne. sa1a2 ) then
437 arequa(nqusho(elemen),1) = a4
438 arequa(nqusho(elemen),2) = a3
439 arequa(nqusho(elemen),3) = a2
440 arequa(nqusho(elemen),4) = a1
444 elseif ( s1 .eq. sa1a2 ) then
445 if ( s2 .eq. sa1a4 ) then
447 arequa(nqusho(elemen),2) = a4
448 arequa(nqusho(elemen),4) = a2
451 arequa(nqusho(elemen),1) = a2
452 arequa(nqusho(elemen),2) = a3
453 arequa(nqusho(elemen),3) = a4
454 arequa(nqusho(elemen),4) = a1
459 c le sommet s1 n'est pas une extremite de l'arete a1
460 c il est donc un sommet de a3. on precise comment
462 if ( somare(1,a3) .eq. somare(1,a2) .or.
463 > somare(1,a3) .eq. somare(2,a2) ) then
464 c le 1er noeud de l'arete 3 est un des sommets de a2 ;
465 c donc le 2nd noeud de l'arete 3 est un des sommets de a4
469 c le 1er noeud de l'arete 3 n'est pas un des sommets de a2 ;
470 c donc c'est qu'il est un des sommets de a4
471 c donc le 2nd noeud de l'arete 3 est un des sommets de a2
476 if ( s1 .eq. sa3a4 ) then
477 if ( s2 .eq. sa2a3 ) then
479 arequa(nqusho(elemen),1) = a3
480 arequa(nqusho(elemen),3) = a1
483 arequa(nqusho(elemen),1) = a4
484 arequa(nqusho(elemen),2) = a1
485 arequa(nqusho(elemen),3) = a2
486 arequa(nqusho(elemen),4) = a3
489 if ( s2 .eq. sa3a4 ) then
491 arequa(nqusho(elemen),1) = a3
492 arequa(nqusho(elemen),2) = a4
493 arequa(nqusho(elemen),3) = a1
494 arequa(nqusho(elemen),4) = a2
497 arequa(nqusho(elemen),1) = a2
498 arequa(nqusho(elemen),2) = a1
499 arequa(nqusho(elemen),3) = a4
500 arequa(nqusho(elemen),4) = a3
505 cgn print *,elemen,nnosho(noeele(elemen,1)),
506 cgn > nnosho(noeele(elemen,2)),
507 cgn > nnosho(noeele(elemen,3)),
508 cgn > nnosho(noeele(elemen,4))
509 cgn print *,nqusho(elemen),arequa(nqusho(elemen),1),
510 cgn > arequa(nqusho(elemen),2),
511 cgn > arequa(nqusho(elemen),3),
512 cgn > arequa(nqusho(elemen),4)
520 c 3. determination des codes des faces dans les volumes
523 do 30 , elemen = 1 , nbelem
525 typhom = medtrf(typele(elemen))
527 #ifdef _DEBUG_HOMARD_
528 if ( elemen.ge.-12 ) then
534 #ifdef _DEBUG_HOMARD_
535 if ( glop.ne.0 ) then
536 write (ulsort,texte(langue,4)) elemen, typhom
540 c 3.1. ==> on saute si c'est un element incompatible avec le mode
541 c d'utilisation de HOMARD
543 if ( eleinc.ne.0 ) then
544 if ( tyeref(typhom).ne.0 ) then
549 c 3.2. ==> les tetraedres
551 if ( typhom.eq.tyhte1 .or. typhom.eq.tyhte2 ) then
553 letetr = ntesho(elemen)
555 #ifdef _DEBUG_HOMARD_
556 if ( glop.ne.0 ) then
558 write (ulsort,90002) mess14(langue,2,3), letetr
559 write (ulsort,90002) mess14(langue,3,1),
560 > (areele(elemen,iaux),iaux=1,6)
564 do 321 , iaux = 1 , 4
567 letria = tritet(letetr,numfac)
569 #ifdef _DEBUG_HOMARD_
570 write (ulsort,texte(langue,3)) 'VCORI1', nompro
572 call vcori1 ( elemen, typhom, numfac, letria,
575 > ulsort, langue, codret )
576 if ( codret.eq.0 ) then
577 cotrte(letetr,numfac) = code
582 c 3.3. ==> les hexaedres
584 elseif ( typhom.eq.tyhhe1 .or. typhom.eq.tyhhe2 ) then
586 lehexa = nhesho(elemen)
588 #ifdef _DEBUG_HOMARD_
589 if ( glop.ne.0 ) then
591 write (ulsort,90002) mess14(langue,2,6), lehexa
592 write (ulsort,90002) mess14(langue,3,1),
593 > (areele(elemen,iaux),iaux=1,6)
594 write (ulsort,90002) mess14(langue,3,1),
595 > (areele(elemen,iaux),iaux=7,12)
599 do 331 , iaux = 1 , 6
602 lequad = quahex(lehexa,numfac)
604 #ifdef _DEBUG_HOMARD_
605 write (ulsort,texte(langue,3)) 'VCORI2', nompro
607 call vcori2 ( elemen, typhom, numfac, lequad,
610 > ulsort, langue, codret )
611 if ( codret.eq.0 ) then
612 coquhe(lehexa,numfac) = code
617 c 3.4. ==> les pentaedres
619 elseif ( typhom.eq.tyhpe1 .or. typhom.eq.tyhpe2 ) then
621 lepent = npesho(elemen)
623 #ifdef _DEBUG_HOMARD_
624 if ( glop.ne.0 ) then
626 write (ulsort,90002) mess14(langue,2,7), lepent
627 write (ulsort,90002) mess14(langue,3,1),
628 > (areele(elemen,iaux),iaux=1,9)
632 do 341 , iaux = 1 , 2
635 letria = facpen(lepent,numfac)
637 #ifdef _DEBUG_HOMARD_
638 write (ulsort,texte(langue,3)) 'VCORI1', nompro
640 call vcori1 ( elemen, typhom, numfac, letria,
643 > ulsort, langue, codret )
644 if ( codret.eq.0 ) then
645 cofape(lepent,iaux) = code
650 do 344 , iaux = 3 , 5
653 lequad = facpen(lepent,numfac)
655 #ifdef _DEBUG_HOMARD_
656 write (ulsort,texte(langue,3)) 'VCORI2', nompro
658 call vcori2 ( elemen, typhom, numfac, lequad,
661 > ulsort, langue, codret )
662 if ( codret.eq.0 ) then
663 cofape(lepent,numfac) = code
668 c 3.5. ==> les pyramides
670 elseif ( typhom.eq.tyhpy1 .or. typhom.eq.tyhpy2 ) then
672 lapyra = npysho(elemen)
674 #ifdef _DEBUG_HOMARD_
675 if ( glop.ne.0 ) then
677 write (ulsort,90002) mess14(langue,2,5), lapyra
678 write (ulsort,90002) mess14(langue,3,1),
679 > (areele(elemen,iaux),iaux=1,8)
683 do 351 , iaux = 1 , 4
686 letria = facpyr(lapyra,numfac)
688 #ifdef _DEBUG_HOMARD_
689 write (ulsort,texte(langue,3)) 'VCORI1', nompro
691 call vcori1 ( elemen, typhom, numfac, letria,
694 > ulsort, langue, codret )
695 if ( codret.eq.0 ) then
696 cofapy(lapyra,numfac) = code
702 lequad = facpyr(lapyra,numfac)
704 #ifdef _DEBUG_HOMARD_
705 write (ulsort,texte(langue,3)) 'VCORI2', nompro
707 call vcori2 ( elemen, typhom, numfac, lequad,
710 > ulsort, langue, codret )
711 if ( codret.eq.0 ) then
712 cofapy(lapyra,numfac) = code
723 if ( codret.ne.0 ) then
727 write (ulsort,texte(langue,1)) 'Sortie', nompro
728 write (ulsort,texte(langue,2)) codret
731 #ifdef _DEBUG_HOMARD_
732 write (ulsort,texte(langue,1)) 'Sortie', nompro