4 #include <limits.h> // limites min max int long real ...
5 #include <unistd.h> // gethostname, ...
7 #include <iostream.h> // pour cout cin ...
8 #include <iomanip.h> // pour le format des io setw, stx, setfill, ...
9 #include <string.h> // pour les fonctions sur les chaines de caracteres
12 #include <math.h> // pour les fonctions mathematiques
15 #include <sys/types.h>
18 void qualitetrte( R3 *mnpxyd,
19 Z & mosoar, Z & mxsoar, Z *mnsoar,
20 Z & moartr, Z & mxartr, Z *mnartr,
21 Z & nbtria, R & quamoy, R & quamin );
22 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23 // but : calculer la qualite moyenne et minimale de la triangulation
24 // ----- actuelle definie par les tableaux nosoar et noartr
27 // mnpxyd : tableau des coordonnees 2d des points
28 // par point : x y distance_souhaitee
29 // mosoar : nombre maximal d'entiers par arete et
30 // indice dans nosoar de l'arete suivante dans le hachage
31 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
32 // attention: mxsoar>3*mxsomm obligatoire!
33 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
34 // chainage des aretes frontalieres, chainage du hachage des aretes
35 // hachage des aretes = nosoar(1)+nosoar(2)*2
36 // avec mxsoar>=3*mxsomm
37 // une arete i de nosoar est vide <=> nosoar(1,i)=0 et
38 // nosoar(2,arete vide)=l'arete vide qui precede
39 // nosoar(3,arete vide)=l'arete vide qui suit
40 // moartr : nombre maximal d'entiers par arete du tableau noartr
41 // mxartr : nombre maximal de triangles declarables
42 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
43 // arete1 = 0 si triangle vide => arete2 = triangle vide suivant
46 // nbtria : nombre de triangles internes au domaine
47 // quamoy : qualite moyenne des triangles actuels
48 // quamin : qualite minimale des triangles actuels
49 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
52 void aptrte( Z nutysu, R aretmx,
53 Z nblf, Z *nudslf, R2 *uvslf,
55 Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
57 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
58 // but : appel de la triangulation par un arbre-4 recouvrant
59 // ----- de triangles equilateraux
60 // le contour du domaine plan est defini par des lignes fermees
61 // la premiere ligne etant l'enveloppe de toutes les autres
62 // la fonction areteideale_(s,d) donne la taille d'arete
63 // au point s dans la direction d (direction inactive pour l'instant)
64 // des lors toute arete issue d'un sommet s devrait avoir une longueur
65 // comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
68 // Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
69 // De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
73 // nutysu : numero de traitement de areteideale_() selon le type de surface
74 // 0 pas d'emploi de la fonction areteideale_() et aretmx est active
75 // 1 il existe une fonction areteideale_(s,d)
76 // dont seules les 2 premieres composantes de uv sont actives
77 // ... autres options a definir ...
78 // aretmx : longueur maximale des aretes de la future triangulation
79 // nblf : nombre de lignes fermees de la surface
80 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees
81 // nudslf(0)=0 pour permettre la difference sans test
82 // Attention le dernier sommet de chaque ligne est raccorde au premier
83 // tous les sommets et les points internes ont des coordonnees
84 // UV differentes <=> Pas de point double!
85 // uvslf : uv des nudslf(nblf) sommets des lignes fermees
86 // nbpti : nombre de points internes futurs sommets de la triangulation
87 // uvpti : uv des points internes futurs sommets de la triangulation
91 // nbst : nombre de sommets de la triangulation finale
92 // uvst : coordonnees uv des nbst sommets de la triangulation
93 // nbt : nombre de triangles de la triangulation finale
94 // nust : 3 numeros dans uvst des sommets des nbt triangles
95 // ierr : 0 si pas d'erreur
97 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
98 // auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001
99 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
101 extern "C" { void tempscpu_( double & tempsec ); }
102 //Retourne le temps CPU utilise en secondes
104 extern "C" { void deltacpu_( R & dtcpu ); }
105 //Retourne le temps CPU utilise en secondes depuis le precedent appel
107 //initialiser le tableau mnsoar pour le hachage des aretes
108 extern "C" {void insoar_( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );}
110 //mettre a zero les nb entiers de tab
111 extern "C" {void azeroi_( Z & nb, Z * tab );}
113 extern "C" {void fasoar_( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
114 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst,
115 Z & noar, Z & ierr );}
116 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
117 // but : former l'arete de sommet ns1-ns2 dans le hachage du tableau
118 // ----- nosoar des aretes de la triangulation
121 // ns1 ns2: numero pxyd des 2 sommets de l'arete
122 // nt1 : numero du triangle auquel appartient l'arete
123 // nt1=-1 si numero inconnu
124 // nt2 : numero de l'eventuel second triangle de l'arete si connu
125 // nt2=-1 si numero inconnu
126 // nolign : numero de la ligne fermee de l'arete
127 // =0 si l'arete n'est une arete de ligne
128 // ce numero est ajoute seulement si l'arete est creee
129 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
130 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
133 // n1soar : numero de la premiere arete vide dans le tableau nosoar
134 // une arete i de nosoar est vide <=> nosoar(1,i)=0
135 // chainage des aretes vides amont et aval
136 // l'arete vide qui precede=nosoar(4,i)
137 // l'arete vide qui suit =nosoar(5,i)
138 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
139 // chainage momentan'e d'aretes, chainage du hachage des aretes
140 // hachage des aretes = min( nosoar(1), nosoar(2) )
141 // noarst : noarst(np) numero d'une arete du sommet np
143 // ierr : si < 0 en entree pas d'affichage en cas d'erreur du type
144 // "arete appartenant a plus de 2 triangles et a creer!"
145 // si >=0 en entree affichage de ce type d'erreur
148 // noar : >0 numero de l'arete retrouvee ou ajoutee
149 // ierr : =0 si pas d'erreur
150 // =1 si le tableau nosoar est sature
151 // =2 si arete a creer et appartenant a 2 triangles distincts
152 // des triangles nt1 et nt2
153 // =3 si arete appartenant a 2 triangles distincts
154 // differents des triangles nt1 et nt2
155 // =4 si arete appartenant a 2 triangles distincts
156 // dont le second n'est pas le triangle nt2
157 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
159 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
160 extern "C" {void teajte_( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi,
161 R & aretmx, Z & mxtree, Z * letree,
165 extern "C" {void tehote_( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd,
166 R3 * comxmi, R & aretmx,
167 Z * letree, Z & mxqueu, Z * mnqueu,
169 // homogeneisation de l'arbre des te a un saut de taille au plus
170 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
172 extern "C" {void tetrte_( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
173 Z & mxqueu, Z * mnqueu, Z * mntree,
174 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
175 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
177 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
178 // et des points de la frontiere, des points internes imposes interieurs
180 extern "C" {void aisoar_( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );}
181 // formation du chainage 6 des aretes internes a echanger eventuellement
183 extern "C" {void tedela_( R3 * mnpxyd, Z * mnarst,
184 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
185 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );}
186 // boucle sur les aretes internes (non sur une ligne de la frontiere)
187 // avec echange des 2 diagonales afin de rendre la triangulation delaunay
189 extern "C" {void terefr_( Z & nbarpi, R3 * mnpxyd,
190 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
191 Z & moartr, Z & n1artr, Z * mnartr, Z * mnarst,
192 Z & mxarcf, Z * mnarc1, Z * mnarc2,
193 Z * mnarc3, Z * mnarc4,
195 // detection des aretes frontalieres initiales perdues
196 // triangulation frontale pour les restaurer
198 extern "C" {void tesuex_( Z & nblf, Z * nulftr,
199 Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
200 Z & mosoar, Z & mxsoar, Z * mnsoar,
201 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
202 Z & nbtria, Z * mntrsu, Z & ierr );}
203 // suppression des triangles externes a la surface
205 extern "C" {void teamqt_( Z & nutysu,
206 Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
207 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
208 Z & mxarcf, Z * mntrcf, Z * mnstbo,
209 Z * n1arcf, Z * mnarcf, Z * mnarc1,
210 R3 * comxmi, Z & nbarpi, Z & nbsomm, Z & mxsomm,
211 R3 * mnpxyd, Z * mnslig,
213 // amelioration de la qualite de la triangulation par
214 // barycentrage des sommets internes a la triangulation
215 // suppression des aretes trop longues ou trop courtes
216 // modification de la topologie des groupes de triangles
217 // mise en delaunay de la triangulation
219 extern "C" {void nusotr_( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,
221 //retrouver les numero des 3 sommets du triangle nt
223 extern "C" {void qutr2d_( R3 & p1, R3 & p2, R3 & p3, R & qualite );}
224 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
226 extern "C" { R surtd2_( R3 & p1, R3 & p2, R3 & p3 ); }
227 //calcul de la surface d'un triangle defini par 3 points de r**2