132 double a11,a21,a12,a22,area1,area2,area3,prod1,prod2,prod3;
136 ppa = &
mesh->point[ia];
137 ppb = &
mesh->point[ib];
140 if ( !
MG_EOK(pt) )
return 0;
143 if ( pt->
v[0] == ib || pt->
v[1] == ib || pt->
v[2] == ib) ibreak = 1;
145 p1 = &
mesh->point[pt->
v[0]];
146 p2 = &
mesh->point[pt->
v[1]];
147 p3 = &
mesh->point[pt->
v[2]];
150 a11 = ppb->
c[0] - ppa->
c[0];
151 a21 = ppb->
c[1] - ppa->
c[1];
153 a12 = p1->
c[0] - ppa->
c[0];
154 a22 = p1->
c[1] - ppa->
c[1];
155 area1 = a11*a22 - a12*a21;
157 a12 = p2->
c[0] - ppa->
c[0];
158 a22 = p2->
c[1] - ppa->
c[1];
159 area2 = a11*a22 - a12*a21;
161 a12 = p3->
c[0] - ppa->
c[0];
162 a22 = p3->
c[1] - ppa->
c[1];
163 area3 = a11*a22 - a12*a21;
170 if ( prod1 > 0 && ((prod2 < 0 || prod3 < 0))) {
177 if ( prod2 > 0 && ((prod1 < 0 || prod3 < 0))) {
184 if ( prod3 > 0 && ((prod2 < 0 || prod1 < 0))) {
192 if ( pt->
v[i] == ia || ibreak ) {
194 if ( (prod1 < 0) || (prod2 < 0) || (prod3 < 0) ) {
201 if ( ibreak && ( pt->
v[(i+1)%3] == ia || pt->
v[(i+2)%3] == ia ) ) {
204 else if ( pt->
v[i] == ia && ( pt->
v[(i+1)%3] == ib || pt->
v[(i+2)%3] == ib ) ) {
223 MMG5_int iel,base,iadr,*adja,iter,
ier;
225 double l1,l2,l3,det,eps;
226 static int8_t mmgWarn0 = 0;
233 mvDir[0] = mvDir[1] = mvDir[2] = 0;
235 pt = &
mesh->tria[iel];
238 if ( iel >
mesh->nt )
return 0;
242 if ( pt->
base == base) {
245 fprintf(stderr,
"\n ## Warning: %s: numerical problem, please make"
246 " a bug report.\n",__func__);
251 if ( (pt->
v[0] == ip) || (pt->
v[1] == ip) || (pt->
v[2] == ip) )
return iel;
255 adja = &
mesh->adja[iadr];
259 if ( !
ier )
return 0;
274 if(!mvDir[0] && !mvDir[1] && !mvDir[2]) {
281 if (!mvDir[i])
continue;
285 pt1 = &
mesh->tria[jel];
287 if(pt1->
base ==
mesh->base)
continue;
295 if (mvDir[i])
continue;
298 pt1 = &
mesh->tria[jel];
299 if(pt1->
base ==
mesh->base)
continue;
309 }
while ( iter<=mesh->nt );
332 double a[3],a11,a21,a12,a22,area1,area2,area3,prod1,prod2,prod3;
334 MMG5_int iadr,*adja,k,ibreak,i,ncompt,lon,iare,ivert;
335 static int8_t mmgWarn=0;
341 ppa = &
mesh->point[ia];
342 ppb = &
mesh->point[ib];
347 if(pt->
v[0]==ia || pt->
v[1]==ia || pt->
v[2]==ia) ivert = 1;
357 if (
mesh->info.ddebug ||
mesh->info.imprim > 6 )
358 printf(
" Try to enforce edge %" MMG5_PRId
" %" MMG5_PRId
"\n",ia,ib);
366 adja = &
mesh->adja[iadr];
371 if ( pt->
v[0] == ib || pt->
v[1] == ib || pt->
v[2] == ib ) ibreak = 1;
373 ppt1 = &
mesh->point[pt->
v[0]];
374 ppt2 = &
mesh->point[pt->
v[1]];
375 ppt3 = &
mesh->point[pt->
v[2]];
378 a11 = ppb->
c[0] - ppa->
c[0];
379 a21 = ppb->
c[1] - ppa->
c[1];
380 a12 = ppt1->
c[0] - ppa->
c[0];
381 a22 = ppt1->
c[1] - ppa->
c[1];
382 area1 = a11*a22 - a12*a21;
384 a12 = ppt2->
c[0] - ppa->
c[0];
385 a22 = ppt2->
c[1] - ppa->
c[1];
386 area2 = a11*a22 - a12*a21;
388 a12 = ppt3->
c[0] - ppa->
c[0];
389 a22 = ppt3->
c[1] - ppa->
c[1];
390 area3 = a11*a22 - a12*a21;
409 if ( prod1 > 0.0 && ((prod2 < 0.0 || prod3 < 0.0))) {
412 list[lon++] = 3*k + iare-1;
415 if ( (
mesh->tria[k].base >=
mesh->base ) || !k ) {
417 if ( !iare && (
mesh->tria[k].base >=
mesh->base || !k ) ) {
419 if ( (
mesh->tria[k].base >=
mesh->base ) )
422 else if ( (
mesh->tria[k].base >=
mesh->base ) )
430 if ( prod2 > 0.0 && ((prod1 < 0.0 || prod3 < 0.0 ))) {
433 list[lon++] = 3*k + iare-1;
436 if ((
mesh->tria[k].base >=
mesh->base) || !k) {
438 if ( !iare && (!k ||
mesh->tria[k].base >=
mesh->base) ) {
440 if ( (
mesh->tria[k].base >=
mesh->base ) )
443 else if ( (
mesh->tria[k].base >=
mesh->base ) )
451 if ( prod3 > 0.0 && ((prod2 < 0.0 || prod1 < 0.0 ))) {
454 list[lon++] = 3*k + iare-1;
457 if ( (
mesh->tria[k].base >=
mesh->base ) || !k ) {
459 if ( !iare && (!k ||
mesh->tria[k].base >=
mesh->base) ) {
461 if((
mesh->tria[k].base >=
mesh->base))
464 else if ( (
mesh->tria[k].base >=
mesh->base) )
474 if ( pt->
v[i] == ia || ibreak ) {
475 if ( (prod1 < 0.0) || (prod2 < 0.0) || (prod3 < 0.0) ) {
478 list[lon++] = 3*k + iare-1;
484 if ( ibreak && ( pt->
v[(i+1)%3] == ia || pt->
v[(i+2)%3] == ia) ){
489 else if ( pt->
v[i] == ia && ( pt->
v[(i+1)%3] == ib || pt->
v[(i+2)%3] == ib ) ) {
509 niaib = sqrt(a11*a11+a21*a21 );
516 npti = sqrt((ppb->
c[0]-ppt4->
c[0])*(ppb->
c[0]-ppt4->
c[0])+
517 (ppb->
c[1]-ppt4->
c[1])*(ppb->
c[1]-ppt4->
c[1]));
518 if ( niaib > npti ) {
540 assert ( pt->
v[i] == ia );
555 if (!k ||
mesh->tria[k].base>=
mesh->base || !
mesh->tria[k].v[0]) {
557 if(!k ||
mesh->tria[k].base>=
mesh->base || !
mesh->tria[k].v[0]) {
559 if(
mesh->tria[k].base>=
mesh->base || !
mesh->tria[k].v[0]) k=0;
565 k = adja[(i+1)%3] / 3;
566 if (!k ||
mesh->tria[k].base>=
mesh->base || !
mesh->tria[k].v[0]) {
568 if(!k ||
mesh->tria[k].base>=
mesh->base || !
mesh->tria[k].v[0]) {
570 if(
mesh->tria[k].base>=
mesh->base || !
mesh->tria[k].v[0]) k=0;
579 if ( ibreak == 1 || ibreak == -10 )
continue;
580 if ( ibreak > 1 )
break;
586 fprintf(stderr,
"\n ## Error: %s: unexpected failure."
587 " Check your initial data and/or report the bug. lon:%" MMG5_PRId
". %e %e %e\n"
588 " tria %" MMG5_PRId
": %" MMG5_PRId
" %" MMG5_PRId
" %" MMG5_PRId
",\n",
589 __func__,lon, area1,area2,area3,k,
mesh->tria[k].v[0],
590 mesh->tria[k].v[1],
mesh->tria[k].v[2]);
599 if ((
mesh->tria[k].base>=
mesh->base) || !k || !
mesh->tria[k].v[0]) {
601 if ((
mesh->tria[k].base>=
mesh->base) || !k || !
mesh->tria[k].v[0]) {
603 if((
mesh->tria[k].base>=
mesh->base) || !k || !
mesh->tria[k].v[0]) {
610 while ( ncompt < mesh->nt );
613 lon = ( ibreak == 4 ) ? 4 : ((-1)*lon);
int MMG2D_coorbary(MMG5_pMesh mesh, MMG5_pTria pt, double c[2], double *det, double *l1, double *l2)