Skip to content

Commit 89097b6

Browse files
committed
Addition of the possibility to declare local remeshing parameters at corners in the default file.
1 parent e0e4360 commit 89097b6

File tree

8 files changed

+52
-14
lines changed

8 files changed

+52
-14
lines changed

src/common/libmmgtypes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ enum MMG5_entities {
231231
MMG5_Edg, /*!< Edge entity */
232232
MMG5_Triangle, /*!< Triangle entity */
233233
MMG5_Tetrahedron, /*!< Tetra entity */
234+
MMG5_Crn, /*!< Corner entity */
234235
};
235236

236237
/**
@@ -545,6 +546,7 @@ typedef struct {
545546
* connecting 2 bdy points and tet with more than 1 bdy
546547
* face) */
547548
int8_t fem; /*!< internal value for fem / no fem mesh output */
549+
int8_t kiso; /*!< Retain previous ls entities (in ls mode) */
548550
int8_t lag; /*!< lagrangian mode */
549551
int8_t parTyp; /*!< Contains binary flags to say which kind of local
550552
param are setted: if \f$tag = 1+2+4\f$ then the point

src/common/mmgcommon_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ extern "C" {
161161
#define MG_Tria (1 << 1 ) /**< 2 local parameter applied over triangle */
162162
#define MG_Tetra (1 << 2 ) /**< 4 local parameter applied over tetrahedron */
163163
#define MG_Edge (1 << 3 ) /**< 8 local parameter applied over edge */
164-
164+
#define MG_Crn (1 << 4 ) /**< 16 local parameter applied over corner */
165165

166166
#define MG_VOK(ppt) (ppt && ((ppt)->tag < MG_NUL)) /**< Vertex OK */
167167
#define MG_EOK(pt) (pt && ((pt)->v[0] > 0)) /**< Element OK */

src/mmg2d/API_functions_2d.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ void MMG2D_Init_parameters(MMG5_pMesh mesh) {
108108
mesh->info.dhd = MMG5_ANGEDG;
109109
}
110110

111-
112111
int MMG2D_Set_iparameter(MMG5_pMesh mesh, MMG5_pSol sol, int iparam, MMG5_int val){
113112
int k;
114113

@@ -147,6 +146,9 @@ int MMG2D_Set_iparameter(MMG5_pMesh mesh, MMG5_pSol sol, int iparam, MMG5_int va
147146
mesh->info.dhd = MMG5_ANGEDG;
148147
}
149148
break;
149+
case MMG2D_IPARAM_kiso :
150+
mesh->info.kiso = val;
151+
break;
150152
case MMG2D_IPARAM_nofem :
151153
mesh->info.setfem = (val==1)? 0 : 1;
152154
break;
@@ -397,11 +399,11 @@ int MMG2D_Set_localParameter(MMG5_pMesh mesh,MMG5_pSol sol, int typ, MMG5_int re
397399
fprintf(stderr," max number of local parameters: %d\n",mesh->info.npar);
398400
return 0;
399401
}
400-
if ( typ != MMG5_Triangle && typ != MMG5_Edg ) {
402+
if ( typ != MMG5_Triangle && typ != MMG5_Edg && typ != MMG5_Crn ) {
401403
fprintf(stderr,"\n ## Warning: %s: you must apply your local parameters",
402404
__func__);
403-
fprintf(stderr," on triangles (MMG5_Triangle or %d) or edges"
404-
" (MMG5_Edg or %d).\n",MMG5_Triangle,MMG5_Edg);
405+
fprintf(stderr," on triangles (MMG5_Triangle or %d), edges"
406+
" (MMG5_Edg or %d) or corners (MMG5_Crn or %d).\n",MMG5_Triangle,MMG5_Edg,MMG5_Crn);
405407
fprintf(stderr,"\n ## Unknown type of entity: ignored.\n");
406408
return 0;
407409
}
@@ -447,7 +449,7 @@ int MMG2D_Set_localParameter(MMG5_pMesh mesh,MMG5_pSol sol, int typ, MMG5_int re
447449
mesh->info.par[mesh->info.npari].hmin = hmin;
448450
mesh->info.par[mesh->info.npari].hmax = hmax;
449451
mesh->info.par[mesh->info.npari].hausd = hausd;
450-
452+
451453
switch ( typ )
452454
{
453455
case ( MMG5_Triangle ):
@@ -456,6 +458,9 @@ int MMG2D_Set_localParameter(MMG5_pMesh mesh,MMG5_pSol sol, int typ, MMG5_int re
456458
case ( MMG5_Edg ):
457459
mesh->info.parTyp |= MG_Edge;
458460
break;
461+
case ( MMG5_Crn ) :
462+
mesh->info.parTyp |= MG_Crn;
463+
break;
459464
default:
460465
fprintf(stderr,"\n ## Error: %s: unexpected entity type: %s.\n",
461466
__func__,MMG5_Get_entitiesName(typ));

src/mmg2d/hash_2d.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ int MMG2D_assignEdge(MMG5_pMesh mesh) {
404404
pa = &mesh->edge[ia];
405405
pt->edg[i2] = pa->ref;
406406
pt->tag[i2] |= pa->tag;
407-
408407
}
409408
}
410409
}

src/mmg2d/isosiz_2d.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,17 @@ int MMG2D_defsiz_iso(MMG5_pMesh mesh,MMG5_pSol met) {
339339
break;
340340
}
341341
}
342+
343+
/* Retrieve local parameters associated to vertex k if corner */
344+
if ( p0->tag & MG_CRN ) {
345+
for (l=0; l<mesh->info.npar; l++) {
346+
ppa = &mesh->info.par[l];
347+
if ( ppa->elt == MMG5_Crn && ppa->ref == p0->ref ) {
348+
met->m[k] = MG_MAX(hmin,MG_MIN(met->m[k],ppa->hmax));
349+
break;
350+
}
351+
}
352+
}
342353
}
343354
}
344355

src/mmg2d/libmmg2d.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ extern "C" {
143143
MMG2D_DPARAM_xreg, /*!< [val], Relaxation parameter for coordinate regularization (0<val<1) */
144144
MMG2D_DPARAM_rmc, /*!< [-1/val], Remove small disconnected components in level-set mode */
145145
MMG2D_IPARAM_nofem, /*!< [1/0], Do not attempt to make the mesh suitable for finite-element computations */
146+
MMG2D_IPARAM_kiso, /*!< [1/0], Keep previous isoline in mesh (in ls mode) */
146147
MMG2D_IPARAM_isoref, /*!< [0/n], Iso-surface boundary material reference */
147148
};
148149

src/mmg2d/libmmg2d_tools.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,12 @@ int MMG2D_parsar(int argc,char *argv[],MMG5_pMesh mesh,MMG5_pSol met,MMG5_pSol s
240240
return 0;
241241
}
242242
break;
243+
case 'k':
244+
if ( !strcmp(argv[i],"-kiso") ) {
245+
if ( !MMG2D_Set_iparameter(mesh,met,MMG2D_IPARAM_kiso,1) )
246+
return 0;
247+
}
248+
break;
243249
case 'l':
244250
if ( !strcmp(argv[i],"-lag") ) {
245251
if ( ++i < argc && isdigit(argv[i][0]) ) {
@@ -695,6 +701,11 @@ int MMG2D_parsop(MMG5_pMesh mesh,MMG5_pSol met) {
695701
return 0;
696702
}
697703
}
704+
else if ( !strcmp(data,"corners") || !strcmp(data,"corner") ) {
705+
if ( !MMG2D_Set_localParameter(mesh,met,MMG5_Crn,ref,fp1,fp2,fp3) ) {
706+
return 0;
707+
}
708+
}
698709
else {
699710
fprintf(stderr," %%%% Wrong format: %s\n",data);
700711
return 0;

src/mmg2d/mmg2d6_open.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,22 @@ int MMG5_resetRef_ls_open(MMG5_pMesh mesh) {
4545
MMG5_pPoint p0;
4646
MMG5_int ref,k;
4747
int8_t i;
48-
48+
4949
for (k=1; k<=mesh->nt; k++) {
5050
pt = &mesh->tria[k];
5151
if ( !pt->v[0] ) continue;
5252

5353
for (i=0; i<3; i++) {
5454
p0 = &mesh->point[pt->v[i]];
55-
if ( pt->edg[i] == mesh->info.isoref ) pt->edg[i] = 0;
56-
if ( p0->ref == mesh->info.isoref ) p0->ref = 0;
55+
if ( pt->edg[i] == mesh->info.isoref ) {
56+
pt->tag[i] &= ~MG_BDY;
57+
pt->tag[i] &= ~MG_REF;
58+
pt->edg[i] = 0;
59+
}
60+
if ( p0->ref == mesh->info.isoref ) {
61+
p0->ref = 0;
62+
p0->tag = 0;
63+
}
5764
}
5865
}
5966

@@ -435,17 +442,19 @@ int MMG2D_mmg2d6_open(MMG5_pMesh mesh, MMG5_pSol phi,MMG5_pSol psi) {
435442
return 0;
436443
}
437444

438-
/* Snapping: to do */
445+
/* Snapping: not sure... may create troubles if several lines intersect */
439446

440447
/* Removal of small parasitic components: to do */
441448

442449
/* No need to keep adjacencies from now on */
443450
MMG5_DEL_MEM(mesh,mesh->adja);
444451

445452
/* Reset the mesh->info.isoref field everywhere it appears */
446-
if ( !MMG5_resetRef_ls_open(mesh) ) {
447-
fprintf(stderr,"\n ## Problem in resetting references. Exit program.\n");
448-
return 0;
453+
if ( !mesh->info.kiso ) {
454+
if ( !MMG5_resetRef_ls_open(mesh) ) {
455+
fprintf(stderr,"\n ## Problem in resetting references. Exit program.\n");
456+
return 0;
457+
}
449458
}
450459

451460
/* Effective splitting of the crossed triangles */

0 commit comments

Comments
 (0)