7 #include "../shared/shared.h"
43 if(
NbRef>0){
_printf_(
"Trying to delete geometry and NbRef>0, probably due to an error. NbRef:" <<
NbRef);
return;}
59 double Hmin = HUGE_VAL;
60 int i,j,n,i0,i1,i2,i3;
68 if (bamggeom->
Vertices==NULL)
_error_(
"the domain provided does not contain any vertex");
69 if (bamggeom->
Edges==NULL)
_error_(
"the domain provided does not contain any edge");
73 if(verbose>5)
_printf_(
" processing Vertices\n");
105 int MaxICoord = 1073741823;
110 _error_(
"No BamgVertex provided");
114 if (bamggeom->
Edges){
116 double* verticeslength=NULL;
118 if(verbose>5)
_printf_(
" processing Edges\n");
123 verticeslength =
new double[
nbv];
124 for(i=0;i<
nbv;i++) verticeslength[i]=0;
129 i1=(int)bamggeom->
Edges[i*3+0]-1;
130 i2=(
int)bamggeom->
Edges[i*3+1]-1;
137 double l12=sqrt((x12,x12));
153 verticeslength[i1] += l12;
154 verticeslength[i2] += l12;
158 for (i=0;i<
nbv;i++) {
164 delete [] verticeslength;
173 if(verbose>5)
_printf_(
" processing hVertices\n");
174 for (i=0;i<
nbv;i++){
175 if (!xIsNan<IssmPDouble>(bamgopts->
hVertices[i])){
183 if(verbose>5)
_printf_(
" processing MetricVertices\n");
184 for (i=0;i<
nbv;i++) {
191 if(verbose>5)
_printf_(
" processing TangentAtEdges");
202 if (i<0 || i>=
nbe)
_error_(
"TangentAtEdges first index exceeds matrix dimension");
203 if (j!=0 && j!=1)
_error_(
"TangentAtEdges second index should be 1 or 2 only");
210 if(verbose>5)
_printf_(
" processing Corners");
215 if (j>
nbv-1 || j<0)
_error_(
"Bad corner definition: should in [0 " <<
nbv <<
"]");
224 if(verbose>5)
_printf_(
" processing RequiredVertices\n");
229 if (j>
nbv-1 || j<0)
_error_(
"Bad RequiredVerticess definition: should in [0 " <<
nbv <<
"]");
236 if(verbose>5)
_printf_(
" processing RequiredEdges\n");
241 if (j>
nbe-1 || j<0)
_error_(
"Bad RequiredEdges definition: should in [0 " <<
nbe <<
"]");
248 if(verbose>5)
_printf_(
" processing SubDomains\n");
257 if (i0!=2)
_error_(
"Bad Subdomain definition: first number should be 2 (for Edges)");
258 if (i1>
nbe || i1<=0)
_error_(
"Bad Subdomain definition: second number should in [1 " <<
nbe <<
"] (edge number)");
278 if(verbose>5)
_printf_(
" writing Vertices\n");
289 if (
vertices[i].Required()) nbreqv++;
294 if(verbose>5)
_printf_(
" writing Edges\n");
298 bamggeom->
Edges=xNew<double>(3*
nbe);
302 bamggeom->
Edges[i*3+2]=(double)
edges[i].ReferenceNumber;
305 if (
edges[i].Required()) nbreq++;
306 if (
edges[i].TgA() &&
edges[i][0].Corner()) nbtan++;
307 if (
edges[i].TgB() &&
edges[i][1].Corner()) nbtan++;
312 if(verbose>5)
_printf_(
" writing " << nbreq <<
" RequiredEdges\n");
319 if (
edges[i].Required()){
329 if(verbose>5)
_printf_(
" writing " << nbreqv <<
" RequiredVertices\n");
344 if(verbose>5)
_printf_(
" writing SubDomains\n");
358 if(verbose>5)
_printf_(
" writing TangentAtEdges\n");
385 _printf_(
" nbv (number of vertices) : " <<
nbv <<
"\n");
386 _printf_(
" nbe (number of edges) : " <<
nbe <<
"\n");
444 long *head_v =
new long[
nbv];
445 long *next_p =
new long[2 *
nbe];
446 float *eangle =
new float[
nbe];
475 _error_(
"two points of the geometry are very close to each other (see reference numbers above)");
542 for (i=0;i<
nbv;i++) head_v[i]=-1;
544 for (i=0;i<
nbe;i++) {
553 _printf_(
"Length of edge " << i <<
" is 0\n");
554 _error_(
"Length of edge " << i <<
" is 0");
557 eangle[i] = atan2(v10.
y,v10.
x);
567 for (i=0;i<
nbv;i++) {
575 float angleold=-1000 ;
592 if (angleold > angle){
615 long n2 = next_p[n1];
616 long i1 = n1/2, i2 = n2/2;
617 long j1 = n1%2, j2 = n2%2;
620 float da12 =
Abs(angle2-angle1);
621 if (( da12 >= MaxCornerAngle ) && (da12 <= 2*
Pi -MaxCornerAngle)) {
628 if(
edges[i1].ReferenceNumber !=
edges[i2].ReferenceNumber) {
639 long n2 = next_p[n1];
640 long i1 = n1/2, i2 = n2/2;
641 long j1 = n1%2, j2 = n2%2;
646 if (
edges[i1].ReferenceNumber !=
edges[i2].ReferenceNumber) {
653 long no=-1, ne = head_v[i];
654 while (ne >=0) ne = next_p[no=ne];
655 if(no>=0) next_p[no] = head_v[i];
664 long n1 = next_p[k++];
665 long i1 = n1/2 ,j1=n1%2;
667 if(
edges[i1].v[j1] !=
edges[i].v[j])
_error_(
"Problem while processing edges: check the edge list");
675 for (i=0;i<
nbe;i++) {
678 double ltg2[2]={0.0};
688 if(!
edges[i].v[j]->Corner()){
701 tg = tg*(lAB/ltg),ltg=lAB;
706 if ((tg,AB)<0) tg = -tg;
716 for (
int step=0;step<2;step++){
719 for (i=0;i<
nbe;i++)
edges[i].SetUnMark();
720 long nb_marked_edges=0;
725 for (
int level=0;level<2 && nb_marked_edges!=
nbe;level++){
794 _error_(
"ProjectOnCurve error message: edge provided should be on geometry");
796 if (!e[0].GeomEdgeHook || !e[1].GeomEdgeHook){
797 _error_(
"ProjectOnCurve error message: at least one of the vertex of the edge provided is not on geometry");
805 R2 V0=v0,V1=v1,V01=V1-V0;
814 R2 Ag=(
R2)(*on)[0],Bg=(
R2)(*on)[1],AB=Bg-Ag;
815 int OppositeSens = (V01,AB)<0;
816 int direction0=0,direction1=1;
824 int directionge[mxe+1];
826 int bge=mxe/2,tge=bge;
833 _printf_(
"Fatal Error: on the class Mesh before call Geometry::ProjectOnCurve\n");
834 _printf_(
"That bug might come from:\n");
835 _printf_(
" 1) a mesh edge containing more than " << mxe/2 <<
" geometrical edges\n");
836 _printf_(
" 2) code bug : be sure that we call Mesh::SetVertexFieldOn() before\n");
837 _printf_(
"To solve the problem do a coarsening of the geometrical mesh or change the constant value of mxe (dangerous)\n");
844 ge[--bge] =eg0 = eg0->
Adj[direction0];
846 direction0 = 1-( directionge[bge] = tmpge->
AdjVertexIndex[direction0]);
850 _printf_(
"WARNING: on the class Mesh before call Geometry::ProjectOnCurve is having issues (isn't it Eric?)\n");
852 if (NbTry<2)
goto retry;
853 _printf_(
"Fatal Error: on the class Mesh before call Geometry::ProjectOnCurve\n");
854 _printf_(
"That bug might come from:\n");
855 _printf_(
" 1) a mesh edge contening more than " << mxe/2 <<
" geometrical edges\n");
856 _printf_(
" 2) code bug : be sure that we call Mesh::SetVertexFieldOn() before\n");
857 _printf_(
"To solve the problem do a coarsening of the geometrical mesh or change the constant value of mxe (dangerous)\n");
861 ge[++tge] =eg1 = eg1->
Adj[direction1];
862 directionge[tge]= direction1 = 1-tmpge->
AdjVertexIndex[direction1];
874 double s0=vg0,s1=vg1;
875 sg = s0*(1.0-s) + s*s1;
883 for(i=bge;i<tge;i++){
885 BB = (*ge[i])[directionge[i]];
886 lge[i]=ll +=
Norme2(AA-BB);
888 lge[tge]=ll+=
Norme2(AA-V1);
894 s1= directionge[bge];
897 while ( (l1=lge[i]) < ls ) {
899 i++,s0=1-(s1=directionge[i]),l0=l1;
927 for (
int i=0;i<
nbe;i++)
edges[i].SetUnMark();