1 subroutine deisv2 ( ncmpin, usacmp,
2 > tesupp, teindi, teinin,
3 > hesupp, heindi, heinin,
4 > pysupp, pyindi, pyinin,
5 > pesupp, peindi, peinin,
7 > hetqua, filqua, perqua,
8 > tritet, pertet, pthepe,
9 > quahex, hethex, filhex, perhex, fhpyte,
14 > ulsort, langue, codret)
15 c ______________________________________________________________________
19 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
21 c Version originale enregistree le 18 juin 1996 sous le numero 96036
22 c aupres des huissiers de justice Simart et Lavoir a Clamart
23 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
24 c aupres des huissiers de justice
25 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
27 c HOMARD est une marque deposee d'Electricite de France
33 c ______________________________________________________________________
35 c traitement des DEcisions - Initialisations - par Saut - Volumes - 2
37 c attention : on ne traite pas les cas non-conformes
38 c ______________________________________________________________________
40 c . nom . e/s . taille . description .
41 c .____________________________________________________________________.
42 c . ncmpin . e . 1 . nombre de composantes de l'indicateur .
43 c . usacmp . e . 1 . usage des composantes de l'indicateur .
44 c . . . . 0 : norme L2 .
45 c . . . . 1 : norme infinie -max des valeurs absolues.
46 c . . . . 2 : valeur relative si une seule composante.
47 c . tesupp . e . nbteto . support pour les tetraedres .
48 c . teindi . es . nbteto . valeurs pour les tetraedres .
49 c . teinin . e . nbteto . valeurs initiales pour les tetraedres .
50 c . hesupp . e . nbheto . support pour les hexaedres .
51 c . heindi . es . nbheto . valeurs pour les hexaedres .
52 c . heinin . e . nbheto . valeurs initiales pour les hexaedres .
53 c . pysupp . e . nbpyto . support pour les pyramides .
54 c . pyindi . es . nbpyto . valeurs pour les pyramides .
55 c . pyinin . e . nbpyto . valeurs initiales pour les pyramides .
56 c . pesupp . e . nbpeto . support pour les pentaedres .
57 c . peindi . es . nbpeto . valeurs pour les pentaedres .
58 c . peinin . e . nbpeto . valeurs initiales pour les pentaedres .
59 c . hettri . e . nbtrto . historique de l'etat des triangles .
60 c . pertri . e . nbtrto . pere des triangles .
61 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
62 c . filqua . e . nbquto . fils des quadrangles .
63 c . perqua . e . nbquto . pere des quadrangles .
64 c . tritet . e .nbtecf*4. numeros des triangles des tetraedres .
65 c . pertet . e . nbteto . pere des tetraedres .
66 c . . . . si pertet(i) > 0 : numero du tetraedre .
67 c . . . . si pertet(i) < 0 : -numero dans pthepe .
68 c . pthepe . e . * . si i <= nbheco : numero de l'hexaedre .
69 c . . . . si non : numero du pentaedre .
70 c . hethex . e . nbheto . historique de l'etat des hexaedres .
71 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
72 c . filhex . e . nbheto . premier fils des hexaedres .
73 c . perhex . e . nbheto . pere des hexaedres .
74 c . fhpyte . e .2*nbheco. fhpyte(1,j) = numero de la 1ere pyramide .
75 c . . . . fille de l'hexaedre k tel que filhex(k) =-j.
76 c . . . . fhpyte(2,j) = numero du 1er tetraedre .
77 c . . . . fils de l'hexaedre k tel que filhex(k) = -j.
78 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
79 c . facpen . e .nbpecf*5. numeros des 5 faces des pyramides .
80 c . voltri . es .2*nbtrto. numeros des 2 volumes par triangle .
81 c . . . . voltri(i,k) definit le i-eme voisin de k .
82 c . . . . 0 : pas de voisin .
83 c . . . . j>0 : tetraedre j .
84 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
85 c . pypetr . e .2*lgpype. pypetr(1,j) = numero de la pyramide voisine.
86 c . . . . du triangle k tel que voltri(1/2,k) = -j .
87 c . . . . pypetr(2,j) = numero du pentaedre voisin .
88 c . . . . du triangle k tel que voltri(1/2,k) = -j .
89 c . volqua . e .2*nbquto. numeros des 2 volumes par quadrangle .
90 c . . . . volqua(i,k) definit le i-eme voisin de k .
91 c . . . . 0 : pas de voisin .
92 c . . . . j>0 : hexaedre j .
93 c . . . . j<0 : pyramide/pentaedre dans pypequ(1/2,j).
94 c . pypequ . e .2*lgpype. pypequ(1,j) = numero de la pyramide voisine.
95 c . . . . du quadrangle k tel que volqua(1/2,k) = -j .
96 c . . . . pypequ(2,j) = numero du pentaedre voisin .
97 c . . . . du quadrangle k tel que volqua(1/2,k) = -j .
98 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
99 c . langue . e . 1 . langue des messages .
100 c . . . . 1 : francais, 2 : anglais .
101 c . codret . es . 1 . code de retour des modules .
102 c . . . . 0 : pas de probleme .
103 c . . . . 2 : probleme dans le traitement .
104 c ______________________________________________________________________
107 c 0. declarations et dimensionnement
110 c 0.1. ==> generalites
116 parameter ( nompro = 'DEISV2' )
121 parameter( lgdaux = 500 )
139 integer tesupp(nbteto)
140 integer hesupp(nbheto)
141 integer pysupp(nbpyto)
142 integer pesupp(nbpeto)
143 integer hettri(nbtrto), pertri(nbtrto)
144 integer hetqua(nbquto), filqua(nbquto), perqua(nbquto)
145 integer tritet(nbtecf,4)
146 integer pertet(nbteto), pthepe(*)
147 integer quahex(nbhecf,6)
148 integer hethex(nbheto), filhex(nbheto), perhex(nbheto)
149 integer fhpyte(2,nbheco)
150 integer facpyr(nbpycf,5)
151 integer facpen(nbpecf,5)
152 integer voltri(2,nbtrto), pypetr(2,*)
153 integer volqua(2,nbquto), pypequ(2,*)
155 integer ulsort, langue, codret
157 double precision teindi(nbteto,ncmpin), teinin(nbteto,ncmpin)
158 double precision heindi(nbheto,ncmpin), heinin(nbheto,ncmpin)
159 double precision pyindi(nbpyto,ncmpin), pyinin(nbpyto,ncmpin)
160 double precision peindi(nbpeto,ncmpin), peinin(nbpeto,ncmpin)
162 c 0.4. ==> variables locales
164 integer iaux, jaux, kaux
165 integer laface, typfac
166 integer lamail, typenh
168 double precision valaux(lgdaux)
170 integer nbfite, nbvote, voiste(lgdaux)
171 integer nbfihe, nbvohe, voishe(lgdaux)
172 integer nbfipy, nbvopy, voispy(lgdaux)
173 integer nbfipe, nbvope, voispe(lgdaux)
176 parameter (nbmess = 10 )
177 character*80 texte(nblang,nbmess)
178 c ______________________________________________________________________
184 c 1.1. ==> Les messages
188 #ifdef _DEBUG_HOMARD_
189 write (ulsort,texte(langue,1)) 'Entree', nompro
193 texte(1,4) = '(''. Saut a la traversee des faces'')'
195 > '(''On veut'',i6,'' composantes, mais taille de daux ='',i6)'
196 texte(1,6) = '(''. Examen du '',a,i10)'
198 texte(2,4) = '(''. Jump through the faces'')'
200 > '(i6,''components are requested, but size of daux equals'',i6)'
201 texte(2,6) = '(''. Examen du '',a,i10)'
204 20000 format(a,i10,a,20g16.8)
205 20001 format(2(a,i10))
211 if ( ncmpin.gt.lgdaux ) then
212 write (ulsort,texte(langue,5)) ncmpin, lgdaux
216 #ifdef _DEBUG_HOMARD_
217 write (ulsort,texte(langue,4))
221 c 2. Calcul du saut entre chaque tetraedre et ses voisins
223 #ifdef _DEBUG_HOMARD_
224 write (ulsort,*) '2. parcours tetraedre ; codret = ', codret
225 write (ulsort,90002) 'nbtecf', nbtecf
230 do 21 , iaux = 1 , nbtecf
232 if ( tesupp(iaux).gt.0 ) then
235 cgn write (ulsort,*) 'lamail = ', lamail
237 c 2.1.1. ==> Recherche des voisins par chacune des faces
244 do 211 , kaux = 1 , 4
246 if ( codret.eq.0 ) then
248 laface = tritet(iaux,kaux)
249 #ifdef _DEBUG_HOMARD_
250 write (ulsort,texte(langue,3)) 'DEISV6 / tetr', nompro
252 call deisv6 ( laface, typfac, lamail, typenh,
256 > hethex, filhex, perhex, fhpyte,
263 > ulsort, langue, codret )
269 c 2.1.2. ==> Retrait de la maille courante de la liste des voisins
271 if ( codret.eq.0 ) then
273 #ifdef _DEBUG_HOMARD_
274 write (ulsort,texte(langue,3)) 'DEISV7 / tetr', nompro
276 cc call deisv7 ( lamail, nbvote, voiste,
277 cc > ulsort, langue, codret )
281 c 2.1.3. ==> Calcul des sauts
283 if ( codret.eq.0 ) then
285 #ifdef _DEBUG_HOMARD_
286 write (ulsort,texte(langue,3)) 'DEISV5 / tetr', nompro
288 call deisv5 ( lamail, ncmpin, usacmp,
289 > nbteto, teindi, teinin,
299 > ulsort, langue, codret)
308 c 3. Calcul du saut entre chaque hexaedre et ses voisins
310 #ifdef _DEBUG_HOMARD_
311 write (ulsort,*) '3. parcours hexaedre ; codret = ', codret
312 write (ulsort,90002) 'nbhecf', nbhecf
317 do 31 , iaux = 1 , nbhecf
319 if ( hesupp(iaux).gt.0 ) then
322 cgn write (ulsort,*) 'lamail = ', lamail
324 c 3.1.1. ==> Recherche des voisins par chacune des faces
331 do 311 , kaux = 1 , 6
333 if ( codret.eq.0 ) then
335 laface = quahex(iaux,kaux)
336 #ifdef _DEBUG_HOMARD_
337 write (ulsort,texte(langue,3)) 'DEISV6 / hexa', nompro
339 call deisv6 ( laface, typfac, lamail, typenh,
343 > hethex, filhex, perhex, fhpyte,
350 > ulsort, langue, codret )
352 #ifdef _DEBUG_HOMARD_
353 write (ulsort,90002) 'apres la face', kaux
354 write (ulsort,90002) 'nbvote', nbvote
355 write (ulsort,90002) 'nbvohe', nbvohe
356 write (ulsort,90002) 'nbvopy', nbvopy
357 write (ulsort,90002) 'nbvope', nbvope
364 c 3.1.2. ==> Retrait de la maille courante de la liste des voisins
366 if ( codret.eq.0 ) then
368 #ifdef _DEBUG_HOMARD_
369 write (ulsort,texte(langue,3)) 'DEISV7 / hexa', nompro
371 cc call deisv7 ( lamail, nbvohe, voishe,
372 cc > ulsort, langue, codret )
376 c 3.1.3. ==> Calcul des sauts
378 if ( codret.eq.0 ) then
380 #ifdef _DEBUG_HOMARD_
381 write (ulsort,texte(langue,3)) 'DEISV5 / hexa', nompro
383 call deisv5 ( lamail, ncmpin, usacmp,
384 > nbheto, heindi, heinin,
394 > ulsort, langue, codret)
403 c 4. Calcul du saut entre chaque pyramide et ses voisins
405 #ifdef _DEBUG_HOMARD_
406 write (ulsort,*) '4. parcours pyramide ; codret = ', codret
407 write (ulsort,90002) 'nbpycf', nbpycf
411 do 41 , iaux = 1 , nbpycf
413 if ( pysupp(iaux).gt.0 ) then
416 cgn write (ulsort,*) 'lamail = ', lamail
418 c 4.1.1. ==> Recherche des voisins par chacune des faces
425 do 411 , kaux = 1 , 5
427 if ( codret.eq.0 ) then
429 laface = facpyr(iaux,kaux)
430 if ( kaux.le.4 ) then
435 #ifdef _DEBUG_HOMARD_
436 write (ulsort,texte(langue,3)) 'DEISV6 / pyra', nompro
438 call deisv6 ( laface, typfac, lamail, typenh,
442 > hethex, filhex, perhex, fhpyte,
449 > ulsort, langue, codret )
455 c 4.1.2. ==> Retrait de la maille courante de la liste des voisins
457 if ( codret.eq.0 ) then
459 #ifdef _DEBUG_HOMARD_
460 write (ulsort,texte(langue,3)) 'DEISV7 / pyra', nompro
462 cc call deisv7 ( lamail, nbvopy, voispy,
463 cc > ulsort, langue, codret )
467 c 4.1.3. ==> Calcul des sauts
469 if ( codret.eq.0 ) then
471 #ifdef _DEBUG_HOMARD_
472 write (ulsort,texte(langue,3)) 'DEISV5 / pyra', nompro
474 call deisv5 ( lamail, ncmpin, usacmp,
475 > nbpyto, pyindi, pyinin,
485 > ulsort, langue, codret)
494 c 5. Calcul du saut entre chaque pentaedre et ses voisins
496 #ifdef _DEBUG_HOMARD_
497 write (ulsort,*) '5. parcours pentaedre ; codret = ', codret
498 write (ulsort,90002) 'nbpecf', nbpecf
502 do 51 , iaux = 1 , nbpecf
504 if ( pesupp(iaux).gt.0 ) then
508 c 5.1.1. ==> Recherche des voisins par chacune des faces
515 do 511 , kaux = 1 , 5
517 if ( codret.eq.0 ) then
519 laface = facpen(iaux,kaux)
520 if ( kaux.le.2 ) then
525 #ifdef _DEBUG_HOMARD_
526 write (ulsort,texte(langue,3)) 'DEISV6 / pent', nompro
528 call deisv6 ( laface, typfac, lamail, typenh,
532 > hethex, filhex, perhex, fhpyte,
539 > ulsort, langue, codret )
545 c 5.1.2. ==> Retrait de la maille courante de la liste des voisins
547 if ( codret.eq.0 ) then
549 #ifdef _DEBUG_HOMARD_
550 write (ulsort,texte(langue,3)) 'DEISV7 / pent', nompro
552 call deisv7 ( lamail, nbvope, voispe,
553 > ulsort, langue, codret )
557 c 5.1.3. ==> Calcul des sauts
559 if ( codret.eq.0 ) then
561 #ifdef _DEBUG_HOMARD_
562 write (ulsort,texte(langue,3)) 'DEISV5 / pent', nompro
564 call deisv5 ( lamail, ncmpin, usacmp,
565 > nbpeto, peindi, peinin,
575 > ulsort, langue, codret)
584 c 6. Calcul des sauts pour les fils des hexaedres coupes par conformite
585 c s'ils sont decrits par aretes
587 #ifdef _DEBUG_HOMARD_
588 write (ulsort,*) '6. fils des hexaedres ; codret = ', codret
591 if ( nbteca.gt.0 .or. nbheca.gt.0 .or. nbpyca.gt.0 ) then
593 do 61 , jaux = 1 , nbhecf
597 if ( mod(hethex(iaux),1000).ge.11 ) then
598 #ifdef _DEBUG_HOMARD_
599 write (ulsort,texte(langue,6)) mess14(langue,1,6), iaux
602 c 6.1. ==> Recherche des mailles a considerer
604 if ( codret.eq.0 ) then
606 #ifdef _DEBUG_HOMARD_
607 write (ulsort,texte(langue,3)) 'DEISV8', nompro
614 > nbfite, nbvote, voiste,
615 > nbfihe, nbvohe, voishe,
616 > nbfipy, nbvopy, voispy,
617 > ulsort, langue, codret )
621 c 6.2. ==> Calcul des sauts entre chaque fils de l'hexaedre et les
622 c voisins contenus dans la liste
624 if ( codret.eq.0 ) then
626 do 621 , kaux = 1 , nbfite
627 #ifdef _DEBUG_HOMARD_
628 write (ulsort,texte(langue,3)) '. DEISV5 / tetr', nompro
630 call deisv5 ( voiste(kaux), ncmpin, usacmp,
631 > nbteto, teindi, teinin,
641 > ulsort, langue, codret)
644 do 622 , kaux = 1 , nbfihe
645 #ifdef _DEBUG_HOMARD_
646 write (ulsort,texte(langue,3)) '. DEISV5 / hexa', nompro
648 call deisv5 ( voishe(kaux), ncmpin, usacmp,
649 > nbheto, heindi, heinin,
659 > ulsort, langue, codret)
662 do 623 , kaux = 1 , nbfipy
663 #ifdef _DEBUG_HOMARD_
664 write (ulsort,texte(langue,3)) '. DEISV5 / pyra', nompro
666 call deisv5 ( voispy(kaux), ncmpin, usacmp,
667 > nbpyto, pyindi, pyinin,
677 > ulsort, langue, codret)
692 if ( codret.ne.0 ) then
696 write (ulsort,texte(langue,1)) 'Sortie', nompro
697 write (ulsort,texte(langue,2)) codret
701 #ifdef _DEBUG_HOMARD_
702 write (ulsort,texte(langue,1)) 'Sortie', nompro