Salome HOME
*** empty log message ***
[modules/smesh.git] / src / MEFISTO2 / aptrte.h
1 //  SMESH MEFISTO2 : algorithm for meshing
2 //
3 //  Copyright (C) 2003  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
27 #ifndef aptrte__h
28 #define aptrte__h
29
30 #include <limits.h>   // limites min max int long real ...
31 #ifndef WIN32
32 #include <unistd.h>   // gethostname, ...
33 #endif
34 #include <stdio.h>
35 #ifndef WIN32
36 #include <iostream.h> // pour cout cin ...
37 #include <iomanip.h>  // pour le format des io setw, stx, setfill, ...
38 #endif
39 #include <string.h>   // pour les fonctions sur les chaines de caracteres
40 #include <ctype.h>
41 #include <stdlib.h>
42 #include <math.h>     // pour les fonctions mathematiques
43 #include <time.h>
44
45 #include <sys/types.h>
46 #ifndef WIN32
47 #include <sys/time.h>
48 #endif
49
50 #ifdef WNT
51  #if defined MEFISTO2D_EXPORTS
52   #define MEFISTO2D_EXPORT __declspec( dllexport )
53  #else
54   #define MEFISTO2D_EXPORT __declspec( dllimport )
55  #endif
56 #else
57  #define MEFISTO2D_EXPORT
58 #endif
59
60   void qualitetrte( R3 *mnpxyd,
61                   Z & mosoar, Z & mxsoar, Z *mnsoar,
62                   Z & moartr, Z & mxartr, Z *mnartr,
63                   Z & nbtria, R & quamoy, R & quamin );
64 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
65 // but :    calculer la qualite moyenne et minimale de la triangulation
66 // -----    actuelle definie par les tableaux nosoar et noartr
67 // entrees:
68 // --------
69 // mnpxyd : tableau des coordonnees 2d des points
70 //          par point : x  y  distance_souhaitee
71 // mosoar : nombre maximal d'entiers par arete et
72 //          indice dans nosoar de l'arete suivante dans le hachage
73 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
74 //          attention: mxsoar>3*mxsomm obligatoire!
75 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
76 //          chainage des aretes frontalieres, chainage du hachage des aretes
77 //          hachage des aretes = nosoar(1)+nosoar(2)*2
78 //          avec mxsoar>=3*mxsomm
79 //          une arete i de nosoar est vide <=> nosoar(1,i)=0 et
80 //          nosoar(2,arete vide)=l'arete vide qui precede
81 //          nosoar(3,arete vide)=l'arete vide qui suit
82 // moartr : nombre maximal d'entiers par arete du tableau noartr
83 // mxartr : nombre maximal de triangles declarables
84 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
85 //          arete1 = 0 si triangle vide => arete2 = triangle vide suivant
86 // sorties:
87 // --------
88 // nbtria : nombre de triangles internes au domaine
89 // quamoy : qualite moyenne  des triangles actuels
90 // quamin : qualite minimale des triangles actuels
91 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
92
93
94 MEFISTO2D_EXPORT
95   void  aptrte( Z nutysu, R aretmx,
96               Z nblf,   Z *nudslf, R2 *uvslf,
97               Z nbpti,  R2 *uvpti,
98               Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
99               Z & ierr );
100 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
101 // but : appel de la triangulation par un arbre-4 recouvrant
102 // ----- de triangles equilateraux
103 //       le contour du domaine plan est defini par des lignes fermees
104 //       la premiere ligne etant l'enveloppe de toutes les autres
105 //       la fonction areteideale_(s,d) donne la taille d'arete
106 //       au point s dans la direction d (direction inactive pour l'instant)
107 //       des lors toute arete issue d'un sommet s devrait avoir une longueur
108 //       comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
109 //
110 //Attention:
111 //  Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
112 //  De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
113 //
114 // entrees:
115 // --------
116 // nutysu : numero de traitement de areteideale_() selon le type de surface
117 //          0 pas d'emploi de la fonction areteideale_() et aretmx est active
118 //          1 il existe une fonction areteideale_(s,d)
119 //            dont seules les 2 premieres composantes de uv sont actives
120 //          ... autres options a definir ...
121 // aretmx : longueur maximale des aretes de la future triangulation
122 // nblf   : nombre de lignes fermees de la surface
123 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees
124 //          nudslf(0)=0 pour permettre la difference sans test
125 //          Attention le dernier sommet de chaque ligne est raccorde au premier
126 //          tous les sommets et les points internes ont des coordonnees
127 //          UV differentes <=> Pas de point double!
128 // uvslf  : uv des nudslf(nblf) sommets des lignes fermees
129 // nbpti  : nombre de points internes futurs sommets de la triangulation
130 // uvpti  : uv des points internes futurs sommets de la triangulation
131 //
132 // sorties:
133 // --------
134 // nbst   : nombre de sommets de la triangulation finale
135 // uvst   : coordonnees uv des nbst sommets de la triangulation
136 // nbt    : nombre de triangles de la triangulation finale
137 // nust   : 3 numeros dans uvst des sommets des nbt triangles
138 // ierr   : 0 si pas d'erreur
139 //        > 0 sinon
140 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
141 // auteur : Alain Perronnet  Analyse Numerique Paris UPMC   decembre 2001
142 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
143
144 extern "C" {  void
145 #ifdef WIN32
146               __stdcall
147 #endif
148 #ifdef DFORTRAN
149   TEMPSCPU( double & tempsec );  }
150 #else
151   tempscpu_( double & tempsec );  }
152 #endif
153     
154 //Retourne le temps CPU utilise en secondes
155
156 extern "C" { void
157 #ifdef WIN32
158               __stdcall
159 #endif
160 #ifdef DFORTRAN
161   DELTACPU( R & dtcpu ); }
162 #else
163   deltacpu_( R & dtcpu ); }
164 #endif
165     
166 //Retourne le temps CPU utilise en secondes depuis le precedent appel
167
168 //initialiser le tableau mnsoar pour le hachage des aretes
169 extern "C" {void
170 #ifdef WIN32
171               __stdcall
172 #endif
173 #ifdef DFORTRAN
174   INSOAR( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );}
175 #else
176   insoar_( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );}
177 #endif  
178
179 //mettre a zero les nb entiers de tab
180 extern "C" {void
181 #ifdef WIN32
182               __stdcall
183 #endif
184 #ifdef DFORTRAN
185   AZEROI( Z & nb, Z * tab );}
186 #else
187   azeroi_( Z & nb, Z * tab );}
188 #endif
189
190 extern "C" {void
191 #ifdef WIN32
192               __stdcall
193 #endif
194 #ifdef DFORTRAN
195   FASOAR( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
196 #else
197   fasoar_( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
198 #endif  
199                           Z & mosoar,  Z & mxsoar,  Z & n1soar,  Z * mnsoar,  Z * mnarst,
200                           Z & noar, Z & ierr );}
201 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
202 // but :    former l'arete de sommet ns1-ns2 dans le hachage du tableau
203 // -----    nosoar des aretes de la triangulation
204 // entrees:
205 // --------
206 // ns1 ns2: numero pxyd des 2 sommets de l'arete
207 // nt1    : numero du triangle auquel appartient l'arete
208 //          nt1=-1 si numero inconnu
209 // nt2    : numero de l'eventuel second triangle de l'arete si connu
210 //          nt2=-1 si numero inconnu
211 // nolign : numero de la ligne fermee de l'arete
212 //          =0 si l'arete n'est une arete de ligne
213 //          ce numero est ajoute seulement si l'arete est creee
214 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
215 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
216 // modifies:
217 // ---------
218 // n1soar : numero de la premiere arete vide dans le tableau nosoar
219 //          une arete i de nosoar est vide  <=>  nosoar(1,i)=0
220 //          chainage des aretes vides amont et aval
221 //          l'arete vide qui precede=nosoar(4,i)
222 //          l'arete vide qui suit   =nosoar(5,i)
223 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
224 //          chainage momentan'e d'aretes, chainage du hachage des aretes
225 //          hachage des aretes = min( nosoar(1), nosoar(2) )
226 // noarst : noarst(np) numero d'une arete du sommet np
227
228 // ierr   : si < 0  en entree pas d'affichage en cas d'erreur du type
229 //         "arete appartenant a plus de 2 triangles et a creer!"
230 //          si >=0  en entree       affichage de ce type d'erreur
231 // sorties:
232 // --------
233 // noar   : >0 numero de l'arete retrouvee ou ajoutee
234 // ierr   : =0 si pas d'erreur
235 //          =1 si le tableau nosoar est sature
236 //          =2 si arete a creer et appartenant a 2 triangles distincts
237 //             des triangles nt1 et nt2
238 //          =3 si arete appartenant a 2 triangles distincts
239 //             differents des triangles nt1 et nt2
240 //          =4 si arete appartenant a 2 triangles distincts
241 //             dont le second n'est pas le triangle nt2
242 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
243
244 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
245 extern "C" {void
246 #ifdef WIN32
247               __stdcall
248 #endif
249 #ifdef DFORTRAN
250   TEAJTE
251 #else
252   teajte_
253 #endif
254     ( Z & mxsomm, Z &  nbsomm, R3 * mnpxyd,  R3 * comxmi,
255                           R & aretmx,  Z & mxtree, Z * letree,
256                           Z & ierr );}
257
258
259 extern "C" {void
260 #ifdef WIN32
261               __stdcall
262 #endif
263 #ifdef DFORTRAN
264   TEHOTE
265 #else
266   tehote_
267 #endif
268     ( Z & nutysu, Z & nbarpi, Z &  mxsomm, Z &  nbsomm, R3 * mnpxyd,
269                           R3 * comxmi, R & aretmx,
270                           Z * letree, Z & mxqueu, Z * mnqueu,
271                           Z & ierr );}
272 // homogeneisation de l'arbre des te a un saut de taille au plus
273 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
274
275 extern "C" {void
276 #ifdef WIN32
277               __stdcall
278 #endif
279 #ifdef DFORTRAN
280   TETRTE
281 #else
282   tetrte_
283 #endif
284     (  R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
285                            Z & mxqueu,  Z * mnqueu,  Z * mntree,
286                            Z & mosoar,  Z & mxsoar,  Z & n1soar, Z * mnsoar,
287                            Z & moartr, Z &  mxartr,  Z & n1artr,  Z * mnartr,  Z * mnarst,
288                            Z & ierr );}
289 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
290 // et des points de la frontiere, des points internes imposes interieurs
291
292 extern "C" {void
293 #ifdef WIN32
294               __stdcall
295 #endif
296 #ifdef DFORTRAN
297   AISOAR
298 #else
299   aisoar_
300 #endif
301     ( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );}
302   // formation du chainage 6 des aretes internes a echanger eventuellement
303
304 extern "C" {void
305 #ifdef WIN32
306               __stdcall
307 #endif
308 #ifdef DFORTRAN
309   TEDELA
310 #else
311   tedela_
312 #endif
313     ( R3 * mnpxyd, Z * mnarst,
314                           Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
315                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );}
316   // boucle sur les aretes internes (non sur une ligne de la frontiere)
317   // avec echange des 2 diagonales afin de rendre la triangulation delaunay
318  
319 extern "C" {void
320 #ifdef WIN32
321               __stdcall
322 #endif
323 #ifdef DFORTRAN
324   TEREFR
325 #else
326   terefr_
327 #endif
328     ( Z & nbarpi, R3 * mnpxyd,
329                           Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
330                           Z & moartr, Z & n1artr, Z * mnartr, Z * mnarst,
331                           Z & mxarcf, Z * mnarc1, Z * mnarc2,
332                           Z * mnarc3, Z * mnarc4,
333                           Z & n, Z & ierr );}
334 // detection des aretes frontalieres initiales perdues
335 // triangulation frontale pour les restaurer
336
337 extern "C" {void
338 #ifdef WIN32
339               __stdcall
340 #endif
341 #ifdef DFORTRAN
342   TESUEX
343 #else
344   tesuex_
345 #endif
346     ( Z & nblf, Z * nulftr,
347                           Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
348                           Z & mosoar, Z & mxsoar, Z * mnsoar,
349                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
350                           Z & nbtria, Z * mntrsu, Z & ierr );}
351 // suppression des triangles externes a la surface
352
353 extern "C" {void
354 #ifdef WIN32
355               __stdcall
356 #endif
357 #ifdef DFORTRAN
358   TEAMQT
359 #else
360   teamqt_
361 #endif
362     ( Z & nutysu,
363                           Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
364                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
365                           Z & mxarcf, Z * mntrcf, Z * mnstbo,
366                           Z * n1arcf, Z * mnarcf, Z * mnarc1,
367                           R3 * comxmi, Z & nbarpi, Z & nbsomm, Z & mxsomm,
368                           R3 * mnpxyd, Z * mnslig,
369                           Z & ierr );}
370 // amelioration de la qualite de la triangulation par
371 // barycentrage des sommets internes a la triangulation
372 // suppression des aretes trop longues ou trop courtes
373 // modification de la topologie des groupes de triangles
374 // mise en delaunay de la triangulation
375  
376 extern "C" {void
377 #ifdef WIN32
378               __stdcall
379 #endif
380 #ifdef DFORTRAN
381   NUSOTR
382 #else
383   nusotr_
384 #endif
385     ( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr );}
386 //retrouver les numero des 3 sommets du triangle nt
387
388 extern "C" {void
389 #ifdef WIN32
390               __stdcall
391 #endif
392 #ifdef DFORTRAN
393   QUTR2D
394 #else
395   qutr2d_
396 #endif
397     ( R3 & p1, R3 & p2, R3 & p3, R & qualite );}
398 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
399
400 extern "C" { R
401 #ifdef WIN32
402               __stdcall
403 #endif
404 #ifdef DFORTRAN
405   SURTD2
406 #else
407   surtd2_
408 #endif
409     ( R3 & p1, R3 & p2, R3 & p3 ); }
410 //calcul de la surface d'un triangle defini par 3 points de r**2
411
412 #endif