diff --git a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp index 78c584b..6ce6b41 100644 --- a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp @@ -286,11 +286,10 @@ bool applyPropertyInterpolation( } /** - * @brief 用网格输出和捕获的场景值组装一次完整模型输入。 + * @brief 用已初始化的模型输入和捕获的场景值组装一次完整模型输入。 */ bool buildModelInputFromSnapshot( const nmPebiSolverInputSnapshot& oSnapshot, - const HX_NWTM_GRID_OUTPUT2& oGridOutput, HX_NWTM_MODEL_INPUT& oModelInput, QString& sErrorMessage, const QAtomicInt* pCancelRequested) @@ -300,10 +299,6 @@ bool buildModelInputFromSnapshot( if(isTaskCancellationRequested(pCancelRequested)) { return false; } - oModelInput = HX_NWTM_MODEL_INPUT(oGridOutput); - if(isTaskCancellationRequested(pCancelRequested)) { - return false; - } // 第一步:恢复井槽位、产量制度和井筒参数。场景与网格快照在同一次捕获中 // 生成,因此这些外层数组天然使用同一个 DLL 下标顺序。 @@ -356,7 +351,7 @@ bool buildModelInputFromSnapshot( oModelInput.Base.dt_Min = oScene.Base.dt_Min; oModelInput.Base.dt_Max = oScene.Base.dt_Max; - const size_t nCellCount = oGridOutput.Trinodexy.size(); + const size_t nCellCount = oModelInput.GRID.Trinodexy.size(); oModelInput.Base.k = dVec1(nCellCount, oScene.Base.k_ref); oModelInput.Base.phi = dVec1(nCellCount, oScene.Base.phi_ref); oModelInput.Base.h = dVec1(nCellCount, oScene.Base.h_ref); @@ -854,21 +849,16 @@ bool nmCalculationDllPebiSolverTask::prepareManualInput() reportStage(tr("Checking grid cache..."), 0, 0); if(m_pInputSnapshot->m_bMayUseCachedGrid) { - HX_NWTM_GRID_OUTPUT1 oGridOutput1; - HX_NWTM_GRID_OUTPUT2 oGridOutput2; - int nPebiCount = -1; + nmPebiGridResult& oGridResult = + m_pInputSnapshot->m_oGridResult; + // 缓存直接复制到任务快照,避免大网格在局部对象中产生额外副本。 if(pGridService->copyCurrentGridFor( m_pDataManager, m_nGridInputRevision, - oGridOutput1, - oGridOutput2, - nPebiCount, + oGridResult.m_oGridOutput1, + oGridResult.m_oGridOutput2, + oGridResult.m_nPebiCount, &m_nCancelRequested)) { - nmPebiGridResult& oGridResult = - m_pInputSnapshot->m_oGridResult; - oGridResult.m_oGridOutput1 = oGridOutput1; - oGridResult.m_oGridOutput2 = oGridOutput2; - oGridResult.m_nPebiCount = nPebiCount; oGridResult.m_bSucceeded = true; reportStage(tr("Preparing result grid..."), 0, 0); @@ -1002,11 +992,11 @@ bool nmCalculationDllPebiSolverTask::execPebiMode() // 第三步:由场景值快照重建完整模型输入。属性插值可以耗时,但它只读取任务 // 自己的点集副本,因此放在工作线程不会阻塞或竞争界面数据。 - HX_NWTM_MODEL_INPUT oModelInput; + // 直接初始化可避免先构造临时模型输入、再复制完整 GRID 的额外内存峰值。 + HX_NWTM_MODEL_INPUT oModelInput(oGridResult.m_oGridOutput2); QString sInterpolationError; reportStage(tr("Preparing model input..."), 0, 0); if(!buildModelInputFromSnapshot(*m_pInputSnapshot, - oGridResult.m_oGridOutput2, oModelInput, sInterpolationError, pCancelRequested)) {