Changeset 17122
- Timestamp:
- 01/16/14 11:39:30 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/IoModel.h
r16770 r17122 40 40 int *edges; 41 41 int *elementtoedgeconnectivity; 42 int *elementtofaceconnectivity; 42 43 int *singlenodetoelementconnectivity; 43 44 int *numbernodetoelementconnectivity; -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateFaces.cpp
r16291 r17122 5 5 #include "../../classes/classes.h" 6 6 #include "../../shared/shared.h" 7 8 void CreateFaces(IoModel* iomodel){ 7 #include "./ModelProcessorx.h" 8 9 void CreateFaces(IoModel* iomodel){/*{{{*/ 9 10 10 11 /*If faces are already present, exit*/ 11 12 if(iomodel->faces) return; 12 13 13 /*Check Iomodel properties*/ 14 if(iomodel->meshtype!=Mesh2DhorizontalEnum) _error_("only 2d model are supported"); 14 /*Some checks*/ 15 15 if(iomodel->numberofvertices<3) _error_("not enough elements in mesh"); 16 16 _assert_(iomodel->elements); 17 18 /*Check Iomodel properties*/ 19 if(iomodel->meshtype==Mesh2DhorizontalEnum){ 20 /*Keep going*/ 21 } 22 else if(iomodel->meshtype==Mesh3DEnum){ 23 CreateFaces3d(iomodel); 24 return; 25 } 26 else{ 27 _error_("mesh dimension not supported yet"); 28 } 17 29 18 30 /*Intermediaries*/ … … 31 43 /*Initialize chain*/ 32 44 int* head_minv = xNew<int>(iomodel->numberofvertices); 33 int* next_ edge = xNew<int>(maxnbf);45 int* next_face = xNew<int>(maxnbf); 34 46 for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1; 35 47 … … 57 69 /*Go through all processed faces connected to v1 and check whether we have seen this edge yet*/ 58 70 _assert_(v1>=0 && v1<iomodel->numberofvertices); 59 for(int e=head_minv[v1]; e!=-1; e=next_ edge[e]){71 for(int e=head_minv[v1]; e!=-1; e=next_face[e]){ 60 72 if(facestemp[e*4+1]==v2){ 61 73 exist = true; … … 76 88 77 89 /*Update chain*/ 78 next_ edge[nbf] = head_minv[v1];90 next_face[nbf] = head_minv[v1]; 79 91 head_minv[v1] = nbf; 80 92 … … 87 99 /*Clean up*/ 88 100 xDelete<int>(head_minv); 89 xDelete<int>(next_ edge);101 xDelete<int>(next_face); 90 102 91 103 /*Create final faces*/ … … 109 121 iomodel->faces = faces; 110 122 iomodel->numberoffaces = nbf; 111 } 123 }/*}}}*/ 124 void CreateFaces3d(IoModel* iomodel){/*{{{*/ 125 126 /*Intermediaries*/ 127 bool exist; 128 int i,j,k,v0,cols; 129 int maxnbf,nbf,elementnbf,elementnbv,facemaxnbv; 130 int *elementfaces = NULL; 131 int *elementfaces_markers = NULL; 132 133 /*Maximum number of faces*/ 134 maxnbf = 6*iomodel->numberofelements; 135 136 /*Initialize intermediaries*/ 137 int* facestemp = xNew<int>(maxnbf*6); /*format: [vertex1 vertex2 vertex3 element1 element2 marker] */ 138 for(i=0;i<maxnbf;i++) facestemp[i*6+4]=-1; /*Initialize last column of faces as -1 (boundary face) */ 139 140 /*Initialize chain*/ 141 int* head_minv = xNew<int>(iomodel->numberofvertices); 142 int* next_face = xNew<int>(maxnbf); 143 for(i=0;i<iomodel->numberofvertices;i++) head_minv[i]=-1; 144 145 /*Mesh specific face indexing per element*/ 146 if(iomodel->meshtype==Mesh3DEnum){ 147 elementnbv = 6; /*Number of vertices per element*/ 148 elementnbf = 5; /*Number of faces per element*/ 149 facemaxnbv = 4; /*Maximum number of vertices per face*/ 150 cols = facemaxnbv + 1; 151 elementfaces = xNew<int>(elementnbf*cols); 152 elementfaces_markers = xNew<int>(elementnbf); 153 /*2 triangles*/ 154 elementfaces_markers[0] = 1; 155 elementfaces_markers[1] = 1; 156 elementfaces[cols*0+0] = 3; elementfaces[cols*0+1] = 0; elementfaces[cols*0+2] = 1; elementfaces[cols*0+3] = 2; 157 elementfaces[cols*1+0] = 3; elementfaces[cols*1+1] = 3; elementfaces[cols*1+2] = 4; elementfaces[cols*1+3] = 5; 158 /*3 quads*/ 159 elementfaces_markers[2] = 2; 160 elementfaces_markers[3] = 2; 161 elementfaces_markers[4] = 2; 162 elementfaces[cols*2+0] = 4; elementfaces[cols*2+1] = 0; elementfaces[cols*2+2] = 1; elementfaces[cols*2+3] = 4; elementfaces[cols*2+4] = 3; 163 elementfaces[cols*3+0] = 4; elementfaces[cols*3+1] = 1; elementfaces[cols*3+2] = 2; elementfaces[cols*3+3] = 5; elementfaces[cols*3+4] = 4; 164 elementfaces[cols*4+0] = 4; elementfaces[cols*4+1] = 2; elementfaces[cols*4+2] = 0; elementfaces[cols*4+3] = 3; elementfaces[cols*4+4] = 5; 165 } 166 else{ 167 _error_("mesh dimension not supported yet"); 168 } 169 int *element_face_connectivity = xNewZeroInit<int>(iomodel->numberofelements*elementnbf); /*format: [face1 face2 ...] */ 170 171 /*Initialize number of faces and list of vertex indices*/ 172 nbf = 0; 173 int* v = xNew<int>(facemaxnbv); 174 175 for(i=0;i<iomodel->numberofelements;i++){ 176 for(j=0;j<elementnbf;j++){ 177 178 /*Get indices of current face*/ 179 for(k=0;k<elementfaces[cols*j+0];k++){ 180 v[k] = iomodel->elements[i*elementnbv + elementfaces[cols*j+k+1]] - 1; 181 } 182 183 /*Sort list of vertices*/ 184 HeapSort(v,elementfaces[cols*j+0]); 185 v0 = v[0]; 186 187 /*This face a priori has not been processed yet*/ 188 exist = false; 189 190 /*Go through all processed faces connected to v1 and check whether we have seen this edge yet*/ 191 _assert_(v0>=0 && v0<iomodel->numberofvertices); 192 for(int e=head_minv[v0]; e!=-1; e=next_face[e]){ 193 if(facestemp[e*6+1]==v[1]+1 && facestemp[e*6+2]==v[2]+1){ 194 exist = true; 195 facestemp[e*6+4]=i+1; 196 element_face_connectivity[i*elementnbf+j]=e; 197 break; 198 } 199 } 200 201 /*If this face is new, add it to the lists*/ 202 if(!exist){ 203 _assert_(nbf<maxnbf); 204 205 /*Update faces*/ 206 facestemp[nbf*6+0] = v[0]+1; 207 facestemp[nbf*6+1] = v[1]+1; 208 facestemp[nbf*6+2] = v[2]+1; 209 facestemp[nbf*6+3] = i+1; 210 facestemp[nbf*6+5] = elementfaces_markers[j]; 211 212 /*Update Connectivity*/ 213 element_face_connectivity[i*elementnbf+j]=nbf; 214 215 /*Update chain*/ 216 next_face[nbf] = head_minv[v0]; 217 head_minv[v0] = nbf; 218 219 /*Increase number of faces*/ 220 nbf++; 221 } 222 } 223 } 224 225 /*Clean up*/ 226 xDelete<int>(head_minv); 227 xDelete<int>(next_face); 228 229 /*Create final faces (now that we have the correct size)*/ 230 int* faces = xNew<int>(nbf*6); /*vertex1 vertex2 vertex3 element1 element2 marker*/ 231 xMemCpy<int>(faces,facestemp,nbf*6); 232 xDelete<int>(facestemp); 233 234 /*Assign output pointers*/ 235 iomodel->faces = faces; 236 iomodel->numberoffaces = nbf; 237 iomodel->elementtofaceconnectivity = element_face_connectivity; 238 }/*}}}*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/FacesPartitioning.cpp
r16291 r17122 11 11 12 12 /*Intermediaries*/ 13 int el1,el2; 14 bool my_face; 15 16 /*Check Iomodel properties*/ 17 if(iomodel->meshtype!=Mesh2DhorizontalEnum) _error_("only 2d model are supported"); 13 int elementnbf; 18 14 19 15 /*Get faces and elements*/ 20 16 CreateFaces(iomodel); 17 _assert_(iomodel->elementtofaceconnectivity); 21 18 19 /*Mesh dependent variables*/ 20 if(iomodel->meshtype==Mesh2DhorizontalEnum){ 21 elementnbf = 3; 22 } 23 else if(iomodel->meshtype==Mesh2DverticalEnum){ 24 elementnbf = 3; 25 } 26 else if(iomodel->meshtype==Mesh3DEnum){ 27 elementnbf = 5; 28 } 29 else{ 30 _error_("mesh dimension not supported yet"); 31 } 22 32 /*output: */ 23 bool* my_faces=xNew <bool>(iomodel->numberoffaces);33 bool* my_faces=xNewZeroInit<bool>(iomodel->numberoffaces); 24 34 25 for(int i=0;i<iomodel->numberoffaces;i++){ 26 27 /*Get left and right elements*/ 28 el1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2] 29 el2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2] 30 31 /*Check whether we should include this face (el2 is -2 for boundary faces)*/ 32 my_face = iomodel->my_elements[el1]; 33 if(!my_face && el2>=0){ 34 my_face = iomodel->my_elements[el2]; 35 for(int i=0;i<iomodel->numberofelements;i++){ 36 if(iomodel->my_elements[i]){ 37 for(int j=0;j<elementnbf;j++){ 38 _assert_(iomodel->elementtofaceconnectivity[i*elementnbf+j] >= 0); 39 _assert_(iomodel->elementtofaceconnectivity[i*elementnbf+j] < iomodel->numberoffaces); 40 my_faces[iomodel->elementtofaceconnectivity[i*elementnbf+j]] = true; 41 } 35 42 } 36 37 my_faces[i] = my_face;38 43 } 39 44 -
issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
r16787 r17122 30 30 31 31 /*Mesh properties*/ 32 void CreateEdges(IoModel* iomodel); 32 33 void CreateFaces(IoModel* iomodel); 33 void Create Edges(IoModel* iomodel);34 void CreateFaces3d(IoModel* iomodel); 34 35 35 36 /*Connectivity*/
Note:
See TracChangeset
for help on using the changeset viewer.