SALOME - SMESH
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
aptrte.h
Go to the documentation of this file.
1 // SMESH MEFISTO2 : algorithm for meshing
2 //
3 // Copyright (C) 2006 Laboratoire J.-L. Lions UPMC Paris
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 //
19 // See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
20 //
21 //
22 //
23 // File : aptrte.h
24 // Author : Alain PERRONNET
25 // Module : SMESH
26 // Date : 13 novembre 2006
27 
28 #ifndef aptrte__h
29 #define aptrte__h
30 
31 #include <climits> // limites min max int long real ...
32 #ifndef WIN32
33 #include <unistd.h> // gethostname, ...
34 #endif
35 #include <stdio.h>
36 #ifndef WIN32
37 #include <iostream> // pour cout cin ...
38 #include <iomanip> // pour le format des io setw, stx, setfill, ...
39 #endif
40 #include <string.h> // pour les fonctions sur les chaines de caracteres
41 #include <ctype.h>
42 #include <stdlib.h>
43 #include <math.h> // pour les fonctions mathematiques
44 #include <time.h>
45 
46 #include <sys/types.h>
47 #ifndef WIN32
48 #include <sys/time.h>
49 #endif
50 
51 #ifdef WNT
52  #if defined MEFISTO2D_EXPORTS
53  #define MEFISTO2D_EXPORT __declspec( dllexport )
54  #else
55  #define MEFISTO2D_EXPORT __declspec( dllimport )
56  #endif
57 #else
58  #define MEFISTO2D_EXPORT
59 #endif
60 
62  void aptrte( Z nutysu, R aretmx,
63  Z nblf, Z *nudslf, R2 *uvslf,
64  Z nbpti, R2 *uvpti,
65  Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
66  Z & ierr );
67 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
68 // but : appel de la triangulation par un arbre-4 recouvrant
69 // ----- de triangles equilateraux
70 // le contour du domaine plan est defini par des lignes fermees
71 // la premiere ligne etant l'enveloppe de toutes les autres
72 // la fonction areteideale_(s,d) donne la taille d'arete
73 // au point s dans la direction d (direction inactive pour l'instant)
74 // des lors toute arete issue d'un sommet s devrait avoir une longueur
75 // comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
76 //
77 //Attention:
78 // Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
79 // De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
80 //
81 // entrees:
82 // --------
83 // nutysu : numero de traitement de areteideale_() selon le type de surface
84 // 0 pas d'emploi de la fonction areteideale_() et aretmx est active
85 // 1 il existe une fonction areteideale_(s,d)
86 // dont seules les 2 premieres composantes de uv sont actives
87 // ... autres options a definir ...
88 // aretmx : longueur maximale des aretes de la future triangulation
89 // nblf : nombre de lignes fermees de la surface
90 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees
91 // nudslf(0)=0 pour permettre la difference sans test
92 // Attention le dernier sommet de chaque ligne est raccorde au premier
93 // tous les sommets et les points internes ont des coordonnees
94 // UV differentes <=> Pas de point double!
95 // uvslf : uv des nudslf(nblf) sommets des lignes fermees
96 // nbpti : nombre de points internes futurs sommets de la triangulation
97 // uvpti : uv des points internes futurs sommets de la triangulation
98 //
99 // sorties:
100 // --------
101 // nbst : nombre de sommets de la triangulation finale
102 // uvst : coordonnees uv des nbst sommets de la triangulation
103 // nbt : nombre de triangles de la triangulation finale
104 // nust : 3 numeros dans uvst des sommets des nbt triangles
105 // ierr : 0 si pas d'erreur
106 // > 0 sinon
107 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
108 // auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001
109 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
110 
111 #if defined(WIN32) && defined(DFORTRAN)
112 
113  #define tempscpu TEMPSCPU
114  #define deltacpu DELTACPU
115  #define insoar INSOAR
116  #define azeroi AZEROI
117  #define fasoar FASOAR
118  #define teajte TEAJTE
119  #define tehote TEHOTE
120  #define tetrte TETRTE
121  #define aisoar AISOAR
122  #define tedela TEDELA
123  #define terefr TEREFR
124  #define tesuex TESUEX
125  #define teamqt TEAMQT
126  #define nusotr NUSOTR
127  #define qutr2d QUTR2D
128  #define surtd2 SURTD2
129  #define qualitetrte QUALITETRTE
130 
131  #define areteideale ARETEIDEALE
132 
133  #define MEFISTO2D_STDCALL __stdcall
134 
135 #elif defined(WIN32) && defined (__WATCOM__)
136 
137  #define MEFISTO2D_STDCALL
138 
139 #else //Lin and MacOSX use f77
140 
141  #define MEFISTO2D_STDCALL
142 
143  #define insoar insoar_
144  #define azeroi azeroi_
145  #define fasoar fasoar_
146  #define teajte teajte_
147  #define tehote tehote_
148  #define tetrte tetrte_
149  #define aisoar aisoar_
150  #define tedela tedela_
151  #define terefr terefr_
152  #define tesuex tesuex_
153  #define teamqt teamqt_
154  #define nusotr nusotr_
155  #define qutr2d qutr2d_
156  #define surtd2 surtd2_
157  #define qualitetrte qualitetrte_
158  #define areteideale areteideale_
159 
160 #endif
161 
162 extern "C" { MEFISTO2D_EXPORT void MEFISTO2D_STDCALL qualitetrte( R3 *mnpxyd,
163  Z & mosoar, Z & mxsoar, Z *mnsoar,
164  Z & moartr, Z & mxartr, Z *mnartr,
165  Z & nbtria, R & quamoy, R & quamin ); }
166 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
167 // but : calculer la qualite moyenne et minimale de la triangulation
168 // ----- actuelle definie par les tableaux nosoar et noartr
169 // entrees:
170 // --------
171 // mnpxyd : tableau des coordonnees 2d des points
172 // par point : x y distance_souhaitee
173 // mosoar : nombre maximal d'entiers par arete et
174 // indice dans nosoar de l'arete suivante dans le hachage
175 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
176 // attention: mxsoar>3*mxsomm obligatoire!
177 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
178 // chainage des aretes frontalieres, chainage du hachage des aretes
179 // hachage des aretes = nosoar(1)+nosoar(2)*2
180 // avec mxsoar>=3*mxsomm
181 // une arete i de nosoar est vide <=> nosoar(1,i)=0 et
182 // nosoar(2,arete vide)=l'arete vide qui precede
183 // nosoar(3,arete vide)=l'arete vide qui suit
184 // moartr : nombre maximal d'entiers par arete du tableau noartr
185 // mxartr : nombre maximal de triangles declarables
186 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
187 // arete1 = 0 si triangle vide => arete2 = triangle vide suivant
188 // sorties:
189 // --------
190 // nbtria : nombre de triangles internes au domaine
191 // quamoy : qualite moyenne des triangles actuels
192 // quamin : qualite minimale des triangles actuels
193 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
194 
195 extern "C" { void MEFISTO2D_STDCALL tempscpu( double & tempsec ); }
196 
197 //Retourne le temps CPU utilise en secondes
198 
199 extern "C" { void MEFISTO2D_STDCALL deltacpu( R & dtcpu ); }
200 
201 //Retourne le temps CPU utilise en secondes depuis le precedent appel
202 
203 //initialiser le tableau mnsoar pour le hachage des aretes
204 extern "C" { void MEFISTO2D_STDCALL insoar( Z & mxsomm,
205  Z & mosoar,
206  Z & mxsoar,
207  Z & n1soar,
208  Z * mnsoar );}
209 
210 //mettre a zero les nb entiers de tab
211 extern "C" { void MEFISTO2D_STDCALL azeroi( Z & nb, Z * tab ); }
212 
213 extern "C" {void MEFISTO2D_STDCALL fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
214  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst,
215  Z & noar, Z & ierr );
216 }
217 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
218 // but : former l'arete de sommet ns1-ns2 dans le hachage du tableau
219 // ----- nosoar des aretes de la triangulation
220 // entrees:
221 // --------
222 // ns1 ns2: numero pxyd des 2 sommets de l'arete
223 // nt1 : numero du triangle auquel appartient l'arete
224 // nt1=-1 si numero inconnu
225 // nt2 : numero de l'eventuel second triangle de l'arete si connu
226 // nt2=-1 si numero inconnu
227 // nolign : numero de la ligne fermee de l'arete
228 // =0 si l'arete n'est une arete de ligne
229 // ce numero est ajoute seulement si l'arete est creee
230 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
231 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
232 // modifies:
233 // ---------
234 // n1soar : numero de la premiere arete vide dans le tableau nosoar
235 // une arete i de nosoar est vide <=> nosoar(1,i)=0
236 // chainage des aretes vides amont et aval
237 // l'arete vide qui precede=nosoar(4,i)
238 // l'arete vide qui suit =nosoar(5,i)
239 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
240 // chainage momentan'e d'aretes, chainage du hachage des aretes
241 // hachage des aretes = min( nosoar(1), nosoar(2) )
242 // noarst : noarst(np) numero d'une arete du sommet np
243 
244 // ierr : si < 0 en entree pas d'affichage en cas d'erreur du type
245 // "arete appartenant a plus de 2 triangles et a creer!"
246 // si >=0 en entree affichage de ce type d'erreur
247 // sorties:
248 // --------
249 // noar : >0 numero de l'arete retrouvee ou ajoutee
250 // ierr : =0 si pas d'erreur
251 // =1 si le tableau nosoar est sature
252 // =2 si arete a creer et appartenant a 2 triangles distincts
253 // des triangles nt1 et nt2
254 // =3 si arete appartenant a 2 triangles distincts
255 // differents des triangles nt1 et nt2
256 // =4 si arete appartenant a 2 triangles distincts
257 // dont le second n'est pas le triangle nt2
258 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
259 
260 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
261 extern "C" {void MEFISTO2D_STDCALL teajte( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi,
262  R & aretmx, Z & mxtree, Z * letree,
263  Z & ierr );
264 }
265 
266 extern "C" {void MEFISTO2D_STDCALL tehote( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd,
267  R3 * comxmi, R & aretmx,
268  Z * letree, Z & mxqueu, Z * mnqueu,
269  Z & ierr );
270 }
271 // homogeneisation de l'arbre des te a un saut de taille au plus
272 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
273 
274 extern "C" {void MEFISTO2D_STDCALL tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
275  Z & mxqueu, Z * mnqueu, Z * mntree,
276  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
277  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
278  Z & ierr );
279 }
280 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
281 // et des points de la frontiere, des points internes imposes interieurs
282 
283 extern "C" { void MEFISTO2D_STDCALL aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na ); }
284 // formation du chainage 6 des aretes internes a echanger eventuellement
285 
286 extern "C" { void MEFISTO2D_STDCALL tedela( R3 * mnpxyd, Z * mnarst,
287  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
288  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );
289 }
290 // boucle sur les aretes internes (non sur une ligne de la frontiere)
291 // avec echange des 2 diagonales afin de rendre la triangulation delaunay
292 
293 extern "C" { void MEFISTO2D_STDCALL terefr( Z & nbarpi, R3 * mnpxyd,
294  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
295  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
296  Z & mxarcf, Z * mnarc1, Z * mnarc2,
297  Z * mnarc3, Z * mnarc4,
298  Z & n, Z & ierr );
299 }
300 // detection des aretes frontalieres initiales perdues
301 // triangulation frontale pour les restaurer
302 
303 extern "C" { void MEFISTO2D_STDCALL tesuex( Z & nblf, Z * nulftr,
304  Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
305  Z & mosoar, Z & mxsoar, Z * mnsoar,
306  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
307  Z & nbtria, Z * mntrsu, Z & ierr );
308 }
309 // suppression des triangles externes a la surface
310 
311 extern "C" { void MEFISTO2D_STDCALL teamqt( Z & nutysu, R & aretmx, R & airemx,
312  Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
313  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
314  Z & mxarcf, Z * mntrcf, Z * mnstbo,
315  Z * n1arcf, Z * mnarcf, Z * mnarc1,
316  Z & nbarpi, Z & nbsomm, Z & mxsomm,
317  R3 * mnpxyd, Z * mnslig,
318  Z & ierr );
319 }
320 // amelioration de la qualite de la triangulation par
321 // barycentrage des sommets internes a la triangulation
322 // suppression des aretes trop longues ou trop courtes
323 // modification de la topologie des groupes de triangles
324 // mise en delaunay de la triangulation
325 
326 extern "C" { void MEFISTO2D_STDCALL nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr );
327 }
328 //retrouver les numero des 3 sommets du triangle nt
329 
330 extern "C" { void MEFISTO2D_STDCALL qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite ); }
331 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
332 
333 extern "C" { R MEFISTO2D_STDCALL surtd2( R3 & p1, R3 & p2, R3 & p3 ); }
334 //calcul de la surface d'un triangle defini par 3 points de r**2
335 
336 #endif
#define teajte
Definition: aptrte.h:146
#define MEFISTO2D_STDCALL
Definition: aptrte.h:141
#define tetrte
Definition: aptrte.h:148
#define teamqt
Definition: aptrte.h:153
void aptrte(Z nutysu, R aretmx, Z nblf, Z *nudslf, R2 *uvslf, Z nbpti, R2 *uvpti, Z &nbst, R2 *&uvst, Z &nbt, Z *&nust, Z &ierr)
Definition: Rn.h:89
#define surtd2
Definition: aptrte.h:156
#define terefr
Definition: aptrte.h:151
#define tehote
Definition: aptrte.h:147
#define aisoar
Definition: aptrte.h:149
#define qutr2d
Definition: aptrte.h:155
long int Z
Definition: Rn.h:74
#define tesuex
Definition: aptrte.h:152
#define fasoar
Definition: aptrte.h:145
#define azeroi
Definition: aptrte.h:144
Definition: Rn.h:128
void tempscpu(double &tempsec)
#define nusotr
Definition: aptrte.h:154
#define qualitetrte
Definition: aptrte.h:157
double R
Definition: Rn.h:81
void deltacpu(R &dtcpu)
#define MEFISTO2D_EXPORT
Definition: aptrte.h:58
#define insoar
Definition: aptrte.h:143
#define tedela
Definition: aptrte.h:150