41#define MMG5_DEGTOL 1.e-1
56 for (k=1; k<=
mesh->
ne; k++) {
65 len = (p2->
c[0] - p1->
c[0])*(p2->
c[0] - p1->
c[0])
66 + (p2->
c[1] - p1->
c[1])*(p2->
c[1] - p1->
c[1])
67 + (p2->
c[2] - p1->
c[2])*(p2->
c[2] - p1->
c[2]);
87 vp[i] = (1.0-t)*v1[i] + t*v2[i];
108 double len,lmax,o[3],hma2;
111 MMG5_int src,ns,k,ip,ip1,ip2,iadr;
114 static int8_t mmgWarn0 = 0;
120 for (k=1; k<=
mesh->
ne; k++) {
125 if ( pt->
mark != itdeg )
continue;
130 for (i=0; i<6; i++) {
139 if ( pxt && (pxt->
tag[i] &
MG_BDY) )
continue;
144 len = (p1->
c[0]-p0->
c[0])*(p1->
c[0]-p0->
c[0])
145 + (p1->
c[1]-p0->
c[1])*(p1->
c[1]-p0->
c[1])
146 + (p1->
c[2]-p0->
c[2])*(p1->
c[2]-p0->
c[2]);
156 fprintf(stderr,
"\n ## Warning: %s: all edges of tetra %" MMG5_PRId
" are required"
157 " or of length null.\n",__func__,k);
162 if ( lmax < hma2 )
continue;
176 if ( !ilist )
continue;
177 else if ( ilist<0 )
return -1;
188 o[0] = 0.5*(p0->
c[0] + p1->
c[0]);
189 o[1] = 0.5*(p0->
c[1] + p1->
c[1]);
190 o[2] = 0.5*(p0->
c[2] + p1->
c[2]);
205 "larger displacement",
214 double,
"larger displacement",
227 if ( !MMG5_intmet(
mesh,met,k,imax,ip,0.5) ) {
235 iadr = disp->
size*ip1;
237 iadr = disp->
size*ip2;
239 iadr = disp->
size*ip;
251 fprintf(stderr,
"\n ## Error: %s: unable to split.\n",__func__);
281 int ilist,it,maxit,
ier;
282 MMG5_int k,nconf,ns,nns;
291 for (k=1; k<=
mesh->
ne; k++) {
294 if ( pt->
mark != itdeg )
continue;
296 for (i=0; i<6; i++) {
300 if ( pxt->
edg[i] || pxt->
tag[i] )
continue;
305 if ( nconf<0 )
return -1;
309 else if (
ier < 0 )
return -1;
316 while ( ++it < maxit && ns > 0 );
333 MMG5_int k,nm,nnm,base;
339 for (k=1; k<=
mesh->
np; k++)
348 for (k=1; k<=
mesh->
ne; k++) {
351 if ( pt->
mark != itdeg )
continue;
354 for (i=0; i<4; i++) {
356 if ( ppt->
flag == base )
continue;
360 if ( !ilistv )
continue;
374 while( ++it < maxit && nm > 0 );
392 double ll,ux,uy,uz,hmi2;
395 MMG5_int k,nc,nnm,base;
397 int8_t i,j,ip,iq,isnm;
403 for (k=1; k<=
mesh->
np; k++)
406 for (k=1; k<=
mesh->
ne; k++) {
410 if ( pt->
mark != itdeg )
continue;
412 for (i=0; i<4; i++) {
414 for (j=0; j<3; j++) {
417 assert( 0<=ip && ip<4 &&
"unexpected local index for vertex");
418 assert( 0<=iq && iq<4 &&
"unexpected local index for vertex");
422 if ( p0->
flag == base )
continue;
427 ux = p1->
c[0] - p0->
c[0];
428 uy = p1->
c[1] - p0->
c[1];
429 uz = p1->
c[2] - p0->
c[2];
430 ll = ux*ux + uy*uy + uz*uz;
432 if ( ll > hmi2 )
continue;
440 if (
ier < 0 )
return -1;
446 else if ( ilist < 0 )
return -1;
476 double *v,c[4][3],tau;
485 for (k=1; k<=
mesh->
ne; k++) {
487 if ( !
MG_EOK(pt) )
continue;
489 for (i=0; i<4; i++) {
494 c[i][j] = ppt->
c[j]+tau*v[j];
515 double *v,tau,ctau,c[4][3],ocal,ncal;
523 for (k=1; k<=
mesh->
ne; k++) {
525 if ( !
MG_EOK(pt) )
continue;
527 for (i=0; i<4; i++) {
536 for (i=0; i<4; i++) {
551 for (k=1; k<=
mesh->
np; k++) {
554 if ( !
MG_VOK(ppt) )
continue;
557 for (i=0; i<3; i++) {
558 ppt->
c[i] = ppt->
c[i] + tau*v[i];
584 double avlen,tau,hmintmp,hmaxtmp;
585 int itdc,itmn,maxitmn,maxitdc,iit,warn;
586 MMG5_int nspl,ns,nm,nc,k;
587 MMG5_int nns,nnm,nnc,nnspl,nnns,nnnm,nnnc,nnnspl;
588 MMG5_int ninvalidTets;
598 nnnspl = nnnc = nnns = nnnm = lastt = 0;
601 fprintf(stdout,
" ** LAGRANGIAN MOTION\n");
604 for (k=1; k<=
mesh->
ne; k++)
616 for (itmn=0; itmn<maxitmn; itmn++) {
621 fprintf(stderr,
"\n ## Problem in func. MMG5_velextLS. Exit program.\n");
625 fprintf(stderr,
"\n ## Error: %s: you need to compile with the USE_ELAS"
626 " CMake's flag set to ON to use the rigidbody movement.\n",__func__);
633 for (itdc=0; itdc<maxitdc; itdc++) {
634 nnspl = nnc = nns = nnm = 0;
639 fprintf(stderr,
"\n *** Stop: impossible to proceed further\n");
645 fprintf(stderr,
"\n ** Impossible motion\n");
651 printf(
" ---> Realized displacement: %f\n",tau);
655 for ( iit=0; iit<5; iit++) {
657 nspl = nc = ns = nm = 0;
664 fprintf(stderr,
"\n ## Problem in spllag. Exiting.\n");
671 fprintf(stderr,
"\n ## Problem in coltetlag. Exiting.\n");
683 fprintf(stderr,
"\n ## Problem in swaptetlag. Exiting.\n");
691 fprintf(stderr,
"\n ## Problem in movtetlag. Exiting.\n");
696 printf(
" %" MMG5_PRId
" edges splitted, %" MMG5_PRId
" vertices collapsed, %" MMG5_PRId
" elements"
697 " swapped, %" MMG5_PRId
" vertices moved.\n",nspl,nc,ns,nm);
705 printf(
" %" MMG5_PRId
" edges splitted, %" MMG5_PRId
" vertices collapsed, %" MMG5_PRId
" elements"
706 " swapped, %" MMG5_PRId
" vertices moved.\n",nnspl,nnc,nns,nnm);
720 printf(
" ---> Realized displacement: %f\n",tau);
724 printf(
" %"MMG5_PRId
" edges splitted, %"MMG5_PRId
" vertices collapsed,"
725 " %"MMG5_PRId
" elements swapped, %"MMG5_PRId
" vertices moved.\n",
726 nnnspl,nnnc,nnns,nnnm);
737 printf(
"## Warning: Not enough memory to keep track of"
738 " the invalid tetrahedron.\n");
742 assert ( ninvalidTets );
749 if ( ninvalidTets ) {
750 return -ninvalidTets;
int MMG5_boulevolp(MMG5_pMesh mesh, MMG5_int start, int ip, int64_t *list)
int MMG5_coquil(MMG5_pMesh mesh, MMG5_int start, int ia, int64_t *list, int8_t *isbdy)
MMG5_int MMG5_colver(MMG5_pMesh mesh, MMG5_pSol met, int64_t *list, int ilist, int8_t indq, int8_t typchk)
int MMG5_chkcol_int(MMG5_pMesh mesh, MMG5_pSol met, MMG5_int k, int8_t iface, int8_t iedg, int64_t *list, int ilist, int8_t typchk)
static double MMG5_caltet_iso_4pt(double *a, double *b, double *c, double *d)
API headers for the mmg3d library.
MMG5_int MMG3D_newPt(MMG5_pMesh mesh, double c[3], int16_t tag, MMG5_int src)
int MMG5_split1b(MMG5_pMesh, MMG5_pSol, int64_t *, int, MMG5_int, int, int8_t, int8_t)
MMG5_int MMG5_chkswpgen(MMG5_pMesh, MMG5_pSol, MMG5_int, int, int *, int64_t *, double, int8_t)
int MMG5_velextLS(MMG5_pMesh, MMG5_pSol)
void MMG3D_delPt(MMG5_pMesh mesh, MMG5_int ip)
int MMG5_swpgen(MMG5_pMesh, MMG5_pSol, MMG5_int, int, int64_t *, MMG3D_pPROctree, int8_t)
static const uint8_t MMG5_iare[6][2]
vertices of extremities of the edges of the tetra
#define MMG3D_POINT_REALLOC(mesh, sol, ip, wantedGap, law, o, tag, src)
int MMG5_movintpt_iso(MMG5_pMesh, MMG5_pSol, MMG3D_pPROctree, int64_t *, int, int)
#define MMG3D_LSWAPIMPROVE
static const uint8_t MMG5_idir[4][3]
idir[i]: vertices of face opposite to vertex i
short MMG5_dikmov(MMG5_pMesh mesh, MMG5_pSol disp, short *lastt, short shortmax, MMG5_int chkmovmesh(MMG5_pMesh, MMG5_pSol, short, MMG5_int *))
common functions for lagrangian meshing.
static int MMG5_intdispvol(double *v1, double *v2, double *vp, double t)
static MMG5_int MMG5_spllag(MMG5_pMesh mesh, MMG5_pSol disp, MMG5_pSol met, int itdeg, int *warn)
int MMG5_dispmesh(MMG5_pMesh mesh, MMG5_pSol disp, short t, int itdeg)
static MMG5_int MMG5_coltetlag(MMG5_pMesh mesh, MMG5_pSol met, int itdeg)
MMG5_int MMG5_chkmovmesh(MMG5_pMesh mesh, MMG5_pSol disp, short t, MMG5_int *tetIdx)
MMG5_int MMG5_swptetlag(MMG5_pMesh mesh, MMG5_pSol met, double crit, MMG3D_pPROctree PROctree, int itdeg)
double MMG5_estavglen(MMG5_pMesh mesh)
MMG5_int MMG5_movtetlag(MMG5_pMesh mesh, MMG5_pSol met, int itdeg)
int MMG5_mmg3d3(MMG5_pMesh mesh, MMG5_pSol disp, MMG5_pSol met, MMG5_int **invalidTets)
#define MMG5_SAFE_CALLOC(ptr, size, type, law)
#define MMG5_ADD_MEM(mesh, size, message, law)
#define MMG5_SAFE_REALLOC(ptr, prevSize, newSize, type, message, law)
static const uint8_t MMG5_iprv2[3]
static const uint8_t MMG5_inxt2[6]
#define MMG5_DEL_MEM(mesh, ptr)
#define MMG5_SAFE_RECALLOC(ptr, prevSize, newSize, type, message, law)
Structure to store points of a MMG mesh.
Structure to store the surface tetrahedra of a MMG mesh.