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

Refactor of isLeft and for 0 Reserve o subelements

parent 3f97026e
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -35,7 +35,7 @@ class VTKMeshDataWriter {




        IndexType realIndex = 0;
        IndexType realIndex = 0;
        for (IndexType i = 0; i < writer.cellVert.template getDataByPos<0>().size(); i++) {
        for (IndexType i = 0; i < writer.getNumberOfCells(); i++) {


            auto iterator = writer.backwardCellIndexMapping.find(i);
            auto iterator = writer.backwardCellIndexMapping.find(i);
            if (iterator == writer.backwardCellIndexMapping.end()){
            if (iterator == writer.backwardCellIndexMapping.end()){
@@ -64,7 +64,7 @@ class VTKMeshDataWriter {
        ost << "SCALARS " << Traits<T>::ttype::template getName<Index>() << " double 1\nLOOKUP_TABLE default\n";
        ost << "SCALARS " << Traits<T>::ttype::template getName<Index>() << " double 1\nLOOKUP_TABLE default\n";


        IndexType realIndex = 0;
        IndexType realIndex = 0;
        for (IndexType i = 0; i < writer.cellVert.template getDataByPos<0>().size(); i++) {
        for (IndexType i = 0; i < writer.getNumberOfCells(); i++) {


            auto iterator = writer.backwardCellIndexMapping.find(i);
            auto iterator = writer.backwardCellIndexMapping.find(i);
            if (iterator == writer.backwardCellIndexMapping.end()){
            if (iterator == writer.backwardCellIndexMapping.end()){
@@ -115,7 +115,7 @@ public:
    static void writeToStream(std::ostream& ost, DataContainer<T, Position, MeshDimension>& data, VTKMeshWriter<MeshDimension,IndexType, Real>& writer) {
    static void writeToStream(std::ostream& ost, DataContainer<T, Position, MeshDimension>& data, VTKMeshWriter<MeshDimension,IndexType, Real>& writer) {
        using type = T;//typename std::remove_reference<decltype(data.template getDataByDim<MeshDimension>())>::type::DataType;
        using type = T;//typename std::remove_reference<decltype(data.template getDataByDim<MeshDimension>())>::type::DataType;
        static_assert (Detail::has_default_traits<type>::value, "The class T must have defined traits for example using macro MAKE_ATTRIBUTE_TRAIT in header Traits.h");
        static_assert (Detail::has_default_traits<type>::value, "The class T must have defined traits for example using macro MAKE_ATTRIBUTE_TRAIT in header Traits.h");
        ost << "CELL_DATA " << writer.cellVert.template getDataByPos<0>().size() << std::endl;
        ost << "CELL_DATA " << writer.getNumberOfCells() << std::endl;
        writeCellData<typename Traits<type>::ttype>::write(ost, data, writer);
        writeCellData<typename Traits<type>::ttype>::write(ost, data, writer);
    }
    }


@@ -150,7 +150,7 @@ public:
    static void writeToStream(std::ostream& ost, MeshDataContainer<T, Dimensions...>& data, VTKMeshWriter<MeshDimension,IndexType, Real>& writer) {
    static void writeToStream(std::ostream& ost, MeshDataContainer<T, Dimensions...>& data, VTKMeshWriter<MeshDimension,IndexType, Real>& writer) {
        using type = T;//typename std::remove_reference<decltype(data.template getDataByDim<MeshDimension>())>::type::DataType;
        using type = T;//typename std::remove_reference<decltype(data.template getDataByDim<MeshDimension>())>::type::DataType;
        static_assert (Detail::has_default_traits<type>::value, "The class T must have defined traits for example using macro MAKE_ATTRIBUTE_TRAIT in header Traits.h");
        static_assert (Detail::has_default_traits<type>::value, "The class T must have defined traits for example using macro MAKE_ATTRIBUTE_TRAIT in header Traits.h");
        ost << "CELL_DATA " << writer.cellVert.template getDataByPos<0>().size() << std::endl;
        ost << "CELL_DATA " << writer.getNumberOfCells() << std::endl;
        MeshDataIterator<MeshDataContainer<T, Dimensions...>::size() - 1>::writeToStream(ost, data, writer);
        MeshDataIterator<MeshDataContainer<T, Dimensions...>::size() - 1>::writeToStream(ost, data, writer);
    }
    }
};
};
+27 −8
Original line number Original line Diff line number Diff line
@@ -57,24 +57,29 @@ public:
template <typename IndexType>
template <typename IndexType>
struct Subelement{
struct Subelement{
    IndexType index = INVALID_INDEX(IndexType);
    IndexType index = INVALID_INDEX(IndexType);
    bool isLeft = false;
};
};




template <typename IndexType, unsigned int Reserve>
template <typename IndexType, unsigned int Reserve>
class SubelementContainer : public std::array<Subelement<IndexType>, Reserve>{
class SubelementContainer : public std::array<Subelement<IndexType>, Reserve>{
    unsigned char numberOfElements = 0;
    unsigned int numberOfElements = 0;


public:
public:
    unsigned char getNumberOfSubElements(){
    unsigned int getNumberOfSubElements(){
        return numberOfElements;
        return numberOfElements;
    }
    }


    unsigned int size() {
        return numberOfElements;
    }

    unsigned int reserve() {
        return Reserve;
    }


    void addSubelement(IndexType index, bool isLeft) {
    void addSubelement(IndexType index) {
        if (numberOfElements < Reserve){
        if (numberOfElements < Reserve){
            this->at(numberOfElements).index = index;
            this->at(numberOfElements).index = index;
            this->at(numberOfElements).isLeft = isLeft;
            numberOfElements++;
            numberOfElements++;
        } else {
        } else {
            throw(std::runtime_error(//"In face element (" + std::to_string(MeshElementBase<IndexType>::GetIndex()) +
            throw(std::runtime_error(//"In face element (" + std::to_string(MeshElementBase<IndexType>::GetIndex()) +
@@ -84,6 +89,10 @@ public:


    }
    }


    void push_back(IndexType index) {
        addSubelement(index);
    }

    void removeSubelement(unsigned char atIndex){
    void removeSubelement(unsigned char atIndex){
        if (atIndex < numberOfElements){
        if (atIndex < numberOfElements){
            for(unsigned char i = atIndex; i < numberOfElements - 1; i++){
            for(unsigned char i = atIndex; i < numberOfElements - 1; i++){
@@ -108,6 +117,18 @@ public:
};
};




template<typename IndexType>
class SubelementContainer<IndexType, 0> : public std::vector<IndexType> {
    void addSubelement(IndexType index) {
        this->push_back(index);
    }

    void removeSubelement(unsigned char atIndex){
        this->erase(atIndex);
    }
};


struct emptyStruct{};
struct emptyStruct{};


struct emptyStruct2{};
struct emptyStruct2{};
@@ -132,9 +153,7 @@ public:
    }
    }


    MeshElement(IndexType index = INVALID_INDEX(IndexType))
    MeshElement(IndexType index = INVALID_INDEX(IndexType))
        :MeshElementBase<IndexType>(index), CellBoundaryConnection<IndexType> () {
        :MeshElementBase<IndexType>(index), CellBoundaryConnection<IndexType> () {}
        subelements.fill({INVALID_INDEX(IndexType), false});
    }


};
};


+1 −1
Original line number Original line Diff line number Diff line
@@ -77,7 +77,7 @@ public:
                    edgeIndex = edgeIt->second;
                    edgeIndex = edgeIt->second;
                }
                }
                try {
                try {
                    mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndex, true);
                    mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndex);
                } catch (std::runtime_error& err) {
                } catch (std::runtime_error& err) {
                    throw std::runtime_error(std::string("The number of edges has overflew the prealocated memory ") +
                    throw std::runtime_error(std::string("The number of edges has overflew the prealocated memory ") +
                                             std::to_string(mesh.getFaces().at(faceIndex).getSubelements().size()) +
                                             std::to_string(mesh.getFaces().at(faceIndex).getSubelements().size()) +
+5 −5
Original line number Original line Diff line number Diff line
@@ -320,7 +320,7 @@ public:
            std::vector<std::array<int,2>>& edgeOrder = TypeEdgesFaces.at(numVert).first;
            std::vector<std::array<int,2>>& edgeOrder = TypeEdgesFaces.at(numVert).first;
            std::vector<std::vector<int>>& faceOrder = TypeEdgesFaces.at(numVert).second;
            std::vector<std::vector<int>>& faceOrder = TypeEdgesFaces.at(numVert).second;


            std::vector<std::pair<IndexType, bool>> edgeIndexes;
            std::vector<IndexType> edgeIndexes;
            // construct edges first
            // construct edges first
            for (std::array<int, 2>& e : edgeOrder) {
            for (std::array<int, 2>& e : edgeOrder) {


@@ -335,10 +335,10 @@ public:
                    mesh.getEdges().at(edgeIndex).setVertexAIndex(iA);
                    mesh.getEdges().at(edgeIndex).setVertexAIndex(iA);
                    mesh.getEdges().at(edgeIndex).setVertexBIndex(iB);
                    mesh.getEdges().at(edgeIndex).setVertexBIndex(iB);
                    mesh.getEdges().at(edgeIndex).setIndex(edgeIndex);
                    mesh.getEdges().at(edgeIndex).setIndex(edgeIndex);
                    edgeIndexes.push_back({edgeIndex, true});
                    edgeIndexes.push_back(edgeIndex);
                    edges[edgeKey] = edgeIndex;
                    edges[edgeKey] = edgeIndex;
                } else {
                } else {
                    edgeIndexes.push_back({edgeIt->second, iA == mesh.getEdges().at(edgeIt->second).getVertexAIndex()});
                    edgeIndexes.push_back(edgeIt->second);
                }
                }
            }
            }


@@ -349,7 +349,7 @@ public:


                std::vector<IndexType> faceEdges;
                std::vector<IndexType> faceEdges;
                for (int& index : f) {
                for (int& index : f) {
                    faceEdges.push_back(edgeIndexes.at(index).first);
                    faceEdges.push_back(edgeIndexes.at(index));
                }
                }
                std::sort(faceEdges.begin(), faceEdges.end());
                std::sort(faceEdges.begin(), faceEdges.end());


@@ -365,7 +365,7 @@ public:
                    faceIndex = mesh.getFaces().size();
                    faceIndex = mesh.getFaces().size();
                    mesh.getFaces().push_back({});
                    mesh.getFaces().push_back({});
                    for (int& index : f) {
                    for (int& index : f) {
                        mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndexes.at(index).first,edgeIndexes.at(index).second);
                        mesh.getFaces().at(faceIndex).getSubelements().addSubelement(edgeIndexes.at(index));
                    }
                    }
                    mesh.getFaces().at(faceIndex).setCellLeftIndex(cellIndex);
                    mesh.getFaces().at(faceIndex).setCellLeftIndex(cellIndex);
                    mesh.getFaces().at(faceIndex).setIndex(faceIndex);
                    mesh.getFaces().at(faceIndex).setIndex(faceIndex);
+9 −0
Original line number Original line Diff line number Diff line
@@ -377,6 +377,15 @@ private:


public:
public:


    /**
     * @brief getNumberOfCells
     * returns the number of exported cells
     * @return
     */
    size_t getNumberOfCells() {
        return cellVert.template getDataByPos<0>().size();
    }

    /**
    /**
     * @brief indexMesh<HR>
     * @brief indexMesh<HR>
     * This function creates vector of indexes of vertices for each cell in order suitable
     * This function creates vector of indexes of vertices for each cell in order suitable
Loading