#include "FITKOFSolverSIMPLE.h" #include "FITKOFDiscretization.h" #include "FITK_Kernel/FITKEasyParam/FITKParameter.h" #include "FITK_Kernel/FITKEasyParam/FITKParamRadioGroup.h" #include "FITK_Kernel/FITKEasyParam/FITKParamBoolGroup.h" #include "FITKOFSolution.h" #include "FITKOFSolutionSolver.h" #include "FITKOFInitialConditions.h" #include "FITKOFTransportProp.h" #include "FITKOFTransportModel.h" #include "FITKOFBoundary.h" #include "FITKOFBoundaryType.h" #include "FITKOFRunControl.h" #include "FITKOFOperatingConditions.h" namespace Interface { FITKOFSolverSIMPLE::FITKOFSolverSIMPLE() { //设置求解器名称 this->setDataObjectName("SIMPLE"); //设置启用湍流数据 _enableTurb = true; //初始化 this->init(); } FITKOFSolverTypeEnum::FITKOFSolverType FITKOFSolverSIMPLE::getSolverType() { //获取求解器类型 return FITKOFSolverTypeEnum::SIMPLE; } QString FITKOFSolverSIMPLE::getSolverCommand() { return "simpleFoam"; } void FITKOFSolverSIMPLE::initTransportProp() { //初始化材料 if (!_transportProp) _transportProp = new FITKOFTransportProp; FITKOFTransportPhase* phase1 = new FITKOFTransportPhase; phase1->setPhaseName("phase1"); FITKOFTransModelNewtonian* model1 = new FITKOFTransModelNewtonian; phase1->setTransportModel(model1); _transportProp->appendPhase(phase1); } void FITKOFSolverSIMPLE::initDiscretization() { //初始化离散 if (_discretization == nullptr) return; _discretization->initGradients(); _discretization->initInterpolation(); //Time Core::FITKParameter* timeOption = _discretization->getTimeOption(); if (!timeOption)return; Core::FITKParamRadioGroup* timePara = timeOption->createRadioGroupParameter("Time Type"); //创建修饰timetype的value Core::FITKParameter* decorated = new Core::FITKParameter; decorated->createBoolParameter("Bounded", false); timePara->setSubValue(decorated); //设置选择项 timePara->appendValue("Steady State", nullptr, QList() << true); //添加U Core::FITKParameter* variableU = new Core::FITKParameter; _discretization->insertConvection("U", variableU); Core::FITKParamRadioGroup* convectionType = variableU->createRadioGroupParameter("Convection Type"); //创建修饰convectionType的value decorated = new Core::FITKParameter; decorated->createBoolParameter("VectorSpecific", true); decorated->createBoolParameter("Bounded", true); decorated->createBoolParameter("SkewCorrected", false); convectionType->setSubValue(decorated); //设置选择项 convectionType->appendValue("upwind", nullptr, QList() << false << true << true); convectionType->appendValue("linearUpwind", nullptr, QList() << true << true << true); convectionType->appendValue("linear", nullptr, QList() << false << true << true); Core::FITKParameter* vlimitedLinear = new Core::FITKParameter; vlimitedLinear->createDoubleParameter("limitedLinear", 1.0); convectionType->appendValue("limitedLinear", vlimitedLinear, QList() << true << true << true); convectionType->appendValue("LUST", nullptr, QList() << false << true << true); convectionType->appendValue("cubic", nullptr, QList() << false << true << true); convectionType->appendValue("vanLeer", nullptr, QList() << true << true << true); convectionType->appendValue("MUSCL", nullptr, QList() << true << true << true); convectionType->appendValue("QUICK", nullptr, QList() << true << true << true); Core::FITKParameter* vDEShybrid = new Core::FITKParameter; vDEShybrid->createDoubleParameter("DEShybrid", 10.0); vDEShybrid->createDoubleParameter("DEShybrid", 1.0); convectionType->appendValue("DEShybrid", vDEShybrid, QList() << false << true << true); //设置初始值 convectionType->setCurrentValue("upwind"); } void FITKOFSolverSIMPLE::initSolution() { //初始化solution if (!_solution)return; //初始化p的参数 solver FITKOFAlgebraicEquationsPara* pPara = new FITKOFAlgebraicEquationsPara; pPara->setSolutionSolver(new FITKOFSolutionSolverGAMG()); pPara->setVariableName("p"); _solution->appendSolutionSolver(pPara); //初始化U的参数 solver FITKOFAlgebraicEquationsPara* uPara = new FITKOFAlgebraicEquationsPara; uPara->setSolutionSolver(new FITKOFSolutionSolverPBiCGStabilized()); uPara->setVariableName("U"); _solution->appendSolutionSolver(uPara); //设置求解器有关的参数 Core::FITKParameter* simple = new Core::FITKParameter; simple->createBoolParameter("Consistent", true); simple->createIntParameter("Non-Orthogonal Correctors", 1); _solution->setSpeciallyData("SIMPLE", simple); //设置Residuals _solution->initAppendResidual("p", "SIMPLE"); _solution->initAppendResidual("U", "SIMPLE"); //设置Relaxation Core::FITKParameter* relaxation = _solution->getRelaxation(); if (!relaxation)return; relaxation->createDoubleParameter("p", 0.3); relaxation->createDoubleParameter("U", 0.7); //设置Limits Core::FITKParameter* limits = _solution->getLimits(); if (!limits) return; Core::FITKParamBoolGroup* vG = limits->createBoolGroupParameter("Velocity Damping", false); Core::FITKParameter* childV = new Core::FITKParameter; childV->createDoubleParameter("Umax", 100); vG->setValueGroup(childV); } void FITKOFSolverSIMPLE::initBoundarys() { //初始化Wall边界信息 FITKOFBoundary* boundaryWall = new FITKOFBoundary(FITKOFSolverTypeEnum::FITKOFBoundaryType::BWall); boundaryWall->setFlowBoundary("p", new FITKOFBTyZeroGradient); boundaryWall->setFlowBoundary("U", new FITKOFBTyNoSlip); _boundaryInfos.append(boundaryWall); //初始化PressureInlet边界信息 FITKOFBoundary* boundaryPInlet = new FITKOFBoundary(FITKOFSolverTypeEnum::FITKOFBoundaryType::BPressureInlet); boundaryPInlet->setFlowBoundary("p", new FITKOFBTyTKETotalPressure); boundaryPInlet->setFlowBoundary("U", new FITKOFBTyPressureIOVelocity); _boundaryInfos.append(boundaryPInlet); //初始化VelocityInlet边界信息 FITKOFBoundary* boundaryVInlet = new FITKOFBoundary(FITKOFSolverTypeEnum::FITKOFBoundaryType::BVelocityInlet); boundaryVInlet->setFlowBoundary("p", new FITKOFBTyZeroGradient); boundaryVInlet->setFlowBoundary("U", new FITKOFBTySurNorFixedValue); _boundaryInfos.append(boundaryVInlet); //初始化PressureOutlet边界信息 FITKOFBoundary* boundaryPOutlet = new FITKOFBoundary(FITKOFSolverTypeEnum::FITKOFBoundaryType::BPressureOutlet); boundaryPOutlet->setFlowBoundary("p", new FITKOFBTyTKEFixedValue); boundaryPOutlet->setFlowBoundary("U", new FITKOFBTyPressureIOVelocity); _boundaryInfos.append(boundaryPOutlet); } void FITKOFSolverSIMPLE::initInitialConditions() { //初始化Initial Conditions数据 if (!_initialCond)return; //初始化Basic Core::FITKParameter* basic = _initialCond->getBasicData(); if (!basic)return; basic->createDoubleParameter("p", 0); basic->createDoubleListParameter("U", QList() << 0 << 0 << 0); } void FITKOFSolverSIMPLE::initRunControl() { //初始化运行配置 if (!_runControl) return; //初始化时间配置 Core::FITKParameter* timeControl = _runControl->getTimeControl(); if (!timeControl)return; timeControl->createIntParameter("Number of Iterations", 100, 99999999, 1); //初始化输出配置 Core::FITKParameter* outputControl = _runControl->getOutputControl(); if (!outputControl)return; outputControl->createIntParameter("Write Interval", 10); Core::FITKParamBoolGroup* cleanResult = outputControl->createBoolGroupParameter("Clean Old Result Files", true); Core::FITKParameter* cleanResultChild = new Core::FITKParameter; cleanResultChild->createIntParameter("Max No.of Files", 2); cleanResult->setValueGroup(cleanResultChild); } void FITKOFSolverSIMPLE::initOperatingConditions() { if (!_operatingCond) _operatingCond = new FITKOFOperatingConditions; _operatingCond->initReferencePressure(); } }