#include "FITKFlowOFHDF5Writer.h" #include "FITKFlowOFHDF5AdaptorGeometryMeshSize.h" #include "FITKFlowOFHDF5AdaptorMaterialPoint.h" #include "FITKFlowOFHDF5AdaptorRegionMesh.h" #include "FITKFlowOFHDF5AdaptorPhysicsData.h" #include "FITKFlowOFHDF5AdaptorGeometryRefine.h" #include "FITKFlowOFHDF5AdaptorMesh.h" #include "FITKFlowOFHDF5AdaptorGeometryComponent.h" #include "FITK_Kernel/FITKAppFramework/FITKMessage.h" #include "FITK_Kernel/FITKCore/FITKAbstractDataManager.hpp" #include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" //几何 #include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h" #include "FITK_Interface/FITKInterfaceGeoIOHDF5/FITKInterfaceHDF5AdaptorCommand.h" #include "FITK_Component/FITKGeoOCCIOHDF5/FITKOCCHDF5AdaptorCommand.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKMeshGenInterface.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSize.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKGeometryMeshSize.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKZonePoints.h" #include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionGeometryRefine.h" #include "FITK_Interface/FITKInterfaceMesh/FITKUnstructuredFluidMeshVTK.h" //物理场 #include "FITK_Interface/FITKInterfaceFlowOF/FITKOFPhysicsData.h" #include namespace IO { void FITKFlowOFHDF5Writer::run() { *_resultMark = true; *_resultMark &= writeVersion(); *_resultMark &= writeDataGeometry(); *_resultMark &= writeGeoComponent(); *_resultMark &= writeGeometryRefine(); *_resultMark &= writeGeoMeshSize(); *_resultMark &= writeMaterialPoint(); *_resultMark &= writeRegionMesh(); *_resultMark &= writeMesh(); *_resultMark &= writePhysicsData(); this->sendCalculateProgress(100); } bool FITKFlowOFHDF5Writer::writeVersion() { QString name = "Version"; H5::Group versionGroup = _h5File->createGroup(name.toStdString()); hsize_t dim[2] = { 1, 1 }; H5::DataSpace SpaceThree(2, dim); H5::Attribute transAttr = versionGroup.createAttribute(name.toStdString(), H5::PredType::NATIVE_DOUBLE, SpaceThree); transAttr.write(H5::PredType::NATIVE_DOUBLE, &_version); return true; } bool FITKFlowOFHDF5Writer::writeDataGeometry() { bool isW = true; //创建几何节点 H5::Group geometryGroup = _h5File->createGroup("Geometry"); //获取几何数据链表 Interface::FITKGeoCommandList* geoCmdList = FITKGLODATA->getGeometryData(); if (!geoCmdList)return false; //获取几何 int count = geoCmdList->getDataCount(); for (int i = 0; i < count; ++i) { Interface::FITKAbsGeoCommand* comm = geoCmdList->getDataByIndex(i); if (!comm) continue; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", comm); if (adaptor == nullptr) return false; adaptor->setH5GroupData(geometryGroup); adaptor->setDataObject(comm); adaptor->setFileWriter(this); bool w = adaptor->adaptW(); if (!w) consoleMessage(3, QString("Write Command Errors, CaseName : %1").arg(comm->getDataObjectName())); isW &= w; delete adaptor; } //写出几何命令列表长度 hsize_t dim[2] = { 1, 1 }; H5::DataSpace SpaceThree(2, dim); H5::Attribute transAttr = geometryGroup.createAttribute("Count", H5::PredType::NATIVE_INT, SpaceThree); transAttr.write(H5::PredType::NATIVE_INT, &count); return isW; } bool FITKFlowOFHDF5Writer::writeGeoComponent() { bool isW = true; //创建几何节点 H5::Group geometryGroup = _h5File->createGroup("GeoComponent"); //获取几何数据链表 Interface::FITKGeoCommandList* geoCmdList = FITKGLODATA->getGeometryData(); if (!geoCmdList)return false; //获取几何 int count = geoCmdList->getDataCount(); //写出几何命令列表长度 hsize_t dim[2] = { 1, 1 }; H5::DataSpace SpaceThree(2, dim); H5::Attribute transAttr = geometryGroup.createAttribute("Count", H5::PredType::NATIVE_INT, SpaceThree); transAttr.write(H5::PredType::NATIVE_INT, &count); for (int i = 0; i < count; ++i) { Interface::FITKAbsGeoCommand* comm = geoCmdList->getDataByIndex(i); if (!comm) continue; std::string geoName = comm->getDataObjectName().toStdString(); // 创建字符串类属性 std::string name = std::to_string(i); H5::DataSpace dataspace; H5::StrType datatypeStr(H5::PredType::C_S1, H5T_VARIABLE); H5::Attribute desAttr = geometryGroup.createAttribute(name, datatypeStr, dataspace); desAttr.write(datatypeStr, geoName); H5::Group geoComGroup = geometryGroup.createGroup(geoName); //写出几何面组 auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", "Interface::FITKGeoComponentManager"); if (adaptor == nullptr) return false; adaptor->setH5GroupData(geoComGroup); adaptor->setDataObject(comm); adaptor->setFileWriter(this); bool w = adaptor->adaptW(); if (!w) consoleMessage(3, QString("Write Command Errors, CaseName : %1").arg(comm->getDataObjectName())); isW &= w; delete adaptor; } return isW; } bool FITKFlowOFHDF5Writer::writeGeometryRefine() { bool isW = true; //创建几何节点 H5::Group geoRefineGroup = _h5File->createGroup("GeoRefine"); //获取几何划分网格管理器 Interface::FITKRegionGeometryRefineManager* geoRefineManager = Interface::FITKMeshGenInterface::getInstance()->getRegionGeometryRefineManager(); if (!geoRefineManager)return false; //获取数据 int count = geoRefineManager->getDataCount(); for (int i = 0; i < count; ++i) { Interface::FITKRegionGeometryRefine* geoRefine = geoRefineManager->getDataByIndex(i); if (!geoRefine)continue; if (!geoRefine->getGeometryModel())continue; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", geoRefine); if (adaptor == nullptr) return false; adaptor->setH5GroupData(geoRefineGroup); adaptor->setDataObject(geoRefine); adaptor->setFileWriter(this); bool w = adaptor->adaptW(); if (!w) consoleMessage(3, QString("Write Refine Errors, Geometry : %1").arg(geoRefine->getGeometryModel()->getDataObjectName())); isW &= w; delete adaptor; } return true; } bool FITKFlowOFHDF5Writer::writeGeoMeshSize() { bool isW = true; //创建几何节点 H5::Group geoMeshSizeGroup = _h5File->createGroup("GeoMeshSize"); //获取网格生成单例 Interface::FITKMeshGenInterface* meshGen = Interface::FITKMeshGenInterface::getInstance(); if (!meshGen)return false; //获取区域网格尺寸管理器 Interface::FITKGeometryMeshSizeManager* geoMeshSizeManager = meshGen->getGeometryMeshSizeManager(); if (!geoMeshSizeManager)return false; //获取数据 int count = geoMeshSizeManager->getDataCount(); for (int i = 0; i < count; ++i) { Interface::FITKGeometryMeshSize* geoMeshSize = geoMeshSizeManager->getDataByIndex(i); if (!geoMeshSize)continue; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", geoMeshSize); if (adaptor == nullptr) return false; adaptor->setH5GroupData(geoMeshSizeGroup); adaptor->setDataObject(geoMeshSize); adaptor->setFileWriter(this); bool w = adaptor->adaptW(); if (!w) consoleMessage(3, QString("Write Geometry Errors, GeometryComponentName : %1").arg(geoMeshSize->getDataObjectName())); isW &= w; delete adaptor; } return isW; } bool FITKFlowOFHDF5Writer::writeMaterialPoint() { bool isW = true; //创建几何节点 H5::Group geoMeshSizeGroup = _h5File->createGroup("MaterialPoints"); //获取网格生成单例 Interface::FITKMeshGenInterface* meshGen = Interface::FITKMeshGenInterface::getInstance(); if (!meshGen)return false; Interface::FITKZonePointManager* pointManager = meshGen->getZonePointManager(); if (!pointManager)return false; //获取数据 int count = pointManager->getDataCount(); for (int i = 0; i < count; ++i) { Interface::FITKZonePoint* pointData = pointManager->getDataByIndex(i); if (!pointData)continue; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", "Interface::FITKZonePoint"); if (adaptor == nullptr) return false; adaptor->setH5GroupData(geoMeshSizeGroup); adaptor->setDataObject(pointData); adaptor->setFileWriter(this); bool w = adaptor->adaptW(); if (!w) consoleMessage(3, QString("Write Geometry Errors, MaterialPointId : %1").arg(pointData->getDataObjectID())); isW &= w; delete adaptor; } return isW; } bool FITKFlowOFHDF5Writer::writeRegionMesh() { bool isW = true; //创建几何节点 H5::Group regionMeshGroup = _h5File->createGroup("RegionMesh"); //获取网格生成单例 Interface::FITKMeshGenInterface* meshGen = Interface::FITKMeshGenInterface::getInstance(); if (!meshGen)return false; Interface::FITKRegionMeshSizeManager* regionMeshManager = meshGen->getRegionMeshSizeMgr(); if (!regionMeshManager)return false; //获取数据 int count = regionMeshManager->getDataCount(); for (int i = 0; i < count; ++i) { Interface::FITKAbstractRegionMeshSize* regionMesh = regionMeshManager->getDataByIndex(i); if (!regionMesh)continue; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", regionMesh); if (adaptor == nullptr) return false; adaptor->setH5GroupData(regionMeshGroup); adaptor->setDataObject(regionMesh); adaptor->setFileWriter(this); bool w = adaptor->adaptW(); if (!w) consoleMessage(3, QString("Write Geometry Errors, MaterialPointId : %1").arg(regionMesh->getDataObjectName())); isW &= w; delete adaptor; } return isW; } bool FITKFlowOFHDF5Writer::writeMesh() { //创建物理场数据节点 H5::Group meshGroup = _h5File->createGroup("MeshData"); //获取全局数据 AppFrame::FITKGlobalData* globalData = FITKAPP->getGlobalData(); if (!globalData)return false; //获取网格数据 Interface::FITKUnstructuredFluidMeshVTK* meshData = globalData->getMeshData(); if (!meshData)return false; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", "Interface::FITKUnstructuredFluidMeshVTK"); if (adaptor == nullptr) return false; adaptor->setH5GroupData(meshGroup); adaptor->setDataObject(meshData); adaptor->setFileWriter(this); bool isW = adaptor->adaptW(); if (!isW) consoleMessage(3, QString("Write MeshData Errors ! ")); delete adaptor; return isW; } bool FITKFlowOFHDF5Writer::writePhysicsData() { //创建物理场数据节点 H5::Group physicsGroup = _h5File->createGroup("PhysicsData"); //获取全局数据 AppFrame::FITKGlobalData* globalData = FITKAPP->getGlobalData(); if (!globalData)return false; //获取物理数据 Interface::FITKOFPhysicsData* physicsData = globalData->getPhysicsData(); if (!physicsData)return false; auto adaptor = FITKIOADAPTORFACTORY->createT("HDF5", "Interface::FITKOFPhysicsData"); if (adaptor == nullptr) return false; adaptor->setH5GroupData(physicsGroup); adaptor->setDataObject(physicsData); adaptor->setFileWriter(this); bool isW = adaptor->adaptW(); if (!isW) consoleMessage(3, QString("Write PhysicsData Errors ! ")); delete adaptor; return isW; } void FITKFlowOFHDF5Writer::sendCalculateProgress(int Progress) { } void FITKFlowOFHDF5Writer::consoleMessage(int level, const QString & str) { #ifdef QT_DEBUG qDebug() << str; #endif //判断消息等级 switch (level) { case 1:AppFrame::FITKMessageNormal(str); break; case 2: AppFrame::FITKMessageWarning(str); break; case 3:AppFrame::FITKMessageError(str); break; default: AppFrame::FITKMessageError(str); break; } } }