void setEclipseProperty(const Matrix& propertyFrames, const QString &hostName, quint16 port, const qint64& caseId, QString propertyName, const int32NDArray& requestedTimeSteps, QString porosityModel) { QTcpSocket socket; socket.connectToHost(hostName, port); if (!socket.waitForConnected(riOctavePlugin::connectTimeOutMilliSecs)) { error((("Connection: ") + socket.errorString()).toLatin1().data()); return; } QDataStream socketStream(&socket); socketStream.setVersion(riOctavePlugin::qtDataStreamVersion); // Create command as a string with arguments , and send it: QString command; command += "SetActiveCellProperty " + QString::number(caseId) + " " + propertyName + " " + porosityModel; for (int i = 0; i < requestedTimeSteps.numel(); ++i) { if (i == 0) command += " "; command += QString::number(static_cast<int>(requestedTimeSteps.elem(i)) - 1); // To make the index 0-based if (i != requestedTimeSteps.numel() -1) command += " "; } QByteArray cmdBytes = command.toLatin1(); socketStream << (qint64)(cmdBytes.size()); socket.write(cmdBytes); // Write property data header dim_vector mxDims = propertyFrames.dims(); qint64 cellCount = mxDims.elem(0); qint64 timeStepCount = mxDims.elem(1); qint64 timeStepByteCount = cellCount * sizeof(double); socketStream << (qint64)(timeStepCount); socketStream << (qint64)timeStepByteCount; const double* internalData = propertyFrames.fortran_vec(); QStringList errorMessages; if (!RiaSocketDataTransfer::writeBlockDataToSocket(&socket, (const char *)internalData, timeStepByteCount*timeStepCount, errorMessages)) { for (int i = 0; i < errorMessages.size(); i++) { octave_stdout << errorMessages[i].toStdString(); } return; } QString tmp = QString("riSetActiveCellProperty : Wrote %1").arg(propertyName); if (caseId == -1) { tmp += QString(" to current case."); } else { tmp += QString(" to case with Id = %1.").arg(caseId); } octave_stdout << tmp.toStdString() << " Active Cells : " << cellCount << " Time steps : " << timeStepCount << std::endl; while(socket.bytesToWrite() && socket.state() == QAbstractSocket::ConnectedState) { // octave_stdout << "Bytes to write: " << socket.bytesToWrite() << std::endl; socket.waitForBytesWritten(riOctavePlugin::shortTimeOutMilliSecs); OCTAVE_QUIT; } //octave_stdout << " Socket write completed" << std::endl; if (socket.bytesToWrite() && socket.state() != QAbstractSocket::ConnectedState) { error("riSetActiveCellProperty : ResInsight refused to accept the data. Maybe the dimensions or porosity model is wrong"); } #ifdef WIN32 // TODO: Due to synchronization issues seen on Windows 10, it is required to do a sleep here to be able to catch disconnect // signals from the socket. No sleep causes the server to hang. Sleep(100); #endif //WIN32 return; }
void getDynamicNNCValues(Matrix& propertyFrames, const QString &serverName, quint16 serverPort, const qint64& caseId, QString propertyName, const int32NDArray& requestedTimeSteps) { QTcpSocket socket; socket.connectToHost(serverName, serverPort); if (!socket.waitForConnected(riOctavePlugin::connectTimeOutMilliSecs)) { error((("Connection: ") + socket.errorString()).toLatin1().data()); return; } QDataStream socketStream(&socket); socketStream.setVersion(riOctavePlugin::qtDataStreamVersion); // Create command as a string with arguments , and send it: QString command; command += "GetDynamicNNCValues " + QString::number(caseId) + " " + propertyName; for (int i = 0; i < requestedTimeSteps.numel(); ++i) { if (i == 0) command += " "; command += QString::number(static_cast<int>(requestedTimeSteps.elem(i)) - 1); // To make the index 0-based if (i != requestedTimeSteps.numel() -1) command += " "; } QByteArray cmdBytes = command.toLatin1(); socketStream << (qint64)(cmdBytes.size()); socket.write(cmdBytes); // Get response. First wait for the header while (socket.bytesAvailable() < (int)(2*sizeof(quint64))) { if (!socket.waitForReadyRead(riOctavePlugin::longTimeOutMilliSecs)) { error((("Waiting for header: ") + socket.errorString()).toLatin1().data()); return; } } // Read connection count and timestep count quint64 connectionCount; quint64 timestepCount; socketStream >> connectionCount; socketStream >> timestepCount; propertyFrames.resize(connectionCount, timestepCount); if (!(connectionCount && timestepCount)) { error ("Could not find the requested data in ResInsight"); return; } quint64 totalByteCount = timestepCount * connectionCount * sizeof(double); double* internalMatrixData = propertyFrames.fortran_vec(); QStringList errorMessages; if (!RiaSocketDataTransfer::readBlockDataFromSocket(&socket, (char*)(internalMatrixData), totalByteCount, errorMessages)) { for (int i = 0; i < errorMessages.size(); i++) { error(errorMessages[i].toLatin1().data()); } return; } QString tmp = QString("riGetDynamicNNCValues : Read %1").arg(propertyName); if (caseId < 0) { tmp += QString(" from current case."); } else { tmp += QString(" from case with Id: %1.").arg(caseId); } octave_stdout << tmp.toStdString() << " Connections: " << connectionCount << ", Time steps : " << timestepCount << std::endl; return; }