/******************** 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.