diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index c312675..2bab4b7 100644 Binary files a/Bin/Config/Lang/cn/nmNum_cn.qm and b/Bin/Config/Lang/cn/nmNum_cn.qm differ diff --git a/Bin/Config/Lang/cn/nmNum_cn.ts b/Bin/Config/Lang/cn/nmNum_cn.ts index ab99aa4..75552d4 100644 --- a/Bin/Config/Lang/cn/nmNum_cn.ts +++ b/Bin/Config/Lang/cn/nmNum_cn.ts @@ -2440,8 +2440,10 @@ Reason: %1 求解完成 - Solve time: %1 ms - 本次求解耗时:%1 ms + Grid count: %1 +Solve time: %2 ms + 网格数量:%1 +本次求解耗时:%2 ms diff --git a/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h b/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h index 6ddb222..1f021b3 100644 --- a/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h +++ b/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h @@ -52,6 +52,8 @@ public: // 获取输出结果 HX_NWTM_GRID_OUTPUT1 getGridOutput1(); HX_NWTM_GRID_OUTPUT2 getGridOutput2(); + // 获取最近一次网格划分生成的PEBI网格数量 + int getPebiCount() const; private: // 静态对象 static nmCalculationPebiGrid* m_instance; @@ -62,6 +64,7 @@ private: HX_NWTM_GRID_OUTPUT2 p2; // 对应HX_NWTM_GRID_INPUT::GridControl double m_dGridControl; + int m_nPebiCount; }; diff --git a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp index 61943ef..601ed8b 100644 --- a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp @@ -399,12 +399,11 @@ bool nmCalculationDllPebiSolverTask::execPebiMode() SetIntValueFunc setSolverType = (SetIntValueFunc)GetProcAddress(dll, "set_solvetype"); SetIntValueFunc setOmpThreads = (SetIntValueFunc)GetProcAddress(dll, "set_omp_threads"); SetIntValueFunc setIluReuseSteps = (SetIntValueFunc)GetProcAddress(dll, "set_ilu_reuse_steps"); - GetIntValueFunc getPebiCount = (GetIntValueFunc)GetProcAddress(dll, "getPEBInum"); GetIntValueFunc getSolveTime = (GetIntValueFunc)GetProcAddress(dll, "getsolvetime"); if(HX_NWTM_MODEL == nullptr || setSolverType == nullptr || setOmpThreads == nullptr || setIluReuseSteps == nullptr - || getPebiCount == nullptr || getSolveTime == nullptr) { + || getSolveTime == nullptr) { QString sLogMessage = "Failed to resolve PEBI solver configuration interface."; qWarning() << sLogMessage; zxLogInstance::getInstance()->writeLogF(sLogMessage); @@ -692,7 +691,7 @@ bool nmCalculationDllPebiSolverTask::execPebiMode() } HX_NWTM_MODEL(p1, p0, licensePathStd); - m_nPebiCount = getPebiCount(); + m_nPebiCount = pGridInstance->getPebiCount(); m_nSolveTimeMs = getSolveTime(); if(m_autoFitTargetWellName.isEmpty()) { QString sSolveLog = QString("PEBI count: %1, solve time: %2 ms") diff --git a/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp b/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp index 4f85c7e..4419f05 100644 --- a/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp @@ -171,6 +171,7 @@ nmCalculationPebiGrid* nmCalculationPebiGrid::getInstance() } nmCalculationPebiGrid::nmCalculationPebiGrid() + : m_nPebiCount(-1) { // 默认值来自HX_NWTM_GRID_INPUT构造函数 m_dGridControl = p0.GridControl; @@ -223,6 +224,7 @@ void nmCalculationPebiGrid::clearGridData() p1 = HX_NWTM_GRID_OUTPUT1(); p2 = HX_NWTM_GRID_OUTPUT2(); m_dGridControl = p0.GridControl; + m_nPebiCount = -1; } void nmCalculationPebiGrid::logInputParameters(const HX_NWTM_GRID_INPUT& input) @@ -719,6 +721,11 @@ HX_NWTM_GRID_OUTPUT2 nmCalculationPebiGrid::getGridOutput2() return p2; } +int nmCalculationPebiGrid::getPebiCount() const +{ + return m_nPebiCount; +} + vtkSmartPointer nmCalculationPebiGrid::createPebiUnstructuredGrid(const HX_NWTM_GRID_OUTPUT1& P1) { vtkSmartPointer pUnstructuredGrid = vtkSmartPointer::New(); @@ -895,12 +902,13 @@ bool nmCalculationPebiGrid::generateOutputPara() // 定义函数指针类型 typedef void (*HX_NWTM_GRID_Func)(HX_NWTM_GRID_OUTPUT1&, HX_NWTM_GRID_OUTPUT2&, const HX_NWTM_GRID_INPUT&, std::string); + typedef int (*GetIntValueFunc)(); // ===== 调用网格生成器 ===== - typedef void (*HX_NWTM_GRID_Func)(HX_NWTM_GRID_OUTPUT1&, HX_NWTM_GRID_OUTPUT2&, const HX_NWTM_GRID_INPUT&, std::string); HX_NWTM_GRID_Func HX_NWTM_GRID = (HX_NWTM_GRID_Func)GetProcAddress(dll, "HX_NWTM_GRID"); + GetIntValueFunc getPebiCount = (GetIntValueFunc)GetProcAddress(dll, "getPEBInum"); - if(!HX_NWTM_GRID) { + if(!HX_NWTM_GRID || !getPebiCount) { DWORD error = GetLastError(); printf("Failed to resolve function. Error code: %lu\n", error); FreeLibrary(dll); @@ -912,6 +920,7 @@ bool nmCalculationPebiGrid::generateOutputPara() p0 = HX_NWTM_GRID_INPUT(); p1 = HX_NWTM_GRID_OUTPUT1(); p2 = HX_NWTM_GRID_OUTPUT2(); + m_nPebiCount = -1; // PEBI网格划分输入参数:GridControl来自界面 p0.GridControl = m_dGridControl; @@ -1177,6 +1186,9 @@ bool nmCalculationPebiGrid::generateOutputPara() HX_NWTM_GRID(p1, p2, p0, licensePathStd); + // getPEBInum的计数在HX_NWTM_GRID阶段生成,必须在卸载DLL前保存。 + m_nPebiCount = getPebiCount(); + } catch(const std::exception& e) { zxLogInstance::getInstance()->writeLogF(QString("C++ Exception: %1").arg(e.what())); logCurrentState(); diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index f543cb1..d7c7eb3 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -2067,6 +2067,7 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed) { // 线程完成后清空两个持有点:当前窗口指针和全局运行中指针。 nmCalculationDllPebiSolverTask* pTask = qobject_cast(sender()); + int nPebiCount = pTask != nullptr ? pTask->getPebiCount() : -1; int nSolveTimeMs = pTask != nullptr ? pTask->getSolveTimeMs() : -1; if(pTask == m_pSolverTask) { m_pSolverTask = nullptr; @@ -2079,9 +2080,11 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed) NM_Calculation_Result result = isSuccessed ? NM_Calculation_Result_Success : NM_Calculation_Result_Fail; this->on_calculationFinished(result); - if(isSuccessed && nSolveTimeMs >= 0) { + if(isSuccessed && nPebiCount >= 0 && nSolveTimeMs >= 0) { QMessageBox::information(this, tr("Solver completed"), - tr("Solve time: %1 ms").arg(nSolveTimeMs)); + tr("Grid count: %1\nSolve time: %2 ms") + .arg(nPebiCount) + .arg(nSolveTimeMs)); } }