PageRenderTime 29ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/ResInsight-2018.01.1/ApplicationCode/UserInterface/RiuResultTextBuilder.cpp

https://bitbucket.org/terraai/resinsight
C++ | 766 lines | 550 code | 136 blank | 80 comment | 110 complexity | ad6032bae08534a10f1a2a426dfa449a MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1
  1. /////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) Statoil ASA
  4. // Copyright (C) Ceetron Solutions AS
  5. //
  6. // ResInsight is free software: you can redistribute it and/or modify
  7. // it under the terms of the GNU General Public License as published by
  8. // the Free Software Foundation, either version 3 of the License, or
  9. // (at your option) any later version.
  10. //
  11. // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
  12. // WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. // FITNESS FOR A PARTICULAR PURPOSE.
  14. //
  15. // See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
  16. // for more details.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////////
  19. #include "RiuResultTextBuilder.h"
  20. #include "RigCaseCellResultsData.h"
  21. #include "RigEclipseCaseData.h"
  22. #include "RigFormationNames.h"
  23. #include "RigMainGrid.h"
  24. #include "RigResultAccessor.h"
  25. #include "RigResultAccessorFactory.h"
  26. #include "RigSimWellData.h"
  27. #include "RimCellEdgeColors.h"
  28. #include "RimEclipseCase.h"
  29. #include "RimEclipseCellColors.h"
  30. #include "RimEclipseFaultColors.h"
  31. #include "RimEclipseView.h"
  32. #include "RimFormationNames.h"
  33. #include "RimLegendConfig.h"
  34. #include "RimReservoirCellResultsStorage.h"
  35. #include "cafDisplayCoordTransform.h"
  36. //--------------------------------------------------------------------------------------------------
  37. ///
  38. //--------------------------------------------------------------------------------------------------
  39. RiuResultTextBuilder::RiuResultTextBuilder(RimEclipseView* reservoirView, size_t gridIndex, size_t cellIndex, size_t timeStepIndex)
  40. {
  41. CVF_ASSERT(reservoirView);
  42. m_reservoirView = reservoirView;
  43. m_gridIndex = gridIndex;
  44. m_cellIndex = cellIndex;
  45. m_timeStepIndex = timeStepIndex;
  46. m_nncIndex = cvf::UNDEFINED_SIZE_T;
  47. m_intersectionPoint = cvf::Vec3d::UNDEFINED;
  48. m_face = cvf::StructGridInterface::NO_FACE;
  49. }
  50. //--------------------------------------------------------------------------------------------------
  51. ///
  52. //--------------------------------------------------------------------------------------------------
  53. void RiuResultTextBuilder::setNncIndex(size_t nncIndex)
  54. {
  55. m_nncIndex = nncIndex;
  56. }
  57. //--------------------------------------------------------------------------------------------------
  58. ///
  59. //--------------------------------------------------------------------------------------------------
  60. void RiuResultTextBuilder::setIntersectionPoint(cvf::Vec3d intersectionPoint)
  61. {
  62. m_intersectionPoint = intersectionPoint;
  63. }
  64. //--------------------------------------------------------------------------------------------------
  65. ///
  66. //--------------------------------------------------------------------------------------------------
  67. void RiuResultTextBuilder::setFace(cvf::StructGridInterface::FaceType face)
  68. {
  69. m_face = face;
  70. }
  71. //--------------------------------------------------------------------------------------------------
  72. ///
  73. //--------------------------------------------------------------------------------------------------
  74. QString RiuResultTextBuilder::mainResultText()
  75. {
  76. QString text;
  77. // Produce result text for all variants
  78. // Priority defined as follows : NNC, Fault, Grid
  79. {
  80. QString nncText = nncResultText();
  81. if (!nncText.isEmpty())
  82. {
  83. text = "NNC : " + nncText;
  84. }
  85. else if (m_cellIndex != cvf::UNDEFINED_SIZE_T)
  86. {
  87. QString faultText = faultResultText();
  88. if (!faultResultText().isEmpty())
  89. {
  90. text = "Fault : " + faultText;
  91. }
  92. else
  93. {
  94. text = "Grid cell : " + gridResultText();
  95. }
  96. }
  97. text += "\n";
  98. }
  99. QString topoText = this->geometrySelectionText("\n");
  100. text += topoText;
  101. appendDetails(text, formationDetails());
  102. text += "\n";
  103. appendDetails(text, nncDetails());
  104. if (m_cellIndex != cvf::UNDEFINED_SIZE_T)
  105. {
  106. appendDetails(text, faultResultDetails());
  107. appendDetails(text, cellEdgeResultDetails());
  108. appendDetails(text, gridResultDetails());
  109. appendDetails(text, wellResultText());
  110. }
  111. return text;
  112. }
  113. //--------------------------------------------------------------------------------------------------
  114. ///
  115. //--------------------------------------------------------------------------------------------------
  116. QString RiuResultTextBuilder::geometrySelectionText(QString itemSeparator)
  117. {
  118. QString text;
  119. if (m_reservoirView && m_reservoirView->eclipseCase())
  120. {
  121. const RigEclipseCaseData* eclipseCase = m_reservoirView->eclipseCase()->eclipseCaseData();
  122. if (eclipseCase)
  123. {
  124. if (m_cellIndex != cvf::UNDEFINED_SIZE_T)
  125. {
  126. size_t i = 0;
  127. size_t j = 0;
  128. size_t k = 0;
  129. if (eclipseCase->grid(m_gridIndex)->ijkFromCellIndex(m_cellIndex, &i, &j, &k))
  130. {
  131. // Adjust to 1-based Eclipse indexing
  132. i++;
  133. j++;
  134. k++;
  135. cvf::StructGridInterface::FaceEnum faceEnum(m_face);
  136. QString faceText = faceEnum.text();
  137. text += QString("Face : %1").arg(faceText) + itemSeparator;
  138. text += QString("Hit grid %1").arg(m_gridIndex) + itemSeparator;
  139. text += QString("Cell : [%1, %2, %3]").arg(i).arg(j).arg(k) + itemSeparator;
  140. }
  141. }
  142. cvf::ref<caf::DisplayCoordTransform> transForm = m_reservoirView->displayCoordTransform();
  143. cvf::Vec3d domainCoord = transForm->translateToDomainCoord(m_intersectionPoint);
  144. QString formattedText;
  145. formattedText.sprintf("Intersection point : [E: %.2f, N: %.2f, Depth: %.2f]", domainCoord.x(), domainCoord.y(), -domainCoord.z());
  146. text += formattedText;
  147. }
  148. }
  149. return text;
  150. }
  151. //--------------------------------------------------------------------------------------------------
  152. ///
  153. //--------------------------------------------------------------------------------------------------
  154. QString RiuResultTextBuilder::gridResultDetails()
  155. {
  156. QString text;
  157. if (m_reservoirView->eclipseCase() && m_reservoirView->eclipseCase()->eclipseCaseData())
  158. {
  159. RigEclipseCaseData* eclipseCaseData = m_reservoirView->eclipseCase()->eclipseCaseData();
  160. RigGridBase* grid = eclipseCaseData->grid(m_gridIndex);
  161. this->appendTextFromResultColors(eclipseCaseData, m_gridIndex, m_cellIndex, m_timeStepIndex, m_reservoirView->cellResult(), &text);
  162. if (!text.isEmpty())
  163. {
  164. text.prepend("-- Grid cell result details --\n");
  165. }
  166. }
  167. return text;
  168. }
  169. //--------------------------------------------------------------------------------------------------
  170. ///
  171. //--------------------------------------------------------------------------------------------------
  172. QString RiuResultTextBuilder::faultResultDetails()
  173. {
  174. QString text;
  175. if (m_reservoirView->eclipseCase() && m_reservoirView->eclipseCase()->eclipseCaseData())
  176. {
  177. RigEclipseCaseData* eclipseCaseData = m_reservoirView->eclipseCase()->eclipseCaseData();
  178. RigGridBase* grid = eclipseCaseData->grid(m_gridIndex);
  179. RigMainGrid* mainGrid = grid->mainGrid();
  180. const RigFault* fault = mainGrid->findFaultFromCellIndexAndCellFace(m_cellIndex, m_face);
  181. if (fault)
  182. {
  183. text += "-- Fault result details --\n";
  184. text += QString("Fault Name: %1\n").arg(fault->name());
  185. cvf::StructGridInterface::FaceEnum faceHelper(m_face);
  186. text += "Fault Face : " + faceHelper.text() + "\n";
  187. if (m_reservoirView->faultResultSettings()->hasValidCustomResult())
  188. {
  189. text += "Fault result data:\n";
  190. this->appendTextFromResultColors(eclipseCaseData, m_gridIndex, m_cellIndex, m_timeStepIndex, m_reservoirView->currentFaultResultColors(), &text);
  191. }
  192. }
  193. }
  194. return text;
  195. }
  196. //--------------------------------------------------------------------------------------------------
  197. ///
  198. //--------------------------------------------------------------------------------------------------
  199. QString RiuResultTextBuilder::formationDetails()
  200. {
  201. QString text;
  202. RimCase* rimCase = m_reservoirView->eclipseCase();
  203. if(rimCase)
  204. {
  205. if(rimCase->activeFormationNames() && rimCase->activeFormationNames()->formationNamesData())
  206. {
  207. RigFormationNames* formNames = rimCase->activeFormationNames()->formationNamesData();
  208. size_t k = cvf::UNDEFINED_SIZE_T;
  209. {
  210. const RigEclipseCaseData* eclipseData = m_reservoirView->eclipseCase()->eclipseCaseData();
  211. if(eclipseData)
  212. {
  213. if(m_cellIndex != cvf::UNDEFINED_SIZE_T)
  214. {
  215. size_t i = cvf::UNDEFINED_SIZE_T;
  216. size_t j = cvf::UNDEFINED_SIZE_T;
  217. eclipseData->grid(m_gridIndex)->ijkFromCellIndex(m_cellIndex, &i, &j, &k);
  218. }
  219. }
  220. }
  221. if (k != cvf::UNDEFINED_SIZE_T)
  222. {
  223. QString formName = formNames->formationNameFromKLayerIdx(k);
  224. if(!formName.isEmpty())
  225. {
  226. //text += "-- Formation details --\n";
  227. text += QString("Formation Name: %1\n").arg(formName);
  228. }
  229. }
  230. }
  231. }
  232. return text;
  233. }
  234. //--------------------------------------------------------------------------------------------------
  235. ///
  236. //--------------------------------------------------------------------------------------------------
  237. QString RiuResultTextBuilder::gridResultText()
  238. {
  239. QString text = cellResultText(m_reservoirView->cellResult());
  240. return text;
  241. }
  242. //--------------------------------------------------------------------------------------------------
  243. ///
  244. //--------------------------------------------------------------------------------------------------
  245. QString RiuResultTextBuilder::faultResultText()
  246. {
  247. QString text;
  248. if (m_reservoirView->eclipseCase() && m_reservoirView->eclipseCase()->eclipseCaseData())
  249. {
  250. RigEclipseCaseData* eclipseCaseData = m_reservoirView->eclipseCase()->eclipseCaseData();
  251. RigGridBase* grid = eclipseCaseData->grid(m_gridIndex);
  252. RigMainGrid* mainGrid = grid->mainGrid();
  253. const RigFault* fault = mainGrid->findFaultFromCellIndexAndCellFace(m_cellIndex, m_face);
  254. if (fault)
  255. {
  256. cvf::StructGridInterface::FaceEnum faceHelper(m_face);
  257. if (m_reservoirView->faultResultSettings()->hasValidCustomResult())
  258. {
  259. text = cellResultText(m_reservoirView->currentFaultResultColors());
  260. }
  261. }
  262. }
  263. return text;
  264. }
  265. //--------------------------------------------------------------------------------------------------
  266. ///
  267. //--------------------------------------------------------------------------------------------------
  268. QString RiuResultTextBuilder::nncResultText()
  269. {
  270. QString text;
  271. if (m_nncIndex != cvf::UNDEFINED_SIZE_T)
  272. {
  273. if (m_reservoirView.notNull() && m_reservoirView->eclipseCase())
  274. {
  275. RigEclipseCaseData* eclipseCase = m_reservoirView->eclipseCase()->eclipseCaseData();
  276. RigMainGrid* grid = eclipseCase->mainGrid();
  277. CVF_ASSERT(grid);
  278. RigNNCData* nncData = grid->nncData();
  279. CVF_ASSERT(nncData);
  280. if (nncData && m_nncIndex < nncData->connections().size())
  281. {
  282. const RigConnection& conn = nncData->connections()[m_nncIndex];
  283. cvf::StructGridInterface::FaceEnum face(conn.m_c1Face);
  284. if (m_reservoirView->currentFaultResultColors())
  285. {
  286. size_t scalarResultIdx = m_reservoirView->currentFaultResultColors()->scalarResultIndex();
  287. RiaDefines::ResultCatType resultType = m_reservoirView->currentFaultResultColors()->resultType();
  288. const std::vector<double>* nncValues = nullptr;
  289. if (resultType == RiaDefines::STATIC_NATIVE)
  290. {
  291. nncValues = nncData->staticConnectionScalarResult(scalarResultIdx);
  292. }
  293. else if (resultType == RiaDefines::DYNAMIC_NATIVE)
  294. {
  295. if (m_reservoirView.notNull() && m_reservoirView->eclipseCase())
  296. {
  297. size_t nativeTimeStep = m_reservoirView->eclipseCase()->uiToNativeTimeStepIndex(m_timeStepIndex);
  298. nncValues = nncData->dynamicConnectionScalarResult(scalarResultIdx, nativeTimeStep);
  299. }
  300. }
  301. if (nncValues && (m_nncIndex < nncValues->size()))
  302. {
  303. QString resultVar = m_reservoirView->currentFaultResultColors()->resultVariableUiName();
  304. double scalarValue = (*nncValues)[m_nncIndex];
  305. text = QString("%1 : %2").arg(resultVar).arg(scalarValue);
  306. }
  307. }
  308. }
  309. }
  310. }
  311. return text;
  312. }
  313. //--------------------------------------------------------------------------------------------------
  314. ///
  315. //--------------------------------------------------------------------------------------------------
  316. void RiuResultTextBuilder::appendTextFromResultColors(RigEclipseCaseData* eclipseCase, size_t gridIndex, size_t cellIndex, size_t timeStepIndex, RimEclipseCellColors* resultColors, QString* resultInfoText)
  317. {
  318. if (!resultColors)
  319. {
  320. return;
  321. }
  322. RiaDefines::PorosityModelType porosityModel = resultColors->porosityModel();
  323. if (resultColors->isTernarySaturationSelected())
  324. {
  325. RigCaseCellResultsData* gridCellResults = resultColors->currentGridCellResults();
  326. if (gridCellResults)
  327. {
  328. size_t soilScalarSetIndex = gridCellResults->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SOIL");
  329. size_t sgasScalarSetIndex = gridCellResults->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SGAS");
  330. size_t swatScalarSetIndex = gridCellResults->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SWAT");
  331. cvf::ref<RigResultAccessor> dataAccessObjectX = RigResultAccessorFactory::createFromResultIdx(eclipseCase, gridIndex, porosityModel, timeStepIndex, soilScalarSetIndex);
  332. cvf::ref<RigResultAccessor> dataAccessObjectY = RigResultAccessorFactory::createFromResultIdx(eclipseCase, gridIndex, porosityModel, timeStepIndex, sgasScalarSetIndex);
  333. cvf::ref<RigResultAccessor> dataAccessObjectZ = RigResultAccessorFactory::createFromResultIdx(eclipseCase, gridIndex, porosityModel, timeStepIndex, swatScalarSetIndex);
  334. double scalarValue = 0.0;
  335. if (dataAccessObjectX.notNull()) scalarValue = dataAccessObjectX->cellScalar(cellIndex);
  336. else scalarValue = 0.0;
  337. resultInfoText->append(QString("SOIL : %1\n").arg(scalarValue));
  338. if (dataAccessObjectY.notNull()) scalarValue = dataAccessObjectY->cellScalar(cellIndex);
  339. else scalarValue = 0.0;
  340. resultInfoText->append(QString("SGAS : %1\n").arg(scalarValue));
  341. if (dataAccessObjectZ.notNull()) scalarValue = dataAccessObjectZ->cellScalar(cellIndex);
  342. else scalarValue = 0.0;
  343. resultInfoText->append(QString("SWAT : %1\n").arg(scalarValue));
  344. }
  345. return;
  346. }
  347. else if (resultColors->hasResult())
  348. {
  349. if (resultColors->hasStaticResult())
  350. {
  351. if (resultColors->resultVariable().compare(RiaDefines::combinedTransmissibilityResultName(), Qt::CaseInsensitive) == 0)
  352. {
  353. cvf::ref<RigResultAccessor> transResultAccessor = RigResultAccessorFactory::createFromUiResultName(eclipseCase, gridIndex, porosityModel, 0, RiaDefines::combinedTransmissibilityResultName());
  354. {
  355. double scalarValue = transResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_I);
  356. resultInfoText->append(QString("Tran X : %1\n").arg(scalarValue));
  357. scalarValue = transResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_J);
  358. resultInfoText->append(QString("Tran Y : %1\n").arg(scalarValue));
  359. scalarValue = transResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_K);
  360. resultInfoText->append(QString("Tran Z : %1\n").arg(scalarValue));
  361. }
  362. return;
  363. }
  364. else if (resultColors->resultVariable().compare(RiaDefines::combinedMultResultName(), Qt::CaseInsensitive) == 0)
  365. {
  366. cvf::ref<RigResultAccessor> multResultAccessor = RigResultAccessorFactory::createFromUiResultName(eclipseCase, gridIndex, porosityModel, 0, RiaDefines::combinedMultResultName());
  367. {
  368. double scalarValue = multResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_I);
  369. resultInfoText->append(QString("MULTX : %1\n").arg(scalarValue));
  370. scalarValue = multResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::NEG_I);
  371. resultInfoText->append(QString("MULTX- : %1\n").arg(scalarValue));
  372. scalarValue = multResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_J);
  373. resultInfoText->append(QString("MULTY : %1\n").arg(scalarValue));
  374. scalarValue = multResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::NEG_J);
  375. resultInfoText->append(QString("MULTY- : %1\n").arg(scalarValue));
  376. scalarValue = multResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_K);
  377. resultInfoText->append(QString("MULTZ : %1\n").arg(scalarValue));
  378. scalarValue = multResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::NEG_K);
  379. resultInfoText->append(QString("MULTZ- : %1\n").arg(scalarValue));
  380. }
  381. return;
  382. }
  383. else if (resultColors->resultVariable().compare(RiaDefines::combinedRiTranResultName(), Qt::CaseInsensitive) == 0)
  384. {
  385. cvf::ref<RigResultAccessor> transResultAccessor = RigResultAccessorFactory::createFromUiResultName(eclipseCase, gridIndex, porosityModel, 0, RiaDefines::combinedRiTranResultName());
  386. {
  387. double scalarValue = transResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_I);
  388. resultInfoText->append(QString("riTran X : %1\n").arg(scalarValue));
  389. scalarValue = transResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_J);
  390. resultInfoText->append(QString("riTran Y : %1\n").arg(scalarValue));
  391. scalarValue = transResultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_K);
  392. resultInfoText->append(QString("riTran Z : %1\n").arg(scalarValue));
  393. }
  394. return;
  395. }
  396. else if (resultColors->resultVariable().compare(RiaDefines::combinedRiMultResultName(), Qt::CaseInsensitive) == 0)
  397. {
  398. cvf::ref<RigResultAccessor> resultAccessor = RigResultAccessorFactory::createFromUiResultName(eclipseCase, gridIndex, porosityModel, 0, RiaDefines::combinedRiMultResultName());
  399. {
  400. double scalarValue = resultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_I);
  401. resultInfoText->append(QString("riMult X : %1\n").arg(scalarValue));
  402. scalarValue = resultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_J);
  403. resultInfoText->append(QString("riMult Y : %1\n").arg(scalarValue));
  404. scalarValue = resultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_K);
  405. resultInfoText->append(QString("riMult Z : %1\n").arg(scalarValue));
  406. }
  407. return;
  408. }
  409. else if (resultColors->resultVariable().compare(RiaDefines::combinedRiAreaNormTranResultName(), Qt::CaseInsensitive) == 0)
  410. {
  411. cvf::ref<RigResultAccessor> resultAccessor = RigResultAccessorFactory::createFromUiResultName(eclipseCase, gridIndex, porosityModel, 0, RiaDefines::combinedRiAreaNormTranResultName());
  412. {
  413. double scalarValue = resultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_I);
  414. resultInfoText->append(QString("riTransByArea X : %1\n").arg(scalarValue));
  415. scalarValue = resultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_J);
  416. resultInfoText->append(QString("riTransByArea Y : %1\n").arg(scalarValue));
  417. scalarValue = resultAccessor->cellFaceScalar(cellIndex, cvf::StructGridInterface::POS_K);
  418. resultInfoText->append(QString("riTransByArea Z : %1\n").arg(scalarValue));
  419. }
  420. return;
  421. }
  422. }
  423. }
  424. resultInfoText->append(cellResultText(resultColors));
  425. }
  426. //--------------------------------------------------------------------------------------------------
  427. ///
  428. //--------------------------------------------------------------------------------------------------
  429. QString RiuResultTextBuilder::cellEdgeResultDetails()
  430. {
  431. QString text;
  432. if (m_reservoirView->cellEdgeResult()->hasResult())
  433. {
  434. text += "-- Cell edge result data --\n";
  435. if (m_reservoirView->cellEdgeResult()->isUsingSingleVariable())
  436. {
  437. text += cellResultText(m_reservoirView->cellEdgeResult()->singleVarEdgeResultColors());
  438. text += "\n";
  439. }
  440. else
  441. {
  442. std::vector<RimCellEdgeMetaData> metaData;
  443. m_reservoirView->cellEdgeResult()->cellEdgeMetaData(&metaData);
  444. std::set<size_t> uniqueResultIndices;
  445. for (int idx = 0; idx < 6; idx++)
  446. {
  447. size_t resultIndex = metaData[idx].m_resultIndex;
  448. if (resultIndex == cvf::UNDEFINED_SIZE_T) continue;
  449. if (uniqueResultIndices.find(resultIndex) != uniqueResultIndices.end()) continue;
  450. size_t adjustedTimeStep = m_timeStepIndex;
  451. if (metaData[idx].m_isStatic)
  452. {
  453. adjustedTimeStep = 0;
  454. }
  455. RiaDefines::PorosityModelType porosityModel = m_reservoirView->cellResult()->porosityModel();
  456. cvf::ref<RigResultAccessor> resultAccessor = RigResultAccessorFactory::createFromResultIdx(m_reservoirView->eclipseCase()->eclipseCaseData(), m_gridIndex, porosityModel, adjustedTimeStep, resultIndex);
  457. if (resultAccessor.notNull())
  458. {
  459. double scalarValue = resultAccessor->cellScalar(m_cellIndex);
  460. text.append(QString("%1 : %2\n").arg(metaData[idx].m_resultVariable).arg(scalarValue));
  461. uniqueResultIndices.insert(resultIndex);
  462. }
  463. }
  464. }
  465. }
  466. return text;
  467. }
  468. //--------------------------------------------------------------------------------------------------
  469. ///
  470. //--------------------------------------------------------------------------------------------------
  471. QString RiuResultTextBuilder::nncDetails()
  472. {
  473. QString text;
  474. if (m_nncIndex != cvf::UNDEFINED_SIZE_T)
  475. {
  476. if (m_reservoirView.notNull() && m_reservoirView->eclipseCase())
  477. {
  478. RigEclipseCaseData* eclipseCase = m_reservoirView->eclipseCase()->eclipseCaseData();
  479. RigMainGrid* grid = eclipseCase->mainGrid();
  480. CVF_ASSERT(grid);
  481. RigNNCData* nncData = grid->nncData();
  482. CVF_ASSERT(nncData);
  483. if (nncData && m_nncIndex < nncData->connections().size())
  484. {
  485. text += "-- NNC details --\n";
  486. {
  487. const RigConnection& conn = nncData->connections()[m_nncIndex];
  488. cvf::StructGridInterface::FaceEnum face(conn.m_c1Face);
  489. // First cell of NNC
  490. {
  491. CVF_ASSERT(conn.m_c1GlobIdx < grid->globalCellArray().size());
  492. const RigCell& cell = grid->globalCellArray()[conn.m_c1GlobIdx];
  493. RigGridBase* hostGrid = cell.hostGrid();
  494. size_t gridLocalCellIndex = cell.gridLocalCellIndex();
  495. size_t i, j, k;
  496. if (hostGrid->ijkFromCellIndex(gridLocalCellIndex, &i, &j, &k))
  497. {
  498. // Adjust to 1-based Eclipse indexing
  499. i++;
  500. j++;
  501. k++;
  502. QString gridName = QString::fromStdString(hostGrid->gridName());
  503. text.append(QString("NNC 1 : cell [%1, %2, %3] face %4 (%5)\n").arg(i).arg(j).arg(k).arg(face.text()).arg(gridName));
  504. }
  505. }
  506. // Second cell of NNC
  507. {
  508. CVF_ASSERT(conn.m_c2GlobIdx < grid->globalCellArray().size());
  509. const RigCell& cell = grid->globalCellArray()[conn.m_c2GlobIdx];
  510. RigGridBase* hostGrid = cell.hostGrid();
  511. size_t gridLocalCellIndex = cell.gridLocalCellIndex();
  512. size_t i, j, k;
  513. if (hostGrid->ijkFromCellIndex(gridLocalCellIndex, &i, &j, &k))
  514. {
  515. // Adjust to 1-based Eclipse indexing
  516. i++;
  517. j++;
  518. k++;
  519. QString gridName = QString::fromStdString(hostGrid->gridName());
  520. cvf::StructGridInterface::FaceEnum oppositeFaceEnum(cvf::StructGridInterface::oppositeFace(face));
  521. QString faceText = oppositeFaceEnum.text();
  522. text.append(QString("NNC 2 : cell [%1, %2, %3] face %4 (%5)\n").arg(i).arg(j).arg(k).arg(faceText).arg(gridName));
  523. }
  524. }
  525. }
  526. }
  527. }
  528. }
  529. return text;
  530. }
  531. //--------------------------------------------------------------------------------------------------
  532. ///
  533. //--------------------------------------------------------------------------------------------------
  534. void RiuResultTextBuilder::appendDetails(QString& text, const QString& details)
  535. {
  536. if (!details.isEmpty())
  537. {
  538. text += "\n";
  539. text += details;
  540. }
  541. }
  542. //--------------------------------------------------------------------------------------------------
  543. ///
  544. //--------------------------------------------------------------------------------------------------
  545. QString RiuResultTextBuilder::cellResultText(RimEclipseCellColors* resultColors)
  546. {
  547. QString text;
  548. if (m_reservoirView->eclipseCase() && m_reservoirView->eclipseCase()->eclipseCaseData())
  549. {
  550. RigEclipseCaseData* eclipseCaseData = m_reservoirView->eclipseCase()->eclipseCaseData();
  551. RigGridBase* grid = eclipseCaseData->grid(m_gridIndex);
  552. if (resultColors->isTernarySaturationSelected())
  553. {
  554. RigCaseCellResultsData* gridCellResults = m_reservoirView->cellResult()->currentGridCellResults();
  555. if (gridCellResults)
  556. {
  557. size_t soilScalarSetIndex = gridCellResults->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SOIL");
  558. size_t sgasScalarSetIndex = gridCellResults->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SGAS");
  559. size_t swatScalarSetIndex = gridCellResults->findOrLoadScalarResult(RiaDefines::DYNAMIC_NATIVE, "SWAT");
  560. RiaDefines::PorosityModelType porosityModel = resultColors->porosityModel();
  561. cvf::ref<RigResultAccessor> dataAccessObjectX = RigResultAccessorFactory::createFromResultIdx(eclipseCaseData, m_gridIndex, porosityModel, m_timeStepIndex, soilScalarSetIndex);
  562. cvf::ref<RigResultAccessor> dataAccessObjectY = RigResultAccessorFactory::createFromResultIdx(eclipseCaseData, m_gridIndex, porosityModel, m_timeStepIndex, sgasScalarSetIndex);
  563. cvf::ref<RigResultAccessor> dataAccessObjectZ = RigResultAccessorFactory::createFromResultIdx(eclipseCaseData, m_gridIndex, porosityModel, m_timeStepIndex, swatScalarSetIndex);
  564. double scalarValue = 0.0;
  565. if (dataAccessObjectX.notNull()) scalarValue = dataAccessObjectX->cellScalar(m_cellIndex);
  566. else scalarValue = 0.0;
  567. text += QString("SOIL : %1 ").arg(scalarValue);
  568. if (dataAccessObjectY.notNull()) scalarValue = dataAccessObjectY->cellScalar(m_cellIndex);
  569. else scalarValue = 0.0;
  570. text += QString("SGAS : %1 ").arg(scalarValue);
  571. if (dataAccessObjectZ.notNull()) scalarValue = dataAccessObjectZ->cellScalar(m_cellIndex);
  572. else scalarValue = 0.0;
  573. text += QString("SWAT : %1 ").arg(scalarValue);
  574. }
  575. }
  576. else
  577. {
  578. size_t adjustedTimeStep = m_timeStepIndex;
  579. if (resultColors->hasStaticResult())
  580. {
  581. adjustedTimeStep = 0;
  582. }
  583. cvf::ref<RigResultAccessor> resultAccessor = RigResultAccessorFactory::createFromResultDefinition(eclipseCaseData, m_gridIndex, adjustedTimeStep, resultColors);
  584. if (resultAccessor.notNull())
  585. {
  586. double scalarValue = resultAccessor->cellFaceScalar(m_cellIndex, m_face);
  587. QString resultVar = resultColors->resultVariableUiName();
  588. QString resultValueText;
  589. if (resultColors->hasCategoryResult())
  590. {
  591. RimLegendConfig* legendConfig = resultColors->legendConfig();
  592. resultValueText += legendConfig->categoryNameFromCategoryValue(scalarValue);
  593. }
  594. else
  595. {
  596. resultValueText = QString("%1").arg(scalarValue);
  597. }
  598. text = QString("%1 : %2").arg(resultVar).arg(resultValueText);
  599. }
  600. }
  601. }
  602. return text;
  603. }
  604. //--------------------------------------------------------------------------------------------------
  605. ///
  606. //--------------------------------------------------------------------------------------------------
  607. QString RiuResultTextBuilder::wellResultText()
  608. {
  609. QString text;
  610. if (m_reservoirView->eclipseCase() &&
  611. m_reservoirView->eclipseCase()->eclipseCaseData() )
  612. {
  613. cvf::Collection<RigSimWellData> simWellData = m_reservoirView->eclipseCase()->eclipseCaseData()->wellResults();
  614. for (size_t i = 0; i < simWellData.size(); i++)
  615. {
  616. RigSimWellData* singleWellResultData = simWellData.at(i);
  617. if (!singleWellResultData->hasWellResult(m_timeStepIndex))
  618. {
  619. continue;
  620. }
  621. const RigWellResultFrame& wellResultFrame = singleWellResultData->wellResultFrame(m_timeStepIndex);
  622. const RigWellResultPoint* wellResultCell = wellResultFrame.findResultCell(m_gridIndex, m_cellIndex);
  623. if (wellResultCell)
  624. {
  625. text += QString("-- Well-cell connection info --\n Well Name: %1\n Branch Id: %2\n Segment Id: %3\n").arg(singleWellResultData->m_wellName).arg(wellResultCell->m_ertBranchId).arg(wellResultCell->m_ertSegmentId);
  626. }
  627. }
  628. }
  629. return text;
  630. }