diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp index 5c060c7031..793c2ffc9c 100644 --- a/ApplicationCode/Application/RiaPreferences.cpp +++ b/ApplicationCode/Application/RiaPreferences.cpp @@ -61,6 +61,7 @@ RiaPreferences::RiaPreferences(void) CAF_PDM_InitField(&readFaultData, "readFaultData", true, "Read fault data", "", "", ""); CAF_PDM_InitField(&useStreamTransfer, "useStreamTransfer", true, "Use stream transfer to Octave", "", "", ""); + CAF_PDM_InitField(&blockSize, "blockSize", 10000, "blockSize", "", "", ""); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaPreferences.h b/ApplicationCode/Application/RiaPreferences.h index 5fcc691d3c..785eccf6d6 100644 --- a/ApplicationCode/Application/RiaPreferences.h +++ b/ApplicationCode/Application/RiaPreferences.h @@ -61,6 +61,7 @@ public: // Pdm Fields caf::PdmField readFaultData; caf::PdmField useStreamTransfer; + caf::PdmField blockSize; protected: virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute); diff --git a/ApplicationCode/SocketInterface/RiaCaseInfoCommands.cpp b/ApplicationCode/SocketInterface/RiaCaseInfoCommands.cpp index 201267dfb0..e6444f314d 100644 --- a/ApplicationCode/SocketInterface/RiaCaseInfoCommands.cpp +++ b/ApplicationCode/SocketInterface/RiaCaseInfoCommands.cpp @@ -16,9 +16,12 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiaStdInclude.h" + #include "RiaSocketCommand.h" #include "RiaSocketServer.h" #include "RiaSocketTools.h" +#include "RiaApplication.h" +#include "RiaPreferences.h" #include "RimReservoirView.h" #include "RimResultSlot.h" @@ -28,8 +31,8 @@ #include "RimWellCollection.h" #include "Rim3dOverlayInfoConfig.h" #include "RimReservoirCellResultsCacher.h" - #include "RimCase.h" + #include "RigCaseData.h" #include "RigCaseCellResultsData.h" @@ -37,6 +40,7 @@ + //-------------------------------------------------------------------------------------------------- /// OBSOLETE, to be deleted //-------------------------------------------------------------------------------------------------- @@ -133,7 +137,8 @@ public: for (size_t tIdx = 0; tIdx < columnCount; ++tIdx) { #if 1 // Write data as raw bytes, fast but does not handle byteswapping - server->currentClient()->write((const char *)activeCellInfo[tIdx].data(), timestepByteCount); + RiaSocketTools::writeBlockData(server, server->currentClient(), (const char *)activeCellInfo[tIdx].data(), timestepByteCount); + #else // Write data using QDataStream, does byteswapping for us. Must use QDataStream on client as well for (size_t cIdx = 0; cIdx < activeCellInfo[tIdx].size(); ++cIdx) { diff --git a/ApplicationCode/SocketInterface/RiaGeometryCommands.cpp b/ApplicationCode/SocketInterface/RiaGeometryCommands.cpp index 413f4791bc..5a3c8bc8b7 100644 --- a/ApplicationCode/SocketInterface/RiaGeometryCommands.cpp +++ b/ApplicationCode/SocketInterface/RiaGeometryCommands.cpp @@ -38,6 +38,7 @@ #include "RiaPreferences.h" + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -108,7 +109,7 @@ public: CVF_ASSERT(coordCount == doubleValueCount); - server->currentClient()->write((const char *)cellCenterValues.data(), byteCount); + RiaSocketTools::writeBlockData(server, server->currentClient(), (const char *)cellCenterValues.data(), byteCount); return true; } @@ -181,7 +182,7 @@ public: quint64 byteCount = doubleValueCount * sizeof(double); socketStream << byteCount; - server->currentClient()->write((const char *)cellCenterValues.data(), byteCount); + RiaSocketTools::writeBlockData(server, server->currentClient(), (const char *)cellCenterValues.data(), byteCount); return true; } @@ -296,7 +297,8 @@ public: } } } - server->currentClient()->write((const char *)cellCornerValues.data(), byteCount); + + RiaSocketTools::writeBlockData(server, server->currentClient(), (const char *)cellCornerValues.data(), byteCount); } double totalTimeMS = timer.time() * 1000.0; @@ -381,7 +383,7 @@ public: quint64 byteCount = doubleValueCount * sizeof(double); socketStream << byteCount; - server->currentClient()->write((const char *)cellCornerValues.data(), byteCount); + RiaSocketTools::writeBlockData(server, server->currentClient(), (const char *)cellCornerValues.data(), byteCount); return true; } diff --git a/ApplicationCode/SocketInterface/RiaPropertyDataCommands.cpp b/ApplicationCode/SocketInterface/RiaPropertyDataCommands.cpp index 4fa6a4f841..00210e4e21 100644 --- a/ApplicationCode/SocketInterface/RiaPropertyDataCommands.cpp +++ b/ApplicationCode/SocketInterface/RiaPropertyDataCommands.cpp @@ -334,7 +334,6 @@ public: else { - std::vector values(rigGrid->cellCount()); for (size_t tsIdx = 0; tsIdx < timestepCount; tsIdx++) { cvf::ref cellCenterDataAccessObject = rimCase->reservoirData()->dataAccessObject(rigGrid, porosityModelEnum, requestedTimesteps[tsIdx], scalarResultIndex); @@ -343,6 +342,7 @@ public: continue; } + std::vector values(rigGrid->cellCount()); for (size_t cellIdx = 0; cellIdx < rigGrid->cellCount(); cellIdx++) { double cellValue = cellCenterDataAccessObject->cellScalar(cellIdx); @@ -352,9 +352,8 @@ public: } values[valueIdx++] = cellValue; } + RiaSocketTools::writeBlockData(server, server->currentClient(), (const char *)values.data(), values.size() * sizeof(double)); } - - server->currentClient()->write((const char *)values.data(), rigGrid->cellCount() * sizeof(double)); } double totalTimeMS = timer.time() * 1000.0; diff --git a/ApplicationCode/SocketInterface/RiaSocketTools.cpp b/ApplicationCode/SocketInterface/RiaSocketTools.cpp index cc53f26824..4ad720d2a9 100644 --- a/ApplicationCode/SocketInterface/RiaSocketTools.cpp +++ b/ApplicationCode/SocketInterface/RiaSocketTools.cpp @@ -16,6 +16,10 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiaStdInclude.h" + +#include "RiaApplication.h" +#include "RiaPreferences.h" + #include "RiaSocketTools.h" #include "RiaSocketServer.h" #include "RimCase.h" @@ -34,6 +38,8 @@ #include "RimInputPropertyCollection.h" +#include + //-------------------------------------------------------------------------------------------------- /// @@ -98,4 +104,45 @@ void RiaSocketTools::getCaseInfoFromCase(RimCase* rimCase, qint64& caseId, QStri } } +bool RiaSocketTools::writeBlockData(RiaSocketServer* server, QTcpSocket* socket, const char* data, quint64 bytesToWrite) +{ + cvf::Timer timer; + + quint64 bytesWritten = 0; + int blockCount = 0; + + quint64 maxBlockSize = RiaApplication::instance()->preferences()->blockSize(); + + while (bytesWritten < bytesToWrite) + { + quint64 byteCountToWrite = qMin(bytesToWrite - bytesWritten, maxBlockSize); + + quint64 actuallyBytesWritten = socket->write(data + bytesWritten, byteCountToWrite); + if (actuallyBytesWritten == -1) + { + if (server) + { + QString errorMessage = "Error detected when writing data, error string from socket : \n" + socket->errorString(); + + server->errorMessageDialog()->showMessage(errorMessage); + } + + return false; + } + + bytesWritten += actuallyBytesWritten; + + blockCount++; + } + + if (server) + { + double totalTimeMS = timer.time() * 1000.0; + QString resultInfo = QString("Total time '%1 ms'\nTotal bytes written . %2\nNumber of blocks : %3\nBlock size : %4").arg(totalTimeMS).arg(bytesWritten).arg(blockCount).arg(maxBlockSize); + + server->errorMessageDialog()->showMessage(resultInfo); + } + + return true; +} diff --git a/ApplicationCode/SocketInterface/RiaSocketTools.h b/ApplicationCode/SocketInterface/RiaSocketTools.h index 1baeb5a9fc..b331799e2e 100644 --- a/ApplicationCode/SocketInterface/RiaSocketTools.h +++ b/ApplicationCode/SocketInterface/RiaSocketTools.h @@ -17,6 +17,7 @@ class RimCase; class RiaSocketServer; +class QTcpSocket; #define PMonLog( MessageString ) RiuMainWindow::instance()->processMonitor()->addStringToLog( MessageString ); @@ -25,4 +26,6 @@ class RiaSocketTools public: static RimCase* findCaseFromArgs(RiaSocketServer* server, const QList& args); static void getCaseInfoFromCase(RimCase* rimCase, qint64& caseId, QString& caseName, QString& caseType, qint64& caseGroupId); + + static bool writeBlockData(RiaSocketServer* server, QTcpSocket* socket, const char* data, quint64 bytesToWrite); };