#include "FITKOFDecomposeParDriver.h" #include "FITK_Kernel/FITKAppFramework/FITKAbstractProgramDriver.h" #include "FITK_Kernel/FITKAppFramework/FITKAbstractCommandRunner.h" // QT #include namespace FoamDriver { int FITKOFDecomposeParDriver::getProgramType() { return 1; } QString FITKOFDecomposeParDriver::getProgramName() { return "decomposePar"; } void FITKOFDecomposeParDriver::start() { //输入参数判空 if (!_inputInfo) return; // 获取blockMesh启动参数 QStringList decomposeParArguments = _inputInfo->args(); qDebug() << "decomposeParArguments:" << decomposeParArguments; // 获取监控的路径 QStringList monitorPaths = _inputInfo->getMonitorPath(); qDebug() << "monitorPaths:" << monitorPaths; QString decomposeParCommond = "blockMesh " + decomposeParArguments.join(" "); qDebug() << "decomposeParCommond:" << decomposeParCommond; // 判断监控路径是否存在 if (_commandRunner->isExistDictionary(monitorPaths)) { // 执行命令并捕获其输出 connect(_commandRunner, SIGNAL(taskFinishedSig(FITKThreadTask*)), this, SLOT(threadFinishedSlot()), Qt::UniqueConnection); _commandRunner->setExecuteCommand(decomposeParCommond); _commandRunner->push2ThreadPool(); } } void FITKOFDecomposeParDriver::stop() { _commandRunner->killProcess(_commandRunner->getID()); } // bool FITKOFDecomposeParDriver::runCommand(const QString &command) // { // try // { // // 执行命令并捕获其输出 // QString output = executeCommand(command, _processId); // captureOutput(output); // return true; // } // catch (const std::runtime_error &e) // { // emit commandError(e.what()); // return false; // } // } // void FITKOFDecomposeParDriver::captureOutput(const QString &output) // { // emit commandOutput(output); // qDebug() << output; // } // qint64 FITKOFDecomposeParDriver::getProcessId() const // { // return _processId; // } // bool FITKOFDecomposeParDriver::executeDecomposePar(const QString &casePath, const QStringList &options) // { // // 设置当前算例路径 // setWorkDirect(casePath); // bool isSuccess = false; // QString decomposeParOptions = parseDecomposeParOptions(casePath, options); // QString command = QString("decomposePar %1").arg(decomposeParOptions); // // 检查算例路径下是否包含必须文件 // if (isExistDictionary(casePath)) // { // isSuccess = runCommand(command); // } // return isSuccess; // } // QString FITKOFDecomposeParDriver::parseDecomposeParOptions(const QString &casePath, const QStringList &options) // { // // 选项结果 // QString optionResult; // // 使用不区分大小写的包含检查 // for (const QString &option : options) // { // if (option.compare("case", Qt::CaseInsensitive) == 0) // { // // 指定要使用的案例目录(而不是 cwd) // optionResult += "-case " + casePath; // } // else if (option.compare("allRegions", Qt::CaseInsensitive) == 0) // { // // operate on all regions in regionSolvers // optionResult += " -allRegions"; // } // else if (option.compare("cellProc", Qt::CaseInsensitive) == 0) // { // // write cell processor indices as a volScalarField::Internal for post-processing // optionResult += " -cellProc"; // } // else if (option.compare("constant", Qt::CaseInsensitive) == 0) // { // // include the 'constant/' dir in the times list // optionResult += " -constant"; // } // else if (option.compare("copyUniform", Qt::CaseInsensitive) == 0) // { // // copy any uniform/ directories too // optionResult += " -copyUniform"; // } // else if (option.compare("copyZero", Qt::CaseInsensitive) == 0) // { // //Copy 0 directory to processor* rather than decompose the fields // optionResult += " -copyZero"; // } // else if (option.compare("fields", Qt::CaseInsensitive) == 0) // { // //use existing geometry decomposition and convert fields only // optionResult += " -fields"; // } // else if (option.compare("noFields", Qt::CaseInsensitive) == 0) // { // //opposite of -fields; only decompose geometry // optionResult += " -noFields"; // } // } // return optionResult; // } // bool FITKOFDecomposeParDriver::isExistDictionary(const QString &dicFilePath) // { // // decomposeParDict 字典,用来分解网格和场,位于 system 子文件夹下 // QString getNumberSubdomainsRequiredDict = QString("%1/system/decomposeParDict").arg(dicFilePath); // // 使用 QFileInfo 判断是否存在 // QFileInfo checkFile(getNumberSubdomainsRequiredDict); // if (checkFile.exists()) // { // return true; // } // return false; // } }