1 subroutine utb05b ( choix, typenh, nbeexa, quadia, qualij,
2 > nbiter, rafdef, nbvoto, enqinf,
4 > ulsort, langue, codret )
5 c ______________________________________________________________________
9 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
11 c Version originale enregistree le 18 juin 1996 sous le numero 96036
12 c aupres des huissiers de justice Simart et Lavoir a Clamart
13 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
14 c aupres des huissiers de justice
15 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
17 c HOMARD est une marque deposee d'Electricite de France
23 c ______________________________________________________________________
25 c UTilitaire - Bilan - option 05 - etape b
27 c ______________________________________________________________________
29 c . nom . e/s . taille . description .
30 c .____________________________________________________________________.
31 c . choix . e . 1 . variantes .
32 c . . . . 0 : diametres .
33 c . . . . 1 : qualites .
34 c . . . . 2 : qualites par le jacobien normalise .
35 c . typenh . e . 1 . variantes .
36 c . . . . 2 : triangles .
37 c . . . . 3 : tetraedres .
38 c . . . . 4 : quadrangles .
39 c . . . . 5 : pyramides .
40 c . . . . 6 : hexaedres .
41 c . . . . 7 : pentaedres .
42 c . nbeexa . e . 1 . nombre d'entites a examiner .
43 c . quadia . e . nbeexa . qualite/diametre des entites a examiner .
44 c . qualij . e . nbeexa . qualite par le jacobien normalise .
45 c . nbiter . e . 1 . numero de l'iteration courante .
46 c . rafdef . e . 1 . histoire du maillage en raff/dera/modi .
47 c . nbvoto . e . 1 . nombre de volumes .
48 c . enqinf . e . * . liste des entites de qualite infinie .
49 c . ulbila . e . 1 . unite logique d'ecriture du bilan .
50 c . ulsort . e . 1 . unite logique de la sortie generale .
51 c . langue . e . 1 . langue des messages .
52 c . . . . 1 : francais, 2 : anglais .
53 c . codret . s . 1 . code de retour des modules .
54 c . . . . 0 : pas de probleme .
55 c . . . . 1 : probleme .
56 c .____________________________________________________________________.
59 c 0. declarations et dimensionnement
62 c 0.1. ==> generalites
68 parameter ( nompro = 'UTB05B' )
83 double precision quadia(*)
84 double precision qualij(*)
85 double precision valmin, valmax
87 integer choix, typenh, nbeexa
88 integer nbiter, nbvoto
91 integer ulbila, rafdef
92 integer ulsort, langue, codret
94 c 0.4. ==> variables locales
96 integer lechoi, choide, choifi
100 parameter (nbclmx=50)
101 integer histog(nbclmx)
102 integer iclass(0:nbclmx)
103 double precision rclass(0:nbclmx)
106 character*8 titcou(6)
109 integer typval, ival(1)
110 integer iaux, jaux, kaux
111 integer nuroul, lnomfl
113 integer lgmess(nblang,0:2)
114 integer nxmd58(nblang,7)
115 integer nxmq58(nblang,7)
116 integer nxmj58(nblang,7)
118 double precision xlow
119 double precision vamiar, vamaar, valdif, difman, valech
120 double precision daux, daux1
121 double precision vmax, vmin
123 character*80 saux80, sau80a
124 character*08 mess08(nblang,4)
125 character*09 mess09(nblang,0:2)
129 parameter (nbmess = 10 )
130 character*80 texte(nblang,nbmess)
131 character*58 mege58(nblang,0:nbmess)
132 character*58 medi58(nblang,nbmess,7)
133 character*58 mequ58(nblang,nbmess,7)
134 character*58 meqj58(nblang,nbmess,7)
138 c 0.5. ==> initialisations
142 c ______________________________________________________________________
150 #ifdef _DEBUG_HOMARD_
151 write (ulsort,texte(langue,1)) 'Entree', nompro
155 c 1.1. ==> Messages generaux
157 mess09(1,0) = 'Diametre '
158 mess09(1,1) = 'Qualite '
159 mess09(1,2) = 'Qualite '
161 mess09(2,0) = 'Diameter '
162 mess09(2,1) = 'Quality '
163 mess09(2,2) = 'Quality '
165 texte(1,4) = '(''Nombre de '',a,'' a examiner : '',i8)'
166 texte(1,5) = '(''--> valeur arrondie pour le '',a,'' :'',g15.6)'
167 texte(1,6) = '(5x,''Nombre de '',a,'' aplatis : '',i8)'
168 texte(1,7) = '(5x,''Le '',a,i10,'' est aplati.'')'
170 texte(2,4) = '(''Number of '',a,'' to be examined : '',i8)'
171 texte(2,5) = '(''--> round value for '',a,'' :'',g15.6)'
172 texte(2,6) = '(5x,''Number of flat '',a,'': '',i8)'
173 texte(2,7) = '(5x,''The '',a,'' #'',i10,'' is flat.'')'
177 #ifdef _DEBUG_HOMARD_
178 write (ulsort,90002) 'ulbila', ulbila
181 c 1234567890123456789012345678901234567890123456789012345678
189 > 'QUALITES EN JACOBIEN NORMALISE DES '
192 > ' Valeur constante : '
194 > 'Remarque : on ne regarde ici que les triangles qui '
196 > 'sont de vraies mailles de calcul. '
198 > 'Remarque : on ne regarde ici que les quadrangles qui '
207 > 'QUALITY WITH SCALED JACOBIAN OF '
210 > ' Constant value : '
212 > 'Remark : only triangles which are real calculation '
214 > 'meshes are seen here. '
216 > 'Remark : only quadrangles which are real calculation '
218 c 1.2. ==> Messages lies aux diametres
221 > 'Rappel : le diametre est egal a la longueur du plus '
223 > 'grand segment que l''on peut tracer dans la maille. '
226 > 'Pour un triangle, c''est la longueur de la plus '
232 > 'Pour un tetraedre, c''est la longueur de la plus '
238 > 'Pour un quadrangle, c''est la plus grande longueur entre '
240 > 'les aretes et les diagonales. '
244 > 'Pour une pyramide, c''est la plus grande longueur entre '
246 > 'les aretes et les diagonales de la base. '
250 > 'Pour un hexaedre, c''est la plus grande longueur entre '
252 > 'les aretes et les diagonales. '
256 > 'Pour un pentaedre, c''est la plus grande longueur entre '
258 > 'les aretes et les diagonales. '
262 > 'Note: diameter egals the length of the largest line that '
264 > 'can be placed in the mesh. '
267 > 'For a triangle, it is the length of the largest edge. '
271 > 'For a tetradron, it is the length of the largest edge. '
275 > 'For a quadrangle, it is the largest length between edges '
281 > 'For a pyramid, it is the largest length between edges '
283 > 'and diagonals of the basis. '
287 > 'For an hexahedron, it is the largest length between edges '
293 > 'For a prism, it is the largest length between edges and '
295 > 'diagonals of the basis. '
298 c 1.3. ==> Messages lies aux qualites
301 > 'Rappel : la qualite est egale au rapport du diametre du '
303 > 'triangle sur le rayon du cercle inscrit, normalise a 1 '
305 > 'pour un triangle equilateral. '
309 > 'Rappel : la qualite est egale au rapport du diametre du '
311 > 'tetraedre sur le rayon de la sphere inscrite, '
313 > 'normalise a 1 pour un tetraedre regulier. '
317 > 'Rappel : la qualite est egale au rapport du produit de '
319 > 'la plus grande longueur des cotes et des diagonales et '
321 > 'de la moyenne quadratique des cotes sur la surface '
323 > 'minimum des triangles inscrits, normalise a 1 pour '
328 c 123456789012345678901234567890123456789012345678901234
330 > 'Non definie aujourd''hui. '
334 > 'Rappel : la qualite est egale a la qualite du pire des '
336 > '24 tetraedres composant l''hexaedre, normalise a 1 '
342 > 'Non definie aujourd''hui. '
345 c 1234567890123456789012345678901234567890123456789012345678
347 > 'Note: the quality equals the ratio of the diametre '
349 > 'of the triangle by the radius of the inscribed circle '
351 > 'normalised to 1 for an equilateral triangle. '
355 > 'Note: the quality equals the ratio of the diametre '
357 > 'of the tetradron by the radius of the inscribed sphere '
359 > 'normalised to 1 for a regular tetrahedron. '
363 > 'Note: the quality equals the ratio of the product of '
365 > 'the largest edge and diagonals and square mean of edge '
367 > 'over minimum surface of inscribed triangles. '
369 > 'This valeur is normalised to 1 for a square. '
377 > 'Note: the quality equals the worse quality of the '
379 > 'the 24 tetrahedron composing the hexahedron '
381 > 'normalised to 1 for a cube. '
388 c 1.4. ==> Messages lies aux qualites en jacobien normalise
391 > 'Rappel : la qualite est egale au minimum des Jacobiens '
393 > 'pour chacun des sommets, normalise a 1 pour '
395 > 'un triangle equilateral. '
399 > 'Rappel : la qualite est egale au minimum des Jacobiens '
401 > 'pour chacun des sommets, normalise a 1 pour '
403 > 'un tetraedre regulier. '
407 > 'Rappel : la qualite est egale au minimum des Jacobiens '
409 > 'pour chacun des sommets, normalise a 1 pour un carre. '
413 > 'Rappel : la qualite est egale au minimum des Jacobiens '
415 > 'pour chacun des sommets, normalise a 1 pour '
417 > 'une pyramide reguliere. '
421 > 'Rappel : la qualite est egale au minimum des Jacobiens '
423 > 'pour chacun des sommets, normalise a 1 pour un cube. '
427 > 'Rappel : la qualite est egale au minimum des Jacobiens '
429 > 'pour chacun des sommets, normalise a 1 pour '
431 > 'un pentaedre regulier. '
434 c 1234567890123456789012345678901234567890123456789012345678
436 > 'Note: the quality equals the minimum of the Jacobian for '
438 > 'every node, normalised to 1 for an equilateral triangle. '
442 > 'Note: the quality equals the minimum of the Jacobian for '
444 > 'every node, normalised to 1 for a regular tetrahedron. '
448 > 'Note: the quality equals the minimum of the Jacobian for '
450 > 'every node, normalised to 1 for a square. '
454 > 'Note: the quality equals the minimum of the Jacobian for '
456 > 'every node, normalised to 1 for a regular pyramid. '
460 > 'Note: the quality equals the minimum of the Jacobian for '
462 > 'every node, normalised to 1 for a cube. '
466 > 'Note: the quality equals the minimum of the Jacobian for '
468 > 'every node, normalised to 1 for a regular prism. '
471 10100 format(/,5x,64('*'))
472 10200 format( 5x,64('*'))
473 11100 format(/,4x,a,/,4x,a)
474 11200 format( 5x,'* ',a58,' *')
481 c 2.1. ==> Recherche des types d'impressions a faire
483 if ( choix.eq.12 ) then
491 c 2.2. ==> Valeurs extremes pour les aplatissements
493 vmax = 0.99d0 * vinfpo
494 vmin = 1.11d0 * epsima
496 do 20 , lechoi = choide, choifi
498 #ifdef _DEBUG_HOMARD_
499 write (ulsort,90002) 'lechoi', lechoi
503 c 3. ecriture de l'entete
506 saux80 = mege58(langue,lechoi)
507 iaux = lgmess(langue,lechoi) + 1
508 saux80(iaux+1:iaux+14) = mess14(langue,5,typenh)
509 call utlgut ( jaux, saux80,
510 > ulsort, langue, codret )
511 do 31 , iaux = 1, jaux
512 sau80a(iaux:iaux) = '-'
514 write (ulbila,11100) saux80(1:jaux), sau80a(1:jaux)
520 c 4.1. ==> Des entites sont aplaties
527 if ( lechoi.le.1 ) then
529 do 411 , iaux = 1 , nbeexa
530 cgn write (ulsort,90114) 'quadia', iaux, quadia(iaux)
531 if ( quadia(iaux).gt.vmin .and. quadia(iaux).lt.vmax ) then
532 valmin = min ( valmin, quadia(iaux) )
533 valmax = max ( valmax, quadia(iaux) )
536 enqinf(nbqinf) = iaux
542 do 412 , iaux = 1 , nbeexa
543 cgn write (ulsort,90114) 'qualij', iaux, qualij(iaux)
544 if ( qualij(iaux).gt.vmin .and. qualij(iaux).lt.vmax ) then
545 valmin = min ( valmin, qualij(iaux) )
546 valmax = max ( valmax, qualij(iaux) )
549 enqinf(nbqinf) = iaux
555 #ifdef _DEBUG_HOMARD_
556 write (ulsort,texte(langue,4)) mess14(langue,3,typenh), nbeexa
557 cgn if ( lechoi.ne.1 ) then
558 write (ulsort,90004) mess09(langue,lechoi)//'min', valmin
560 write (ulsort,90004) mess09(langue,lechoi)//'max', valmax
563 c 4.2. ==> Des entites sont aplaties
565 if ( nbqinf.gt.0 ) then
567 write (ulbila,texte(langue,6)) mess14(langue,3,typenh), nbqinf
568 do 42 , iaux = 1 , nbqinf
569 write (ulbila,texte(langue,7)) mess14(langue,1,typenh),
575 c 4.3. ==> Est-ce constant ?
577 if ( valmax.le.epsima ) then
580 if ( (valmax-valmin)/valmax.le.1.d-6 ) then
586 #ifdef _DEBUG_HOMARD_
587 write (ulsort,99001) 'consta', consta
591 c 5. arrondis des valeurs extremes
593 #ifdef _DEBUG_HOMARD_
594 write (ulsort,90002) '5. arrondis ; codret', codret
597 if ( .not.consta ) then
599 c 5.1. ==> Programme de calcul des arrondis
601 if ( codret.eq.0 ) then
603 #ifdef _DEBUG_HOMARD_
604 write (ulsort,texte(langue,3)) 'UTARRO', nompro
606 call utarro ( valmin, valmax, vamiar, vamaar,
607 > ulsort, langue, codret )
611 c 5.2. ==> Ajustement en fonction du traitement
613 if ( codret.eq.0 ) then
615 #ifdef _DEBUG_HOMARD_
616 write (ulsort,90004) 'Arrondi min', vamiar
617 write (ulsort,90004) 'Arrondi max', vamaar
620 if ( lechoi.eq.0 .or. lechoi.eq.2 ) then
621 vamiar = max(vamiar,0.d0)
622 elseif ( lechoi.eq.1 ) then
623 vamiar = max(vamiar,1.d0)
626 if ( lechoi.eq.2 ) then
627 vamaar = min(vamaar,1.d0)
630 #ifdef _DEBUG_HOMARD_
631 write (ulsort,90004) 'Arrondi min final', vamiar
632 write (ulsort,90004) 'Arrondi max final', vamaar
640 c 6. Creation des classes
642 #ifdef _DEBUG_HOMARD_
643 write (ulsort,90002) '6. Creation des classes ; codret', codret
646 if ( .not.consta ) then
648 c 6.1 ==> Gestion de l'ordre de grandeur
649 c C'est un probleme qui se pose pour le diametre en fonction des
650 c unites qui ont ete utilisees.
652 if ( codret.eq.0 ) then
654 valdif = ( vamaar - vamiar ) * 0.99999999d0
656 #ifdef _DEBUG_HOMARD_
657 write (ulsort,texte(langue,3)) 'UTPD10', nompro
659 call utpd10 ( valdif, difman, difexp,
660 > ulsort, langue, codret )
661 #ifdef _DEBUG_HOMARD_
662 write (ulsort,90004) 'valdif', valdif
663 write (ulsort,90004) '==> difman', difman
664 write (ulsort,90002) '==> difexp', difexp
669 if ( codret.eq.0 ) then
671 if ( difexp.le.0 ) then
672 valech = 10.d0**(1-difexp)
673 elseif ( difexp.ge.4 ) then
674 valech = 10.d0**(2-difexp)
679 #ifdef _DEBUG_HOMARD_
680 write (ulsort,90004) 'valech', valech
681 write (ulsort,90004) 'daux=valdif*valech', daux
686 c 6.2 ==> Les classes
688 if ( codret.eq.0 ) then
690 if ( daux.le.1.d0 ) then
693 daux1 = 0.05d0/valech
695 elseif ( daux.le.2.d0 ) then
698 daux1 = 0.05d0/valech
700 elseif ( daux.le.2.5d0 ) then
703 daux1 = 0.05d0/valech
705 elseif ( daux.le.4.d0 ) then
708 daux1 = 0.10d0/valech
710 elseif ( daux.le.5.d0 ) then
713 daux1 = 0.10d0/valech
715 elseif ( daux.le.7.5d0 ) then
718 daux1 = 0.25d0/valech
720 elseif ( daux.le.10.d0 ) then
723 daux1 = 0.25d0/valech
725 elseif ( daux.le.15.d0 ) then
728 daux1 = 0.50d0/valech
730 elseif ( daux.le.20.d0 ) then
733 daux1 = 0.50d0/valech
735 elseif ( daux.le.50.d0 ) then
738 daux1 = 2.00d0/valech
740 elseif ( daux.le.100.d0 ) then
743 daux1 = 2.00d0/valech
748 daux1 = (vamaar-vamiar) / dble(nbclas)
752 #ifdef _DEBUG_HOMARD_
753 write (ulsort,90002) 'nbclas', nbclas
754 write (ulsort,90004) 'daux1', daux1
757 do 62 , iaux = 1 , nbclas
758 rclass(iaux) = rclass(iaux-1) + daux1
759 if ( rclass(iaux).ge.vamaar ) then
770 #ifdef _DEBUG_HOMARD_
771 do 6999 , iaux = 0 , nbclas
772 write (ulsort,90114) 'rclass', iaux, rclass(iaux)
779 c 7. ecriture sur le fichier d'information
781 #ifdef _DEBUG_HOMARD_
782 write (ulsort,90002) '7. ecriture ; codret', codret
784 c 7.1. ==> ecriture de l'entete
786 if ( codret.eq.0 ) then
790 if ( lechoi.eq.0 ) then
792 write (ulbila,11200) medi58(langue,1,1)
793 write (ulbila,11200) medi58(langue,2,1)
794 do 710 , iaux = 1, nxmd58(langue,typenh)
795 write (ulbila,11200) medi58(langue,iaux,typenh)
798 elseif ( lechoi.eq.1 ) then
800 do 711 , iaux = 1, nxmq58(langue,typenh)
801 write (ulbila,11200) mequ58(langue,iaux,typenh)
806 do 712 , iaux = 1, nxmj58(langue,typenh)
807 write (ulbila,11200) meqj58(langue,iaux,typenh)
812 if ( nbvoto.ne.0 ) then
813 if ( typenh.eq.2 .or. typenh.eq.4 ) then
814 write (ulbila,11200) mege58(langue,typenh+2)
815 write (ulbila,11200) mege58(langue,5)
821 c 7.2. ==> message si constant
823 if ( codret.eq.0 ) then
828 write (mege58(langue,3)(32:42),'(f11.4)') valmin
829 write (ulbila,11200) mege58(langue,3)
837 c 8. sortie pour xmgrace et ecriture de la table
839 #ifdef _DEBUG_HOMARD_
840 write (ulsort,90002) '8. ecriture ; codret', codret
843 if ( .not.consta ) then
845 c 8.1. ==> Ouverture du fichier
847 if ( codret.eq.0 ) then
849 if ( lechoi.eq.0 ) then
850 saux09 = 'diam.'//suffix(2,typenh)(1:4)
851 elseif ( lechoi.eq.1 ) then
852 saux09 = 'qual.'//suffix(2,typenh)(1:4)
854 saux09 = 'quaj.'//suffix(2,typenh)(1:4)
858 if ( rafdef.eq.31 ) then
863 #ifdef _DEBUG_HOMARD_
864 write (ulsort,texte(langue,3)) 'UTULBI', nompro
866 call utulbi ( nuroul, nomflo, lnomfl,
867 > iaux, saux09, kaux, jaux,
868 > ulsort, langue, codret )
869 #ifdef _DEBUG_HOMARD_
870 write (ulsort,90003) 'nomflo', nomflo
877 if ( codret.eq.0 ) then
879 mess08(1,2) = ' des '//mess14(langue,3,typenh)(1:3)
880 mess08(1,3) = mess14(langue,3,typenh)(4:11)
881 mess08(1,4) = mess14(langue,3,typenh)(12:13)//' '
883 mess08(2,2) = ' of '//mess14(langue,3,typenh)(1:4)
884 mess08(2,3) = mess14(langue,3,typenh)(5:12)
885 mess08(2,4) = mess14(langue,3,typenh)(13:14)//' '
887 titcou(1) = mess09(langue,lechoi)(1:8)
888 titcou(2) = mess08(langue,2)
889 titcou(3) = mess08(langue,3)
890 titcou(4) = mess08(langue,4)
891 titcou(5) = titcou(1)
894 if ( lechoi.le.1 ) then
895 #ifdef _DEBUG_HOMARD_
896 write (ulsort,texte(langue,3)) 'UTCRHI / quadia', nompro
898 call utcrhi ( nbclas, rclass, iclass, histog,
899 > nbeexa, typval, quadia, ival,
900 > titcou, xlow, ulbila, iaux,
901 > ulsort, langue, codret )
903 #ifdef _DEBUG_HOMARD_
904 write (ulsort,texte(langue,3)) 'UTCRHI / qualij', nompro
906 call utcrhi ( nbclas, rclass, iclass, histog,
907 > nbeexa, typval, qualij, ival,
908 > titcou, xlow, ulbila, iaux,
909 > ulsort, langue, codret )
914 c 8.3. ==> Fermeture du fichier
916 if ( codret.eq.0 ) then
918 call gufeul ( nuroul , codret)
930 if ( codret.ne.0 ) then
934 write (ulsort,texte(langue,1)) 'Sortie', nompro
935 write (ulsort,texte(langue,2)) codret
939 #ifdef _DEBUG_HOMARD_
940 write (ulsort,texte(langue,1)) 'Sortie', nompro