You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Component/FITKOFMeshIO/FITKOpenFOAMMeshReader.h

308 lines
9.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @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<int> 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<QList<int>> points);
/**
* @brief 装配多边形单元
* @param eleIndex 单元索引
* @param points 每个面上点的列表
* @return 装配完的单元或者空指针
* @author YanZhiHui (chanyuantiandao@126.com)
* @date 2024-07-17
*/
Interface::FITKElementPolygon* setupPolygonCell(QList<int> face);
/**
* @brief 装配单元
* @param eleIndex 单元索引
* @param faces 面索引列表
* @return 装配完的单元或空指针
* @author YanZhiHui (chanyuantiandao@126.com)
* @date 2024-07-17
*/
Interface::FITKAbstractElement* setupCell(int eleIndex, QList<int> 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<QList<int>> _faces{};
/**
* @brief owner哈希<所属单元owner索引face索引列表>
* @author YanZhiHui (chanyuantiandao@126.com)
* @date 2024-07-16
*/
QMap<int, QList<int>> _owner{};
/**
* @brief 邻居单元<face索引, 邻居单元索引>
* @author YanZhiHui (chanyuantiandao@126.com)
* @date 2024-07-16
*/
QMap<int, int> _neighbour{};
/**
* @brief 邻居单元<单元索引, face索引列表>
* @author YanZhiHui (chanyuantiandao@126.com)
* @date 2024-07-16
*/
QMap<int, QList<int>> _tempNeighbour{};
/**
* @brief 边界
* @author YanZhiHui (chanyuantiandao@126.com)
* @date 2024-07-22
*/
QList<Boundary*> _Boundarys{};
};
}
#endif // FITKOPENFOAMMESHREADER_H