Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
zaldy_3d.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/CNRS/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
36#include "libmmg3d_private.h"
37
39MMG5_int MMG3D_newPt(MMG5_pMesh mesh,double c[3],int16_t tag,MMG5_int src) {
40
41 MMG5_pPoint ppt;
42 MMG5_int curpt;
43
44 if ( !mesh->npnil ) return 0;
45 curpt = mesh->npnil;
46 if ( mesh->npnil > mesh->np ) mesh->np = mesh->npnil;
47 ppt = &mesh->point[curpt];
48 memcpy(ppt->c,c,3*sizeof(double));
49 mesh->npnil = ppt->tmp;
50 ppt->tmp = 0;
51
52 ppt->ref = 0;
53 ppt->xp = 0;
54 ppt->flag = 0;
55 /* point on geometry */
56 if ( tag & MG_BDY ) {
57 mesh->xp++;
58 if(mesh->xp > mesh->xpmax){
59 /* reallocation of xpoint table */
61 "larger xpoint table",
62 return 0);
63 }
64 ppt->xp = mesh->xp;
65 }
66 assert(tag < 24704);
67 assert(tag >= 0);
68 ppt->n[0] = 0;
69 ppt->n[1] = 0;
70 ppt->n[2] = 0;
71 ppt->tag = tag;
72 ppt->tagdel = 0;
73#ifdef USE_POINTMAP
74 assert( src );
75 ppt->src = src;
76#endif
77 return curpt;
78}
79
80void MMG3D_delPt(MMG5_pMesh mesh,MMG5_int ip) {
81 MMG5_pPoint ppt;
82 MMG5_xPoint *pxp;
83
84 ppt = &mesh->point[ip];
85 if ( ppt->xp ) {
86 pxp = &mesh->xpoint[ppt->xp];
87 memset(pxp,0,sizeof(MMG5_xPoint));
88 }
89 memset(ppt,0,sizeof(MMG5_Point));
90 ppt->tag = MG_NUL;
91 ppt->tmp = mesh->npnil;
92 mesh->npnil = ip;
93 if ( ip == mesh->np ) {
94 while ( !MG_VOK((&mesh->point[mesh->np])) ) mesh->np--;
95 }
96}
97
100 MMG5_int curiel;
101
102 if ( !mesh->nenil ) return 0;
103 curiel = mesh->nenil;
104
105 if ( mesh->nenil > mesh->ne ) mesh->ne = mesh->nenil;
106 mesh->nenil = mesh->tetra[curiel].v[3];
107 mesh->tetra[curiel].v[3] = 0;
108 mesh->tetra[curiel].mark=mesh->mark;
109
110 return curiel;
111}
112
122int MMG3D_delElt(MMG5_pMesh mesh,MMG5_int iel) {
123 MMG5_pTetra pt;
124 MMG5_int iadr;
125
126 pt = &mesh->tetra[iel];
127 if ( !MG_EOK(pt) ) {
128 fprintf(stderr,"\n ## INVALID ELEMENT %" MMG5_PRId ".\n",iel);
129 return 0;
130 }
131 memset(pt,0,sizeof(MMG5_Tetra));
132 pt->v[3] = mesh->nenil;
133 iadr = 4*(iel-1) + 1;
134 if ( mesh->adja )
135 memset(&mesh->adja[iadr],0,4*sizeof(MMG5_int));
136 mesh->nenil = iel;
137 if ( iel == mesh->ne ) {
138 while ( !MG_EOK((&mesh->tetra[mesh->ne])) ) mesh->ne--;
139 }
140 return 1;
141}
142
159
161
163}
164
174 size_t usedMem,avMem,reservedMem,npadd;
175 int ctri;
176 MMG5_int bytes;
177
178 /* init allocation need MMG5_MEMMIN B */
179 reservedMem = MMG5_MEMMIN +
180 (mesh->nprism*sizeof(MMG5_Prism)+mesh->nquad*sizeof(MMG5_Quad));
181
182 /* Compute the needed initial memory */
183 usedMem = reservedMem + (mesh->np+1)*sizeof(MMG5_Point)
184 + (mesh->nt+1)*sizeof(MMG5_Tria) + (mesh->ne+1)*sizeof(MMG5_Tetra)
185 + (3*mesh->nt+1)*sizeof(MMG5_int) + (4*mesh->ne+1)*sizeof(MMG5_int)
186 + (mesh->np+1)*sizeof(double);
187
188 if ( usedMem > mesh->memMax ) {
189 fprintf(stderr,"\n ## Error: %s: %zu MB of memory ",__func__,mesh->memMax/MMG5_MILLION);
190 fprintf(stderr,"is not enough to load mesh. You need to ask %zu MB minimum\n",
191 usedMem/MMG5_MILLION+1);
192 return 0;
193 }
194
195 ctri = 2;
196 /* Euler-poincare: ne = 6*np; nt = 2*np; na = np/5 *
197 * point+tria+tets+adja+adjt+aniso sol+item */
198 bytes = sizeof(MMG5_Point) + sizeof(MMG5_xPoint) +
199 6*sizeof(MMG5_Tetra) + ctri*sizeof(MMG5_xTetra) +
200 4*6*sizeof(MMG5_int) + ctri*3*sizeof(MMG5_int) +
201 4*sizeof(MMG5_hedge)+6*sizeof(double);
202
203#ifdef USE_SCOTCH
204 /* bytes = bytes + vertTab + edgeTab + PermVrtTab *
205 * + vertOldTab + sortPartTab - adja */
206 bytes = bytes + 3*6*sizeof(MMG5_int);
207#endif
208
209 avMem = mesh->memMax-usedMem;
210
211 /* If npadd is exactly the maximum memory available, we will use all the
212 * memory and the analysis step will fail. As arrays may be reallocated, we
213 * can have smaller values for npmax,ntmax and nemax (npadd/2). */
214 npadd = avMem/(2*bytes);
215 mesh->npmax = MG_MIN(mesh->npmax,mesh->np+npadd);
216 mesh->ntmax = MG_MIN(mesh->ntmax,ctri*npadd+mesh->nt);
217 mesh->nemax = MG_MIN(mesh->nemax,6*npadd+mesh->ne);
218
219 if ( sizeof(MMG5_int) == sizeof(int32_t) ) {
222 int coef;
223 if ( mesh->nprism ) {
224 coef = 5;
225 }
226 else {
227 coef = 4;
228 }
229
230 /* maximal number of triangles, taking the
231 * computation of adjacency relationships into account */
232 int32_t int32_nemax = (INT32_MAX-(coef+1))/coef;
233
234 if ( int32_nemax < mesh->nemax ) {
235 if ( int32_nemax <= mesh->ne ) {
236 /* No possible allocation without int32 overflow */
237 fprintf(stderr,"\n ## Error: %s: with %" MMG5_PRId " tetrahedra Mmg will overflow"
238 " the 32-bit integer.\n",__func__,mesh->ne);
239 fprintf(stderr,"Please, configure Mmg with MMG5_INT=int64_t argument.\n");
240 return 0;
241 }
242 else {
243 /* Correction of maximal number of tetrahedra */
244 mesh->nemax = int32_nemax;
245 }
246 }
247 }
248
249 /* check if the memory asked is enough to load the mesh*/
250 if ( abs(mesh->info.imprim) > 4 || mesh->info.ddebug ) {
251 fprintf(stdout," MAXIMUM MEMORY AUTHORIZED (MB) %zu\n",
253 }
254 if ( abs(mesh->info.imprim) > 5 || mesh->info.ddebug ) {
255 fprintf(stdout," MMG3D_NPMAX %" MMG5_PRId "\n",mesh->npmax);
256 fprintf(stdout," MMG3D_NTMAX %" MMG5_PRId "\n",mesh->ntmax);
257 fprintf(stdout," MMG3D_NEMAX %" MMG5_PRId "\n",mesh->nemax);
258 }
259
260 return 1;
261}
262
272
273 mesh->npmax = MG_MAX((int)(1.5*mesh->np),MMG3D_NPMAX);
274 mesh->nemax = MG_MAX((int)(1.5*mesh->ne),MMG3D_NEMAX);
275 mesh->ntmax = MG_MAX((int)(1.5*mesh->nt),MMG3D_NTMAX);
276
278}
279
289 MMG5_int k;
290
291 MMG5_ADD_MEM(mesh,(mesh->npmax+1)*sizeof(MMG5_Point),"initial vertices",
292 fprintf(stderr," Exit program.\n");
293 return 0);
295
296 MMG5_ADD_MEM(mesh,(mesh->nemax+1)*sizeof(MMG5_Tetra),"initial tetrahedra",
297 fprintf(stderr," Exit program.\n");
298 return 0);
300
301 if ( mesh->nprism ) {
302 MMG5_ADD_MEM(mesh,(mesh->nprism+1)*sizeof(MMG5_Prism),"initial prisms",return 0);
304 }
305
306 if ( mesh->nt ) {
307 MMG5_ADD_MEM(mesh,(mesh->nt+1)*sizeof(MMG5_Tria),"initial triangles",return 0);
309 memset(&mesh->tria[0],0,sizeof(MMG5_Tria));
310 }
311
312 if ( mesh->nquad ) {
313 MMG5_ADD_MEM(mesh,(mesh->nquad+1)*sizeof(MMG5_Quad),"initial quadrilaterals",return 0);
315 }
316
317 mesh->namax = mesh->na;
318 if ( mesh->na ) {
319 MMG5_ADD_MEM(mesh,(mesh->na+1)*sizeof(MMG5_Edge),"initial edges",return 0);
320 MMG5_SAFE_CALLOC(mesh->edge,(mesh->na+1),MMG5_Edge,return 0);
321 }
322
323 /* keep track of empty links */
324 mesh->npnil = mesh->np + 1;
325 mesh->nenil = mesh->ne + 1;
326
327 for (k=mesh->npnil; k<mesh->npmax-1; k++) {
328 /* link */
329 mesh->point[k].tmp = k+1;
330 }
331
332 for (k=mesh->nenil; k<mesh->nemax-1; k++)
333 mesh->tetra[k].v[3] = k+1;
334
335 return 1;
336}
337
347
348 if ( !MMG3D_memOption(mesh) ) return 0;
349
351}
352
360 MMG5_pTetra pt;
361 MMG5_int k;
362
363 for (k=1; k<=mesh->ne; k++) {
364 pt = &mesh->tetra[k];
365 pt->xt = 0;
366 }
367 if ( mesh->xtetra )
369 mesh->xt = 0;
370}
371
379 MMG5_pPrism pp;
380 MMG5_int k;
381
382 for (k=1; k<=mesh->nprism; k++) {
383 pp = &mesh->prism[k];
384 pp->xpr = 0;
385 }
386 if ( mesh->xprism )
388 mesh->xpr = 0;
389}
MMG5_pMesh * mesh
#define MMG3D_NEMAX
#define MMG3D_NPMAX
#define MMG3D_NTMAX
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
#define MG_EOK(pt)
void MMG5_memOption_memSet(MMG5_pMesh mesh)
Definition: tools.c:891
#define MG_NUL
#define MG_MIN(a, b)
#define MG_MAX(a, b)
#define MMG5_GAP
#define MMG5_ADD_MEM(mesh, size, message, law)
#define MMG5_MILLION
#define MMG5_TAB_RECALLOC(mesh, ptr, initSize, wantedGap, type, message, law)
#define MG_VOK(ppt)
#define MG_BDY
#define MMG5_MEMMIN
#define MMG5_DEL_MEM(mesh, ptr)
Structure to store edges of a MMG mesh.
Definition: libmmgtypes.h:305
int8_t ddebug
Definition: libmmgtypes.h:532
MMG mesh structure.
Definition: libmmgtypes.h:605
MMG5_int ntmax
Definition: libmmgtypes.h:612
MMG5_pQuad quadra
Definition: libmmgtypes.h:648
MMG5_Info info
Definition: libmmgtypes.h:651
MMG5_int xt
Definition: libmmgtypes.h:620
MMG5_int ne
Definition: libmmgtypes.h:612
MMG5_pPoint point
Definition: libmmgtypes.h:641
MMG5_int xpr
Definition: libmmgtypes.h:620
MMG5_int mark
Definition: libmmgtypes.h:618
MMG5_int * adja
Definition: libmmgtypes.h:624
MMG5_pPrism prism
Definition: libmmgtypes.h:645
MMG5_int nquad
Definition: libmmgtypes.h:613
size_t memMax
Definition: libmmgtypes.h:606
MMG5_int nemax
Definition: libmmgtypes.h:612
MMG5_int npmax
Definition: libmmgtypes.h:612
MMG5_pxPoint xpoint
Definition: libmmgtypes.h:642
MMG5_int nenil
Definition: libmmgtypes.h:622
MMG5_int xp
Definition: libmmgtypes.h:620
MMG5_int namax
Definition: libmmgtypes.h:612
MMG5_pTetra tetra
Definition: libmmgtypes.h:643
MMG5_pxPrism xprism
Definition: libmmgtypes.h:646
MMG5_int nt
Definition: libmmgtypes.h:612
MMG5_pTria tria
Definition: libmmgtypes.h:647
MMG5_int np
Definition: libmmgtypes.h:612
MMG5_pEdge edge
Definition: libmmgtypes.h:649
MMG5_pxTetra xtetra
Definition: libmmgtypes.h:644
MMG5_int nprism
Definition: libmmgtypes.h:613
MMG5_int na
Definition: libmmgtypes.h:612
MMG5_int npnil
Definition: libmmgtypes.h:621
MMG5_int xpmax
Definition: libmmgtypes.h:612
Structure to store points of a MMG mesh.
Definition: libmmgtypes.h:270
double n[3]
Definition: libmmgtypes.h:272
int16_t tag
Definition: libmmgtypes.h:284
int8_t tagdel
Definition: libmmgtypes.h:286
MMG5_int tmp
Definition: libmmgtypes.h:280
double c[3]
Definition: libmmgtypes.h:271
MMG5_int xp
Definition: libmmgtypes.h:279
MMG5_int ref
Definition: libmmgtypes.h:278
MMG5_int flag
Definition: libmmgtypes.h:282
MMG5_int xpr
Definition: libmmgtypes.h:467
MMG5_int v[4]
Definition: libmmgtypes.h:403
MMG5_int xt
Definition: libmmgtypes.h:407
MMG5_int mark
Definition: libmmgtypes.h:406
Used to hash edges (memory economy compared to MMG5_hgeom).
Definition: libmmgtypes.h:584
Structure to store surface points of a MMG mesh.
Definition: libmmgtypes.h:294
Structure to store the surface tetrahedra of a MMG mesh.
Definition: libmmgtypes.h:418
MMG5_int MMG3D_newPt(MMG5_pMesh mesh, double c[3], int16_t tag, MMG5_int src)
Definition: zaldy_3d.c:39
MMG5_int MMG3D_newElt(MMG5_pMesh mesh)
Definition: zaldy_3d.c:99
void MMG5_freeXPrisms(MMG5_pMesh mesh)
Definition: zaldy_3d.c:378
void MMG3D_delPt(MMG5_pMesh mesh, MMG5_int ip)
Definition: zaldy_3d.c:80
void MMG5_freeXTets(MMG5_pMesh mesh)
Definition: zaldy_3d.c:359
int MMG3D_memOption_memRepartition(MMG5_pMesh mesh)
Definition: zaldy_3d.c:173
int MMG3D_delElt(MMG5_pMesh mesh, MMG5_int iel)
Definition: zaldy_3d.c:122
int MMG3D_memOption_memSet(MMG5_pMesh mesh)
Definition: zaldy_3d.c:158
int MMG3D_setMeshSize_alloc(MMG5_pMesh mesh)
Definition: zaldy_3d.c:288
int MMG3D_zaldy(MMG5_pMesh mesh)
Definition: zaldy_3d.c:346
int MMG3D_memOption(MMG5_pMesh mesh)
Definition: zaldy_3d.c:271