Back to index

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