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_Interface/FITKInterfaceFlowOF/FITKFlowPhysicsHandlerFacto...

972 lines
47 KiB
C++

#include "FITKFlowPhysicsHandlerFactory.h"
#include "FITK_Kernel/FITKEasyParam/FITKParameter.h"
#include "FITKOFPhysicsData.h"
#include "FITKAbstractOFSolver.h"
#include "FITKAbstractOFTurbulence.h"
#include "FITKOFSolution.h"
#include "FITKOFDiscretization.h"
#include "FITKOFBoundary.h"
#include "FITKOFRunControl.h"
#include "FITKOFBoundaryType.h"
#include "FITKOFSolutionSolver.h"
#include "FITKOFInitialConditions.h"
#include "FITKOFTransportProp.h"
#include "FITKOFTransportModel.h"
#include "FITKOFPhysicsManager.h"
#include "FITKOFSolverManager.h"
#include "FITKOFSolutionSolverManager.h"
#include "FITKOFTurbulenceManager.h"
#include "FITKOFBoundaryTypeManager.h"
#include "FITKOFTransportModelManager.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Interface/FITKInterfaceMesh/FITKUnstructuredFluidMeshVTK.h"
#include "FITKOFOperatingConditions.h"
namespace Interface
{
QString FITKFlowPhysicsHandlerFactory::getComponentName()
{
return "FITKFlowPhysicsHandlerFactory";
}
void FITKFlowPhysicsHandlerFactory::setSolver(QString solverName)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//查看是否是当前求解器
if (physicsData->getSolver() && physicsData->getSolver()->getDataObjectName() == solverName)return;
//获取求解器管理器
FITKOFSolverManager* solverManager = physicsManager->getSolverManager();
if (!solverManager)return;
//通过求解器名称获取求解器信息
FITKOFSolverInfo solverInfo = solverManager->getSolverInfoBySolverName(solverName);
//创建求解器
FITKAbstractOFSolver* solver = solverInfo._createFuns();
this->actionSetSolver(solver);
}
void FITKFlowPhysicsHandlerFactory::setTurbence(QString turbulenceName)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//查看是否是湍流数据
if (physicsData->getTurbulence() && physicsData->getTurbulence()->getDataObjectName() == turbulenceName)return;
//获取湍流模型管理器
FITKOFTurbulenceManager* turbulenceManager = physicsManager->getTurbulenceManager();
if (!turbulenceManager)return;
//通过湍流模型名称获取湍流模型信息
FITKOFTurbulenceInfo turbulenceInfo = turbulenceManager->getTurbenceInfoByTurbulenceName(turbulenceName);
if (turbulenceInfo._turbType == FITKOFSolverTypeEnum::FITKOFTurbulenceType::TurbNone)
{
physicsData->setTurbulence(nullptr);
return;
}
//创建湍流模型
FITKAbstractOFTurbulence* turbulence = turbulenceInfo._createFuns();
this->actionSetTurbulence(turbulence);
}
void FITKFlowPhysicsHandlerFactory::setSolutionSolver(int vIndex, QString solutionSolverName)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//查看是否设置类型重复
FITKOFSolution* solution = physicsData->getSolution();
if (!solution)return;
FITKOFAlgebraicEquationsPara* vPara = solution->getSolverVariablePara(vIndex);
if (!vPara) return;
if (vPara->getSolutionSolver() && vPara->getSolutionSolver()->getDataObjectName() == solutionSolverName)return;
//获取湍流模型管理器
FITKOFSolutionSolverManager* solutionSolverManager = physicsManager->getSolutionSolverManager();
if (!solutionSolverManager)return;
//通过名称获取solutionSolver信息
FITKOFSolutionSolverInfo info = solutionSolverManager->getSolutionSolverInfo(solutionSolverName);
if (info._solutionSolverName.isEmpty())return;
FITKOFAbsSolutionSolver* solutionSolver = info._createFuns();
vPara->setSolutionSolver(solutionSolver);
}
void FITKFlowPhysicsHandlerFactory::setTransportModel(int phaseIndex, QString modelName)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取物理场材料
FITKOFTransportProp* transportProp = physicsData->getTransportProp();
if (!transportProp)return;
//获取Phase数据对象
FITKOFTransportPhase* phase = transportProp->getPhase(phaseIndex);
if (!phase)return;
//获取Transport Model管理器
FITKOFTransportModelManager* transportModelManager = physicsManager->getTransportModelManager();
//通过名称获取Transport Model信息
FITKOFTransportModelInfo info = transportModelManager->getTransportModelInfo(modelName);
if (info._transModelName.isEmpty())return;
FITKAbsOFTransportModel* modelNew = info._createFuns();
phase->setTransportModel(modelNew);
}
void FITKFlowPhysicsHandlerFactory::setBoundary(int meshBoundaryId, FITKOFSolverTypeEnum::FITKOFBoundaryType bType)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取物理场边界管理器
FITKOFBoundaryManager* boundaryManagerPhy = physicsData->getBoundaryManager();
if (!boundaryManagerPhy)return;
//获取边界类型管理器
FITKOFBoundaryTypeManager* boundaryTypeManager = physicsManager->getBoundaryTypeManager();
if (!boundaryTypeManager)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器里的边界信息
FITKOFBoundary* boundarySol = solver->getBoundary(bType);
if (!boundarySol)return;
//创建新边界并添加到物理场边界管理器
FITKOFBoundary* boundaryPhy = new FITKOFBoundary(bType);
boundaryManagerPhy->appendDataObj(boundaryPhy);
boundaryPhy->setMeshBoundaryID(meshBoundaryId);
//将solver边界添加到物理场Flow
int countSolFlow = boundarySol->getFlowCount();
for (int i = 0; i < countSolFlow; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundarySol->getFlowVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundarySol->getFlowVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundarySol->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setFlowBoundary(variableName, boundaryTypeNew);
}
//将solver边界添加到物理场Phase
int countSolPhases = boundarySol->getPhasesCount();
for (int i = 0; i < countSolPhases; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundarySol->getPhasesVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundarySol->getPhasesVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundarySol->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setPhasesBoundary(variableName, boundaryTypeNew);
}
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
if (!turbulence)return;
//获取湍流里的边界信息
FITKOFBoundary* boundaryTur = turbulence->getBoundary(bType);
if (!boundaryTur)return;
//将湍流边界添加到物理场Turbulence
int countSolTurbulence = boundaryTur->getTurbulenceCount();
for (int i = 0; i < countSolTurbulence; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundaryTur->getTurbulenceVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundaryTur->getTurbulenceVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundaryTur->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setTurbulenceBoundary(variableName, boundaryTypeNew);
}
}
void FITKFlowPhysicsHandlerFactory::setBoundaryType(int boundaryIndex, FITKOFSolverTypeEnum::FITKOFBoundaryType bType)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取物理场边界管理器
FITKOFBoundaryManager* boundaryManagerPhy = physicsData->getBoundaryManager();
if (!boundaryManagerPhy)return;
//获取边界类型管理器
FITKOFBoundaryTypeManager* boundaryTypeManager = physicsManager->getBoundaryTypeManager();
if (!boundaryTypeManager)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器里的边界信息
FITKOFBoundary* boundarySol = solver->getBoundary(bType);
if (!boundarySol)return;
//获取物理场边界
FITKOFBoundary* boundaryPhy = boundaryManagerPhy->getDataByIndex(boundaryIndex);
if (!boundaryPhy)return;
//将solver边界添加到物理场Flow
int countSolFlow = boundarySol->getFlowCount();
for (int i = 0; i < countSolFlow; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundarySol->getFlowVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundarySol->getFlowVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundarySol->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setFlowBoundary(variableName, boundaryTypeNew);
}
//将solver边界添加到物理场Phase
int countSolPhases = boundarySol->getPhasesCount();
for (int i = 0; i < countSolPhases; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundarySol->getPhasesVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundarySol->getPhasesVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundarySol->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setPhasesBoundary(variableName, boundaryTypeNew);
}
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
if (!turbulence)return;
//获取湍流里的边界信息
FITKOFBoundary* boundaryTur = turbulence->getBoundary(bType);
if (!boundaryTur)return;
//将湍流边界添加到物理场Turbulence
int countSolTurbulence = boundaryTur->getTurbulenceCount();
for (int i = 0; i < countSolTurbulence; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundaryTur->getTurbulenceVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundaryTur->getTurbulenceVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundaryTur->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setTurbulenceBoundary(variableName, boundaryTypeNew);
}
}
void FITKFlowPhysicsHandlerFactory::setVariableBoundaryType(int boundaryId, QString variableName, QString boundaryType)
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取物理场边界管理器
FITKOFBoundaryManager* boundaryManagerPhy = physicsData->getBoundaryManager();
if (!boundaryManagerPhy)return;
//获取边界类型管理器
FITKOFBoundaryTypeManager* boundaryTypeManager = physicsManager->getBoundaryTypeManager();
if (!boundaryTypeManager)return;
//获取物理场边界
FITKOFBoundary* boundaryPhy = boundaryManagerPhy->getDataByID(boundaryId);
if (!boundaryPhy)return;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType, solver->getSolverType(), variableName, boundaryPhy->getBoundaryType());
if (info._boundaryTypeName.isEmpty())return;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
boundaryPhy->setBoundary(variableName, boundaryTypeNew);
}
void FITKFlowPhysicsHandlerFactory::recordBoundaryMeshName()
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取物理场边界管理器
FITKOFBoundaryManager* boundaryManagerPhy = physicsData->getBoundaryManager();
if (!boundaryManagerPhy)return;
//记录网格边界名称
int count = boundaryManagerPhy->getDataCount();
for (int i = 0; i < count; ++i)
{
FITKOFBoundary* boundary = boundaryManagerPhy->getDataByIndex(i);
if (!boundary)continue;
FITKBoundaryMeshVTK* boundaryMesh = boundary->getMeshBoundary();
if (!boundaryMesh)continue;
QString name = boundaryMesh->getDataObjectName();
boundary->setUserData(Core::FITKUserData::FITKUserRole, name);
}
}
void FITKFlowPhysicsHandlerFactory::resetBoundaryMesh()
{
//获取全局数据
AppFrame::FITKGlobalData* globalData = FITKAPP->getGlobalData();
if (!globalData)return;
//获取网格数据
Interface::FITKUnstructuredFluidMeshVTK* meshData = globalData->getMeshData<Interface::FITKUnstructuredFluidMeshVTK>();
if (!meshData)return;
//获取边界网格管理器
Interface::FITKBoundaryMeshVTKManager* boundaryMeshMgr = meshData->getBoundaryMeshManager();
if (!boundaryMeshMgr)return;
//获取物理数据
FITKOFPhysicsData* physicsData = globalData->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取物理场边界管理器
FITKOFBoundaryManager* boundaryManagerPhy = physicsData->getBoundaryManager();
if (!boundaryManagerPhy)return;
int count = boundaryManagerPhy->getDataCount();
for (int i = count - 1; i >= 0; --i)
{
FITKOFBoundary* boundary = boundaryManagerPhy->getDataByIndex(i);
if (!boundary)continue;
QString name = boundary->getUserDataT<QString>(Core::FITKUserData::FITKUserRole);
Interface::FITKBoundaryMeshVTK* boundaryMesh = boundaryMeshMgr->getDataByName(name);
if (boundaryMesh)
{
boundary->setMeshBoundaryID(boundaryMesh->getDataObjectID());
continue;
}
boundaryManagerPhy->removeDataByIndex(i);
}
}
void FITKFlowPhysicsHandlerFactory::setPatch(int geometryId, QStringList vNameList, FITKOFSolverInitialEnum::FITKPatchApplyObjectType type)
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器下的init数据
FITKOFInitialConditions* physicsInitial = physicsData->getInitialConditions();
if (!physicsInitial)return;
//获取物理数据的init数据
FITKOFInitialConditions* solverInitial = solver->getInitialConditions();
if (!solverInitial)return;
//创建patch
FITKOFGeometryPatch* patch = new FITKOFGeometryPatch(geometryId, type);
physicsInitial->appendPatch(patch);
Core::FITKParameter* fieldData = patch->getFieldPara();
//
Core::FITKParameter* basicSol = solverInitial->getBasicData();
int count = basicSol->getDataCount();
for (int i = 0; i < count; ++i)
{
Core::FITKAbstractEasyParam* data = basicSol->getDataByIndex(i);
if (!data)continue;
QString name = data->getDataObjectName();
if (!vNameList.contains(name))continue;
fieldData->copyAppendPara(data);
}
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
if (!turbulence)return;
//获取湍流下的离散数据变化量
FITKOFInitialConditions* turbulenceInitial = turbulence->getInitialConditions();
if (!turbulenceInitial)return;
Core::FITKParameter* basicTur = turbulenceInitial->getBasicData();
count = basicTur->getDataCount();
for (int i = 0; i < count; ++i)
{
Core::FITKAbstractEasyParam* data = basicTur->getDataByIndex(i);
if (!data)continue;
QString name = data->getDataObjectName();
if (!vNameList.contains(name))continue;
fieldData->copyAppendPara(data);
}
}
QStringList FITKFlowPhysicsHandlerFactory::filterPatchFieldsType()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return QStringList();
//获取求解器下的init数据
FITKOFInitialConditions* physicsInitial = physicsData->getInitialConditions();
if (!physicsInitial)return QStringList();
//获取初始化参数
Core::FITKParameter* basic = physicsInitial->getBasicData();
if (!basic)return QStringList();
QStringList strList;
int count = basic->getDataCount();
for (int i = 0; i < count; ++i)
{
Core::FITKAbstractEasyParam* data = basic->getDataByIndex(i);
if (!data)continue;
strList.append(data->getDataObjectName());
}
return strList;
}
bool FITKFlowPhysicsHandlerFactory::isExecuteSetFields()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return false;
//获取求解器下的init数据
FITKOFInitialConditions* physicsInitial = physicsData->getInitialConditions();
if (!physicsInitial)return false;
//获取patch数量
return physicsInitial->getPatchCount() > 0;
}
void FITKFlowPhysicsHandlerFactory::clearPhysicsData()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//清理所有物理数据
physicsData->setSolver(nullptr);
physicsData->setEnableTurbulenceEqu(false);
physicsData->setTurbulence(nullptr);
physicsData->setTransportProp(nullptr);
physicsData->setDiscretization(nullptr);
physicsData->setSolution(nullptr);
physicsData->setInitialConditions(nullptr);
physicsData->setBoundaryManager(nullptr);
physicsData->setRunControl(nullptr);
physicsData->setOperatingConditions(nullptr);
}
void FITKFlowPhysicsHandlerFactory::actionSetSolver(FITKAbstractOFSolver* solver)
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//设置求解器
physicsData->setSolver(solver);
if (!solver)return;
//设置是否启用湍流数据
physicsData->setEnableTurbulenceEqu(solver->turbEnabled());
//设置湍流为空
physicsData->setTurbulence(nullptr);
//设置离散
this->setPhysicsDiscretization();
//设置solution数据
this->setPhysicsSolution();
//设置init数据
this->setPhysicsInitialConditions();
//设置材料数据
this->setPhysicsTransportProp();
//设置边界管理器
physicsData->setBoundaryManager(new FITKOFBoundaryManager);
//设置运行配置
this->setPhysicsRunControl();
//设置工作条件
this->setPhysicsOperatingConditions();
}
void FITKFlowPhysicsHandlerFactory::actionSetTurbulence(FITKAbstractOFTurbulence* turbulence)
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//设置湍流
physicsData->setTurbulence(turbulence);
//更新变量
this->updatePhysicsDiscretization();
this->updatePhysicsSolution();
this->updatePhysicsInitialConditions();
this->updatePhysicsBoundaryConditions();
}
void FITKFlowPhysicsHandlerFactory::setPhysicsDiscretization()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器下的离散数据
FITKOFDiscretization* discretizationSol = solver->getDiscretization();
if (!discretizationSol)return;
//创建离散数据,初始化离散数据复制到实际数据中
FITKOFDiscretization* discretizationPhy = new FITKOFDiscretization;
//拷贝Time
Core::FITKParameter* timePhy = discretizationPhy->getTimeOption();
Core::FITKParameter* timeSol = discretizationSol->getTimeOption();
if (timePhy && timeSol)
timePhy->copyPara(timeSol);
//拷贝Gradients
Core::FITKParameter* gradientsPhy = discretizationPhy->getGradients();
Core::FITKParameter* gradientsSol = discretizationSol->getGradients();
if (gradientsPhy && gradientsSol)
gradientsPhy->copyPara(gradientsSol);
//拷贝Interpolation
Core::FITKParameter* interpolationPhy = discretizationPhy->getInterpolation();
Core::FITKParameter* interpolationSol = discretizationSol->getInterpolation();
if (interpolationPhy && interpolationSol)
interpolationPhy->copyPara(interpolationSol);
//拷贝对流数据
int count = discretizationSol->getConvectionCount();
for (int i = 0; i < count; ++i)
{
Core::FITKParameter* para = discretizationSol->getConvectionVPara(i);
if (!para)continue;
Core::FITKParameter* newPara = new Core::FITKParameter;
newPara->copyPara(para);
discretizationPhy->insertConvection(discretizationSol->getConvectionVName(i), newPara);
}
//设置数据到物理数据
physicsData->setDiscretization(discretizationPhy);
}
void FITKFlowPhysicsHandlerFactory::setPhysicsSolution()
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取湍流模型管理器
FITKOFSolutionSolverManager* solutionSolverManager = physicsManager->getSolutionSolverManager();
if (!solutionSolverManager)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器下的solution数据
FITKOFSolution* solutionSol = solver->getSolution();
if (!solutionSol)return;
//创建solution,初始化solution数据复制到实际数据中
FITKOFSolution* solutionPhy = new FITKOFSolution;
//拷贝Solvers
int count = solutionSol->getSolversCount();
for (int i = 0; i < count; ++i)
{
//获取求解器代数变量数据对象
FITKOFAlgebraicEquationsPara* solutionSolverSol = solutionSol->getSolverVariablePara(i);
if (!solutionSolverSol)continue;
FITKOFAbsSolutionSolver* data = solutionSolverSol->getSolutionSolver();
if (!data)continue;
//获取代数变量求解器信息
FITKOFSolutionSolverInfo info = solutionSolverManager->getSolutionSolverInfo(data->getDataObjectName());
if (info._solutionSolverName.isEmpty())continue;
FITKOFAbsSolutionSolver* newData = info._createFuns();
if (!newData)continue;
Core::FITKParameter* para = newData->getSolverSolutionPara();
para->copyPara(data->getSolverSolutionPara());
//获取变量求解增加的参数对象并设置数据
Core::FITKParameter* additionPSol = solutionSolverSol->getSolverAdditionalPara();
Core::FITKParameter* additionPPhy = nullptr;
if (additionPSol)
{
additionPPhy = new Core::FITKParameter;
additionPPhy->copyPara(additionPSol);
}
//获取变量名称
QString vname = solutionSolverSol->getVariableName();
//创建新的数据对象
FITKOFAlgebraicEquationsPara* solutionSolverPhy = new FITKOFAlgebraicEquationsPara;
solutionSolverPhy->setVariableName(vname);
solutionSolverPhy->setSolutionSolver(newData);
solutionSolverPhy->setSolverAdditionalPara(additionPPhy);
solutionPhy->appendSolutionSolver(solutionSolverPhy);
}
//拷贝求解器有关的特殊数据
Core::FITKParameter* speciallySol = solutionSol->getSolverSpeciallyDataPara();
if (speciallySol)
{
Core::FITKParameter* speciallyPhy = new Core::FITKParameter;
speciallyPhy->copyPara(speciallySol);
solutionPhy->setSpeciallyData(solutionSol->getSolverSpeciallyDataName(), speciallyPhy);
}
//拷贝residuals
count = solutionSol->getResidualsCount();
for (int i = 0; i < count; ++i)
{
Core::FITKParameter* para = solutionSol->getResidualVariablePara(i);
if (!para)continue;
Core::FITKParameter* newPara = new Core::FITKParameter;
newPara->copyPara(para);
solutionPhy->setResidualData(solutionSol->getResidualVariableName(i), newPara);
}
//拷贝relaxation
Core::FITKParameter* relaxationSol = solutionSol->getRelaxation();
Core::FITKParameter* relaxationPhy = solutionPhy->getRelaxation();
if (relaxationPhy && relaxationSol)
relaxationPhy->copyPara(relaxationSol);
//拷贝limits
Core::FITKParameter* limitsSol = solutionSol->getLimits();
Core::FITKParameter* limitsPhy = solutionPhy->getLimits();
if (limitsPhy && limitsSol)
limitsPhy->copyPara(limitsSol);
//设置数据到物理数据
physicsData->setSolution(solutionPhy);
}
void FITKFlowPhysicsHandlerFactory::setPhysicsInitialConditions()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器下的离散数据
FITKOFInitialConditions* solverInitial = solver->getInitialConditions();
if (!solverInitial)return;
//创建Initial数据初始化Initial数据复制到实际数据中
FITKOFInitialConditions* physicsInitial = new FITKOFInitialConditions;
//拷贝Basic
Core::FITKParameter* basicSol = solverInitial->getBasicData();
Core::FITKParameter* basicPhy = physicsInitial->getBasicData();
if (basicPhy && basicSol)
basicPhy->copyPara(basicSol);
//设置数据到物理数据
physicsData->setInitialConditions(physicsInitial);
}
void FITKFlowPhysicsHandlerFactory::setPhysicsTransportProp()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取物理材料管理器
FITKOFTransportModelManager* transportModelManager = physicsManager->getTransportModelManager();
if (!transportModelManager)return;
// 获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器下的物理材料
FITKOFTransportProp* transSol = solver->getTransportProp();
if (!transSol)return;
//创建物理材料数据,初始化物理材料数据复制到实际数据中
FITKOFTransportProp* transPhy = new FITKOFTransportProp;
//拷贝材料所需参数
Core::FITKParameter* addTransSol = transSol->getTransportAdditionalData();
Core::FITKParameter* addTransPhy = transPhy->getTransportAdditionalData();
if (addTransPhy && addTransSol)
addTransPhy->copyPara(addTransSol);
//拷贝Phase
int count = transSol->getPhasesCount();
for (int i = 0; i < count; ++i)
{
FITKOFTransportPhase* phaseSol = transSol->getPhase(i);
if (!phaseSol) continue;
Core::FITKParameter* addPhaseParaSol = phaseSol->getPhaseAdditionalData();
FITKAbsOFTransportModel* modelSol = phaseSol->getTransportModel();
FITKOFTransportModelInfo info = transportModelManager->getTransportModelInfo(modelSol->getDataObjectName());
if (info._transModelName.isEmpty())continue;
FITKAbsOFTransportModel* newModel = info._createFuns();
Core::FITKParameter* modelPara = newModel->getTransportModelPara();
modelPara->copyPara(modelSol->getTransportModelPara());
Core::FITKParameter* addPhaseParaPhy = nullptr;
if (addPhaseParaSol)
{
addPhaseParaPhy = new Core::FITKParameter;
addPhaseParaPhy->copyPara(addPhaseParaSol);
}
//创建新对象
FITKOFTransportPhase* phaseNew = new FITKOFTransportPhase;
phaseNew->setPhaseName(phaseSol->getPhaseName());
phaseNew->setPhaseAdditionalData(addPhaseParaPhy);
phaseNew->setTransportModel(newModel);
transPhy->appendPhase(phaseNew);
}
physicsData->setTransportProp(transPhy);
}
void FITKFlowPhysicsHandlerFactory::setPhysicsRunControl()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器下的运行配置数据
FITKOFRunControl* solverRun = solver->getRunControl();
if (!solverRun)return;
//创建运行配置数据对象,初始化运行配置数据复制到实际数据中
FITKOFRunControl* physicsRun = new FITKOFRunControl;
//拷贝TimeControl
Core::FITKParameter* timeConPhy = physicsRun->getTimeControl();
Core::FITKParameter* timeConSol = solverRun->getTimeControl();
if (timeConPhy && timeConSol)
timeConPhy->copyPara(timeConSol);
//拷贝OutputControl
Core::FITKParameter* outputConPhy = physicsRun->getOutputControl();
Core::FITKParameter* outputConSol = solverRun->getOutputControl();
if (outputConPhy && outputConSol)
outputConPhy->copyPara(outputConSol);
//设置数据到物理数据
physicsData->setRunControl(physicsRun);
}
void FITKFlowPhysicsHandlerFactory::setPhysicsOperatingConditions()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取求解器里的数据
FITKOFOperatingConditions* operatingSol = solver->getOperatingConditions();
if (!operatingSol)return;
//创建新数据
FITKOFOperatingConditions* operatingPhy = new FITKOFOperatingConditions;
//拷贝引力与加速度条件参数
Core::FITKParameter* gaPhy = operatingPhy->getGravitationalAcceleration();
Core::FITKParameter* gaSol = operatingSol->getGravitationalAcceleration();
if (gaPhy && gaSol)
gaPhy->copyPara(gaSol);
//拷贝OutputControl
Core::FITKParameter* rpPhy = operatingPhy->getReferencePressure();
Core::FITKParameter* rpSol = operatingSol->getReferencePressure();
if (rpPhy && rpSol)
rpPhy->copyPara(rpSol);
physicsData->setOperatingConditions(operatingPhy);
}
void FITKFlowPhysicsHandlerFactory::updatePhysicsDiscretization()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器和物理数据离散数据
FITKAbstractOFSolver* solver = physicsData->getSolver();
FITKOFDiscretization* physicsDis = physicsData->getDiscretization();
if (!solver || !physicsDis)return;
//获取求解器的离散数据
FITKOFDiscretization* solverDis = solver->getDiscretization();
if (!solverDis)return;
//获取需要保留的离散数据名称
QStringList nameList;
int count = solverDis->getConvectionCount();
for (int i = 0; i < count; ++i)
{
nameList.append(solverDis->getConvectionVName(i));
}
//设置需要保留物理数据离散数据
physicsDis->onlyKeepConvection(nameList);
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
if (!turbulence)return;
//获取湍流下的离散数据变化量
FITKOFDiscretization* turbulenceDis = turbulence->getDiscretization();
if (!turbulenceDis)return;
//设置湍流下的离散数据变化量到物理数据离散数据
count = turbulenceDis->getConvectionCount();
for (int i = 0; i < count; ++i)
{
Core::FITKParameter* para = turbulenceDis->getConvectionVPara(i);
if (!para)continue;
Core::FITKParameter* newPara = new Core::FITKParameter;
newPara->copyPara(para);
physicsDis->insertConvection(turbulenceDis->getConvectionVName(i), newPara);
}
}
void FITKFlowPhysicsHandlerFactory::updatePhysicsSolution()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取湍流模型管理器
FITKOFSolutionSolverManager* solutionSolverManager = physicsManager->getSolutionSolverManager();
if (!solutionSolverManager)return;
//获取求解器和物理数据solution数据
FITKAbstractOFSolver* solver = physicsData->getSolver();
FITKOFSolution* physicsSol = physicsData->getSolution();
if (!solver || !physicsSol)return;
//获取求解器的solution数据
FITKOFSolution* solverSol = solver->getSolution();
if (!solverSol)return;
//获取relaxation参数
Core::FITKParameter* relaxationPhy = physicsSol->getRelaxation();
if (!relaxationPhy)return;
//获取需要保留的solution数据名称
QStringList nameSolversList, nameResidualsList;
int count = solverSol->getSolversCount();
for (int i = 0; i < count; ++i)
{
FITKOFAlgebraicEquationsPara* para = solverSol->getSolverVariablePara(i);
if (!para)continue;
nameSolversList.append(para->getVariableName());
}
count = solverSol->getResidualsCount();
for (int i = 0; i < count; ++i)
{
nameResidualsList.append(solverSol->getResidualVariableName(i));
}
//设置需要保留物理数据离散数据
solverSol->onlyKeepSolvers(nameSolversList);
solverSol->onlyKeepResiduals(nameResidualsList);
relaxationPhy->onlyKeepPara(solverSol->getRelaxation());
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
if (!turbulence)return;
//获取湍流下的solution数据变化量
FITKOFSolution* turbulenceSlo = turbulence->getSolution();
if (!turbulenceSlo)return;
//设置湍流下的solution数据变化量到物理数据solution数据
count = turbulenceSlo->getSolversCount();
for (int i = 0; i < count; ++i)
{
//获取求解器代数变量数据对象
FITKOFAlgebraicEquationsPara* solutionSolverTur = turbulenceSlo->getSolverVariablePara(i);
if (!solutionSolverTur)continue;
FITKOFAbsSolutionSolver* data = solutionSolverTur->getSolutionSolver();
if (!data)continue;
FITKOFSolutionSolverInfo info = solutionSolverManager->getSolutionSolverInfo(data->getDataObjectName());
if (info._solutionSolverName.isEmpty())continue;
FITKOFAbsSolutionSolver* solutionSolver = info._createFuns();
if (!solutionSolver)continue;
//获取变量求解增加的参数对象并设置数据
Core::FITKParameter* additionPTur = solutionSolverTur->getSolverAdditionalPara();
Core::FITKParameter* additionPPhy = nullptr;
if (additionPTur)
{
additionPPhy = new Core::FITKParameter;
additionPPhy->copyPara(additionPTur);
}
//获取变量名称
QString vname = solutionSolverTur->getVariableName();
//创建新的数据对象
FITKOFAlgebraicEquationsPara* solutionSolverPhy = new FITKOFAlgebraicEquationsPara;
solutionSolverPhy->setVariableName(vname);
solutionSolverPhy->setSolutionSolver(solutionSolver);
solutionSolverPhy->setSolverAdditionalPara(additionPPhy);
physicsSol->appendSolutionSolver(solutionSolverPhy);
}
//residuals
count = turbulenceSlo->getResidualsCount();
for (int i = 0; i < count; ++i)
{
QString vName = turbulenceSlo->getResidualVariableName(i);
physicsSol->initAppendResidual(vName, physicsSol->getSolverSpeciallyDataName());
}
//relaxation
relaxationPhy->appendPara(turbulenceSlo->getRelaxation());
}
void FITKFlowPhysicsHandlerFactory::updatePhysicsInitialConditions()
{
//获取物理数据
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
if (!physicsData)return;
//获取求解器和物理数据Initial数据
FITKAbstractOFSolver* solver = physicsData->getSolver();
FITKOFInitialConditions* physicsInitial = physicsData->getInitialConditions();
if (!solver || !physicsInitial)return;
//清理patch
int count = physicsInitial->getPatchCount();
for (int i = count - 1; i >= 0; ++i)
{
physicsInitial->removePatch(i);
}
//获取求解器的Initial数据
FITKOFInitialConditions* solverInitial = solver->getInitialConditions();
if (!solverInitial)return;
//获取Basic参数
Core::FITKParameter* basicPhy = physicsInitial->getBasicData();
if (!basicPhy)return;
//设置需要保留物理数据离散数据
basicPhy->onlyKeepPara(solverInitial->getBasicData());
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
if (!turbulence)return;
//获取湍流下的离散数据变化量
FITKOFInitialConditions* turbulenceInitial = turbulence->getInitialConditions();
if (!turbulenceInitial)return;
//追加Basic参数
basicPhy->appendPara(turbulenceInitial->getBasicData());
}
void FITKFlowPhysicsHandlerFactory::updatePhysicsBoundaryConditions()
{
//获取物理数据与物理场管理器
FITKOFPhysicsData* physicsData = FITKAPP->getGlobalData()->getPhysicsData<FITKOFPhysicsData>();
FITKOFPhysicsManager* physicsManager = FITKOFPhysicsManager::getInstance();
if (!physicsManager || !physicsData)return;
//获取求解器
FITKAbstractOFSolver* solver = physicsData->getSolver();
if (!solver)return;
//获取物理场边界管理器
FITKOFBoundaryManager* boundaryManagerPhy = physicsData->getBoundaryManager();
if (!boundaryManagerPhy)return;
//获取边界类型管理器
FITKOFBoundaryTypeManager* boundaryTypeManager = physicsManager->getBoundaryTypeManager();
if (!boundaryTypeManager)return;
//获取湍流数据
FITKAbstractOFTurbulence* turbulence = physicsData->getTurbulence();
//获取物理场边界
int boundCount = boundaryManagerPhy->getDataCount();
for (int index = 0; index < boundCount; ++index)
{
FITKOFBoundary* boundaryPhy = boundaryManagerPhy->getDataByIndex(index);
if (!boundaryPhy)continue;
boundaryPhy->clearTurbulenceBoundary();
if (!turbulence)continue;
//获取边界类型
FITKOFSolverTypeEnum::FITKOFBoundaryType bType = boundaryPhy->getBoundaryType();
//获取湍流里的边界信息
FITKOFBoundary* boundaryTur = turbulence->getBoundary(bType);
if (!boundaryTur)return;
//将湍流边界添加到物理场Turbulence
int countSolTurbulence = boundaryTur->getTurbulenceCount();
for (int i = 0; i < countSolTurbulence; ++i)
{
//获取求解器的变量名和边界
QString variableName = boundaryTur->getTurbulenceVariableName(i);
FITKOFAbsBoundaryType* boundaryType = boundaryTur->getTurbulenceVBType(i);
if (!boundaryType)continue;
//获取边界类型信息
FITKOFBoundaryTypeInfo info = boundaryTypeManager->getBoundaryTypeInfo(boundaryType->getDataObjectName(), solver->getSolverType(), variableName, boundaryTur->getBoundaryType());
if (info._boundaryTypeName.isEmpty())continue;
//创建新的边界类型对象
FITKOFAbsBoundaryType* boundaryTypeNew = info._createFuns();
Core::FITKParameter* para = boundaryTypeNew->getBoundaryTypePara();
//拷贝数据对象
para->copyPara(boundaryType->getBoundaryTypePara());
//设置边界数据对象
boundaryPhy->setTurbulenceBoundary(variableName, boundaryTypeNew);
}
}
}
}