Commit bc36214d authored by Tomáš Jakubec's avatar Tomáš Jakubec
Browse files

Loading 3D from VTK

detection whether an edge is left or right to the face or cell
parent 1b6d2da9
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ public:
        return this->begin() + getNumberOfSubElements();
    }

    typename std::array<Subelement<IndexType>, Reserve>::const_iterator cend(){
    typename std::array<Subelement<IndexType>, Reserve>::const_iterator cend() const {
        return this->cbegin() + getNumberOfSubElements();
    }
};
+40 −1
Original line number Diff line number Diff line
@@ -652,6 +652,45 @@ static MeshDataContainer<unsigned int, FromDim> colour(
}
};



template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve>
bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh,
                typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face,
                typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge
                ) {

    Vertex<MeshDimension, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter();
    Vertex<MeshDimension, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter();


    for (IndexType i = 0; i < MeshDimension; i++){
        IndexType ipo = (i+1)%(MeshDimension);
        IndexType ipt = (i+2)%(MeshDimension);
        Real res = AminC[ipo]*BminC[ipt]-BminC[ipo]*AminC[ipt];
        if ((MeshDimension + i + 1)% 2 == 0)
            res *= -1;
        if (abs(res) > 1e-4) {
            return res > 0;
        }
    }
    throw std::runtime_error("can not determine orientation of edge " +
                             std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex()));
}

template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve>
bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) {

    typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge = mesh.getEdges().at(edgeIndex);
    typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face = mesh.template getElements<2>().at(faceIndex);

    return edgeIsLeft(mesh, face, edge);

}




}


+8 −0
Original line number Diff line number Diff line
@@ -14,5 +14,13 @@ public:
    using type = MeshNativeType<2>;


};

template <typename IndexType, typename Real>
class MeshReader<3, IndexType, Real> {
public:
    using type = MeshNativeType<3>;


};
#endif // MESHREADER_H
+1 −1
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.10.0, 2019-10-03T23:49:08. -->
<!-- Written by QtCreator 4.10.0, 2019-10-04T18:23:48. -->
<qtcreator>
 <data>
  <variable>EnvironmentId</variable>
+7 −4
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ public:
                    mesh.getEdges().at(edgeIndex).setIndex(edgeIndex);

                    mesh.getEdges().at(edgeIndex).setCellLeftIndex(cellIndex);
                    edges[edgeKey] = edgeIndex;
                } else {
                    edgeIndex = edgeIt->second;
                    mesh.getEdges().at(edgeIt->second).setCellRightIndex(cellIndex);
@@ -228,7 +229,7 @@ class VTKMeshReader<3, IndexType, Real, Reserve...> : public MeshReader<3, Index
                    {0,2,1},
                    {0,4,8,3},
                    {1,4,7,5},
                    {3,5,6,3},
                    {3,5,6,2},
                    {6,7,8}
                }
            }
@@ -273,7 +274,6 @@ public:
    void loadPoints(std::istream& ist, MeshElements<3, IndexType, Real, Reserve...>& mesh){
        IndexType numPoints;
        ist >> numPoints;
        Real dummy = 0;
        mesh.getVertices().resize(numPoints);
        ist.ignore(20, '\n');
        for (IndexType vertIndex = 0; vertIndex < numPoints; vertIndex++) {
@@ -321,6 +321,7 @@ public:
                    mesh.getEdges().at(edgeIndex).setVertexBIndex(iB);
                    mesh.getEdges().at(edgeIndex).setIndex(edgeIndex);
                    edgeIndexes.push_back({edgeIndex, true});
                    edges[edgeKey] = edgeIndex;
                } else {
                    edgeIndexes.push_back({edgeIt->second, iA == mesh.getEdges().at(edgeIt->second).getVertexAIndex()});
                }
@@ -347,9 +348,10 @@ public:
                    faceIndex = mesh.getFaces().size();
                    mesh.getFaces().push_back({});
                    for (int& index : f) {
                        mesh.getFaces().at(faceIndex).addSublement(edgeIndexes.at(index));
                        mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndexes.at(index).first,edgeIndexes.at(index).second);
                    }
                    mesh.getFaces().at(faceIndex).setCellLeftIndex(cellIndex);
                    mesh.getFaces().at(faceIndex).setIndex(faceIndex);
                } else {
                    faceIndex = faceIt->second;
                    mesh.getFaces().at(faceIndex).setCellRightIndex(cellIndex);
@@ -362,8 +364,9 @@ public:
                    mesh.getCells().at(cellIndex).setBoundaryElementIndex(faceIndex);
                }
                if (fi == faceOrder.size() - 1) {
                    mesh.getEdges().at(faceIndex).setNextBElem(mesh.getCells().at(cellIndex).getBoundaryElementIndex(), cellIndex);
                    mesh.getFaces().at(faceIndex).setNextBElem(mesh.getCells().at(cellIndex).getBoundaryElementIndex(), cellIndex);
                }
                faces[faceKey] = faceIndex;
                prevFaceIndex = faceIndex;
            }
        }
Loading