// // Created by cflin on 4/20/23. // #ifndef TOP3D_UTIL_H #define TOP3D_UTIL_H #include #include #include "TensorWrapper.h" #include #include #include #include #include #include #include #include #include #include #include namespace top { using Tensor3d=TensorWrapper; using Tensor3i=TensorWrapper; using Eigen::all; using SpMat=Eigen::SparseMatrix; template inline std::vector> Vec2Triplet(const Eigen::VectorXi& I,const Eigen::VectorXi& J,const Eigen::Matrix& V){ std::vector> v_tri; for(int i=0;i>lx>>ly>>lz; Tensor3d t3(lx,ly,lz); for(int k=0;k>t3(i,j,k); } } } return t3; } inline void write_tensor3d_to_vtk(const std::string &vtk_path, const Tensor3d &t3){ // 将Eigen::Tensor变量转换为vtkStructuredGrid对象 vtkSmartPointer grid = vtkSmartPointer::New(); grid->SetDimensions(t3.dimension(0), t3.dimension(1), t3.dimension(2)); vtkSmartPointer points = vtkSmartPointer::New(); for (int k = 0; k < t3.dimension(2); k++) { for (int j = 0; j < t3.dimension(1); j++) { for (int i = 0; i < t3.dimension(0); i++) { points->InsertNextPoint(i, j, k); } } } grid->SetPoints(points); // 将Eigen::Tensor变量的值添加到网格中 vtkSmartPointer values = vtkSmartPointer::New(); values->SetNumberOfTuples(t3.size()); values->SetNumberOfComponents(1); for (int k = 0; k < t3.dimension(2); k++) { for (int j = 0; j < t3.dimension(1); j++) { for (int i = 0; i < t3.dimension(0); i++) { int index = i + j * t3.dimension(0) + k * t3.dimension(0) * t3.dimension(1); values->SetTuple1(index, t3(i,j,k)); } } } grid->GetPointData()->SetScalars(values); // 将网格写入VTK文件 vtkSmartPointer writer = vtkSmartPointer::New(); writer->SetFileName(vtk_path.c_str()); writer->SetInputData(grid); writer->Write(); } } // top #endif //TOP3D_UTIL_H