Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
main.c
Go to the documentation of this file.
1/* =============================================================================
2** This file is part of the mmg software package for the tetrahedral
3** mesh modification.
4** Copyright (c) Bx INP/Inria/UBordeaux/UPMC, 2004- .
5**
6** mmg is free software: you can redistribute it and/or modify it
7** under the terms of the GNU Lesser General Public License as published
8** by the Free Software Foundation, either version 3 of the License, or
9** (at your option) any later version.
10**
11** mmg is distributed in the hope that it will be useful, but WITHOUT
12** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13** FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14** License for more details.
15**
16** You should have received a copy of the GNU Lesser General Public
17** License and of the GNU General Public License along with mmg (in
18** files COPYING.LESSER and COPYING). If not, see
19** <http://www.gnu.org/licenses/>. Please read their terms carefully and
20** use this copy of the mmg distribution only if you accept them.
21** =============================================================================
22*/
23
34
35#include <assert.h>
36#include <stdio.h>
37#include <stdlib.h>
38#include <signal.h>
39#include <string.h>
40#include <ctype.h>
41#include <math.h>
42#include <float.h>
43
45// if the header file is in the "include" directory
46// #include "libmmgs.h"
47// if the header file is in "include/mmg/mmgs"
48#include "mmg/mmgs/libmmgs.h"
49
50int main(int argc,char *argv[]) {
51 MMG5_pMesh mmgMesh;
52 MMG5_pSol mmgLs,mmgMet;
53 MMG5_int np,k;
54 int ier;
55 char *inname,*outname,*lsname;
56
57 fprintf(stdout," -- TEST MMGSLS \n");
58
59 if ( argc != 4 ) {
60 printf(" Usage: %s meshfile lsfile fileout\n",argv[0]);
61 return(1);
62 }
63
64 /* Name and path of the mesh files */
65 inname = (char *) calloc(strlen(argv[1]) + 1, sizeof(char));
66 if ( inname == NULL ) {
67 perror(" ## Memory problem: calloc");
68 exit(EXIT_FAILURE);
69 }
70 strcpy(inname,argv[1]);
71
72
73 lsname = (char *) calloc(strlen(argv[2]) + 1, sizeof(char));
74 if ( lsname == NULL ) {
75 perror(" ## Memory problem: calloc");
76 exit(EXIT_FAILURE);
77 }
78 strcpy(lsname,argv[2]);
79
80 outname = (char *) calloc(strlen(argv[3]) + 1, sizeof(char));
81 if ( outname == NULL ) {
82 perror(" ## Memory problem: calloc");
83 exit(EXIT_FAILURE);
84 }
85 strcpy(outname,argv[3]);
86
88 /* args of InitMesh:
89 * MMG5_ARG_start: we start to give the args of a variadic func
90 * MMG5_ARG_ppMesh: next arg will be a pointer over a MMG5_pMesh
91 * &mmgMesh: pointer toward your MMG5_pMesh (that store your mesh)
92 * MMG5_ARG_ppLs: next arg will be a pointer over a MMG5_pSol storing a level-set
93 * &mmgLs: pointer toward your MMG5_pSol (that store your level-set)
94 * MMG5_ARG_ppMet: next arg will be a pointer over a MMG5_pSol that will
95 * store the input metric
96 * &mmgMet: pointer toward your MMG5_pSol (that will store the input metric) */
97 mmgMesh = NULL;
98 mmgLs = NULL;
99 mmgMet = NULL;
101 MMG5_ARG_ppMesh,&mmgMesh,MMG5_ARG_ppLs,&mmgLs,
102 MMG5_ARG_ppMet,&mmgMet,
104
106 /* Ask for level set discretization: note that it is important to do this step
107 * here because in iso mode, some filters are applied at mesh loading */
108 if ( MMGS_Set_iparameter(mmgMesh,mmgLs,MMGS_IPARAM_iso, 1) != 1 )
109 exit(EXIT_FAILURE);
110
114
116 if ( MMGS_loadMesh(mmgMesh,inname) != 1 ) exit(EXIT_FAILURE);
117
121
123 if ( MMGS_loadSol(mmgMesh,mmgLs,lsname) != 1 )
124 exit(EXIT_FAILURE);
125
127 /* Manually for example */
131 if ( MMGS_Get_meshSize(mmgMesh,&np,NULL,NULL) !=1 ) exit(EXIT_FAILURE);
132
133 if ( MMGS_Set_solSize(mmgMesh,mmgMet,MMG5_Vertex,np,MMG5_Tensor) != 1 )
134 exit(EXIT_FAILURE);
135
137 for(k=1 ; k<=np ; k++) {
138 /* the Metric is constant over the mesh and follow the canonical
139 * directions: it is given by the tensor (10000,0,100) */
140 if ( MMGS_Set_tensorSol(mmgMet,10000,0,0,100,0,1,k) != 1 ) exit(EXIT_FAILURE);
141 }
142
143
145 if ( MMGS_Chk_meshData(mmgMesh,mmgLs) != 1 ) exit(EXIT_FAILURE);
146
148
152 ier = MMGS_mmgsls(mmgMesh,mmgLs,mmgMet);
153
154 if ( ier == MMG5_STRONGFAILURE ) {
155 fprintf(stdout,"BAD ENDING OF MMGSLS: UNABLE TO SAVE MESH\n");
156 return(ier);
157 } else if ( ier == MMG5_LOWFAILURE )
158 fprintf(stdout,"BAD ENDING OF MMGSLS\n");
159
160 /* (Not mandatory) Automatically save the mesh */
161 if ( MMGS_saveMesh(mmgMesh,outname) != 1 )
162 exit(EXIT_FAILURE);
163
164 /* (Not mandatory) Automatically save the output metric */
165 if ( MMGS_saveSol(mmgMesh,mmgMet,outname) != 1 )
166 exit(EXIT_FAILURE);
167
168 /* 9) free the MMGS5 structures */
170 MMG5_ARG_ppMesh,&mmgMesh,MMG5_ARG_ppLs,&mmgLs,
171 MMG5_ARG_ppMet,&mmgMet,
173
174 free(inname);
175 inname = NULL;
176
177 free(outname);
178 outname = NULL;
179
180 free(lsname);
181 lsname = NULL;
182
183 return(ier);
184}
int MMGS_Set_iparameter(MMG5_pMesh mesh, MMG5_pSol sol, int iparam, MMG5_int val)
set an integer parameter of the remesher
int MMGS_Get_meshSize(MMG5_pMesh mesh, MMG5_int *np, MMG5_int *nt, MMG5_int *na)
Get the number of vertices, triangles, and edges of the mesh.
int MMGS_Init_mesh(const int starter,...)
Initialize a mesh structure and optionally the associated solution and metric structures.
int MMGS_Free_all(const int starter,...)
Deallocations before return.
int MMGS_Set_tensorSol(MMG5_pSol met, double m11, double m12, double m13, double m22, double m23, double m33, MMG5_int pos)
Set a single element of a tensor solution structure.
int MMGS_Set_solSize(MMG5_pMesh mesh, MMG5_pSol sol, int typEntity, MMG5_int np, int typSol)
Initialize an array of solution fields: set dimension, types and number of fields.
int MMGS_Chk_meshData(MMG5_pMesh mesh, MMG5_pSol met)
Check if the numbers of given entities match with mesh and solution size and check mesh data.
int ier
program main
Example for using mmglib (basic use)
Definition main.F90:6
int MMGS_loadSol(MMG5_pMesh mesh, MMG5_pSol met, const char *filename)
Load a metric field (or other solution) in medit's .sol format.
Definition inout_s.c:1312
int MMGS_saveMesh(MMG5_pMesh mesh, const char *filename)
Save a mesh in .mesh or .meshb format.
Definition inout_s.c:842
int MMGS_saveSol(MMG5_pMesh mesh, MMG5_pSol met, const char *filename)
Write an isotropic or anisotropic metric in medit file format.
Definition inout_s.c:1483
int MMGS_loadMesh(MMG5_pMesh mesh, const char *filename)
Load a mesh (in .mesh/.mesb format) from file.
Definition inout_s.c:41
int MMGS_mmgsls(MMG5_pMesh mesh, MMG5_pSol sol, MMG5_pSol umet)
Main "program" for level-set discretization.
Definition libmmgs.c:298
@ MMGS_IPARAM_iso
Definition libmmgs.h:114
#define MMG5_ARG_ppMesh
#define MMG5_ARG_end
#define MMG5_ARG_ppLs
#define MMG5_STRONGFAILURE
Definition libmmgtypes.h:65
#define MMG5_LOWFAILURE
Definition libmmgtypes.h:57
@ MMG5_Tensor
MMG5_Sol * MMG5_pSol
MMG5_Mesh * MMG5_pMesh
#define MMG5_ARG_start
Definition libmmgtypes.h:93
@ MMG5_Vertex
#define MMG5_ARG_ppMet