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