FEM: Mesh ViewProvider, add faces and edges of quad8

This commit is contained in:
Bernd Hahnebach 2016-04-09 18:42:59 +01:00 committed by wmayer
parent e8e5876249
commit 6edb3146b4

View File

@ -786,8 +786,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop,
BndBox.Add(facesHelper[i++].set(6, aFace, aFace->GetID(), 0, aFace->GetNode(0), aFace->GetNode(3), aFace->GetNode(1), aFace->GetNode(4), aFace->GetNode(2), aFace->GetNode(5)));
break;
case 8:
//quad8 face = N1, N2, N3, N4, N5, N6, N7, N8
BndBox.Add(facesHelper[i++].set(8, aFace, aFace->GetID(), 0, aFace->GetNode(0), aFace->GetNode(1), aFace->GetNode(2), aFace->GetNode(3), aFace->GetNode(4), aFace->GetNode(5), aFace->GetNode(6), aFace->GetNode(7)));
//quad8 face = N1, N5, N2, N6, N3, N7, N4, N8
BndBox.Add(facesHelper[i++].set(8, aFace, aFace->GetID(), 0, aFace->GetNode(0), aFace->GetNode(4), aFace->GetNode(1), aFace->GetNode(5), aFace->GetNode(2), aFace->GetNode(6), aFace->GetNode(3), aFace->GetNode(7)));
break;
default:
//unknown face type
@ -1279,10 +1279,71 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop,
break;
// 8 nodes
case 8:
// quad8 face
// hexa8 volume, six 4-node quadrangles
Base::Console().Log(" %f: Start build up triangle vector for 8 nodes object\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo()));
Base::Console().Log(" NumNodes:%i\n",facesHelper[l].Element->NbNodes());
switch(facesHelper[l].FaceNo){
case 0: { // quad8 face, 8-node quadrangle
Base::Console().Log(" %f: Start build up triangle vector for quad8 face\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo()));
Base::Console().Log(" NumNodes:%i\n",facesHelper[l].Element->NbNodes());
// prefeche all node indexes of this face
int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)];
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(4)];
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(5)];
int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(6)];
int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)];
// create triangle number 1 ----------------------------------------------
// fill in the node indexes in CLOCKWISE order
indices[index++] = nIdx7;
indices[index++] = nIdx0;
indices[index++] = nIdx1;
indices[index++] = SO_END_FACE_INDEX;
// add the two edge segments for that triangle
insEdgeVec(EdgeMap, nIdx7, nIdx0);
insEdgeVec(EdgeMap, nIdx0, nIdx1);
// rember the element and face number for that triangle
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
// create triangle number 2 ----------------------------------------------
indices[index++] = nIdx1;
indices[index++] = nIdx2;
indices[index++] = nIdx3;
indices[index++] = SO_END_FACE_INDEX;
insEdgeVec(EdgeMap, nIdx1, nIdx2);
insEdgeVec(EdgeMap, nIdx2, nIdx3);
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
// create triangle number 3 ----------------------------------------------
indices[index++] = nIdx3;
indices[index++] = nIdx4;
indices[index++] = nIdx5;
indices[index++] = SO_END_FACE_INDEX;
insEdgeVec(EdgeMap, nIdx3, nIdx4);
insEdgeVec(EdgeMap, nIdx4, nIdx5);
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
// create triangle number 4 ----------------------------------------------
indices[index++] = nIdx5;
indices[index++] = nIdx6;
indices[index++] = nIdx7;
indices[index++] = SO_END_FACE_INDEX;
insEdgeVec(EdgeMap, nIdx5, nIdx6);
insEdgeVec(EdgeMap, nIdx6, nIdx7);
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
// create triangle number 5 ----------------------------------------------
indices[index++] = nIdx7;
indices[index++] = nIdx1;
indices[index++] = nIdx3;
indices[index++] = SO_END_FACE_INDEX;
// this triangle has no edge (inner triangle)
// create triangle number 6 ----------------------------------------------
indices[index++] = nIdx3;
indices[index++] = nIdx5;
indices[index++] = nIdx7;
indices[index++] = SO_END_FACE_INDEX;
// this triangle has no edge (inner triangle)
break; }
case 1: { // hexa8 volume: face 1, 4-node quadrangle
Base::Console().Log(" %f: Start build up triangle vector for hexa8 --> face1\n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo()));
Base::Console().Log(" NumNodes:%i\n",facesHelper[l].Element->NbNodes());
@ -1405,6 +1466,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop,
insEdgeVec(EdgeMap,nIdx3,nIdx0);
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,5);
break; }
default: assert(0);
}
break;
// 10 nodes