Salome HOME
PAL18328 SMESH_AdvancedEditor.py don't work in Debug version
[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 <limits.h>   // limites min max int long real ...
32 #include <unistd.h>   // gethostname, ...
33 #include <stdio.h>
34 #include <iostream.h> // pour cout cin ...
35 #include <iomanip.h>  // pour le format des io setw, stx, setfill, ...
36 #include <string.h>   // pour les fonctions sur les chaines de caracteres
37 #include <ctype.h>
38 #include <stdlib.h>
39 #include <math.h>     // pour les fonctions mathematiques
40 #include <time.h>
41
42 #include <sys/types.h>
43 #include <sys/time.h>
44
45 extern "C" {
46 void qualitetrte_( R3 *mnpxyd,
47                    Z & mosoar, Z & mxsoar, Z *mnsoar,
48                    Z & moartr, Z & mxartr, Z *mnartr,
49                    Z & nbtria, R & quamoy, R & quamin ); }
50 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51 // but :    calculer la qualite moyenne et minimale de la triangulation
52 // -----    actuelle definie par les tableaux nosoar et noartr
53 // entrees:
54 // --------
55 // mnpxyd : tableau des coordonnees 2d des points
56 //          par point : x  y  distance_souhaitee
57 // mosoar : nombre maximal d'entiers par arete et
58 //          indice dans nosoar de l'arete suivante dans le hachage
59 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
60 //          attention: mxsoar>3*mxsomm obligatoire!
61 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
62 //          chainage des aretes frontalieres, chainage du hachage des aretes
63 //          hachage des aretes = nosoar(1)+nosoar(2)*2
64 //          avec mxsoar>=3*mxsomm
65 //          une arete i de nosoar est vide <=> nosoar(1,i)=0 et
66 //          nosoar(2,arete vide)=l'arete vide qui precede
67 //          nosoar(3,arete vide)=l'arete vide qui suit
68 // moartr : nombre maximal d'entiers par arete du tableau noartr
69 // mxartr : nombre maximal de triangles declarables
70 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
71 //          arete1 = 0 si triangle vide => arete2 = triangle vide suivant
72 // sorties:
73 // --------
74 // nbtria : nombre de triangles internes au domaine
75 // quamoy : qualite moyenne  des triangles actuels
76 // quamin : qualite minimale des triangles actuels
77 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
78
79
80 void  aptrte( Z nutysu, R aretmx,
81               Z nblf,   Z *nudslf, R2 *uvslf,
82               Z nbpti,  R2 *uvpti,
83               Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
84               Z & ierr );
85 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
86 // but : appel de la triangulation par un arbre-4 recouvrant
87 // ----- de triangles equilateraux
88 //       le contour du domaine plan est defini par des lignes fermees
89 //       la premiere ligne etant l'enveloppe de toutes les autres
90 //       la fonction areteideale_(s,d) donne la taille d'arete
91 //       au point s dans la direction d (direction inactive pour l'instant)
92 //       des lors toute arete issue d'un sommet s devrait avoir une longueur
93 //       comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
94 //
95 //Attention:
96 //  Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
97 //  De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
98 //
99 // entrees:
100 // --------
101 // nutysu : numero de traitement de areteideale_() selon le type de surface
102 //          0 pas d'emploi de la fonction areteideale_() et aretmx est active
103 //          1 il existe une fonction areteideale_(s,d)
104 //            dont seules les 2 premieres composantes de uv sont actives
105 //          ... autres options a definir ...
106 // aretmx : longueur maximale des aretes de la future triangulation
107 // nblf   : nombre de lignes fermees de la surface
108 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees
109 //          nudslf(0)=0 pour permettre la difference sans test
110 //          Attention le dernier sommet de chaque ligne est raccorde au premier
111 //          tous les sommets et les points internes ont des coordonnees
112 //          UV differentes <=> Pas de point double!
113 // uvslf  : uv des nudslf(nblf) sommets des lignes fermees
114 // nbpti  : nombre de points internes futurs sommets de la triangulation
115 // uvpti  : uv des points internes futurs sommets de la triangulation
116 //
117 // sorties:
118 // --------
119 // nbst   : nombre de sommets de la triangulation finale
120 // uvst   : coordonnees uv des nbst sommets de la triangulation
121 // nbt    : nombre de triangles de la triangulation finale
122 // nust   : 3 numeros dans uvst des sommets des nbt triangles
123 // ierr   : 0 si pas d'erreur
124 //        > 0 sinon
125 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126 // auteur : Alain Perronnet  Analyse Numerique Paris UPMC   decembre 2001
127 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128
129 extern "C" {  void tempscpu_( double & tempsec );  }
130 //Retourne le temps CPU utilise en secondes
131
132 extern "C" { void deltacpu_( R & dtcpu ); }
133 //Retourne le temps CPU utilise en secondes depuis le precedent appel
134
135 //initialiser le tableau mnsoar pour le hachage des aretes
136 extern "C" {void insoar_( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );}
137
138 //mettre a zero les nb entiers de tab
139 extern "C" {void azeroi_( Z & nb, Z * tab );}
140
141 extern "C" {void fasoar_( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
142                           Z & mosoar,  Z & mxsoar,  Z & n1soar,  Z * mnsoar,  Z * mnarst,
143                           Z & noar, Z & ierr );}
144 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
145 // but :    former l'arete de sommet ns1-ns2 dans le hachage du tableau
146 // -----    nosoar des aretes de la triangulation
147 // entrees:
148 // --------
149 // ns1 ns2: numero pxyd des 2 sommets de l'arete
150 // nt1    : numero du triangle auquel appartient l'arete
151 //          nt1=-1 si numero inconnu
152 // nt2    : numero de l'eventuel second triangle de l'arete si connu
153 //          nt2=-1 si numero inconnu
154 // nolign : numero de la ligne fermee de l'arete
155 //          =0 si l'arete n'est une arete de ligne
156 //          ce numero est ajoute seulement si l'arete est creee
157 // mosoar : nombre maximal d'entiers par arete du tableau nosoar
158 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
159 // modifies:
160 // ---------
161 // n1soar : numero de la premiere arete vide dans le tableau nosoar
162 //          une arete i de nosoar est vide  <=>  nosoar(1,i)=0
163 //          chainage des aretes vides amont et aval
164 //          l'arete vide qui precede=nosoar(4,i)
165 //          l'arete vide qui suit   =nosoar(5,i)
166 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
167 //          chainage momentan'e d'aretes, chainage du hachage des aretes
168 //          hachage des aretes = min( nosoar(1), nosoar(2) )
169 // noarst : noarst(np) numero d'une arete du sommet np
170
171 // ierr   : si < 0  en entree pas d'affichage en cas d'erreur du type
172 //         "arete appartenant a plus de 2 triangles et a creer!"
173 //          si >=0  en entree       affichage de ce type d'erreur
174 // sorties:
175 // --------
176 // noar   : >0 numero de l'arete retrouvee ou ajoutee
177 // ierr   : =0 si pas d'erreur
178 //          =1 si le tableau nosoar est sature
179 //          =2 si arete a creer et appartenant a 2 triangles distincts
180 //             des triangles nt1 et nt2
181 //          =3 si arete appartenant a 2 triangles distincts
182 //             differents des triangles nt1 et nt2
183 //          =4 si arete appartenant a 2 triangles distincts
184 //             dont le second n'est pas le triangle nt2
185 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
186
187 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
188 extern "C" {void teajte_( Z & mxsomm, Z &  nbsomm, R3 * mnpxyd,  R3 * comxmi,
189                           R & aretmx,  Z & mxtree, Z * letree,
190                           Z & ierr );}
191
192
193 extern "C" {void tehote_( Z & nutysu, Z & nbarpi, Z &  mxsomm, Z &  nbsomm, R3 * mnpxyd,
194                           R3 * comxmi, R & aretmx,
195                           Z * letree, Z & mxqueu, Z * mnqueu,
196                           Z & ierr );}
197 // homogeneisation de l'arbre des te a un saut de taille au plus
198 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
199
200 extern "C" {void tetrte_(  R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
201                            Z & mxqueu,  Z * mnqueu,  Z * mntree,
202                            Z & mosoar,  Z & mxsoar,  Z & n1soar, Z * mnsoar,
203                            Z & moartr, Z &  mxartr,  Z & n1artr,  Z * mnartr,  Z * mnarst,
204                            Z & ierr );}
205 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
206 // et des points de la frontiere, des points internes imposes interieurs
207
208 extern "C" {void aisoar_( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );}
209   // formation du chainage 6 des aretes internes a echanger eventuellement
210
211 extern "C" {void tedela_( R3 * mnpxyd, Z * mnarst,
212                           Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
213                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );}
214   // boucle sur les aretes internes (non sur une ligne de la frontiere)
215   // avec echange des 2 diagonales afin de rendre la triangulation delaunay
216  
217 extern "C" {void terefr_( Z & nbarpi, R3 * mnpxyd,
218                           Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
219                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
220                           Z & mxarcf, Z * mnarc1, Z * mnarc2,
221                           Z * mnarc3, Z * mnarc4,
222                           Z & n, Z & ierr );}
223 // detection des aretes frontalieres initiales perdues
224 // triangulation frontale pour les restaurer
225
226 extern "C" {void tesuex_( Z & nblf, Z * nulftr,
227                           Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
228                           Z & mosoar, Z & mxsoar, Z * mnsoar,
229                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
230                           Z & nbtria, Z * mntrsu, Z & ierr );}
231 // suppression des triangles externes a la surface
232
233 extern "C" {void teamqt_( Z & nutysu, R & aretmx, R & airemx,
234                           Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
235                           Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
236                           Z & mxarcf, Z * mntrcf, Z * mnstbo,
237                           Z * n1arcf, Z * mnarcf, Z * mnarc1,
238                           Z & nbarpi, Z & nbsomm, Z & mxsomm,
239                           R3 * mnpxyd, Z * mnslig,
240                           Z & ierr );}
241 // amelioration de la qualite de la triangulation par
242 // barycentrage des sommets internes a la triangulation
243 // suppression des aretes trop longues ou trop courtes
244 // modification de la topologie des groupes de triangles
245 // mise en delaunay de la triangulation
246  
247 extern "C" {void nusotr_( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,
248                           Z * nosotr );}
249 //retrouver les numero des 3 sommets du triangle nt
250
251 extern "C" {void qutr2d_( R3 & p1, R3 & p2, R3 & p3, R & qualite );}
252 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
253
254 extern "C" { R surtd2_( R3 & p1, R3 & p2, R3 & p3 ); }
255 //calcul de la surface d'un triangle defini par 3 points de r**2
256
257 #endif