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-09-10T15:52:36. --> <!-- Written by QtCreator 4.10.0, 2019-09-18T12:33:57. --> <qtcreator> <qtcreator> <data> <data> <variable>EnvironmentId</variable> <variable>EnvironmentId</variable> Loading Unstructured_mesh/main.cpp +41 −10 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,8 @@ #include "mesh_functions.h" #include "mesh_functions.h" using namespace std; using namespace std; int main() int main() { { using sit = UnstructuredMesh<2, size_t, double>; using sit = UnstructuredMesh<2, size_t, double>; Loading Loading @@ -56,7 +58,7 @@ int main() size_t edge = mesh.GetCells().at(i).GetBoundaryElementIndex(); size_t edge = mesh.GetCells().at(i).GetBoundaryElementIndex(); size_t tmp_edge = edge; size_t tmp_edge = edge; do { do { DBGVAR(tmp_edge, mesh.GetFaces().at(tmp_edge).VertexA,mesh.GetFaces().at(tmp_edge).VertexB,mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexA), mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexB), mesh.CalculateEdgeMeasure(tmp_edge)); DBGVAR(tmp_edge, mesh.GetFaces().at(tmp_edge).VertexA,mesh.GetFaces().at(tmp_edge).VertexB,mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexA), mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexB), mesh.CalculateEdgeMeasure(tmp_edge)) tmp_edge = mesh.GetFaces().at(tmp_edge).GetNextBElem(i); tmp_edge = mesh.GetFaces().at(tmp_edge).GetNextBElem(i); } while(edge != tmp_edge); } while(edge != tmp_edge); Loading @@ -66,11 +68,11 @@ int main() DBGVAR(mesh.GetCells().at(i).GetCenter(), mesh.CalculateCellMeasure(i)) DBGVAR(mesh.GetCells().at(i).GetCenter(), mesh.CalculateCellMeasure(i)) DBGVAR(mesh.GetCells().at(i).GetFlag()) DBGVAR(mesh.GetCells().at(i).GetFlag()) } } DBGVAR(mesh.CalculateEdgeMeasure(2)/mesh.CalculateCellDist(0,1)); DBGVAR(mesh.CalculateEdgeMeasure(2)/mesh.CalculateCellDist(0,1)) DBGVAR(mesh.CalculateFaceMeasureOverCellDist(2)); DBGVAR(mesh.CalculateFaceMeasureOverCellDist(2)) sit::MeshElementWrap<1> ele(mesh.GetEdges().at(0)); sit::MeshElementWrap<1> ele(&mesh, mesh.GetEdges().at(0)); sit::MeshElementWrap<2> cell(&mesh, mesh.GetCells().at(0)); sit::MeshElementWrap<2> cell(&mesh, mesh.GetCells().at(0)); DBGMSG("cell boundary iterator test"); DBGMSG("cell boundary iterator test"); Loading @@ -80,7 +82,19 @@ int main() } } for(auto i : mesh.GetElement<2>(1).GetSubelements()){ DBGVAR(i) } DBGMSG("cell vertices using iterator"); for(size_t i = 0; i < mesh.GetCells().size(); i++){ for(auto j : mesh.GetElement<2>(i).GetSubelements()){ auto e = mesh.GetElement<1>(j); DBGVAR(e.GetElement().GetVertexAIndex(), e.GetElement().GetVertexBIndex()) } } CellsVertices<2,2,size_t, double>::run(mesh); DBGMSG("3D test"); DBGMSG("3D test"); Loading Loading @@ -155,11 +169,11 @@ DBGCHECK; size_t tmp_face = mesh3.GetCells().at(0).GetBoundaryElementIndex(); size_t tmp_face = mesh3.GetCells().at(0).GetBoundaryElementIndex(); do { do { DBGVAR(tmp_face); DBGVAR(tmp_face) for (auto& sube : mesh3.GetFaces().at(tmp_face).GetSubelements()) { for (auto& sube : mesh3.GetFaces().at(tmp_face).GetSubelements()) { DBGVAR(sube.index); DBGVAR(sube.index) if (sube.index < 12 ){ if (sube.index < 12 ){ DBGVAR(sube.index, mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexAIndex()),mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexBIndex())); DBGVAR(sube.index, mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexAIndex()),mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexBIndex())) } } } } Loading @@ -171,17 +185,34 @@ DBGCHECK; DBGMSG("Iterator wrapper test"); DBGMSG("Iterator wrapper test"); sit3::MeshElementWrap<2> elem(&mesh3, mesh3.GetFaces().at(0)); sit3::MeshElementWrap<2> elem(&mesh3, mesh3.GetFaces().at(0)); for(auto i : elem.GetSubelements()){ for(auto i : elem.GetSubelements()){ DBGVAR(i.index); DBGVAR(i.index) } } MeshDataContainer<double, 3,2> cont(mesh3); DBGMSG("3D cell vertices"); CellsVertices<3,3,size_t, double, 6>::run(mesh3); DBGMSG("mesh conatiner test"); MeshDataContainer<double, 3,2,1,0> cont(mesh3); //cont.GetDataDim<3>().resize(20); //cont.GetDataDim<3>().resize(20); DBG(cont.GetDataPos<1>().size()); DBG(cont.GetDataPos<1>().size()); DBG(cont.GetDataPos<0>().size()); DBG(cont.GetDataPos<0>().size()); //auto centers = ComputeCenters(mesh3); DBGMSG("faceCenters"); MeshDataContainer<Vertex<3,double>, 3,2,1> centers(mesh3); _ComputeCenters<1,3>::compute<size_t, double, 6>(centers, mesh3); auto& faceCent = centers.GetDataDim<2>(); for(auto& center : faceCent) { DBGVAR(center) } DBGMSG("cellCenter"); DBGVAR(centers.GetDataDim<3>().at(0)) //DBGVAR(centers.template GetDataDim<3>().at(0)) //DBGVAR(centers.template GetDataDim<3>().at(0)); //DBGVAR(centers.template GetDataDim<3>().at(0)); } } Unstructured_mesh/mesh_element.h +35 −2 Original line number Original line Diff line number Diff line Loading @@ -435,23 +435,56 @@ public: template<typename Dummy> template<typename Dummy> class MeshElementWrap<1, Dummy> { class MeshElementWrap<1, Dummy> { IndexType elementIndex; IndexType elementIndex; MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh; public: public: MeshElementWrap(MeshElement<Dimension, 1, IndexType, Real, 0>& meshElement){ MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, MeshElement<Dimension, 1, IndexType, Real, 0>& meshElement){ elementIndex = meshElement.GetIndex(); elementIndex = meshElement.GetIndex(); this->parentMesh = parentMesh; } } MeshElementWrap(IndexType elementIndex){ MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, IndexType elementIndex){ this->elementIndex = elementIndex; this->elementIndex = elementIndex; this->parentMesh = parentMesh; } } IndexType GetIndex(){ IndexType GetIndex(){ return elementIndex; return elementIndex; } } Edge& GetElement() { return parentMesh->GetEdges()[elementIndex]; } }; }; template<typename Dummy> class MeshElementWrap<0, Dummy> { IndexType elementIndex; MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh; public: MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, Vertex& meshElement){ elementIndex = meshElement.GetIndex(); this->parentMesh = parentMesh; } MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, IndexType elementIndex){ this->elementIndex = elementIndex; this->parentMesh = parentMesh; } IndexType GetIndex(){ return elementIndex; } Vertex& GetElement() { return parentMesh->GetVertices()[elementIndex]; } }; template<unsigned int ElementDim> MeshElementWrap<ElementDim> GetElement(IndexType elementIndex){ return MeshElementWrap<ElementDim>(this, elementIndex); } }; }; Loading Unstructured_mesh/mesh_functions.h +56 −17 Original line number Original line Diff line number Diff line #ifndef MESH_FUNCTIONS_H #ifndef MESH_FUNCTIONS_H #define MESH_FUNCTIONS_H #define MESH_FUNCTIONS_H #include "mesh_element.h" #include "mesh_element.h" #include "../debug/debug.h" /** /** * @brief The MeshDataContainer struct * @brief The MeshDataContainer struct Loading Loading @@ -102,24 +102,25 @@ public: template <unsigned int dim, unsigned int Dimension> template <unsigned int dim, unsigned int Dimension> struct _ComputeCenters{ struct _ComputeCenters{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> void compute(MeshDataContainer<Vertex<Dimension, Real>, std::make_index_sequence<Dimension + 1>{}>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MeshDataContainer<Vertex<Dimension, Real>, 3,2,1>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template GetDataDim<dim>(); auto& elemCenters = centers.template GetDataDim<dim>(); auto& subElemCenters = centers.template GetDataDim<dim - 1>(); auto& subElemCenters = centers.template GetDataDim<dim - 1>(); for (IndexType i = 0; i < mesh.template GetElements<1>().size(); i++) { for (IndexType i = 0; i < mesh.template GetElements<dim>().size(); i++) { auto& element = mesh.template GetElements<dim>().at(i); auto& element = mesh.template GetElements<dim>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; for(IndexType sub : elemCenters.GetSubelements()){ for(auto& sub : element.GetSubelements()){ elemCenters.at(i) += subElemCenters.at(sub); elemCenters.at(i) += subElemCenters.at(sub.index); subElemCnt++; subElemCnt++; } } elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } DBGMSG(dim); _ComputeCenters<dim + 1, Dimension>::compute(centers, mesh); _ComputeCenters<dim + 1, Dimension>::compute(centers, mesh); } } Loading @@ -128,28 +129,28 @@ struct _ComputeCenters{ template <unsigned int Dimension> template <unsigned int Dimension> struct _ComputeCenters<Dimension, Dimension>{ struct _ComputeCenters<Dimension, Dimension>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> void compute(MeshDataContainer<Vertex<Dimension, Real>, std::make_index_sequence<Dimension + 1>{}>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MeshDataContainer<Vertex<Dimension, Real>, 3,2,1>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template GetDataDim<Dimension>(); auto& elemCenters = centers.template GetDataDim<Dimension>(); auto& subElemCenters = centers.template GetDataDim<Dimension - 1>(); auto& subElemCenters = centers.template GetDataDim<Dimension - 1>(); for (IndexType i = 0; i < mesh.template GetElements<1>().size(); i++) { for (IndexType i = 0; i < mesh.template GetElements<Dimension>().size(); i++) { auto& element = mesh.template GetElements<Dimension>().at(i); auto& element = mesh.template GetElements<Dimension>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; IndexType tmpFaceIndex = element.GetBElemIndex(); IndexType tmpFaceIndex = element.GetBoundaryElementIndex(); do { do { elemCenters.at(i) += subElemCenters.at(tmpFaceIndex); elemCenters.at(i) += subElemCenters.at(tmpFaceIndex); subElemCnt++; subElemCnt++; } while (tmpFaceIndex != element.GetBElemIndex()); } while (tmpFaceIndex != element.GetBoundaryElementIndex()); elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } DBGMSG(Dimension); } } }; }; Loading @@ -157,21 +158,24 @@ struct _ComputeCenters<Dimension, Dimension>{ template <unsigned int Dimension> template <unsigned int Dimension> struct _ComputeCenters<1, Dimension>{ struct _ComputeCenters<1, Dimension>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> void compute(MeshDataContainer<Vertex<Dimension, Real>, std::make_index_sequence<Dimension + 1>{}>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MeshDataContainer<Vertex<Dimension, Real>, 3,2,1>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ std::vector<Vertex<Dimension, Real>>& edgeCenters = centers.template GetDataDim<1>(); auto & edgeCenters = centers.template GetDataDim<1>(); for (auto& edge : mesh.template GetElements<1>()) { for (IndexType i = 0; i < mesh.template GetElements<1>().size(); i++) { edgeCenters.at(edge.GetIndex()) = (mesh.template GetElements<0>().at(edge.GetVertexAIndex()) + auto& edge = mesh.template GetElements<1>().at(i); mesh.template GetElements<0>().at(edge.GetVertexBIndex())) * 0.5; edgeCenters.at(i) = 0.5 * (mesh.template GetElements<0>().at(edge.GetVertexAIndex) + mesh.template GetElements<0>().at(edge.GetVertexAIndex)); } } DBGMSG("1"); _ComputeCenters<2, Dimension>::compute(centers, mesh); _ComputeCenters<2, Dimension>::compute(centers, mesh); } } }; }; template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer<Vertex<Dimension, Real>, std::make_integer_sequence<unsigned int, Dimension + 1>{}> ComputeCenters(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer<Vertex<Dimension, Real>, std::make_integer_sequence<unsigned int, Dimension + 1>{}> ComputeCenters(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ Loading @@ -182,4 +186,39 @@ MeshDataContainer<Vertex<Dimension, Real>, std::make_integer_sequence<unsigned i return centers; return centers; } } template<unsigned int MeshDimension, unsigned int ElementDim,typename IndexType, typename Real, unsigned int ...Reserve> struct CellsVertices { static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType index){ DBGMSG("face number "<<index); for(auto i : mesh.template GetElement<ElementDim>(index).GetSubelements()) { CellsVertices<MeshDimension, ElementDim - 1, IndexType, Real, Reserve...>::run(mesh, i.index); } } }; template<unsigned int MeshDimension,typename IndexType, typename Real, unsigned int ...Reserve> struct CellsVertices<MeshDimension, MeshDimension, IndexType, Real, Reserve...> { static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh){ for(IndexType i = 0; i < mesh.GetCells().size(); i++){ DBGMSG("cell number "<<i); for(auto j : mesh.template GetElement<MeshDimension>(i).GetSubelements()) { CellsVertices<MeshDimension, MeshDimension - 1, IndexType, Real, Reserve...>::run(mesh, j); } } } }; template<unsigned int MeshDimension,typename IndexType, typename Real, unsigned int ...Reserve> struct CellsVertices<MeshDimension, 1, IndexType, Real, Reserve...> { static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType index){ auto e = mesh.template GetElement<1>(index); DBGVAR(mesh.GetVertices()[e.GetElement().GetVertexAIndex()], mesh.GetVertices()[e.GetElement().GetVertexBIndex()]) } }; #endif // MESH_FUNCTIONS_H #endif // MESH_FUNCTIONS_H debug/debug.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -134,7 +134,7 @@ abort();} #define HTMLDBGVAR(...) HDBGLog.writeVar(__LINE__, __FILE__ FOR_EACH(STRVAR, __VA_ARGS__)) #define HTMLDBGVAR(...) HDBGLog.writeVar(__LINE__, __FILE__ FOR_EACH(STRVAR, __VA_ARGS__)) #define HTMLDBGCOND(condition, ...) if(condition) HTMLDBGVAR(__VA_ARGS__) #define HTMLDBGCOND(condition, ...) if(condition) HTMLDBGVAR(__VA_ARGS__) #define DBGCHECK DBG("check"); #define DBGCHECK DBG("check") #else #else Loading 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-09-10T15:52:36. --> <!-- Written by QtCreator 4.10.0, 2019-09-18T12:33:57. --> <qtcreator> <qtcreator> <data> <data> <variable>EnvironmentId</variable> <variable>EnvironmentId</variable> Loading
Unstructured_mesh/main.cpp +41 −10 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,8 @@ #include "mesh_functions.h" #include "mesh_functions.h" using namespace std; using namespace std; int main() int main() { { using sit = UnstructuredMesh<2, size_t, double>; using sit = UnstructuredMesh<2, size_t, double>; Loading Loading @@ -56,7 +58,7 @@ int main() size_t edge = mesh.GetCells().at(i).GetBoundaryElementIndex(); size_t edge = mesh.GetCells().at(i).GetBoundaryElementIndex(); size_t tmp_edge = edge; size_t tmp_edge = edge; do { do { DBGVAR(tmp_edge, mesh.GetFaces().at(tmp_edge).VertexA,mesh.GetFaces().at(tmp_edge).VertexB,mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexA), mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexB), mesh.CalculateEdgeMeasure(tmp_edge)); DBGVAR(tmp_edge, mesh.GetFaces().at(tmp_edge).VertexA,mesh.GetFaces().at(tmp_edge).VertexB,mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexA), mesh.GetVertices().at(mesh.GetFaces().at(tmp_edge).VertexB), mesh.CalculateEdgeMeasure(tmp_edge)) tmp_edge = mesh.GetFaces().at(tmp_edge).GetNextBElem(i); tmp_edge = mesh.GetFaces().at(tmp_edge).GetNextBElem(i); } while(edge != tmp_edge); } while(edge != tmp_edge); Loading @@ -66,11 +68,11 @@ int main() DBGVAR(mesh.GetCells().at(i).GetCenter(), mesh.CalculateCellMeasure(i)) DBGVAR(mesh.GetCells().at(i).GetCenter(), mesh.CalculateCellMeasure(i)) DBGVAR(mesh.GetCells().at(i).GetFlag()) DBGVAR(mesh.GetCells().at(i).GetFlag()) } } DBGVAR(mesh.CalculateEdgeMeasure(2)/mesh.CalculateCellDist(0,1)); DBGVAR(mesh.CalculateEdgeMeasure(2)/mesh.CalculateCellDist(0,1)) DBGVAR(mesh.CalculateFaceMeasureOverCellDist(2)); DBGVAR(mesh.CalculateFaceMeasureOverCellDist(2)) sit::MeshElementWrap<1> ele(mesh.GetEdges().at(0)); sit::MeshElementWrap<1> ele(&mesh, mesh.GetEdges().at(0)); sit::MeshElementWrap<2> cell(&mesh, mesh.GetCells().at(0)); sit::MeshElementWrap<2> cell(&mesh, mesh.GetCells().at(0)); DBGMSG("cell boundary iterator test"); DBGMSG("cell boundary iterator test"); Loading @@ -80,7 +82,19 @@ int main() } } for(auto i : mesh.GetElement<2>(1).GetSubelements()){ DBGVAR(i) } DBGMSG("cell vertices using iterator"); for(size_t i = 0; i < mesh.GetCells().size(); i++){ for(auto j : mesh.GetElement<2>(i).GetSubelements()){ auto e = mesh.GetElement<1>(j); DBGVAR(e.GetElement().GetVertexAIndex(), e.GetElement().GetVertexBIndex()) } } CellsVertices<2,2,size_t, double>::run(mesh); DBGMSG("3D test"); DBGMSG("3D test"); Loading Loading @@ -155,11 +169,11 @@ DBGCHECK; size_t tmp_face = mesh3.GetCells().at(0).GetBoundaryElementIndex(); size_t tmp_face = mesh3.GetCells().at(0).GetBoundaryElementIndex(); do { do { DBGVAR(tmp_face); DBGVAR(tmp_face) for (auto& sube : mesh3.GetFaces().at(tmp_face).GetSubelements()) { for (auto& sube : mesh3.GetFaces().at(tmp_face).GetSubelements()) { DBGVAR(sube.index); DBGVAR(sube.index) if (sube.index < 12 ){ if (sube.index < 12 ){ DBGVAR(sube.index, mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexAIndex()),mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexBIndex())); DBGVAR(sube.index, mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexAIndex()),mesh3.GetVertices().at(mesh3.GetEdges().at(sube.index).GetVertexBIndex())) } } } } Loading @@ -171,17 +185,34 @@ DBGCHECK; DBGMSG("Iterator wrapper test"); DBGMSG("Iterator wrapper test"); sit3::MeshElementWrap<2> elem(&mesh3, mesh3.GetFaces().at(0)); sit3::MeshElementWrap<2> elem(&mesh3, mesh3.GetFaces().at(0)); for(auto i : elem.GetSubelements()){ for(auto i : elem.GetSubelements()){ DBGVAR(i.index); DBGVAR(i.index) } } MeshDataContainer<double, 3,2> cont(mesh3); DBGMSG("3D cell vertices"); CellsVertices<3,3,size_t, double, 6>::run(mesh3); DBGMSG("mesh conatiner test"); MeshDataContainer<double, 3,2,1,0> cont(mesh3); //cont.GetDataDim<3>().resize(20); //cont.GetDataDim<3>().resize(20); DBG(cont.GetDataPos<1>().size()); DBG(cont.GetDataPos<1>().size()); DBG(cont.GetDataPos<0>().size()); DBG(cont.GetDataPos<0>().size()); //auto centers = ComputeCenters(mesh3); DBGMSG("faceCenters"); MeshDataContainer<Vertex<3,double>, 3,2,1> centers(mesh3); _ComputeCenters<1,3>::compute<size_t, double, 6>(centers, mesh3); auto& faceCent = centers.GetDataDim<2>(); for(auto& center : faceCent) { DBGVAR(center) } DBGMSG("cellCenter"); DBGVAR(centers.GetDataDim<3>().at(0)) //DBGVAR(centers.template GetDataDim<3>().at(0)) //DBGVAR(centers.template GetDataDim<3>().at(0)); //DBGVAR(centers.template GetDataDim<3>().at(0)); } }
Unstructured_mesh/mesh_element.h +35 −2 Original line number Original line Diff line number Diff line Loading @@ -435,23 +435,56 @@ public: template<typename Dummy> template<typename Dummy> class MeshElementWrap<1, Dummy> { class MeshElementWrap<1, Dummy> { IndexType elementIndex; IndexType elementIndex; MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh; public: public: MeshElementWrap(MeshElement<Dimension, 1, IndexType, Real, 0>& meshElement){ MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, MeshElement<Dimension, 1, IndexType, Real, 0>& meshElement){ elementIndex = meshElement.GetIndex(); elementIndex = meshElement.GetIndex(); this->parentMesh = parentMesh; } } MeshElementWrap(IndexType elementIndex){ MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, IndexType elementIndex){ this->elementIndex = elementIndex; this->elementIndex = elementIndex; this->parentMesh = parentMesh; } } IndexType GetIndex(){ IndexType GetIndex(){ return elementIndex; return elementIndex; } } Edge& GetElement() { return parentMesh->GetEdges()[elementIndex]; } }; }; template<typename Dummy> class MeshElementWrap<0, Dummy> { IndexType elementIndex; MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh; public: MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, Vertex& meshElement){ elementIndex = meshElement.GetIndex(); this->parentMesh = parentMesh; } MeshElementWrap(MeshElements<Dimension, IndexType, Real, Reserve...>* parentMesh, IndexType elementIndex){ this->elementIndex = elementIndex; this->parentMesh = parentMesh; } IndexType GetIndex(){ return elementIndex; } Vertex& GetElement() { return parentMesh->GetVertices()[elementIndex]; } }; template<unsigned int ElementDim> MeshElementWrap<ElementDim> GetElement(IndexType elementIndex){ return MeshElementWrap<ElementDim>(this, elementIndex); } }; }; Loading
Unstructured_mesh/mesh_functions.h +56 −17 Original line number Original line Diff line number Diff line #ifndef MESH_FUNCTIONS_H #ifndef MESH_FUNCTIONS_H #define MESH_FUNCTIONS_H #define MESH_FUNCTIONS_H #include "mesh_element.h" #include "mesh_element.h" #include "../debug/debug.h" /** /** * @brief The MeshDataContainer struct * @brief The MeshDataContainer struct Loading Loading @@ -102,24 +102,25 @@ public: template <unsigned int dim, unsigned int Dimension> template <unsigned int dim, unsigned int Dimension> struct _ComputeCenters{ struct _ComputeCenters{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> void compute(MeshDataContainer<Vertex<Dimension, Real>, std::make_index_sequence<Dimension + 1>{}>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MeshDataContainer<Vertex<Dimension, Real>, 3,2,1>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template GetDataDim<dim>(); auto& elemCenters = centers.template GetDataDim<dim>(); auto& subElemCenters = centers.template GetDataDim<dim - 1>(); auto& subElemCenters = centers.template GetDataDim<dim - 1>(); for (IndexType i = 0; i < mesh.template GetElements<1>().size(); i++) { for (IndexType i = 0; i < mesh.template GetElements<dim>().size(); i++) { auto& element = mesh.template GetElements<dim>().at(i); auto& element = mesh.template GetElements<dim>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; for(IndexType sub : elemCenters.GetSubelements()){ for(auto& sub : element.GetSubelements()){ elemCenters.at(i) += subElemCenters.at(sub); elemCenters.at(i) += subElemCenters.at(sub.index); subElemCnt++; subElemCnt++; } } elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } DBGMSG(dim); _ComputeCenters<dim + 1, Dimension>::compute(centers, mesh); _ComputeCenters<dim + 1, Dimension>::compute(centers, mesh); } } Loading @@ -128,28 +129,28 @@ struct _ComputeCenters{ template <unsigned int Dimension> template <unsigned int Dimension> struct _ComputeCenters<Dimension, Dimension>{ struct _ComputeCenters<Dimension, Dimension>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> void compute(MeshDataContainer<Vertex<Dimension, Real>, std::make_index_sequence<Dimension + 1>{}>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MeshDataContainer<Vertex<Dimension, Real>, 3,2,1>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ auto& elemCenters = centers.template GetDataDim<Dimension>(); auto& elemCenters = centers.template GetDataDim<Dimension>(); auto& subElemCenters = centers.template GetDataDim<Dimension - 1>(); auto& subElemCenters = centers.template GetDataDim<Dimension - 1>(); for (IndexType i = 0; i < mesh.template GetElements<1>().size(); i++) { for (IndexType i = 0; i < mesh.template GetElements<Dimension>().size(); i++) { auto& element = mesh.template GetElements<Dimension>().at(i); auto& element = mesh.template GetElements<Dimension>().at(i); Real subElemCnt = 0; Real subElemCnt = 0; IndexType tmpFaceIndex = element.GetBElemIndex(); IndexType tmpFaceIndex = element.GetBoundaryElementIndex(); do { do { elemCenters.at(i) += subElemCenters.at(tmpFaceIndex); elemCenters.at(i) += subElemCenters.at(tmpFaceIndex); subElemCnt++; subElemCnt++; } while (tmpFaceIndex != element.GetBElemIndex()); } while (tmpFaceIndex != element.GetBoundaryElementIndex()); elemCenters.at(i) /= subElemCnt; elemCenters.at(i) /= subElemCnt; } } DBGMSG(Dimension); } } }; }; Loading @@ -157,21 +158,24 @@ struct _ComputeCenters<Dimension, Dimension>{ template <unsigned int Dimension> template <unsigned int Dimension> struct _ComputeCenters<1, Dimension>{ struct _ComputeCenters<1, Dimension>{ template <typename IndexType, typename Real, unsigned int ...Reserve> template <typename IndexType, typename Real, unsigned int ...Reserve> void compute(MeshDataContainer<Vertex<Dimension, Real>, std::make_index_sequence<Dimension + 1>{}>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ static void compute(MeshDataContainer<Vertex<Dimension, Real>, 3,2,1>& centers,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ std::vector<Vertex<Dimension, Real>>& edgeCenters = centers.template GetDataDim<1>(); auto & edgeCenters = centers.template GetDataDim<1>(); for (auto& edge : mesh.template GetElements<1>()) { for (IndexType i = 0; i < mesh.template GetElements<1>().size(); i++) { edgeCenters.at(edge.GetIndex()) = (mesh.template GetElements<0>().at(edge.GetVertexAIndex()) + auto& edge = mesh.template GetElements<1>().at(i); mesh.template GetElements<0>().at(edge.GetVertexBIndex())) * 0.5; edgeCenters.at(i) = 0.5 * (mesh.template GetElements<0>().at(edge.GetVertexAIndex) + mesh.template GetElements<0>().at(edge.GetVertexAIndex)); } } DBGMSG("1"); _ComputeCenters<2, Dimension>::compute(centers, mesh); _ComputeCenters<2, Dimension>::compute(centers, mesh); } } }; }; template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve> MeshDataContainer<Vertex<Dimension, Real>, std::make_integer_sequence<unsigned int, Dimension + 1>{}> ComputeCenters(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ MeshDataContainer<Vertex<Dimension, Real>, std::make_integer_sequence<unsigned int, Dimension + 1>{}> ComputeCenters(MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){ Loading @@ -182,4 +186,39 @@ MeshDataContainer<Vertex<Dimension, Real>, std::make_integer_sequence<unsigned i return centers; return centers; } } template<unsigned int MeshDimension, unsigned int ElementDim,typename IndexType, typename Real, unsigned int ...Reserve> struct CellsVertices { static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType index){ DBGMSG("face number "<<index); for(auto i : mesh.template GetElement<ElementDim>(index).GetSubelements()) { CellsVertices<MeshDimension, ElementDim - 1, IndexType, Real, Reserve...>::run(mesh, i.index); } } }; template<unsigned int MeshDimension,typename IndexType, typename Real, unsigned int ...Reserve> struct CellsVertices<MeshDimension, MeshDimension, IndexType, Real, Reserve...> { static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh){ for(IndexType i = 0; i < mesh.GetCells().size(); i++){ DBGMSG("cell number "<<i); for(auto j : mesh.template GetElement<MeshDimension>(i).GetSubelements()) { CellsVertices<MeshDimension, MeshDimension - 1, IndexType, Real, Reserve...>::run(mesh, j); } } } }; template<unsigned int MeshDimension,typename IndexType, typename Real, unsigned int ...Reserve> struct CellsVertices<MeshDimension, 1, IndexType, Real, Reserve...> { static void run(MeshElements<MeshDimension, IndexType, Real, Reserve...>& mesh, IndexType index){ auto e = mesh.template GetElement<1>(index); DBGVAR(mesh.GetVertices()[e.GetElement().GetVertexAIndex()], mesh.GetVertices()[e.GetElement().GetVertexBIndex()]) } }; #endif // MESH_FUNCTIONS_H #endif // MESH_FUNCTIONS_H
debug/debug.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -134,7 +134,7 @@ abort();} #define HTMLDBGVAR(...) HDBGLog.writeVar(__LINE__, __FILE__ FOR_EACH(STRVAR, __VA_ARGS__)) #define HTMLDBGVAR(...) HDBGLog.writeVar(__LINE__, __FILE__ FOR_EACH(STRVAR, __VA_ARGS__)) #define HTMLDBGCOND(condition, ...) if(condition) HTMLDBGVAR(__VA_ARGS__) #define HTMLDBGCOND(condition, ...) if(condition) HTMLDBGVAR(__VA_ARGS__) #define DBGCHECK DBG("check"); #define DBGCHECK DBG("check") #else #else Loading