00001 // SMESH MEFISTO2 : algorithm for meshing 00002 // 00003 // Copyright (C) 2006 Laboratoire J.-L. Lions UPMC Paris 00004 // 00005 // This library is free software; you can redistribute it and/or 00006 // modify it under the terms of the GNU Lesser General Public 00007 // License as published by the Free Software Foundation; either 00008 // version 2.1 of the License. 00009 // 00010 // This library is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 // Lesser General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public 00016 // License along with this library; if not, write to the Free Software 00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 // 00019 // See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr 00020 // 00021 // 00022 // 00023 // File : aptrte.h 00024 // Author : Alain PERRONNET 00025 // Module : SMESH 00026 // Date : 13 novembre 2006 00027 00028 #ifndef aptrte__h 00029 #define aptrte__h 00030 00031 #include <climits> // limites min max int long real ... 00032 #ifndef WIN32 00033 #include <unistd.h> // gethostname, ... 00034 #endif 00035 #include <stdio.h> 00036 #ifndef WIN32 00037 #include <iostream> // pour cout cin ... 00038 #include <iomanip> // pour le format des io setw, stx, setfill, ... 00039 #endif 00040 #include <string.h> // pour les fonctions sur les chaines de caracteres 00041 #include <ctype.h> 00042 #include <stdlib.h> 00043 #include <math.h> // pour les fonctions mathematiques 00044 #include <time.h> 00045 00046 #include <sys/types.h> 00047 #ifndef WIN32 00048 #include <sys/time.h> 00049 #endif 00050 00051 #ifdef WNT 00052 #if defined MEFISTO2D_EXPORTS 00053 #define MEFISTO2D_EXPORT __declspec( dllexport ) 00054 #else 00055 #define MEFISTO2D_EXPORT __declspec( dllimport ) 00056 #endif 00057 #else 00058 #define MEFISTO2D_EXPORT 00059 #endif 00060 00061 00062 MEFISTO2D_EXPORT 00063 void aptrte( Z nutysu, R aretmx, 00064 Z nblf, Z *nudslf, R2 *uvslf, 00065 Z nbpti, R2 *uvpti, 00066 Z & nbst, R2 * & uvst, Z & nbt, Z * & nust, 00067 Z & ierr ); 00068 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00069 // but : appel de la triangulation par un arbre-4 recouvrant 00070 // ----- de triangles equilateraux 00071 // le contour du domaine plan est defini par des lignes fermees 00072 // la premiere ligne etant l'enveloppe de toutes les autres 00073 // la fonction areteideale_(s,d) donne la taille d'arete 00074 // au point s dans la direction d (direction inactive pour l'instant) 00075 // des lors toute arete issue d'un sommet s devrait avoir une longueur 00076 // comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d) 00077 // 00078 //Attention: 00079 // Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques! 00080 // De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee 00081 // 00082 // entrees: 00083 // -------- 00084 // nutysu : numero de traitement de areteideale_() selon le type de surface 00085 // 0 pas d'emploi de la fonction areteideale_() et aretmx est active 00086 // 1 il existe une fonction areteideale_(s,d) 00087 // dont seules les 2 premieres composantes de uv sont actives 00088 // ... autres options a definir ... 00089 // aretmx : longueur maximale des aretes de la future triangulation 00090 // nblf : nombre de lignes fermees de la surface 00091 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees 00092 // nudslf(0)=0 pour permettre la difference sans test 00093 // Attention le dernier sommet de chaque ligne est raccorde au premier 00094 // tous les sommets et les points internes ont des coordonnees 00095 // UV differentes <=> Pas de point double! 00096 // uvslf : uv des nudslf(nblf) sommets des lignes fermees 00097 // nbpti : nombre de points internes futurs sommets de la triangulation 00098 // uvpti : uv des points internes futurs sommets de la triangulation 00099 // 00100 // sorties: 00101 // -------- 00102 // nbst : nombre de sommets de la triangulation finale 00103 // uvst : coordonnees uv des nbst sommets de la triangulation 00104 // nbt : nombre de triangles de la triangulation finale 00105 // nust : 3 numeros dans uvst des sommets des nbt triangles 00106 // ierr : 0 si pas d'erreur 00107 // > 0 sinon 00108 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00109 // auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001 00110 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00111 00112 #if WIN32 & DFORTRAN 00113 #define tempscpu TEMPSCPU 00114 #define deltacpu DELTACPU 00115 #define insoar INSOAR 00116 #define azeroi AZEROI 00117 #define fasoar FASOAR 00118 #define teajte TEAJTE 00119 #define tehote TEHOTE 00120 #define tetrte TETRTE 00121 #define aisoar AISOAR 00122 #define tedela TEDELA 00123 #define terefr TEREFR 00124 #define tesuex TESUEX 00125 #define teamqt TEAMQT 00126 #define nusotr NUSOTR 00127 #define qutr2d QUTR2D 00128 #define surtd2 SURTD2 00129 #define qualitetrte QUALITETRTE 00130 00131 #define areteideale ARETEIDEALE 00132 00133 #else 00134 #define tempscpu tempscpu_ 00135 #define deltacpu deltacpu_ 00136 #define insoar insoar_ 00137 #define azeroi azeroi_ 00138 #define fasoar fasoar_ 00139 #define teajte teajte_ 00140 #define tehote tehote_ 00141 #define tetrte tetrte_ 00142 #define aisoar aisoar_ 00143 #define tedela tedela_ 00144 #define terefr terefr_ 00145 #define tesuex tesuex_ 00146 #define teamqt teamqt_ 00147 #define nusotr nusotr_ 00148 #define qutr2d qutr2d_ 00149 #define surtd2 surtd2_ 00150 #define qualitetrte qualitetrte_ 00151 00152 #define areteideale areteideale_ 00153 00154 #endif 00155 00156 00157 extern "C" { void 00158 #ifdef WIN32 00159 #ifdef F2C_BUILD 00160 #else 00161 __stdcall 00162 #endif 00163 #endif 00164 qualitetrte( R3 *mnpxyd, 00165 Z & mosoar, Z & mxsoar, Z *mnsoar, 00166 Z & moartr, Z & mxartr, Z *mnartr, 00167 Z & nbtria, R & quamoy, R & quamin ); } 00168 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00169 // but : calculer la qualite moyenne et minimale de la triangulation 00170 // ----- actuelle definie par les tableaux nosoar et noartr 00171 // entrees: 00172 // -------- 00173 // mnpxyd : tableau des coordonnees 2d des points 00174 // par point : x y distance_souhaitee 00175 // mosoar : nombre maximal d'entiers par arete et 00176 // indice dans nosoar de l'arete suivante dans le hachage 00177 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar 00178 // attention: mxsoar>3*mxsomm obligatoire! 00179 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, 00180 // chainage des aretes frontalieres, chainage du hachage des aretes 00181 // hachage des aretes = nosoar(1)+nosoar(2)*2 00182 // avec mxsoar>=3*mxsomm 00183 // une arete i de nosoar est vide <=> nosoar(1,i)=0 et 00184 // nosoar(2,arete vide)=l'arete vide qui precede 00185 // nosoar(3,arete vide)=l'arete vide qui suit 00186 // moartr : nombre maximal d'entiers par arete du tableau noartr 00187 // mxartr : nombre maximal de triangles declarables 00188 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 00189 // arete1 = 0 si triangle vide => arete2 = triangle vide suivant 00190 // sorties: 00191 // -------- 00192 // nbtria : nombre de triangles internes au domaine 00193 // quamoy : qualite moyenne des triangles actuels 00194 // quamin : qualite minimale des triangles actuels 00195 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00196 00197 extern "C" { void 00198 #ifdef WIN32 00199 #ifdef F2C_BUILD 00200 #else 00201 __stdcall 00202 #endif 00203 #endif 00204 tempscpu( double & tempsec ); 00205 } 00206 00207 //Retourne le temps CPU utilise en secondes 00208 00209 extern "C" { void 00210 #ifdef WIN32 00211 #ifdef F2C_BUILD 00212 #else 00213 __stdcall 00214 #endif 00215 #endif 00216 deltacpu( R & dtcpu ); 00217 } 00218 00219 //Retourne le temps CPU utilise en secondes depuis le precedent appel 00220 00221 //initialiser le tableau mnsoar pour le hachage des aretes 00222 extern "C" {void 00223 #ifdef WIN32 00224 #ifdef F2C_BUILD 00225 #else 00226 __stdcall 00227 #endif 00228 #endif 00229 insoar( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar ); 00230 } 00231 00232 //mettre a zero les nb entiers de tab 00233 extern "C" {void 00234 #ifdef WIN32 00235 #ifdef F2C_BUILD 00236 #else 00237 __stdcall 00238 #endif 00239 #endif 00240 azeroi( Z & nb, Z * tab ); 00241 } 00242 00243 extern "C" {void 00244 #ifdef WIN32 00245 #ifdef F2C_BUILD 00246 #else 00247 __stdcall 00248 #endif 00249 #endif 00250 fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign, 00251 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst, 00252 Z & noar, Z & ierr ); 00253 } 00254 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00255 // but : former l'arete de sommet ns1-ns2 dans le hachage du tableau 00256 // ----- nosoar des aretes de la triangulation 00257 // entrees: 00258 // -------- 00259 // ns1 ns2: numero pxyd des 2 sommets de l'arete 00260 // nt1 : numero du triangle auquel appartient l'arete 00261 // nt1=-1 si numero inconnu 00262 // nt2 : numero de l'eventuel second triangle de l'arete si connu 00263 // nt2=-1 si numero inconnu 00264 // nolign : numero de la ligne fermee de l'arete 00265 // =0 si l'arete n'est une arete de ligne 00266 // ce numero est ajoute seulement si l'arete est creee 00267 // mosoar : nombre maximal d'entiers par arete du tableau nosoar 00268 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar 00269 // modifies: 00270 // --------- 00271 // n1soar : numero de la premiere arete vide dans le tableau nosoar 00272 // une arete i de nosoar est vide <=> nosoar(1,i)=0 00273 // chainage des aretes vides amont et aval 00274 // l'arete vide qui precede=nosoar(4,i) 00275 // l'arete vide qui suit =nosoar(5,i) 00276 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, 00277 // chainage momentan'e d'aretes, chainage du hachage des aretes 00278 // hachage des aretes = min( nosoar(1), nosoar(2) ) 00279 // noarst : noarst(np) numero d'une arete du sommet np 00280 00281 // ierr : si < 0 en entree pas d'affichage en cas d'erreur du type 00282 // "arete appartenant a plus de 2 triangles et a creer!" 00283 // si >=0 en entree affichage de ce type d'erreur 00284 // sorties: 00285 // -------- 00286 // noar : >0 numero de l'arete retrouvee ou ajoutee 00287 // ierr : =0 si pas d'erreur 00288 // =1 si le tableau nosoar est sature 00289 // =2 si arete a creer et appartenant a 2 triangles distincts 00290 // des triangles nt1 et nt2 00291 // =3 si arete appartenant a 2 triangles distincts 00292 // differents des triangles nt1 et nt2 00293 // =4 si arete appartenant a 2 triangles distincts 00294 // dont le second n'est pas le triangle nt2 00295 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00296 00297 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm 00298 extern "C" {void 00299 #ifdef WIN32 00300 #ifdef F2C_BUILD 00301 #else 00302 __stdcall 00303 #endif 00304 #endif 00305 teajte( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi, 00306 R & aretmx, Z & mxtree, Z * letree, 00307 Z & ierr ); 00308 } 00309 00310 extern "C" {void 00311 #ifdef WIN32 00312 #ifdef F2C_BUILD 00313 #else 00314 __stdcall 00315 #endif 00316 #endif 00317 tehote( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd, 00318 R3 * comxmi, R & aretmx, 00319 Z * letree, Z & mxqueu, Z * mnqueu, 00320 Z & ierr ); 00321 } 00322 // homogeneisation de l'arbre des te a un saut de taille au plus 00323 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux 00324 00325 extern "C" {void 00326 #ifdef WIN32 00327 #ifdef F2C_BUILD 00328 #else 00329 __stdcall 00330 #endif 00331 #endif 00332 tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd, 00333 Z & mxqueu, Z * mnqueu, Z * mntree, 00334 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, 00335 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, 00336 Z & ierr ); 00337 } 00338 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets 00339 // et des points de la frontiere, des points internes imposes interieurs 00340 00341 extern "C" {void 00342 #ifdef WIN32 00343 #ifdef F2C_BUILD 00344 #else 00345 __stdcall 00346 #endif 00347 #endif 00348 aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na ); 00349 } 00350 // formation du chainage 6 des aretes internes a echanger eventuellement 00351 00352 extern "C" {void 00353 #ifdef WIN32 00354 #ifdef F2C_BUILD 00355 #else 00356 __stdcall 00357 #endif 00358 #endif 00359 tedela( R3 * mnpxyd, Z * mnarst, 00360 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na, 00361 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n ); 00362 } 00363 // boucle sur les aretes internes (non sur une ligne de la frontiere) 00364 // avec echange des 2 diagonales afin de rendre la triangulation delaunay 00365 00366 extern "C" {void 00367 #ifdef WIN32 00368 #ifdef F2C_BUILD 00369 #else 00370 __stdcall 00371 #endif 00372 #endif 00373 terefr( Z & nbarpi, R3 * mnpxyd, 00374 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, 00375 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, 00376 Z & mxarcf, Z * mnarc1, Z * mnarc2, 00377 Z * mnarc3, Z * mnarc4, 00378 Z & n, Z & ierr ); 00379 } 00380 // detection des aretes frontalieres initiales perdues 00381 // triangulation frontale pour les restaurer 00382 00383 extern "C" {void 00384 #ifdef WIN32 00385 #ifdef F2C_BUILD 00386 #else 00387 __stdcall 00388 #endif 00389 #endif 00390 tesuex( Z & nblf, Z * nulftr, 00391 Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig, 00392 Z & mosoar, Z & mxsoar, Z * mnsoar, 00393 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, 00394 Z & nbtria, Z * mntrsu, Z & ierr ); 00395 } 00396 // suppression des triangles externes a la surface 00397 00398 extern "C" {void 00399 #ifdef WIN32 00400 #ifdef F2C_BUILD 00401 #else 00402 __stdcall 00403 #endif 00404 #endif 00405 teamqt( Z & nutysu, R & aretmx, R & airemx, 00406 Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, 00407 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, 00408 Z & mxarcf, Z * mntrcf, Z * mnstbo, 00409 Z * n1arcf, Z * mnarcf, Z * mnarc1, 00410 Z & nbarpi, Z & nbsomm, Z & mxsomm, 00411 R3 * mnpxyd, Z * mnslig, 00412 Z & ierr ); 00413 } 00414 // amelioration de la qualite de la triangulation par 00415 // barycentrage des sommets internes a la triangulation 00416 // suppression des aretes trop longues ou trop courtes 00417 // modification de la topologie des groupes de triangles 00418 // mise en delaunay de la triangulation 00419 00420 extern "C" {void 00421 #ifdef WIN32 00422 #ifdef F2C_BUILD 00423 #else 00424 __stdcall 00425 #endif 00426 #endif 00427 nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr ); 00428 } 00429 //retrouver les numero des 3 sommets du triangle nt 00430 00431 extern "C" {void 00432 #ifdef WIN32 00433 #ifdef F2C_BUILD 00434 #else 00435 __stdcall 00436 #endif 00437 #endif 00438 qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite ); 00439 } 00440 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3 00441 00442 extern "C" { R 00443 #ifdef WIN32 00444 #ifdef F2C_BUILD 00445 #else 00446 __stdcall 00447 #endif 00448 #endif 00449 surtd2( R3 & p1, R3 & p2, R3 & p3 ); 00450 } 00451 //calcul de la surface d'un triangle defini par 3 points de r**2 00452 00453 #endif