/** * @file FITKOpenFOAMMeshReader.h * @brief OpenFOAM网格文件读取类 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ #ifndef FITKOPENFOAMMESHREADER_H #define FITKOPENFOAMMESHREADER_H #include "FITKOFMeshIOAPI.h" #include "FITK_Interface/FITKInterfaceIO/FITKAbstractIO.h" class QFile; namespace Interface { class FITKUnstructuredMeshVTK; class FITKAbstractElement; class FITKBoundaryMeshVTKManager; class FITKElementHex8; class FITKElementPolygon; } namespace IO { /** * @brief OpenFOAM文件头信息 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ typedef struct { QString format{}; QString clazz{}; QString location{}; QString object{}; }FoamFileHeader; /** * @brief 边界 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-22 */ typedef struct { QString name{}; QString type{}; QString group{}; int nFaces{0}; int startFace{0}; bool isValid() { return !name.isEmpty() && !type.isEmpty() && nFaces != 0 && startFace != 0; } } Boundary; /** * @brief OpenFOAM网格文件读取类 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ class FITKOFMeshIOAPI FITKOpenFOAMMeshReader : public Interface::FITKAbstractIO { public: /** * @brief 构造函数 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ FITKOpenFOAMMeshReader(); /** * @brief 析构函数 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ ~FITKOpenFOAMMeshReader() override; /** * @brief 重写线程启动函数 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ void run() override; /** * @brief 打印控制台消息 * @param[i] level 打印级别 1 normal 2 warning 3error * @param[i] str 消息 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ void consoleMessage(int level, const QString &str) override; /** * @brief 设置数据 * @param data Interface::FITKUnstructureFluidMeshVTK类型对象 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-25 */ void setDataObject(Core::FITKAbstractDataObject* data) override; /** * @brief 读取网格文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool read(); protected: /** * @brief 处理行数据 * @param line 行数据 * @param inComment 上一次读取完行数据是否在注释中 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool processLine(QString& line, bool inComment = false); /** * @brief 读取OpenFOAM文件头信息 * @param file 文件 * @param[out] header 头信息结构体 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readFoamFileHeader(QFile& file, FoamFileHeader& header); /** * @brief 读取points文件中的点数据 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readPointsData(QFile& file); /** * @brief 读取points文件 * @param points points文件路径 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readPoints(const QString &points); /** * @brief 读取faces文件中的面数据 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readFacesData(QFile& file); /** * @brief 读取faces文件 * @param points faces文件路径 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readFaces(const QString &faces); /** * @brief 读取owner文件中的所属关系数据 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readOwnerData(QFile& file); /** * @brief 读取owner文件 * @param points owner文件路径 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readOwner(const QString &owner); /** * @brief 读取neighbour文件中的相邻关系数据 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readNeighbourData(QFile& file); /** * @brief 读取neighbour文件 * @param points neighbour文件路径 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool readNeighbour(const QString &owner); /** * @brief 读取boundary文件中的单个边界信息 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-22 */ bool readSingleBoundaryData(QFile& file, Boundary*); /** * @brief 读取boundary文件中的边界信息 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-22 */ bool readBoundaryData(QFile& file); /** * @brief 读取boundary文件 * @param file 文件 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-22 */ bool readBoundary(const QString & boundary); /** * @brief 计算hex8单元的节点信息 * @param face 面(节点列表) * @param inIdPrev 已知节点1(按OpenFOAM右手法则排序在前) * @param inIdNext 已知节点2(按OpenFOAM右手法则排序在后) * @param[out] outIdPrev 未知节点1(按OpenFOAM右手法则排序在前) * @param[out] outIdNext 未知节点2(按OpenFOAM右手法则排序在后) * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool getHex8IdsByFace(QList face, int inIdPrev, int inIdNext, int& outIdPrev, int& outIdNext); /** * @brief 装配hex8单元 * @param eleIndex 单元索引 * @param points 每个面上点的列表 * @return 装配完的hex8单元或者空指针 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ Interface::FITKElementHex8* setupHex8Cell(int eleIndex, QVector> points); /** * @brief 装配多边形单元 * @param eleIndex 单元索引 * @param points 每个面上点的列表 * @return 装配完的单元或者空指针 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ Interface::FITKElementPolygon* setupPolygonCell(QList face); /** * @brief 装配单元 * @param eleIndex 单元索引 * @param faces 面索引列表 * @return 装配完的单元或空指针 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ Interface::FITKAbstractElement* setupCell(int eleIndex, QList faces); /** * @brief 装配3D单元 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool setup3DCells(); /** * @brief 装配2D单元 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-17 */ bool setup2DCells(); /** * @brief 装配边界 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-25 */ bool setupBoundarys(); private: /** * @brief 内部网格数据 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ Interface::FITKUnstructuredMeshVTK* _fluidMesh{}; /** * @brief 边界管理器 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-25 */ Interface::FITKBoundaryMeshVTKManager* _boundaryManager{}; /** * @brief 节点总数 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ int _pointsNum{}; /** * @brief face总数 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ int _facesNum{}; /** * @brief face列表<节点索引列表> * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ QVector> _faces{}; /** * @brief owner哈希<所属单元owner索引,face索引列表> * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ QMap> _owner{}; /** * @brief 邻居单元 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ QMap _neighbour{}; /** * @brief 邻居单元<单元索引, face索引列表> * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-16 */ QMap> _tempNeighbour{}; /** * @brief 边界 * @author YanZhiHui (chanyuantiandao@126.com) * @date 2024-07-22 */ QList _Boundarys{}; }; } #endif // FITKOPENFOAMMESHREADER_H