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 MEFISTO2D_EXPORT 00062 void aptrte( Z nutysu, R aretmx, 00063 Z nblf, Z *nudslf, R2 *uvslf, 00064 Z nbpti, R2 *uvpti, 00065 Z & nbst, R2 * & uvst, Z & nbt, Z * & nust, 00066 Z & ierr ); 00067 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00068 // but : appel de la triangulation par un arbre-4 recouvrant 00069 // ----- de triangles equilateraux 00070 // le contour du domaine plan est defini par des lignes fermees 00071 // la premiere ligne etant l'enveloppe de toutes les autres 00072 // la fonction areteideale_(s,d) donne la taille d'arete 00073 // au point s dans la direction d (direction inactive pour l'instant) 00074 // des lors toute arete issue d'un sommet s devrait avoir une longueur 00075 // comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d) 00076 // 00077 //Attention: 00078 // Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques! 00079 // De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee 00080 // 00081 // entrees: 00082 // -------- 00083 // nutysu : numero de traitement de areteideale_() selon le type de surface 00084 // 0 pas d'emploi de la fonction areteideale_() et aretmx est active 00085 // 1 il existe une fonction areteideale_(s,d) 00086 // dont seules les 2 premieres composantes de uv sont actives 00087 // ... autres options a definir ... 00088 // aretmx : longueur maximale des aretes de la future triangulation 00089 // nblf : nombre de lignes fermees de la surface 00090 // nudslf : numero du dernier sommet de chacune des nblf lignes fermees 00091 // nudslf(0)=0 pour permettre la difference sans test 00092 // Attention le dernier sommet de chaque ligne est raccorde au premier 00093 // tous les sommets et les points internes ont des coordonnees 00094 // UV differentes <=> Pas de point double! 00095 // uvslf : uv des nudslf(nblf) sommets des lignes fermees 00096 // nbpti : nombre de points internes futurs sommets de la triangulation 00097 // uvpti : uv des points internes futurs sommets de la triangulation 00098 // 00099 // sorties: 00100 // -------- 00101 // nbst : nombre de sommets de la triangulation finale 00102 // uvst : coordonnees uv des nbst sommets de la triangulation 00103 // nbt : nombre de triangles de la triangulation finale 00104 // nust : 3 numeros dans uvst des sommets des nbt triangles 00105 // ierr : 0 si pas d'erreur 00106 // > 0 sinon 00107 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00108 // auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001 00109 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00110 00111 #if defined(WIN32) && defined(DFORTRAN) 00112 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 #define MEFISTO2D_STDCALL __stdcall 00134 00135 #elif defined(WIN32) && defined (__WATCOM__) 00136 00137 #define MEFISTO2D_STDCALL 00138 00139 #else //Lin and MacOSX use f77 00140 00141 #define MEFISTO2D_STDCALL 00142 00143 #define insoar insoar_ 00144 #define azeroi azeroi_ 00145 #define fasoar fasoar_ 00146 #define teajte teajte_ 00147 #define tehote tehote_ 00148 #define tetrte tetrte_ 00149 #define aisoar aisoar_ 00150 #define tedela tedela_ 00151 #define terefr terefr_ 00152 #define tesuex tesuex_ 00153 #define teamqt teamqt_ 00154 #define nusotr nusotr_ 00155 #define qutr2d qutr2d_ 00156 #define surtd2 surtd2_ 00157 #define qualitetrte qualitetrte_ 00158 #define areteideale areteideale_ 00159 00160 #endif 00161 00162 extern "C" { MEFISTO2D_EXPORT void MEFISTO2D_STDCALL qualitetrte( R3 *mnpxyd, 00163 Z & mosoar, Z & mxsoar, Z *mnsoar, 00164 Z & moartr, Z & mxartr, Z *mnartr, 00165 Z & nbtria, R & quamoy, R & quamin ); } 00166 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00167 // but : calculer la qualite moyenne et minimale de la triangulation 00168 // ----- actuelle definie par les tableaux nosoar et noartr 00169 // entrees: 00170 // -------- 00171 // mnpxyd : tableau des coordonnees 2d des points 00172 // par point : x y distance_souhaitee 00173 // mosoar : nombre maximal d'entiers par arete et 00174 // indice dans nosoar de l'arete suivante dans le hachage 00175 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar 00176 // attention: mxsoar>3*mxsomm obligatoire! 00177 // nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, 00178 // chainage des aretes frontalieres, chainage du hachage des aretes 00179 // hachage des aretes = nosoar(1)+nosoar(2)*2 00180 // avec mxsoar>=3*mxsomm 00181 // une arete i de nosoar est vide <=> nosoar(1,i)=0 et 00182 // nosoar(2,arete vide)=l'arete vide qui precede 00183 // nosoar(3,arete vide)=l'arete vide qui suit 00184 // moartr : nombre maximal d'entiers par arete du tableau noartr 00185 // mxartr : nombre maximal de triangles declarables 00186 // noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 00187 // arete1 = 0 si triangle vide => arete2 = triangle vide suivant 00188 // sorties: 00189 // -------- 00190 // nbtria : nombre de triangles internes au domaine 00191 // quamoy : qualite moyenne des triangles actuels 00192 // quamin : qualite minimale des triangles actuels 00193 // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00194 00195 extern "C" { void MEFISTO2D_STDCALL tempscpu( double & tempsec ); } 00196 00197 //Retourne le temps CPU utilise en secondes 00198 00199 extern "C" { void MEFISTO2D_STDCALL deltacpu( R & dtcpu ); } 00200 00201 //Retourne le temps CPU utilise en secondes depuis le precedent appel 00202 00203 //initialiser le tableau mnsoar pour le hachage des aretes 00204 extern "C" { void MEFISTO2D_STDCALL insoar( Z & mxsomm, 00205 Z & mosoar, 00206 Z & mxsoar, 00207 Z & n1soar, 00208 Z * mnsoar );} 00209 00210 //mettre a zero les nb entiers de tab 00211 extern "C" { void MEFISTO2D_STDCALL azeroi( Z & nb, Z * tab ); } 00212 00213 extern "C" {void MEFISTO2D_STDCALL fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign, 00214 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst, 00215 Z & noar, Z & ierr ); 00216 } 00217 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00218 // but : former l'arete de sommet ns1-ns2 dans le hachage du tableau 00219 // ----- nosoar des aretes de la triangulation 00220 // entrees: 00221 // -------- 00222 // ns1 ns2: numero pxyd des 2 sommets de l'arete 00223 // nt1 : numero du triangle auquel appartient l'arete 00224 // nt1=-1 si numero inconnu 00225 // nt2 : numero de l'eventuel second triangle de l'arete si connu 00226 // nt2=-1 si numero inconnu 00227 // nolign : numero de la ligne fermee de l'arete 00228 // =0 si l'arete n'est une arete de ligne 00229 // ce numero est ajoute seulement si l'arete est creee 00230 // mosoar : nombre maximal d'entiers par arete du tableau nosoar 00231 // mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar 00232 // modifies: 00233 // --------- 00234 // n1soar : numero de la premiere arete vide dans le tableau nosoar 00235 // une arete i de nosoar est vide <=> nosoar(1,i)=0 00236 // chainage des aretes vides amont et aval 00237 // l'arete vide qui precede=nosoar(4,i) 00238 // l'arete vide qui suit =nosoar(5,i) 00239 // nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, 00240 // chainage momentan'e d'aretes, chainage du hachage des aretes 00241 // hachage des aretes = min( nosoar(1), nosoar(2) ) 00242 // noarst : noarst(np) numero d'une arete du sommet np 00243 00244 // ierr : si < 0 en entree pas d'affichage en cas d'erreur du type 00245 // "arete appartenant a plus de 2 triangles et a creer!" 00246 // si >=0 en entree affichage de ce type d'erreur 00247 // sorties: 00248 // -------- 00249 // noar : >0 numero de l'arete retrouvee ou ajoutee 00250 // ierr : =0 si pas d'erreur 00251 // =1 si le tableau nosoar est sature 00252 // =2 si arete a creer et appartenant a 2 triangles distincts 00253 // des triangles nt1 et nt2 00254 // =3 si arete appartenant a 2 triangles distincts 00255 // differents des triangles nt1 et nt2 00256 // =4 si arete appartenant a 2 triangles distincts 00257 // dont le second n'est pas le triangle nt2 00258 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00259 00260 //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm 00261 extern "C" {void MEFISTO2D_STDCALL teajte( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi, 00262 R & aretmx, Z & mxtree, Z * letree, 00263 Z & ierr ); 00264 } 00265 00266 extern "C" {void MEFISTO2D_STDCALL tehote( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd, 00267 R3 * comxmi, R & aretmx, 00268 Z * letree, Z & mxqueu, Z * mnqueu, 00269 Z & ierr ); 00270 } 00271 // homogeneisation de l'arbre des te a un saut de taille au plus 00272 // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux 00273 00274 extern "C" {void MEFISTO2D_STDCALL tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd, 00275 Z & mxqueu, Z * mnqueu, Z * mntree, 00276 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, 00277 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, 00278 Z & ierr ); 00279 } 00280 // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets 00281 // et des points de la frontiere, des points internes imposes interieurs 00282 00283 extern "C" { void MEFISTO2D_STDCALL aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na ); } 00284 // formation du chainage 6 des aretes internes a echanger eventuellement 00285 00286 extern "C" { void MEFISTO2D_STDCALL tedela( R3 * mnpxyd, Z * mnarst, 00287 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na, 00288 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n ); 00289 } 00290 // boucle sur les aretes internes (non sur une ligne de la frontiere) 00291 // avec echange des 2 diagonales afin de rendre la triangulation delaunay 00292 00293 extern "C" { void MEFISTO2D_STDCALL terefr( Z & nbarpi, R3 * mnpxyd, 00294 Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, 00295 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, 00296 Z & mxarcf, Z * mnarc1, Z * mnarc2, 00297 Z * mnarc3, Z * mnarc4, 00298 Z & n, Z & ierr ); 00299 } 00300 // detection des aretes frontalieres initiales perdues 00301 // triangulation frontale pour les restaurer 00302 00303 extern "C" { void MEFISTO2D_STDCALL tesuex( Z & nblf, Z * nulftr, 00304 Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig, 00305 Z & mosoar, Z & mxsoar, Z * mnsoar, 00306 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, 00307 Z & nbtria, Z * mntrsu, Z & ierr ); 00308 } 00309 // suppression des triangles externes a la surface 00310 00311 extern "C" { void MEFISTO2D_STDCALL teamqt( Z & nutysu, R & aretmx, R & airemx, 00312 Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, 00313 Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, 00314 Z & mxarcf, Z * mntrcf, Z * mnstbo, 00315 Z * n1arcf, Z * mnarcf, Z * mnarc1, 00316 Z & nbarpi, Z & nbsomm, Z & mxsomm, 00317 R3 * mnpxyd, Z * mnslig, 00318 Z & ierr ); 00319 } 00320 // amelioration de la qualite de la triangulation par 00321 // barycentrage des sommets internes a la triangulation 00322 // suppression des aretes trop longues ou trop courtes 00323 // modification de la topologie des groupes de triangles 00324 // mise en delaunay de la triangulation 00325 00326 extern "C" { void MEFISTO2D_STDCALL nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr ); 00327 } 00328 //retrouver les numero des 3 sommets du triangle nt 00329 00330 extern "C" { void MEFISTO2D_STDCALL qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite ); } 00331 //calculer la qualite d'un triangle de R2 de sommets p1, p2, p3 00332 00333 extern "C" { R MEFISTO2D_STDCALL surtd2( R3 & p1, R3 & p2, R3 & p3 ); } 00334 //calcul de la surface d'un triangle defini par 3 points de r**2 00335 00336 #endif