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

working...

class UnstructuredMesh has no specializations now
parent 75f9ebcb
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-19T22:58:18. -->
<!-- Written by QtCreator 4.10.0, 2019-09-20T19:57:11. -->
<qtcreator>
<qtcreator>
 <data>
 <data>
  <variable>EnvironmentId</variable>
  <variable>EnvironmentId</variable>
+8 −23
Original line number Original line Diff line number Diff line
@@ -300,23 +300,6 @@ void testMesh2D() {


    mesh.InitializeCenters();
    mesh.InitializeCenters();


    for (size_t i = 0; i < 2; i++) {
        DBGMSG("Cell number" << i);
        size_t edge = mesh.GetCells().at(i).GetBoundaryElementIndex();
        size_t tmp_edge = edge;
        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))
            tmp_edge = mesh.GetFaces().at(tmp_edge).GetNextBElem(i);
        } while(edge != tmp_edge);

    }

    for(size_t i = 0; i < 2; i++) {
        DBGVAR(mesh.GetCells().at(i).GetCenter(), mesh.CalculateCellMeasure(i))
        DBGVAR(mesh.GetCells().at(i).GetFlag())
    }
    DBGVAR(mesh.CalculateEdgeMeasure(2)/mesh.CalculateCellDist(0,1))
    DBGVAR(mesh.CalculateFaceMeasureOverCellDist(2))




    sit::MeshElementWrap<1> ele(&mesh, mesh.GetEdges().at(0));
    sit::MeshElementWrap<1> ele(&mesh, mesh.GetEdges().at(0));
@@ -354,10 +337,10 @@ void testMesh2D() {
        DBGVAR(centers.GetDataDim<2>().at(cell.GetIndex()))
        DBGVAR(centers.GetDataDim<2>().at(cell.GetIndex()))
    }
    }


/*

    DBGMSG("computing measures");
    DBGMSG("computing measures");


    auto measures = ComputeMeasures(mesh);
    auto measures = mesh.ComputeElementMeasures();




    for(double edgeM :measures.GetDataDim<1>()) {
    for(double edgeM :measures.GetDataDim<1>()) {
@@ -367,7 +350,7 @@ void testMesh2D() {
    for(double cellM :measures.GetDataDim<2>()) {
    for(double cellM :measures.GetDataDim<2>()) {
        DBGVAR(cellM)
        DBGVAR(cellM)
    }
    }
*/

}
}




@@ -577,9 +560,11 @@ void testTemplate() {


int main()
int main()
{
{
    //testMesh2D();
    testMesh2D();
    //testMesh3D();
    testMesh3D();
    //test3DMeshDeformedPrisms();
    test3DMeshDeformedPrisms();
    testMeshDataContainer();
    testMeshDataContainer();
    //testTemplate();
    //testTemplate();
    UnstructuredMesh<5, size_t, double, 6,5,4> m;
    m.ComputeElementMeasures();
}
}
+10 −11
Original line number Original line Diff line number Diff line
@@ -3,6 +3,7 @@
#include "mesh_element.h"
#include "mesh_element.h"
#include "../debug/debug.h"
#include "../debug/debug.h"



/**
/**
 * @brief The MeshDataContainer struct
 * @brief The MeshDataContainer struct
 *
 *
@@ -118,8 +119,6 @@ public:








/**
/**
 * @brief The MeshDataContainer struct
 * @brief The MeshDataContainer struct
 *
 *
@@ -402,7 +401,7 @@ struct _ComputeMeasures<3, 3, DataDimensions...>{
            IndexType tmpFace = cell.GetBoundaryElementIndex();
            IndexType tmpFace = cell.GetBoundaryElementIndex();
            Real measure = Real();
            Real measure = Real();
            Vertex<3,Real>& cellCenter = cell.GetCenter();
            Vertex<3,Real>& cellCenter = cell.GetCenter();
            HTMLDBGCOND(cell.GetIndex() == 0, cellCenter[0], cellCenter[1], cellCenter[2]);

            do {
            do {
                // select 3 different vertices
                // select 3 different vertices
                IndexType vAIndex = mesh.GetEdges().at(mesh.GetFaces().at(tmpFace).GetSubelements()[0].index).GetVertexAIndex();
                IndexType vAIndex = mesh.GetEdges().at(mesh.GetFaces().at(tmpFace).GetSubelements()[0].index).GetVertexAIndex();
@@ -471,21 +470,21 @@ struct _ComputeMeasures<2, 2, DataDimensions...>{






template <unsigned int Dimension,unsigned int... DataDimensions>
template <unsigned int... DataDimensions>
struct _ComputeMeasures<2, Dimension, DataDimensions...>{
struct _ComputeMeasures<2, 3, DataDimensions...>{
    template <typename IndexType, typename Real, unsigned int ...Reserve>
    template <typename IndexType, typename Real, unsigned int ...Reserve>
    static void compute(MeshDataContainer< Real, DataDimensions...>& measures,MeshElements<Dimension, IndexType, Real, Reserve...>& mesh){
    static void compute(MeshDataContainer< Real, DataDimensions...>& measures,MeshElements<3, IndexType, Real, Reserve...>& mesh){


        auto& surfaceMeasures = measures.template GetDataDim<2>();
        auto& surfaceMeasures = measures.template GetDataDim<2>();


        for (typename MeshElements<Dimension, IndexType, Real, Reserve...>::template ElemType<2>::type& face : mesh.template GetElements<2>()) {
        for (typename MeshElements<3, IndexType, Real, Reserve...>::template ElemType<2>::type& face : mesh.template GetElements<2>()) {


            Real measure = Real();
            Real measure = Real();
            Vertex<Dimension,Real>& faceCenter = face.GetCenter();
            Vertex<3,Real>& faceCenter = face.GetCenter();
            for(auto sube : face.GetSubelements()){
            for(auto sube : face.GetSubelements()){


                Vertex<Dimension,Real>& a = mesh.GetVertices().at(mesh.GetEdges().at(sube.index).GetVertexAIndex());
                Vertex<3,Real>& a = mesh.GetVertices().at(mesh.GetEdges().at(sube.index).GetVertexAIndex());
                Vertex<Dimension,Real>& b = mesh.GetVertices().at(mesh.GetEdges().at(sube.index).GetVertexBIndex());
                Vertex<3,Real>& b = mesh.GetVertices().at(mesh.GetEdges().at(sube.index).GetVertexBIndex());


                Real distance = Real();
                Real distance = Real();


@@ -498,7 +497,7 @@ struct _ComputeMeasures<2, Dimension, DataDimensions...>{
            }
            }
            surfaceMeasures.at(face.GetIndex()) = measure;
            surfaceMeasures.at(face.GetIndex()) = measure;
        }
        }
        _ComputeMeasures<3, Dimension, DataDimensions...>::compute(measures, mesh);
        _ComputeMeasures<3, 3, DataDimensions...>::compute(measures, mesh);
    }
    }
};
};


+23 −86
Original line number Original line Diff line number Diff line
@@ -3,105 +3,47 @@
#include "mesh_element.h"
#include "mesh_element.h"
#include "vector"
#include "vector"
#include <type_traits>
#include <type_traits>

#include "mesh_functions.h"




template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve>
template <unsigned int Dimension, typename IndexType, typename Real, unsigned int ...Reserve>
class UnstructuredMesh : public MeshElements<Dimension, IndexType, Real, Reserve...>{
class UnstructuredMesh : public MeshElements<Dimension, IndexType, Real, Reserve...>{



public:
    Real CalculateCellDist(IndexType cellIndex1, IndexType cellIndex2){
        return (this->GetCells().at(cellIndex1).GetCenter() - this->GetCells().at(cellIndex2).GetCenter()).NormEukleid();
    }
};

template <typename IndexType, typename Real, unsigned int ...Reserve>
class UnstructuredMesh<2, IndexType, Real, Reserve...> : public MeshElements<2, IndexType, Real, Reserve...>{

public:
public:
    void InitializeCenters(){
        auto centers = ComputeCenters(*this);



        for (auto& face : this->GetFaces()){
    Real CalculateCellDist(IndexType cellIndex1, IndexType cellIndex2){
            face.SetCenter(centers[face]);
        return (this->GetCells().at(cellIndex1).GetCenter() - this->GetCells().at(cellIndex2).GetCenter()).NormEukleid();
        }
        }

        for (auto& cell : this->GetCells()){

            cell.SetCenter(centers[cell]);

    Real CalculateEdgeMeasure(IndexType index){
        {
            auto& edge = this->GetEdges().at(index);
            return (this->GetVertices().at(edge.GetVertexAIndex()) -
                    this->GetVertices().at(edge.GetVertexBIndex())).NormEukleid();
        }
        }
    }
    }


    Real CalculateFaceMeasure(IndexType index){
    auto ComputeElementMeasures() {
        {
        return ComputeMeasures(*this);
            auto& edge = this->GetEdges().at(index);
            return (this->GetVertices().at(edge.GetVertexAIndex()) -
                    this->GetVertices().at(edge.GetVertexBIndex())).NormEukleid();
    }
    }
    }

    Real CalculateCellMeasure(IndexType index){
        auto& cell = this->GetCells().at(index);
        IndexType tmpEdgeIndex = cell.GetBoundaryElementIndex();

        Vertex<2,Real> c = cell.GetCenter();


        double volume = 0;
/*

    Real CalculateFaceMeasureOverCellDist(IndexType edgeIndex, MeshDataContainer){
        do {

            Vertex<2,Real> a = this->GetVertices().at(this->GetEdges().at(tmpEdgeIndex).GetVertexAIndex());
            Vertex<2,Real> b = this->GetVertices().at(this->GetEdges().at(tmpEdgeIndex).GetVertexBIndex());
            Real tmp = (c[0] - a[0]) * (b[1] - a[1]);
            tmp -= (c[1] - a[1]) * (b[0] - a[0]);
            volume += 0.5 * abs(tmp);
            tmpEdgeIndex = this->GetEdges().at(tmpEdgeIndex).GetNextBElem(cell.GetIndex());


        } while (tmpEdgeIndex != cell.GetBoundaryElementIndex());
        const auto& edge = this->GetEdges().at(edgeIndex);
        return CalculateEdgeMeasure(edgeIndex) / CalculateCellDist(edge.GetCellLeftIndex(), edge.GetCellRightIndex());


        return volume;
    }
    }
/*
  */
template <typename data_t, unsigned int ...dimensions>
public:
    struct data : public data<lowerdim, higherdim -1, data_t>{
    Real ComputeCellDist(IndexType cellIndex1, IndexType cellIndex2){
        std::vector<data_t> vec;
        return (this->GetCells().at(cellIndex1).GetCenter() - this->GetCells().at(cellIndex2).GetCenter()).NormEukleid();
    };
    }
    template <unsigned int lowerdim, typename data_t>
        struct data<lowerdim, lowerdim, data_t>{
            std::vector<data_t> vec;
};
};


*/


    void InitializeCenters(){
        auto& vertices = this->GetVertices();
        for(auto& edge : this->GetEdges()){
            edge.SetCenter((vertices.at(edge.GetVertexAIndex()) + vertices.at(edge.GetVertexBIndex())) * 0.5);
        }
        for(auto& cell : this->GetCells()){
            IndexType tmpEdge = cell.GetBoundaryElementIndex();
            Vertex<2, Real> tmpCenter = {0.0, 0.0};
            double counter = 0.0;
            do {
                tmpCenter += this->GetEdges().at(tmpEdge).GetCenter();
                counter++;
                tmpEdge = this->GetEdges().at(tmpEdge).GetNextBElem(cell.GetIndex());
            } while (tmpEdge != cell.GetBoundaryElementIndex());
            cell.SetCenter(tmpCenter / counter);
            DBGVAR(tmpCenter * (1.0 / counter));
        }
    }


    Real CalculateFaceMeasureOverCellDist(IndexType edgeIndex){


        const auto& edge = this->GetEdges().at(edgeIndex);
        return CalculateEdgeMeasure(edgeIndex) / CalculateCellDist(edge.GetCellLeftIndex(), edge.GetCellRightIndex());


    }



    /**
    /**
      Jak udělat metodu, která by byla schopná prosházet elementy sítě v rozmezí nějakých dimenzí (obarvení grafu) (samostatná specializovaná třída volaná metodou)
      Jak udělat metodu, která by byla schopná prosházet elementy sítě v rozmezí nějakých dimenzí (obarvení grafu) (samostatná specializovaná třída volaná metodou)
@@ -115,12 +57,7 @@ template <typename data_t, unsigned int ...dimensions>
      Jak dobře koncipovat metody (počítání objemu...), zmínit i wrappery
      Jak dobře koncipovat metody (počítání objemu...), zmínit i wrappery


      */
      */
};
/*
class CellWrap{
    UnstructuredMesh<2,size_t, double> *m;
    size_t cellIndex;


};

*/

#endif // UNSTRUCTUREDMESH_H
#endif // UNSTRUCTUREDMESH_H