SALOME - SMESH
aptrte.h
Go to the documentation of this file.
1 // SMESH MEFISTO2 : algorithm for meshing
2 //
3 // Copyright (C) 2006-2015 CEA/DEN, EDF R&D, OPEN CASCADE
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, or (at your option) any later version.
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.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 //
21 // File : aptrte.h
22 // Author : Alain PERRONNET
23 // Module : SMESH
24 // Date : 13 novembre 2006
25 
26 #ifndef aptrte__h
27 #define aptrte__h
28 
29 #include <climits> // limites min max int long real ...
30 #ifndef WIN32
31 #include <unistd.h> // gethostname, ...
32 #endif
33 #include <stdio.h>
34 #ifndef WIN32
35 #include <iostream> // pour cout cin ...
36 #include <iomanip> // pour le format des io setw, stx, setfill, ...
37 #endif
38 #include <string.h> // pour les fonctions sur les chaines de caracteres
39 #include <ctype.h>
40 #include <stdlib.h>
41 #include <math.h> // pour les fonctions mathematiques
42 #include <time.h>
43 
44 #include <sys/types.h>
45 #ifndef WIN32
46 #include <sys/time.h>
47 #endif
48 
49 #ifdef WIN32
50  #if defined MEFISTO2D_EXPORTS
51  #define MEFISTO2D_EXPORT __declspec( dllexport )
52  #else
53  #define MEFISTO2D_EXPORT __declspec( dllimport )
54  #endif
55  #define F2C_BUILD
56 #else
57  #define MEFISTO2D_EXPORT
58 #endif
59 
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 WIN32 & DFORTRAN
112  #define tempscpu TEMPSCPU
113  #define deltacpu DELTACPU
114  #define insoar INSOAR
115  #define azeroi AZEROI
116  #define fasoar FASOAR
117  #define teajte TEAJTE
118  #define tehote TEHOTE
119  #define tetrte TETRTE
120  #define aisoar AISOAR
121  #define tedela TEDELA
122  #define terefr TEREFR
123  #define tesuex TESUEX
124  #define teamqt TEAMQT
125  #define nusotr NUSOTR
126  #define qutr2d QUTR2D
127  #define surtd2 SURTD2
128  #define qualitetrte QUALITETRTE
129 
130  #define areteideale ARETEIDEALE
131 
132 #else
133  #define tempscpu tempscpu_
134  #define deltacpu deltacpu_
135  #define insoar insoar_
136  #define azeroi azeroi_
137  #define fasoar fasoar_
138  #define teajte teajte_
139  #define tehote tehote_
140  #define tetrte tetrte_
141  #define aisoar aisoar_
142  #define tedela tedela_
143  #define terefr terefr_
144  #define tesuex tesuex_
145  #define teamqt teamqt_
146  #define nusotr nusotr_
147  #define qutr2d qutr2d_
148  #define surtd2 surtd2_
149  #define qualitetrte qualitetrte_
150 
151  #define areteideale areteideale_
152 
153 #endif
154 
155 
156 extern "C" { void
157 #ifdef WIN32
158 #ifdef F2C_BUILD
159 #else
160  __stdcall
161 #endif
162 #endif
163  qualitetrte( R3 *mnpxyd,
164  Z & mosoar, Z & mxsoar, Z *mnsoar,
165  Z & moartr, Z & mxartr, Z *mnartr,
166  Z & nbtria, R & quamoy, R & quamin ); }
167 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
168 // but : calculer la qualite moyenne et minimale de la triangulation
169 // ----- actuelle definie par les tableaux nosoar et noartr
170 // entrees:
171 // --------
172 // mnpxyd : tableau des coordonnees 2d des points
173 // par point : x y distance_souhaitee
174 // mosoar : nombre maximal d'entiers par arete et
175 // indice dans nosoar de l'arete suivante dans le hachage
176 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
177 // attention: mxsoar>3*mxsomm obligatoire!
178 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
179 // chainage des aretes frontalieres, chainage du hachage des aretes
180 // hachage des aretes = nosoar(1)+nosoar(2)*2
181 // avec mxsoar>=3*mxsomm
182 // une arete i de nosoar est vide <=> nosoar(1,i)=0 et
183 // nosoar(2,arete vide)=l'arete vide qui precede
184 // nosoar(3,arete vide)=l'arete vide qui suit
185 // moartr : nombre maximal d'entiers par arete du tableau noartr
186 // mxartr : nombre maximal de triangles declarables
187 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
188 // arete1 = 0 si triangle vide => arete2 = triangle vide suivant
189 // sorties:
190 // --------
191 // nbtria : nombre de triangles internes au domaine
192 // quamoy : qualite moyenne des triangles actuels
193 // quamin : qualite minimale des triangles actuels
194 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
195 
196 extern "C" { void
197 #ifdef WIN32
198 #ifdef F2C_BUILD
199 #else
200  __stdcall
201 #endif
202 #endif
203  tempscpu( double & tempsec );
204 }
205 
206 //Retourne le temps CPU utilise en secondes
207 
208 extern "C" { void
209 #ifdef WIN32
210 #ifdef F2C_BUILD
211 #else
212  __stdcall
213 #endif
214 #endif
215  deltacpu( R & dtcpu );
216 }
217 
218 //Retourne le temps CPU utilise en secondes depuis le precedent appel
219 
220 //initialiser le tableau mnsoar pour le hachage des aretes
221 extern "C" {void
222 #ifdef WIN32
223 #ifdef F2C_BUILD
224 #else
225  __stdcall
226 #endif
227 #endif
228  insoar( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );
229 }
230 
231 //mettre a zero les nb entiers de tab
232 extern "C" {void
233 #ifdef WIN32
234 #ifdef F2C_BUILD
235 #else
236  __stdcall
237 #endif
238 #endif
239  azeroi( Z & nb, Z * tab );
240 }
241 
242 extern "C" {void
243 #ifdef WIN32
244 #ifdef F2C_BUILD
245 #else
246  __stdcall
247 #endif
248 #endif
249  fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
250  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst,
251  Z & noar, Z & ierr );
252 }
253 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
254 // but : former l'arete de sommet ns1-ns2 dans le hachage du tableau
255 // ----- nosoar des aretes de la triangulation
256 // entrees:
257 // --------
258 // ns1 ns2: numero pxyd des 2 sommets de l'arete
259 // nt1 : numero du triangle auquel appartient l'arete
260 // nt1=-1 si numero inconnu
261 // nt2 : numero de l'eventuel second triangle de l'arete si connu
262 // nt2=-1 si numero inconnu
263 // nolign : numero de la ligne fermee de l'arete
264 // =0 si l'arete n'est une arete de ligne
265 // ce numero est ajoute seulement si l'arete est creee
266 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
267 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
268 // modifies:
269 // ---------
270 // n1soar : numero de la premiere arete vide dans le tableau nosoar
271 // une arete i de nosoar est vide <=> nosoar(1,i)=0
272 // chainage des aretes vides amont et aval
273 // l'arete vide qui precede=nosoar(4,i)
274 // l'arete vide qui suit =nosoar(5,i)
275 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
276 // chainage momentan'e d'aretes, chainage du hachage des aretes
277 // hachage des aretes = min( nosoar(1), nosoar(2) )
278 // noarst : noarst(np) numero d'une arete du sommet np
279 
280 // ierr : si < 0 en entree pas d'affichage en cas d'erreur du type
281 // "arete appartenant a plus de 2 triangles et a creer!"
282 // si >=0 en entree affichage de ce type d'erreur
283 // sorties:
284 // --------
285 // noar : >0 numero de l'arete retrouvee ou ajoutee
286 // ierr : =0 si pas d'erreur
287 // =1 si le tableau nosoar est sature
288 // =2 si arete a creer et appartenant a 2 triangles distincts
289 // des triangles nt1 et nt2
290 // =3 si arete appartenant a 2 triangles distincts
291 // differents des triangles nt1 et nt2
292 // =4 si arete appartenant a 2 triangles distincts
293 // dont le second n'est pas le triangle nt2
294 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
295 
296 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
297 extern "C" {void
298 #ifdef WIN32
299 #ifdef F2C_BUILD
300 #else
301  __stdcall
302 #endif
303 #endif
304  teajte( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi,
305  R & aretmx, Z & mxtree, Z * letree,
306  Z & ierr );
307 }
308 
309 extern "C" {void
310 #ifdef WIN32
311 #ifdef F2C_BUILD
312 #else
313  __stdcall
314 #endif
315 #endif
316  tehote( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd,
317  R3 * comxmi, R & aretmx,
318  Z * letree, Z & mxqueu, Z * mnqueu,
319  Z & ierr );
320 }
321 // homogeneisation de l'arbre des te a un saut de taille au plus
322 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
323 
324 extern "C" {void
325 #ifdef WIN32
326 #ifdef F2C_BUILD
327 #else
328  __stdcall
329 #endif
330 #endif
331  tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
332  Z & mxqueu, Z * mnqueu, Z * mntree,
333  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
334  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
335  Z & ierr );
336 }
337 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
338 // et des points de la frontiere, des points internes imposes interieurs
339 
340 extern "C" {void
341 #ifdef WIN32
342 #ifdef F2C_BUILD
343 #else
344  __stdcall
345 #endif
346 #endif
347  aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );
348 }
349 // formation du chainage 6 des aretes internes a echanger eventuellement
350 
351 extern "C" {void
352 #ifdef WIN32
353 #ifdef F2C_BUILD
354 #else
355  __stdcall
356 #endif
357 #endif
358  tedela( R3 * mnpxyd, Z * mnarst,
359  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
360  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );
361 }
362 // boucle sur les aretes internes (non sur une ligne de la frontiere)
363 // avec echange des 2 diagonales afin de rendre la triangulation delaunay
364 
365 extern "C" {void
366 #ifdef WIN32
367 #ifdef F2C_BUILD
368 #else
369  __stdcall
370 #endif
371 #endif
372  terefr( Z & nbarpi, R3 * mnpxyd,
373  Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
374  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
375  Z & mxarcf, Z * mnarc1, Z * mnarc2,
376  Z * mnarc3, Z * mnarc4,
377  Z & n, Z & ierr );
378 }
379 // detection des aretes frontalieres initiales perdues
380 // triangulation frontale pour les restaurer
381 
382 extern "C" {void
383 #ifdef WIN32
384 #ifdef F2C_BUILD
385 #else
386  __stdcall
387 #endif
388 #endif
389  tesuex( Z & nblf, Z * nulftr,
390  Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
391  Z & mosoar, Z & mxsoar, Z * mnsoar,
392  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
393  Z & nbtria, Z * mntrsu, Z & ierr );
394 }
395 // suppression des triangles externes a la surface
396 
397 extern "C" {void
398 #ifdef WIN32
399 #ifdef F2C_BUILD
400 #else
401  __stdcall
402 #endif
403 #endif
404  teamqt( Z & nutysu, R & aretmx, R & airemx,
405  Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
406  Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
407  Z & mxarcf, Z * mntrcf, Z * mnstbo,
408  Z * n1arcf, Z * mnarcf, Z * mnarc1,
409  Z & nbarpi, Z & nbsomm, Z & mxsomm,
410  R3 * mnpxyd, Z * mnslig,
411  Z & ierr );
412 }
413 // amelioration de la qualite de la triangulation par
414 // barycentrage des sommets internes a la triangulation
415 // suppression des aretes trop longues ou trop courtes
416 // modification de la topologie des groupes de triangles
417 // mise en delaunay de la triangulation
418 
419 extern "C" {void
420 #ifdef WIN32
421 #ifdef F2C_BUILD
422 #else
423  __stdcall
424 #endif
425 #endif
426  nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr );
427 }
428 //retrouver les numero des 3 sommets du triangle nt
429 
430 extern "C" {void
431 #ifdef WIN32
432 #ifdef F2C_BUILD
433 #else
434  __stdcall
435 #endif
436 #endif
437  qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite );
438 }
439 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
440 
441 extern "C" { R
442 #ifdef WIN32
443 #ifdef F2C_BUILD
444 #else
445  __stdcall
446 #endif
447 #endif
448  surtd2( R3 & p1, R3 & p2, R3 & p3 );
449 }
450 //calcul de la surface d'un triangle defini par 3 points de r**2
451 
452 #endif
#define teajte
Definition: aptrte.h:138
#define tetrte
Definition: aptrte.h:140
#define teamqt
Definition: aptrte.h:145
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:87
#define surtd2
Definition: aptrte.h:148
#define terefr
Definition: aptrte.h:143
#define tehote
Definition: aptrte.h:139
#define aisoar
Definition: aptrte.h:141
#define qutr2d
Definition: aptrte.h:147
long int Z
Definition: Rn.h:72
#define tesuex
Definition: aptrte.h:144
#define tempscpu
Definition: aptrte.h:133
#define fasoar
Definition: aptrte.h:137
#define azeroi
Definition: aptrte.h:136
Definition: Rn.h:126
#define nusotr
Definition: aptrte.h:146
#define qualitetrte
Definition: aptrte.h:149
double R
Definition: Rn.h:79
#define MEFISTO2D_EXPORT
Definition: aptrte.h:57
#define insoar
Definition: aptrte.h:135
#define deltacpu
Definition: aptrte.h:134
#define tedela
Definition: aptrte.h:142