Loading Unstructured_mesh/MeshFunctions.h +42 −16 Original line number Original line Diff line number Diff line Loading @@ -654,30 +654,44 @@ static MeshDataContainer<unsigned int, FromDim> colour( template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> template<typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, bool edgeIsLeft(MeshElements<2, IndexType, Real, Reserve...>& mesh, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<2, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge typename MeshElements<2, IndexType, Real, Reserve...>::Edge& edge ) { ) { Vertex<MeshDimension, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<2, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<MeshDimension, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); Vertex<2, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); for (IndexType i = 0; i < MeshDimension; i++){ Real res = AminC[0]*BminC[1]-BminC[0]*AminC[1]; 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; return res > 0; } } throw std::runtime_error("can not determine orientation of edge " + throw std::runtime_error("can not determine orientation of edge " + std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex())); std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex())); } } template<typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<3, IndexType, Real, Reserve...>& mesh, typename MeshElements<3, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<3, IndexType, Real, Reserve...>::Edge& edge, Vector<3, Real> faceNormal ) { Vertex<3, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<3, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); Real res = Real(0); for (IndexType i = 0; i < 3; i++){ IndexType ipo = (i+1)%(3); IndexType ipt = (i+2)%(3); res += AminC[i]*BminC[ipo]*faceNormal[ipt]-AminC[ipt]*BminC[ipo]*faceNormal[i]; } return res > 0; } template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { Loading @@ -688,6 +702,18 @@ bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, } } template<typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<3, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { typename MeshElements<3, IndexType, Real, Reserve...>::Edge& edge = mesh.getEdges().at(edgeIndex); typename MeshElements<3, IndexType, Real, Reserve...>::template ElementType<2>& face = mesh.template getElements<2>().at(faceIndex); auto normals = ComputeFaceNormals(mesh); return edgeIsLeft(mesh, face, edge, normals[face]); } Loading Unstructured_mesh/Unstructured_mesh.pro +1 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,7 @@ SOURCES += \ ../debug/debug.cpp ../debug/debug.cpp HEADERS += \ HEADERS += \ ../debug/VariableExport.h \ ../debug/consolelogger.h \ ../debug/consolelogger.h \ CellBoundaryConnection.h \ CellBoundaryConnection.h \ CellConnection.h \ CellConnection.h \ Loading Unstructured_mesh/Unstructured_mesh.pro.user +1 −1 Original line number Original line Diff line number Diff line <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject> <!-- Written by QtCreator 4.10.0, 2019-10-05T13:24:56. --> <!-- Written by QtCreator 4.10.0, 2019-10-07T13:49:40. --> <qtcreator> <qtcreator> <data> <data> <variable>EnvironmentId</variable> <variable>EnvironmentId</variable> Loading Unstructured_mesh/Vector.h +4 −17 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,10 @@ public: return coordinates[pos]; return coordinates[pos]; } } unsigned int size() const { return Dim; } Real normEukleid(); Real normEukleid(); inline Real sumOfSquares() { inline Real sumOfSquares() { Loading Loading @@ -206,23 +210,6 @@ bool Vector<Dim, Real>::operator !=(const Vector<Dim, Real>& v) const { return !(*this == v); return !(*this == v); } } template <unsigned int Dim, typename Real = double> std::ostream& operator <<(std::ostream& ost, const Vector<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ost << v[i] << ' '; } return ost; } template <unsigned int Dim, typename Real = double> std::istream& operator >>(std::istream& ist, Vector<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ist >> v[i]; } return ist; } Loading Unstructured_mesh/Vertex.h +4 −17 Original line number Original line Diff line number Diff line Loading @@ -38,6 +38,10 @@ public: return coordinates[pos]; return coordinates[pos]; } } unsigned int size() const { return Dim; } Real normEukleid(); Real normEukleid(); inline Real sumOfSquares() { inline Real sumOfSquares() { Loading Loading @@ -191,23 +195,6 @@ bool Vertex<Dim, Real>::operator !=(const Vertex<Dim, Real>& v) const { return !(*this == v); return !(*this == v); } } template <unsigned int Dim, typename Real = double> std::ostream& operator <<(std::ostream& ost, const Vertex<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ost << v[i] << ' '; } return ost; } template <unsigned int Dim, typename Real = double> std::istream& operator >>(std::istream& ist, Vertex<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ist >> v[i]; } return ist; } #endif // VERTEX_H #endif // VERTEX_H Loading
Unstructured_mesh/MeshFunctions.h +42 −16 Original line number Original line Diff line number Diff line Loading @@ -654,30 +654,44 @@ static MeshDataContainer<unsigned int, FromDim> colour( template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> template<typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, bool edgeIsLeft(MeshElements<2, IndexType, Real, Reserve...>& mesh, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<2, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<MeshDimension, IndexType, Real, Reserve...>::Edge& edge typename MeshElements<2, IndexType, Real, Reserve...>::Edge& edge ) { ) { Vertex<MeshDimension, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<2, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<MeshDimension, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); Vertex<2, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); for (IndexType i = 0; i < MeshDimension; i++){ Real res = AminC[0]*BminC[1]-BminC[0]*AminC[1]; 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; return res > 0; } } throw std::runtime_error("can not determine orientation of edge " + throw std::runtime_error("can not determine orientation of edge " + std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex())); std::to_string(edge.getIndex()) + " wrt face: " + std::to_string(face.getIndex())); } } template<typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<3, IndexType, Real, Reserve...>& mesh, typename MeshElements<3, IndexType, Real, Reserve...>::template ElementType<2>& face, typename MeshElements<3, IndexType, Real, Reserve...>::Edge& edge, Vector<3, Real> faceNormal ) { Vertex<3, Real> AminC = mesh.getVertices().at(edge.getVertexAIndex()) - face.getCenter(); Vertex<3, Real> BminC = mesh.getVertices().at(edge.getVertexBIndex()) - face.getCenter(); Real res = Real(0); for (IndexType i = 0; i < 3; i++){ IndexType ipo = (i+1)%(3); IndexType ipt = (i+2)%(3); res += AminC[i]*BminC[ipo]*faceNormal[ipt]-AminC[ipt]*BminC[ipo]*faceNormal[i]; } return res > 0; } template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> template<unsigned int MeshDimension, typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { Loading @@ -688,6 +702,18 @@ bool edgeIsLeft(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, } } template<typename IndexType, typename Real, unsigned int ...Reserve> bool edgeIsLeft(MeshElements<3, IndexType, Real, Reserve...>& mesh, IndexType faceIndex, IndexType edgeIndex) { typename MeshElements<3, IndexType, Real, Reserve...>::Edge& edge = mesh.getEdges().at(edgeIndex); typename MeshElements<3, IndexType, Real, Reserve...>::template ElementType<2>& face = mesh.template getElements<2>().at(faceIndex); auto normals = ComputeFaceNormals(mesh); return edgeIsLeft(mesh, face, edge, normals[face]); } Loading
Unstructured_mesh/Unstructured_mesh.pro +1 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,7 @@ SOURCES += \ ../debug/debug.cpp ../debug/debug.cpp HEADERS += \ HEADERS += \ ../debug/VariableExport.h \ ../debug/consolelogger.h \ ../debug/consolelogger.h \ CellBoundaryConnection.h \ CellBoundaryConnection.h \ CellConnection.h \ CellConnection.h \ Loading
Unstructured_mesh/Unstructured_mesh.pro.user +1 −1 Original line number Original line Diff line number Diff line <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject> <!-- Written by QtCreator 4.10.0, 2019-10-05T13:24:56. --> <!-- Written by QtCreator 4.10.0, 2019-10-07T13:49:40. --> <qtcreator> <qtcreator> <data> <data> <variable>EnvironmentId</variable> <variable>EnvironmentId</variable> Loading
Unstructured_mesh/Vector.h +4 −17 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,10 @@ public: return coordinates[pos]; return coordinates[pos]; } } unsigned int size() const { return Dim; } Real normEukleid(); Real normEukleid(); inline Real sumOfSquares() { inline Real sumOfSquares() { Loading Loading @@ -206,23 +210,6 @@ bool Vector<Dim, Real>::operator !=(const Vector<Dim, Real>& v) const { return !(*this == v); return !(*this == v); } } template <unsigned int Dim, typename Real = double> std::ostream& operator <<(std::ostream& ost, const Vector<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ost << v[i] << ' '; } return ost; } template <unsigned int Dim, typename Real = double> std::istream& operator >>(std::istream& ist, Vector<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ist >> v[i]; } return ist; } Loading
Unstructured_mesh/Vertex.h +4 −17 Original line number Original line Diff line number Diff line Loading @@ -38,6 +38,10 @@ public: return coordinates[pos]; return coordinates[pos]; } } unsigned int size() const { return Dim; } Real normEukleid(); Real normEukleid(); inline Real sumOfSquares() { inline Real sumOfSquares() { Loading Loading @@ -191,23 +195,6 @@ bool Vertex<Dim, Real>::operator !=(const Vertex<Dim, Real>& v) const { return !(*this == v); return !(*this == v); } } template <unsigned int Dim, typename Real = double> std::ostream& operator <<(std::ostream& ost, const Vertex<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ost << v[i] << ' '; } return ost; } template <unsigned int Dim, typename Real = double> std::istream& operator >>(std::istream& ist, Vertex<Dim,Real>& v) { for (unsigned int i = 0; i < Dim; i++) { ist >> v[i]; } return ist; } #endif // VERTEX_H #endif // VERTEX_H