Changeset 5605
- Timestamp:
- 08/27/10 08:37:12 (15 years ago)
- Location:
- issm/trunk/src/c/objects/Bamg
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/objects/Bamg/Mesh.cpp
r5584 r5605 1059 1059 void Mesh::AddVertex( BamgVertex &s,Triangle* t, Icoor2* det3) { 1060 1060 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Add)*/ 1061 // ------------------------------- ------------1061 // ------------------------------- 1062 1062 // s2 1063 // 1064 // /|\ 1065 // / | \ 1066 // / | \ 1067 // tt1 / | \ tt0 1068 // / |s \ 1069 // / . \ 1070 // / . ` \ 1071 // / . ` \ 1072 // ---------------- 1063 // ! 1064 // /|\ ! 1065 // / | \ ! 1066 // / | \ ! 1067 // tt1 / | \ tt0 ! 1068 // / |s \ ! 1069 // / . \ ! 1070 // / . ` \ ! 1071 // / . ` \ ! 1072 // ---------------- ! 1073 1073 // s0 tt2 s1 1074 //-------------------------------------------- 1075 1076 //the three triangles tt 1077 Triangle* tt[3]; 1078 //three vertices of t 1079 BamgVertex &s0 = (*t)[0], &s1=(*t)[1], &s2=(*t)[2]; 1080 //three determinants 1081 Icoor2 det3local[3]; 1082 // number of zero det3 1083 register int nbzerodet =0; 1084 // izerodet = egde contening the vertex s 1085 register int izerodet=-1,iedge; 1074 //------------------------------- 1075 1076 /*Intermediaries*/ 1077 Triangle* tt[3]; //the three triangles 1078 Icoor2 det3local[3]; //three determinants (integer) 1079 int nbzerodet =0; //number of zeros in det3 1080 int izerodet=-1; //egde containing the vertex s 1081 int iedge; 1082 1083 /*three vertices of t*/ 1084 BamgVertex &s0=(*t)[0]; 1085 BamgVertex &s1=(*t)[1]; 1086 BamgVertex &s2=(*t)[2]; 1087 1086 1088 //determinant of t 1087 Icoor2 detOld =t->det;1088 1089 / / infinitevertexpos = orderof the infinite vertex (NULL)1090 // if no infinite vertex (NULL) infinitevertexpos=-11091 // else if v_i is infinite, infinitevertexpos=i1092 int inf initevertexpos= &s0 ? (( &s1 ? ( &s2 ? -1 : 2) : 1 )) : 0;1089 Icoor2 detOld=t->det; 1090 1091 /* infvertexindex = index of the infinite vertex (NULL) 1092 if no infinite vertex (NULL) infvertexindex=-1 1093 else if v_i is infinite, infvertexindex=i*/ 1094 int infvertexindex = &s0 ? (( &s1 ? ( &s2 ? -1 : 2) : 1 )) : 0; 1093 1095 1094 1096 //some checks 1095 if (( inf initevertexpos <0 ) && (detOld <0) || ( infinitevertexpos>=0 ) && (detOld >0) ){1096 ISSMERROR(" bug in Mesh::Add, bad configuration");1097 if (( infvertexindex <0 ) && (detOld <0) || ( infvertexindex >=0 ) && (detOld >0) ){ 1098 ISSMERROR("inconsistent configuration (Contact ISSM developers)"); 1097 1099 } 1098 1100 1099 1101 // if det3 does not exist, build it 1100 if (!det3) 1102 if (!det3){ 1101 1103 //allocate 1102 1104 det3 = det3local; 1103 1105 //if no infinite vertex 1104 if (inf initevertexpos<0 ) {1106 if (infvertexindex<0 ) { 1105 1107 det3[0]=bamg::det(s ,s1,s2); 1106 1108 det3[1]=bamg::det(s0,s ,s2); 1107 1109 det3[2]=bamg::det(s0,s1,s );} 1108 1110 else { 1109 // one of &s1 &s2 &s0 is NULL so (&si || &sj) <=> !&sk1111 // one of &s1 &s2 &s0 is NULL 1110 1112 det3[0]= &s0 ? -1 : bamg::det(s ,s1,s2) ; 1111 1113 det3[1]= &s1 ? -1 : bamg::det(s0,s ,s2) ; … … 1119 1121 1120 1122 //if nbzerodet>0, point s is on an egde or on a vertex 1121 if (nbzerodet >0 ){ 1122 if (nbzerodet == 1) { 1123 if (nbzerodet>0){ 1124 /*s is on an edge*/ 1125 if (nbzerodet==1) { 1123 1126 iedge = OppositeEdge[izerodet]; 1124 1127 AdjacentTriangle ta = t->Adj(iedge); 1125 1128 1126 // the point is on the edge 1127 // if the point is one the boundary 1128 // add the point in outside part 1129 if ( t->det >=0) { // inside triangle 1130 if ((( Triangle *) ta)->det < 0 ) { 1129 /*if the point is one the boundary 1130 add the point in outside part */ 1131 if (t->det>=0){ // inside triangle 1132 if (((Triangle*)ta)->det<0 ) { 1131 1133 // add in outside triangle 1132 AddVertex(s,( Triangle *) 1134 AddVertex(s,( Triangle *)ta); 1133 1135 return; 1134 1136 } 1135 1137 } 1136 1138 } 1137 else { 1138 //t->Echo(); 1139 printf("\nproblem while trying to add:\n"); 1140 s.Echo(); 1141 ISSMERROR("Bug in Mesh::Add points duplicated %i times",nbzerodet); 1139 else{ 1140 ISSMERROR("Cannot add a vertex more than once. Check duplicates"); 1142 1141 } 1143 1142 } 1144 1143 1145 1144 // remove de MarkUnSwap edge 1146 t->SetUnMarkUnSwap(0); 1147 t->SetUnMarkUnSwap(1); 1145 t->SetUnMarkUnSwap(0); 1146 t->SetUnMarkUnSwap(1); 1148 1147 t->SetUnMarkUnSwap(2); 1149 1148 … … 2790 2789 * the initial simple mesh from this edge and 2 boundary triangles*/ 2791 2790 2792 BamgVertex * 2791 BamgVertex *v0=orderedvertices[0], *v1=orderedvertices[1]; 2793 2792 2794 2793 nbt = 2; 2795 triangles[0](0) = NULL; 2794 triangles[0](0) = NULL;//infinite vertex 2796 2795 triangles[0](1) = v0; 2797 2796 triangles[0](2) = v1; … … 2823 2822 2824 2823 /*Now, add the vertices One by One*/ 2825 2826 2824 long NbSwap=0; 2827 2825 if (verbose>3) printf(" Begining of insertion process...\n"); … … 2833 2831 2834 2832 //Find the triangle in which newvertex is located 2835 Icoor2 det e[3];2836 Triangle* tcvi = TriangleFindFromCoord(newvertex->i,det e); //(newvertex->i = integer coordinates)2833 Icoor2 det3[3]; 2834 Triangle* tcvi = TriangleFindFromCoord(newvertex->i,det3); //(newvertex->i = integer coordinates) 2837 2835 2838 2836 //Add newvertex to the quadtree … … 2840 2838 2841 2839 //Add newvertex to the existing mesh 2842 AddVertex(*newvertex,tcvi,det e);2840 AddVertex(*newvertex,tcvi,det3); 2843 2841 2844 2842 //Make the mesh Delaunay around newvertex by swaping the edges … … 2881 2879 long i; 2882 2880 long NbSwap=0; 2883 Icoor2 det e[3];2881 Icoor2 det3[3]; 2884 2882 2885 2883 //number of new points … … 2925 2923 } 2926 2924 vj.ReferenceNumber=0; 2927 Triangle *tcvj=TriangleFindFromCoord(vj.i,det e);2925 Triangle *tcvj=TriangleFindFromCoord(vj.i,det3); 2928 2926 if (tcvj && !tcvj->link){ 2929 2927 tcvj->Echo(); … … 2931 2929 } 2932 2930 quadtree->Add(vj); 2933 AddVertex(vj,tcvj,det e);2931 AddVertex(vj,tcvj,det3); 2934 2932 NbSwap += vj.Optim(1); 2935 2933 iv++; … … 3569 3567 for (int icount=2; icount<nbvb; icount++) { 3570 3568 BamgVertex *vi = orderedvertices[icount]; 3571 Icoor2 det e[3];3572 Triangle *tcvi = TriangleFindFromCoord(vi->i,det e);3569 Icoor2 det3[3]; 3570 Triangle *tcvi = TriangleFindFromCoord(vi->i,det3); 3573 3571 quadtree->Add(*vi); 3574 AddVertex(*vi,tcvi,det e);3572 AddVertex(*vi,tcvi,det3); 3575 3573 NbSwap += vi->Optim(1,1); 3576 3574 } … … 4682 4680 long iv = nbvold; 4683 4681 long NbSwap = 0; 4684 Icoor2 det e[3];4682 Icoor2 det3[3]; 4685 4683 for (int i=nbvold;i<nbv;i++) {// for all the new point 4686 4684 BamgVertex & vi = vertices[i]; … … 4691 4689 vi.ReferenceNumber=0; 4692 4690 vi.DirOfSearch =NoDirOfSearch; 4693 Triangle *tcvi = TriangleFindFromCoord(vi.i,det e);4691 Triangle *tcvi = TriangleFindFromCoord(vi.i,det3); 4694 4692 if (tcvi && !tcvi->link) { 4695 4693 printf("problem inserting point in SplitInternalEdgeWithBorderVertices (tcvj && !tcvj->link)\n"); … … 4700 4698 ISSMERROR("!tcvi || tcvi->det < 0"); 4701 4699 } 4702 AddVertex(vi,tcvi,det e);4700 AddVertex(vi,tcvi,det3); 4703 4701 NbSwap += vi.Optim(1); 4704 4702 iv++; … … 4728 4726 /*}}}1*/ 4729 4727 /*FUNCTION Mesh::TriangleFindFromCoord{{{1*/ 4730 Triangle * Mesh::TriangleFindFromCoord(const I2 & B,Icoor2 det e[3], Triangle *tstart) const {4728 Triangle * Mesh::TriangleFindFromCoord(const I2 & B,Icoor2 det3[3], Triangle *tstart) const { 4731 4729 /*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/FindTriangleContening)*/ 4732 4730 … … 4769 4767 ISSMASSERT(k0>=0);// k0 the NULL vertex 4770 4768 int k1=NextVertex[k0],k2=PreviousVertex[k0]; 4771 det e[k0]=det(B,(*t)[k1],(*t)[k2]);4772 det e[k1]=dete[k2]=-1;4773 if (det e[k0] > 0) // outside B4769 det3[k0]=det(B,(*t)[k1],(*t)[k2]); 4770 det3[k1]=det3[k2]=-1; 4771 if (det3[k0] > 0) // outside B 4774 4772 return t; 4775 4773 t = t->TriangleAdj(OppositeEdge[k0]); … … 4787 4785 4788 4786 j= OppositeVertex[jj]; 4789 det e[j] = detop; //det(*b,*s1,*s2);4787 det3[j] = detop; //det(*b,*s1,*s2); 4790 4788 jn = NextVertex[j]; 4791 4789 jp = PreviousVertex[j]; 4792 det e[jp]= det(*(*t)(j),*(*t)(jn),B);4793 det e[jn] = t->det-dete[j] -dete[jp];4794 4795 // count the number k of det e<04790 det3[jp]= det(*(*t)(j),*(*t)(jn),B); 4791 det3[jn] = t->det-det3[j] -det3[jp]; 4792 4793 // count the number k of det3 <0 4796 4794 int k=0,ii[3]; 4797 if (det e[0] < 0 ) ii[k++]=0;4798 if (det e[1] < 0 ) ii[k++]=1;4799 if (det e[2] < 0 ) ii[k++]=2;4795 if (det3[0] < 0 ) ii[k++]=0; 4796 if (det3[1] < 0 ) ii[k++]=1; 4797 if (det3[2] < 0 ) ii[k++]=2; 4800 4798 // 0 => ok 4801 4799 // 1 => go in way 1 … … 4803 4801 4804 4802 if (k==0) break; 4805 if (k == 2 && BinaryRand()) Exchange(ii[0],ii[1]); 4806 if ( k>=3){ 4807 ISSMERROR("k>=3"); 4808 } 4803 if (k==2 && BinaryRand()) Exchange(ii[0],ii[1]); 4804 ISSMASSERT(k<3); 4809 4805 AdjacentTriangle t1 = t->Adj(jj=ii[0]); 4810 4806 if ((t1.det() < 0 ) && (k == 2)) … … 4812 4808 t=t1; 4813 4809 j=t1;// for optimisation we now the -det[OppositeVertex[j]]; 4814 detop = -det e[OppositeVertex[jj]];4810 detop = -det3[OppositeVertex[jj]]; 4815 4811 jj = j; 4816 4812 } 4817 4813 4818 4814 if (t->det<0) // outside triangle 4819 det e[0]=dete[1]=dete[2]=-1,dete[OppositeVertex[jj]]=detop;4815 det3[0]=det3[1]=det3[2]=-1,det3[OppositeVertex[jj]]=detop; 4820 4816 return t; 4821 4817 } -
issm/trunk/src/c/objects/Bamg/Triangle.cpp
r5460 r5605 259 259 /*FUNCTION Triangle::SetAdj2{{{1*/ 260 260 void Triangle::SetAdj2(short a,Triangle *t,short aat){ 261 adj[a]=t; //the adjacent triangle to the edge a is t 262 AdjEdgeIndex[a]=aat; //position of the edge in the adjacent triangle 263 if(t) { //if t!=NULL add adjacent triangle to t (this) 261 /*For current triangle: 262 * - a is the index of the edge were the adjency is set (in [0 2]) 263 * - t is the adjacent triangle 264 * - aat is the index of the same edge in the adjacent triangle*/ 265 adj[a]=t; 266 AdjEdgeIndex[a]=aat; 267 if(t){ //if t!=NULL add adjacent triangle to t (this) 264 268 t->adj[aat]=this; 265 269 t->AdjEdgeIndex[aat]=a;
Note:
See TracChangeset
for help on using the changeset viewer.