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++

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.

#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);
}
}
}
}