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