]> SALOME platform Git repositories - modules/smesh.git/blob - src/MEFISTO2/aptrte.h
Salome HOME
22359: Body Fitting algorithm: grid orientation
[modules/smesh.git] / src / MEFISTO2 / aptrte.h
1 //  SMESH MEFISTO2 : algorithm for meshing
2 //
3 // Copyright (C) 2006-2013  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.
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 #else
56  #define MEFISTO2D_EXPORT
57 #endif
58
59
60 MEFISTO2D_EXPORT
61   void  aptrte( Z nutysu, R aretmx,
62               Z nblf,   Z *nudslf, R2 *uvslf,
63               Z nbpti,  R2 *uvpti,
64               Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
65               Z & ierr );
66 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
67 // but : appel de la triangulation par un arbre-4 recouvrant
68 // ----- de triangles equilateraux
69 //       le contour du domaine plan est defini par des lignes fermees
70 //       la premiere ligne etant l'enveloppe de toutes les autres
71 //       la fonction areteideale_(s,d) donne la taille d'arete
72 //       au point s dans la direction d (direction inactive pour l'instant)
73 //       des lors toute arete issue d'un sommet s devrait avoir une longueur
74 //       comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
75 //
76 //Attention:
77 //  Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
78 //  De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
79 //
80 // entrees:
81 // --------
82 // nutysu : numero de traitement de areteideale_() selon le type de surface
83 //          0 pas d'emploi de la fonction areteideale_() et aretmx est active
84 //          1 il existe une fonction areteideale_(s,d)
85 //            dont seules les 2 premieres composantes de uv sont actives
86 //          ... autres options a definir ...
87 // aretmx : longueur maximale des aretes de la future triangulation
88 // nblf   : nombre de lignes fermees de la surface
89 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees
90 //          nudslf(0)=0 pour permettre la difference sans test
91 //          Attention le dernier sommet de chaque ligne est raccorde au premier
92 //          tous les sommets et les points internes ont des coordonnees
93 //          UV differentes <=> Pas de point double!
94 // uvslf  : uv des nudslf(nblf) sommets des lignes fermees
95 // nbpti  : nombre de points internes futurs sommets de la triangulation
96 // uvpti  : uv des points internes futurs sommets de la triangulation
97 //
98 // sorties:
99 // --------
100 // nbst   : nombre de sommets de la triangulation finale
101 // uvst   : coordonnees uv des nbst sommets de la triangulation
102 // nbt    : nombre de triangles de la triangulation finale
103 // nust   : 3 numeros dans uvst des sommets des nbt triangles
104 // ierr   : 0 si pas d'erreur
105 //        > 0 sinon
106 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
107 // auteur : Alain Perronnet  Analyse Numerique Paris UPMC   decembre 2001
108 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
109
110 #if WIN32 & DFORTRAN
111   #define tempscpu TEMPSCPU
112   #define deltacpu DELTACPU
113   #define insoar   INSOAR
114   #define azeroi   AZEROI
115   #define fasoar   FASOAR
116   #define teajte   TEAJTE
117   #define tehote   TEHOTE
118   #define tetrte   TETRTE
119   #define aisoar   AISOAR
120   #define tedela   TEDELA
121   #define terefr   TEREFR
122   #define tesuex   TESUEX
123   #define teamqt   TEAMQT
124   #define nusotr   NUSOTR
125   #define qutr2d   QUTR2D
126   #define surtd2   SURTD2
127   #define qualitetrte   QUALITETRTE
128   
129   #define areteideale ARETEIDEALE
130   
131 #else
132   #define tempscpu tempscpu_
133   #define deltacpu deltacpu_
134   #define insoar   insoar_
135   #define azeroi   azeroi_
136   #define fasoar   fasoar_
137   #define teajte   teajte_
138   #define tehote   tehote_
139   #define tetrte   tetrte_
140   #define aisoar   aisoar_
141   #define tedela   tedela_
142   #define terefr   terefr_
143   #define tesuex   tesuex_
144   #define teamqt   teamqt_
145   #define nusotr   nusotr_
146   #define qutr2d   qutr2d_
147   #define surtd2   surtd2_
148   #define qualitetrte   qualitetrte_
149
150   #define areteideale areteideale_
151
152 #endif
153
154
155 extern "C" { void
156 #ifdef WIN32
157 #ifdef F2C_BUILD
158 #else
159               __stdcall
160 #endif
161 #endif
162    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
196 #ifdef WIN32
197 #ifdef F2C_BUILD
198 #else
199               __stdcall
200 #endif
201 #endif
202   tempscpu( double & tempsec );
203 }
204     
205 //Retourne le temps CPU utilise en secondes
206
207 extern "C" { void
208 #ifdef WIN32
209 #ifdef F2C_BUILD
210 #else
211               __stdcall
212 #endif
213 #endif
214   deltacpu( R & dtcpu );
215 }
216     
217 //Retourne le temps CPU utilise en secondes depuis le precedent appel
218
219 //initialiser le tableau mnsoar pour le hachage des aretes
220 extern "C" {void
221 #ifdef WIN32
222 #ifdef F2C_BUILD
223 #else
224               __stdcall
225 #endif
226 #endif
227   insoar( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );
228 }
229
230 //mettre a zero les nb entiers de tab
231 extern "C" {void
232 #ifdef WIN32
233 #ifdef F2C_BUILD
234 #else
235               __stdcall
236 #endif
237 #endif
238   azeroi( Z & nb, Z * tab );
239 }
240
241 extern "C" {void
242 #ifdef WIN32
243 #ifdef F2C_BUILD
244 #else
245               __stdcall
246 #endif
247 #endif
248   fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
249                           Z & mosoar,  Z & mxsoar,  Z & n1soar,  Z * mnsoar,  Z * mnarst,
250                           Z & noar, Z & ierr );
251 }
252 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
253 // but :    former l'arete de sommet ns1-ns2 dans le hachage du tableau
254 // -----    nosoar des aretes de la triangulation
255 // entrees:
256 // --------
257 // ns1 ns2: numero pxyd des 2 sommets de l'arete
258 // nt1    : numero du triangle auquel appartient l'arete
259 //          nt1=-1 si numero inconnu
260 // nt2    : numero de l'eventuel second triangle de l'arete si connu
261 //          nt2=-1 si numero inconnu
262 // nolign : numero de la ligne fermee de l'arete
263 //          =0 si l'arete n'est une arete de ligne
264 //          ce numero est ajoute seulement si l'arete est creee
265 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
266 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
267 // modifies:
268 // ---------
269 // n1soar : numero de la premiere arete vide dans le tableau nosoar
270 //          une arete i de nosoar est vide  <=>  nosoar(1,i)=0
271 //          chainage des aretes vides amont et aval
272 //          l'arete vide qui precede=nosoar(4,i)
273 //          l'arete vide qui suit   =nosoar(5,i)
274 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
275 //          chainage momentan'e d'aretes, chainage du hachage des aretes
276 //          hachage des aretes = min( nosoar(1), nosoar(2) )
277 // noarst : noarst(np) numero d'une arete du sommet np
278
279 // ierr   : si < 0  en entree pas d'affichage en cas d'erreur du type
280 //         "arete appartenant a plus de 2 triangles et a creer!"
281 //          si >=0  en entree       affichage de ce type d'erreur
282 // sorties:
283 // --------
284 // noar   : >0 numero de l'arete retrouvee ou ajoutee
285 // ierr   : =0 si pas d'erreur
286 //          =1 si le tableau nosoar est sature
287 //          =2 si arete a creer et appartenant a 2 triangles distincts
288 //             des triangles nt1 et nt2
289 //          =3 si arete appartenant a 2 triangles distincts
290 //             differents des triangles nt1 et nt2
291 //          =4 si arete appartenant a 2 triangles distincts
292 //             dont le second n'est pas le triangle nt2
293 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
294
295 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
296 extern "C" {void
297 #ifdef WIN32
298 #ifdef F2C_BUILD
299 #else
300               __stdcall
301 #endif
302 #endif
303   teajte( Z & mxsomm, Z &  nbsomm, R3 * mnpxyd,  R3 * comxmi,
304                             R & aretmx,  Z & mxtree, Z * letree,
305                             Z & ierr );
306 }
307
308 extern "C" {void
309 #ifdef WIN32
310 #ifdef F2C_BUILD
311 #else
312               __stdcall
313 #endif
314 #endif
315   tehote( Z & nutysu, Z & nbarpi, Z &  mxsomm, Z &  nbsomm, R3 * mnpxyd,
316                             R3 * comxmi, R & aretmx,
317                             Z * letree, Z & mxqueu, Z * mnqueu,
318                             Z & ierr );
319 }
320 // homogeneisation de l'arbre des te a un saut de taille au plus
321 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
322
323 extern "C" {void
324 #ifdef WIN32
325 #ifdef F2C_BUILD
326 #else
327               __stdcall
328 #endif
329 #endif
330   tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
331                             Z & mxqueu,  Z * mnqueu,  Z * mntree,
332                             Z & mosoar,  Z & mxsoar,  Z & n1soar, Z * mnsoar,
333                             Z & moartr, Z &  mxartr,  Z & n1artr,  Z * mnartr,  Z * mnarst,
334                             Z & ierr );
335 }
336 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
337 // et des points de la frontiere, des points internes imposes interieurs
338
339 extern "C" {void
340 #ifdef WIN32
341 #ifdef F2C_BUILD
342 #else
343               __stdcall
344 #endif
345 #endif
346   aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );
347 }
348 // formation du chainage 6 des aretes internes a echanger eventuellement
349
350 extern "C" {void
351 #ifdef WIN32
352 #ifdef F2C_BUILD
353 #else
354               __stdcall
355 #endif
356 #endif
357   tedela( R3 * mnpxyd, Z * mnarst,
358                             Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
359                             Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );
360 }
361 // boucle sur les aretes internes (non sur une ligne de la frontiere)
362 // avec echange des 2 diagonales afin de rendre la triangulation delaunay
363  
364 extern "C" {void
365 #ifdef WIN32
366 #ifdef F2C_BUILD
367 #else
368               __stdcall
369 #endif
370 #endif
371   terefr( Z & nbarpi, R3 * mnpxyd,
372                             Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
373                             Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
374                             Z & mxarcf, Z * mnarc1, Z * mnarc2,
375                             Z * mnarc3, Z * mnarc4,
376                             Z & n, Z & ierr );
377 }
378 // detection des aretes frontalieres initiales perdues
379 // triangulation frontale pour les restaurer
380
381 extern "C" {void
382 #ifdef WIN32
383 #ifdef F2C_BUILD
384 #else
385               __stdcall
386 #endif
387 #endif
388   tesuex( Z & nblf, Z * nulftr,
389                             Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
390                             Z & mosoar, Z & mxsoar, Z * mnsoar,
391                             Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
392                             Z & nbtria, Z * mntrsu, Z & ierr );
393 }
394 // suppression des triangles externes a la surface
395
396 extern "C" {void
397 #ifdef WIN32
398 #ifdef F2C_BUILD
399 #else
400               __stdcall
401 #endif
402 #endif
403   teamqt( Z & nutysu, R & aretmx, R & airemx,
404                             Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
405                             Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
406                             Z & mxarcf, Z * mntrcf, Z * mnstbo,
407                             Z * n1arcf, Z * mnarcf, Z * mnarc1,
408                             Z & nbarpi, Z & nbsomm, Z & mxsomm,
409                             R3 * mnpxyd, Z * mnslig,
410                             Z & ierr );
411 }
412 // amelioration de la qualite de la triangulation par
413 // barycentrage des sommets internes a la triangulation
414 // suppression des aretes trop longues ou trop courtes
415 // modification de la topologie des groupes de triangles
416 // mise en delaunay de la triangulation
417  
418 extern "C" {void
419 #ifdef WIN32
420 #ifdef F2C_BUILD
421 #else
422               __stdcall
423 #endif
424 #endif
425   nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr );
426 }
427 //retrouver les numero des 3 sommets du triangle nt
428
429 extern "C" {void
430 #ifdef WIN32
431 #ifdef F2C_BUILD
432 #else
433               __stdcall
434 #endif
435 #endif
436   qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite );
437 }
438 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
439
440 extern "C" { R
441 #ifdef WIN32
442 #ifdef F2C_BUILD
443 #else
444               __stdcall
445 #endif
446 #endif
447   surtd2( R3 & p1, R3 & p2, R3 & p3 );
448 }
449 //calcul de la surface d'un triangle defini par 3 points de r**2
450
451 #endif