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

Centers computation done, but the connections in the 3D cell are not

correct.
parent 789e1f9a
Loading
Loading
Loading
Loading
+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>
+41 −10
Original line number Original line Diff line number Diff line
@@ -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>;
@@ -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);


@@ -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");
@@ -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");


@@ -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()))
            }
            }
        }
        }


@@ -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));
}
}
+35 −2
Original line number Original line Diff line number Diff line
@@ -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);
    }


};
};


+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
@@ -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);
    }
    }


@@ -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);
    }
    }


};
};
@@ -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){


@@ -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
+1 −1
Original line number Original line Diff line number Diff line
@@ -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