/******************** Programme test pour mshptg.c *********************/
/******************** necessite les fichiers mshptg.c et mshptg.h ****/
#include <stdio.h>
#include <math.h>
#include "mshptg2.h"
#define nbsmx 100 // nombre max de sommets (pour declaration des tableaux)
#define nbsdmx 1 // nombre max de sous-domaines
#define nbtmx 2*nbsmx // nombre max de triangles
#define nbamx nbsmx+nbsdmx // nombre d'ar\^ete
long c[2*nbsmx]; // coordonne'es des sommets en entier (out)
long tri[4*nbsmx+2*nbsdmx]; // tableau de travail (out)
long ar\^ete[2*nbamx]; //tableau des ar\^etes qui doivent etre retenues (in)
long sd[2*nbsdmx]; // numero de chaque sous-domaines (in)
long nu[6*nbtmx]; //sommets dans les triangles (1..3)+tableau de travail
long reft[nbtmx]; // tableau de travail (out)
float cr[2*nbsmx]; // coord des sommets specifies (in) et finaux (out)
float hh[nbsmx]; //hh[i]= taille souhaitee des ar\^etes autour de q^i (in)
long nbs; // nb de points specifie's (in) et totaux (out)
long nba; // nb d'ar\^ete (in)
long nbt; // nb de triangles (out)
long err; // indicateur d'erreur (out)
long nbsmxx; // nb maximum de sommets permis en tout (in)
long nbsd; // nb de sous-dimaines
FILE* ff; // fichier pour les sorties
void main()
{ /* exemple */
int i;
nbs=5;// nombre de sommets frontiere definis si facultatif enleve'
nba=nbs; // nombre d'ar\^ete definie
cr[0]=0; cr[1]=0; // 4x-------x 3 Les point du bords (ici 5 points)
cr[2]=1; cr[3]=0; // | | la geometrie correspond au dessin
cr[4]=1; cr[5]=1; // \ x 5 | chaque point est rentrer par 2 coor
cr[6]=0; cr[7]=1; // / | convention fortran pour les tableaux
cr[8]=0.3;cr[9]=0.7;//1x-------x 2
for(i=0;i<=nbs;i++)
{
ar\^ete[2*i]=i+1; // le point de depart de l'ar\^ete
ar\^ete[2*i+1]=i+2;//point d'arrive' de l'ar\^ete (convention fortran)
}
ar\^ete[2*nba-1]=1; // la derniere ar\^ete qui ferme le profil
for(i=0;i<=nbs;i++) hh[i]=0.1; // la taille des ar\^etes souhaite'es
hh[2]=0.01;
hh[8]=0.01;
sd[0]=1; // le numero du domaine
nbsmxx=10; // nb max de sommets
nbsd=1; // nb de sous-domaines
mshptg_(cr,hh,c,nu,&nbs,nbsmxx,tri,ar\^ete,nba,sd,nbsd,reft,
&nbt,0.25,0.75,&err);
printf("err= %d nbs= %d nbt= %d\n",(int)err,(int)nbs,(int)nbt);
ff=fopen("ctriangle.dta","w"); // ecriture dans le fichier ctriangle.dta
fprintf(ff,"%d %d\n",(int)nbs,(int)nbt);
for(i=0;i<2*nbs;i+=2)
fprintf(ff,"%f %f %i\n", cr[i],cr[i+1],0);
for(i=0;i<3*nbt;i+=3)
fprintf(ff,"%d %d %d %d\n", (int)nu[i],(int)nu[i+1],(int)nu[i+2],1);
fclose(ff);
}
Les fichiers mshptg.c et mshptg.h sont accessibles par ftp, ainsi que la version fortran
mshptg.f dont elles sont dérivées par traduction automatique (f2c). L'auteur
de ce module est F. Hecht (Frederic.Hecht@inria.fr).
![]()
Tester le programme précédent. Rajouter un petit trou carrée.
Il faudra faire un makefile pour lier ce fichier avec mshptg.c et la bibliotheque
mathematiques (lm). Le programme imprime une ligne a la console et il est important
que nt= donne un chiffre >0 ce qui est le signe que le programme marche.
Pour vereifier que la triangulation générée est la bonne on pourra utiliser
le programme de conversion au format gnuplot ecrit à la leçon 2.
![]()
On comprend mieux comment freefem génère des maillages. L'ordre border sert
à définir les sommets du ou des contours ainsi que la liste des arêtes.
L'ordre buildmesh appelle le module mshptg.