Mmg
Simplicial remeshers (mesh adaptation, isovalue discretization, lagrangian movement)
Functions
movpt_3d.c File Reference

Functions to move a point in the mesh. More...

#include "libmmg3d.h"
#include "inlined_functions_3d_private.h"
#include "mmg3dexterns_private.h"
#include "mmgexterns_private.h"
Include dependency graph for movpt_3d.c:

Go to the source code of this file.

Functions

int MMG5_movintpt_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *list, int ilist, int improve)
 
int MMG5_movintptLES_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, MMG5_int *list, int ilist, int improve)
 
int MMG3D_rotate_surfacicBall (MMG5_pMesh mesh, MMG5_int *lists, int ilists, MMG5_int ip0, double r[3][3], double *lispoi)
 
int MMG3D_movbdyregpt_geom (MMG5_pMesh mesh, MMG5_int *lists, const MMG5_int kel, const MMG5_int ip0, double n[3], double lambda[3], double o[3], double no[3])
 
int MMG5_movbdyregpt_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improveSurf, int improveVol)
 
static int MMG3D_curveEndingPts_chkEdg (MMG5_pMesh mesh, MMG5_int *lists, int l, MMG5_int ip0, MMG5_int *ipa, MMG5_int *ipb, const int16_t edgTag, MMG5_int *ip)
 
int MMG3D_curveEndingPts (MMG5_pMesh mesh, MMG5_int *lists, int ilists, const int16_t edgTag, MMG5_int ip0, MMG5_int *ip1, MMG5_int *ip2)
 
int MMG3D_movbdycurvept_chckAndUpdate (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, int improve, MMG5_pPoint p0, MMG5_int ip0, uint8_t isrid, double o[3], double no[3], double no2[3], double to[3])
 
int MMG3D_movbdycurvept_newPosForSimu (MMG5_pMesh mesh, MMG5_pPoint p0, MMG5_int ip0, MMG5_int ip1, MMG5_int ip2, double ll1old, double ll2old, uint8_t isrid, const double step, double o[3], double no[3], double no2[3], double to[3], const int16_t edgTag)
 
static int MMG3D_movbdycurvept_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve, const int16_t edgTag)
 
int MMG5_movbdyrefpt_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve)
 
int MMG5_movbdynompt_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve)
 
int MMG5_movbdynomintpt_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, int improve)
 
int MMG5_movbdyridpt_iso (MMG5_pMesh mesh, MMG5_pSol met, MMG3D_pPROctree PROctree, int64_t *listv, int ilistv, MMG5_int *lists, int ilists, int improve)
 
int MMG3D_movv_ani (MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int k, int ib)
 
int MMG3D_movnormal_iso (MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int k, int ib)
 
int MMG3D_movv_iso (MMG5_pMesh mesh, MMG5_pSol sol, MMG5_int k, int ib)
 

Detailed Description

Functions to move a point in the mesh.

Author
Charles Dapogny (UPMC)
Cécile Dobrzynski (Bx INP/Inria/UBordeaux)
Pascal Frey (UPMC)
Algiane Froehly (Inria/UBordeaux)
Version
5
Todo:
Doxygen documentation

Definition in file movpt_3d.c.

Function Documentation

◆ MMG3D_curveEndingPts()

int MMG3D_curveEndingPts ( MMG5_pMesh  mesh,
MMG5_int *  lists,
int  ilists,
const int16_t  edgTag,
MMG5_int  ip0,
MMG5_int *  ip1,
MMG5_int *  ip2 
)
Parameters
meshpointer toward the mesh structure.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
edgTagType of edge on which we move (MG_REF, MG_NOM or MG_GEO).
ip0point that we want to move along curve.
ip1first ending point of curve (in current surfacic ball).
ip2second ending point of curve (in current surfacic ball).
Returns
0 if fail (one of curve extremity is not found), 1 if success.

Search the two ending points of curve passing through ip0 in the surfacic ball of ip0.

Travel surfacic ball and recover the two ending points of curve (that will be stored in ip1 and ip2): ball is travelled from beginning in one direction until meeting the curve edge, then, starting from the end, in the other direction until meeting the second curve edge.

a. Travel surface edges in one sense to get the first featured edge. Triangles of the surface are successively processed and the tag of the edge between current tria and previous one is tested (so each edge is checked only once). Ball processing stops at first featured edge crossed.

b. Now travel surface edges in the reverse sense so as to get the second curve. Again, we test the tag of the edge at interface of current triangle and previous one and we stop ball pocessing when the second featured edge has been found. This edge is necessarly different from the one previously found.

Definition at line 936 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_curveEndingPts_chkEdg()

static int MMG3D_curveEndingPts_chkEdg ( MMG5_pMesh  mesh,
MMG5_int *  lists,
int  l,
MMG5_int  ip0,
MMG5_int *  ipa,
MMG5_int *  ipb,
const int16_t  edgTag,
MMG5_int *  ip 
)
inlinestatic
Parameters
meshpointer toward the mesh structure.
listspointer toward the surfacic ball of the point we want to move (ip0).
litem of lists to process.
ip0global index of point whose ball is passed.
ipaglobal idx of second vertex of previous bdy tria of the list (updated at end of tria processing).
ipbglobal idx of third vertex of previous bdy tria of the list (updated at end of tria processing).
edgTagsearched tag (MG_NOM, MG_GEO, MG_REF).
ipvariable to store the global index of ending point (if found).
Returns
0 if tested edge is not tagged edgTag, 1 if it is.

Process boundary triangle stored in the item l of the surfacic list lists of point ip0. Check if the edge at interface of this tria and the tria ipa - ipb - ip0 (previous tria of the list) has tag edgTag:

  • if yes, store second vertex of this edge (ip0 being the first one) in ip and return 1;
  • if no, update values of ipa and ipb and return 0.
Remarks
lists[k] = 4* tet idx + idx of bdy face.

Definition at line 845 of file movpt_3d.c.

Here is the caller graph for this function:

◆ MMG3D_movbdycurvept_chckAndUpdate()

int MMG3D_movbdycurvept_chckAndUpdate ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
int  improve,
MMG5_pPoint  p0,
MMG5_int  ip0,
uint8_t  isrid,
double  o[3],
double  no[3],
double  no2[3],
double  to[3] 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
p0point that we want to move.
ip0global index of point p0.
isrid1 if point is a ridge manifold point
opoint coordinates at new position
nonormal at point at new position
no2second normal at point at new pos (for ridge manifold point)
totangent at point at new pos.
Returns
0 if we don't want to move, 1 if we want to move point

Check volumes of the tetra in the ball of point with new position of point. Update coordinates, normals, tangents and qualities if point displacement is accepted.

Check wether all volumes remain positive with new position of the point

Update coordinates, normals, for new point

Definition at line 1048 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_movbdycurvept_iso()

static int MMG3D_movbdycurvept_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
MMG5_int *  lists,
int  ilists,
int  improve,
const int16_t  edgTag 
)
inlinestatic
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
edgTagType of edge on which we move (MG_REF,MG_NOM or MG_GEO).
Returns
0 if fail, 1 if success.

Move boundary reference, ridge or non-manifold point, whose volumic and surfacic balls are passed.

Remarks
the metric is not interpolated at the new position.
Todo:
End of refactoring with aniso function:
  • test effects of interpolation of metric in iso mode (done only in aniso);
  • check what to do with geometric approx and local hausdorff: only tested in iso mode, normally the surface size map should be integrated to the sizemap but chckedg call still returns 0 in some of ci tests (maybe because metric is not used in lenedg computations).

Step 0: Compute if the edge is a simple ridge to know if we have to compute a second normal at point

Step 1: Travel surfacic ball and recover the two ending points of curve (that will be stored in ip1 and ip2)

Step 2: At this point, we get the point extremities of the curve passing through ip0 : ip1, ip2, along with support tets it1,it2, the surface faces iface1,iface2, and the associated edges ie1,ie2. Computation of displacement along curve and checks

a. Changes needed for choice of time step : see manuscript notes

b. Check sense of displacement, compute support of the associated edge and features of the new position

For each surfacic triangle build a virtual displaced triangle for check purposes :

  • check the new triangle qualities;
  • check edge lengths with respect to Hausdorff criterion.

Remark: normal deviation is checked only with aniso metric because displacment in inso mode remais sufficiently small to not create spurious ridges while this issue was encountered on some aniso test cases.

d. Check whether all volumes remain positive with new position of the point and update coor, normals, tangents and qualities if move is accepted.

Definition at line 1255 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_movbdycurvept_newPosForSimu()

int MMG3D_movbdycurvept_newPosForSimu ( MMG5_pMesh  mesh,
MMG5_pPoint  p0,
MMG5_int  ip0,
MMG5_int  ip1,
MMG5_int  ip2,
double  ll1old,
double  ll2old,
uint8_t  isrid,
const double  step,
double  o[3],
double  no[3],
double  no2[3],
double  to[3],
const int16_t  edgTag 
)
Parameters
meshpointer toward the mesh structure.
p0point that we want to move.
ip0global index of point p0.
ip1First ending point of curve.
ip2Second ending point of curve.
ll1oldlength of edge ip0-ip1.
ll2oldlength of edge ip0-ip2.
isrid1 if point is a ridge manifold point.
stepstep of displacement.
opoint coordinates at new position
nonormal at point at new position
no2second normal at point at new pos (for ridge manifold point)
totangent at point at new pos.
edgTagMG_NOM, MG_REF or MG_GEO depending on type of curve along which we move.
Returns
0 if we don't want to move, global index ip if we want to move toward point ip.

Check volumes of the tetra in the ball of point with new position of point. Update coordinates, normals, tangents and qualities if point displacement is accepted.

Choose direction of displacement depending on edge lengths

Build support of the edge ip-ip0 and features of new position

Store computed values for simulations purposes

Definition at line 1142 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_movbdyregpt_geom()

int MMG3D_movbdyregpt_geom ( MMG5_pMesh  mesh,
MMG5_int *  lists,
const MMG5_int  kel,
const MMG5_int  ip0,
double  n[3],
double  lambda[3],
double  o[3],
double  no[3] 
)
Parameters
meshpointer toward the mesh
listspointer toward the surface ball of ip0
kelindex of the current element in the ball
ip0global index of the point to move
nnormal at ip0
lambdabarycentric coor of the new point in triangle
ocoordinates of the new point (to compute)
nonormal at new point (to compute)
Returns
-1 if fail, 0 if we can't move the point, nxp the index of the new xpoint at ip0 if success.

Compute the Bezier patch at element lists[kel], compute the new point coordinates, normal and tangent and check the geometric approximation.

Definition at line 482 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_movnormal_iso()

int MMG3D_movnormal_iso ( MMG5_pMesh  mesh,
MMG5_pSol  sol,
MMG5_int  k,
int  ib 
)
Parameters
meshpointer toward the mesh structure.
solpointer toward the metric structure.
ktetra index.
iblocal index of the point inside the tetra k.
Returns
0 if fail, 1 if success.

Move internal point according to the normal at the opposite face Try to increase the volume of the tetra. Called when processing very bad elts in opttyp.

Remarks
the metric is not interpolated at the new position.
Todo:
to factorize with movv_iso (and movv_ani)?

Definition at line 1746 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_movv_ani()

int MMG3D_movv_ani ( MMG5_pMesh  mesh,
MMG5_pSol  sol,
MMG5_int  k,
int  ib 
)
Parameters
meshpointer toward the mesh structure.
solpointer toward the metric structure.
kelement index
iplocal index of point
Returns
0 if fail, 1 if success.

Move internal point according to the normal at the opposite face Try to increase the volume of the tetra. Called when processing very bad elts in opttyp.

Remarks
the metric is not interpolated at the new position.

Definition at line 1626 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_movv_iso()

int MMG3D_movv_iso ( MMG5_pMesh  mesh,
MMG5_pSol  sol,
MMG5_int  k,
int  ib 
)
Parameters
meshpointer toward the mesh structure.
solpointer toward the metric structure.
kelement index
iplocal index of point
Returns
0 if fail, 1 if success.

Move internal point according to the normal at the opposite face Try to increase the volume of the tetra. Called when processing very bad elts in opttyp.

Remarks
the metric is not interpolated at the new position.
Todo:
to factorize with movnormal_iso (and movv_ani)?

Definition at line 1875 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG3D_rotate_surfacicBall()

int MMG3D_rotate_surfacicBall ( MMG5_pMesh  mesh,
MMG5_int *  lists,
int  ilists,
MMG5_int  ip0,
double  r[3][3],
double *  lispoi 
)
Parameters
meshpointer toward the mesh structure.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
ip0global index of the point that we move
rrotation matrix that sends the normal at ip0 to z-axis
lispoirotated surfacic ball (lispoi[k] is the common edge between faces lists[k-1] and lists[k])
Returns
1 if success, 0 if the projection along the tangent plane are invalid.

Rotation of the oriented surfacic ball of ip0.

At this point, lispoi contains the oriented surface ball of point p0, that has been rotated through r, with the convention that triangle l has edges lispoi[l]; lispoi[l+1]

Definition at line 350 of file movpt_3d.c.

Here is the caller graph for this function:

◆ MMG5_movbdynomintpt_iso()

int MMG5_movbdynomintpt_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
int  improve 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
Returns
0 if fail, 1 if success.

Move internal non manifold point, whose volumic ball is passed

Remarks
the metric is not interpolated at the new position.

Definition at line 1482 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG5_movbdynompt_iso()

int MMG5_movbdynompt_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
MMG5_int *  lists,
int  ilists,
int  improve 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
Returns
0 if fail, 1 if success.

Move boundary non-manifold point, whose volumic and surfacic balls are passed.

Remarks
the metric is not interpolated at the new position.

Definition at line 1462 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG5_movbdyrefpt_iso()

int MMG5_movbdyrefpt_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
MMG5_int *  lists,
int  ilists,
int  improve 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
Returns
0 if fail, 1 if success.

Move boundary reference point, whose volumic and surfacic balls are passed.

Remarks
the metric is not interpolated at the new position.

Definition at line 1438 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG5_movbdyregpt_iso()

int MMG5_movbdyregpt_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
MMG5_int *  lists,
int  ilists,
int  improveSurf,
int  improveVol 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
Returns
0 if we can not move, 1 if success, -1 if fail.

Move boundary regular point, whose volumic and surfacic balls are passed.

Remarks
the metric is not interpolated at the new position.

Step 1 : rotation matrix that sends normal n to the third coordinate vector of R^3

Step 2 : rotation of the oriented surfacic ball with r : lispoi[k] is the common edge between faces lists[k-1] and lists[k]

Step 3 : Compute optimal position to make current triangle equilateral, and average of these positions

Step 4 : locate new point in the ball, and compute its barycentric coordinates

Step 5 : come back to original problem, and compute patch in triangle iel

Definition at line 625 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG5_movbdyridpt_iso()

int MMG5_movbdyridpt_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  listv,
int  ilistv,
MMG5_int *  lists,
int  ilists,
int  improve 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listvpointer toward the volumic ball of the point.
ilistvsize of the volumic ball.
listspointer toward the surfacic ball of the point.
ilistssize of the surfacic ball.
improveforce the new minimum element quality to be greater or equal than 1.02 of the old minimum element quality.
Returns
0 if fail, 1 if success.

Move boundary ridge point, whose volumic and surfacic balls are passed.

Definition at line 1606 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG5_movintpt_iso()

int MMG5_movintpt_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
int64_t *  list,
int  ilist,
int  improve 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listpointer toward the volumic ball of the point.
ilistsize of the volumic ball.
improveforce the new minimum element quality to be greater or equal than 0.9 of the old minimum element quality.
Returns
0 if we can't move the point, 1 if we can.

Move internal point whose volumic is passed.

Remarks
the metric is not interpolated at the new position.
we don't check if we break the hausdorff criterion.

Definition at line 58 of file movpt_3d.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MMG5_movintptLES_iso()

int MMG5_movintptLES_iso ( MMG5_pMesh  mesh,
MMG5_pSol  met,
MMG3D_pPROctree  PROctree,
MMG5_int *  list,
int  ilist,
int  improve 
)
Parameters
meshpointer toward the mesh structure.
metpointer toward the metric structure.
PROctreepointer toward the PROctree structure.
listpointer toward the volumic ball of the point.
ilistsize of the volumic ball.
improveforce the new minimum element quality to be greater or equal than 0.9 of the old minimum element quality.
Returns
0 if we can't move the point, 1 if we can.

Move internal point whose volumic ball is passed (for LES optimization). The optimal point position is computed as the barycenter of the optimal point position for each tetra. The optimal point position for a tetra is the point located over the normal of the face at the face barycenter and at the distance 1 of the face.

Remarks
the metric is not interpolated at the new position.
we don't check if we break the hausdorff criterion.
not used.

Definition at line 185 of file movpt_3d.c.

Here is the call graph for this function: