SALOME - SMESH
aptrte.h
Go to the documentation of this file.
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
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines