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

The VTK output is complete. Now it's time to refactor!

parent b568a87e
Loading
Loading
Loading
Loading
+85 −14
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ public:
     * Vertices of all cells in correct order for vtk export.
     */
    MeshDataContainer<std::vector<IndexType>, 3> cellVert;
    MeshDataContainer<typename writer::type::ElementType, 3> cellTypes;

    /**
     * @brief totalNumberOfWrittenElements<HR>
@@ -205,6 +206,12 @@ public:
     */
    IndexType totalNumberOfWrittenElements = 0;


    std::vector<Vertex<3, Real>> appendedVertices;

    std::map<IndexType, IndexType> backwardCellIndexMapping;


    /**
     * @brief indexFace<HR>
     * This funcion stores indexes of vertices in correct order
@@ -265,7 +272,6 @@ public:
            return;
        }
        lastHash = curHash;

DBGMSG("indexing mesh");
        // write cells of the mesh
        // prepare connections
@@ -276,12 +282,8 @@ DBGMSG("indexing mesh");
        // this is very expensive procedure
        auto faceEdgeOri = edgesOrientation(mesh);

        int cnt = 0;
        for (auto verts : cellVert.template getDataByPos<0>()){
            cnt += verts.size() + 1;
        }
        std::map<std::string, IndexType> appendedVertPos;

        totalNumberOfWrittenElements = cnt;


        std::vector<IndexType> vertWrit;
@@ -310,6 +312,8 @@ DBGMSG("indexing mesh");
                        vertWrit.push_back(index);
                    }
                }
                this->cellVert.template getDataByPos<0>().push_back(vertWrit);
                this->cellTypes.template getDataByPos<0>().push_back(cellTypes.at(cell));
            }break;

            case writer::type::ElementType::PYRAMID :{
@@ -335,6 +339,8 @@ DBGMSG("indexing mesh");
                        vertWrit.push_back(index);
                    }
                }
                this->cellVert.template getDataByPos<0>().push_back(vertWrit);
                this->cellTypes.template getDataByPos<0>().push_back(cellTypes.at(cell));
            }break;

            case writer::type::ElementType::WEDGE :{
@@ -389,6 +395,8 @@ DBGMSG("indexing mesh");
                        break;
                    }
                }
                this->cellVert.template getDataByPos<0>().push_back(vertWrit);
                this->cellTypes.template getDataByPos<0>().push_back(cellTypes.at(cell));
            }break;

            case writer::type::ElementType::HEXAHEDRON :{
@@ -432,11 +440,70 @@ DBGMSG("indexing mesh");
                        break;
                    }
                }
                this->cellVert.template getDataByPos<0>().push_back(vertWrit);
                this->cellTypes.template getDataByPos<0>().push_back(cellTypes.at(cell));
            }break;
            default: throw std::runtime_error("it is not possible yet to write any object into VTK");
            default: {
                //throw std::runtime_error("it is not possible yet to write generic object into VTK");

                IndexType tmpFace = cell.getBoundaryElementIndex();
                IndexType cellCenterIndex = INVALID_INDEX(IndexType);
                std::string cellCenterKey = std::to_string(cell.getCenter()[0]) +
                        ";" + std::to_string(cell.getCenter()[1]) +
                        ";" + std::to_string(cell.getCenter()[2]);
                auto it = appendedVertPos.find(cellCenterKey);
                if (it == appendedVertPos.end()) {
                    appendedVertPos[cellCenterKey] = appendedVertices.size() + mesh.getVertices().size();
                    cellCenterIndex = appendedVertices.size() + mesh.getVertices().size();
                    appendedVertices.push_back(cell.getCenter());
                    DBGVAR(appendedVertices.size());
                } else {
                    cellCenterIndex = it->second;
                }

                do {
                    auto& face = mesh.getFaces().at(tmpFace);

                    for (auto& sube : face.getSubelements()){
                        auto& edge = mesh.getEdges().at(sube.index);
                        vertWrit.clear();
                        vertWrit.reserve(4);
                        vertWrit.push_back(edge.getVertexAIndex());
                        vertWrit.push_back(edge.getVertexBIndex());
                        std::string faceCenterKey = std::to_string(face.getCenter()[0]) +
                                ";" + std::to_string(face.getCenter()[1]) +
                                ";" + std::to_string(face.getCenter()[2]);
                        IndexType faceCenterIndex = INVALID_INDEX(IndexType);
                        auto it = appendedVertPos.find(faceCenterKey);
                        if (it == appendedVertPos.end()) {
                            faceCenterIndex = appendedVertices.size() + mesh.getVertices().size();
                            DBGVAR(appendedVertices.size() + mesh.getVertices().size(), faceCenterIndex);
                            appendedVertPos[faceCenterKey] = faceCenterIndex;
                            appendedVertices.push_back(face.getCenter());
                        } else {
                            faceCenterIndex = it->second;
                        }
                        vertWrit.push_back(faceCenterIndex);
                        vertWrit.push_back(cellCenterIndex);
                        backwardCellIndexMapping[this->cellVert.template getDataByPos<0>().size()] = cell.getIndex();
                        this->cellVert.template getDataByPos<0>().push_back(vertWrit);
                        this->cellTypes.template getDataByPos<0>().push_back(writer::type::ElementType::TETRA);
                    }

                    tmpFace = face.getNextBElem(cell.getIndex());
                } while (tmpFace != cell.getBoundaryElementIndex());

            }
            }
        }

        int cnt = 0;
        for (auto verts : this->cellVert.template getDataByPos<0>()){
            cnt += verts.size() + 1;
        }

        totalNumberOfWrittenElements = cnt;

    }


@@ -444,19 +511,23 @@ DBGMSG("indexing mesh");
    void writeToStream(std::ostream& ost,
                       MeshElements<3, IndexType, Real, Reserve...>& mesh,
                       MeshDataContainer<typename writer::type::ElementType, 3> cellTypes){
        // create index of mesh
        indexMesh(mesh, cellTypes);
        // first write verices
        ost << "POINTS " << mesh.getVertices().size() <<
        ost << "POINTS " << mesh.getVertices().size() + appendedVertices.size() <<
               " double" << std::endl;

        for(auto vert : mesh.getVertices()) {
            ost << vert[0] << ' ' << vert[1] << ' ' << vert[2] <<"\n";
        }
        ost << std::endl;

        for(auto vert : appendedVertices) {
            ost << vert[0] << ' ' << vert[1] << ' ' << vert[2] <<"\n";
        }
        ost << std::endl;

        // write cells of the mesh
        indexMesh(mesh, cellTypes);
        ost << "CELLS " << mesh.getCells().size() << ' ' << totalNumberOfWrittenElements << std::endl;
        ost << "CELLS " << cellVert.template getDataByPos<0>().size() << ' ' << totalNumberOfWrittenElements << std::endl;


        for (const auto& verts : cellVert.template getDataByPos<0>()){
@@ -472,8 +543,8 @@ DBGMSG("indexing mesh");

        ost << std::endl;

        ost << "CELL_TYPES " << mesh.getCells().size() << std::endl;
        for (typename writer::type::ElementType type : cellTypes.template getDataByPos<0>()) {
        ost << "CELL_TYPES " << this->cellTypes.template getDataByPos<0>().size() << std::endl;
        for (typename writer::type::ElementType type : this->cellTypes.template getDataByPos<0>()) {
            ost << TypeConversionTable.at(type) << "\n";
        }
        ost << std::endl;
+10 −0
Original line number Diff line number Diff line
@@ -558,6 +558,15 @@ void testMesh3D() {
    ofstream out3D("3D_test_mesh_two_prisms.vtk");
    writer.writeHeader(out3D, "test data");
    writer.writeToStream(out3D, mesh3, types);


    MeshDataContainer<MeshNativeType<3>::ElementType,3> types1(mesh3, MeshNativeType<3>::ElementType::POLYHEDRON);

    VTKMeshWriter<3, size_t, double, 6> writer1;
    ofstream out3D1("3D_test_mesh_two_prisms_split.vtk");
    writer1.writeHeader(out3D1, "test data");
    writer1.writeToStream(out3D1, mesh3, types1);
    DBGVAR(writer1.backwardCellIndexMapping);
}


@@ -601,6 +610,7 @@ void test3DMeshDeformedPrisms() {
    ofstream out3D("3D_test_mesh_two_deformed_prisms.vtk");
    writer.writeHeader(out3D, "test data");
    writer.writeToStream(out3D, mesh3, types);

}