2014-09-23 08:04:57 -05:00
/////////////////////////////////////////////////////////////////////////////////
2013-09-04 01:03:11 -05:00
//
2014-09-23 08:04:57 -05:00
// Copyright (C) 2011- Statoil ASA
// Copyright (C) 2013- Ceetron Solutions AS
// Copyright (C) 2011-2012 Ceetron AS
2013-09-04 01:03:11 -05:00
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
# include "RiaSocketCommand.h"
# include "RiaSocketServer.h"
# include "RiaSocketTools.h"
2017-01-09 12:51:15 -06:00
# include "RigGridBase.h"
2017-01-10 02:51:39 -06:00
# include "RigEclipseCaseData.h"
2017-10-13 06:44:53 -05:00
# include "RigSimWellData.h"
2013-09-04 01:03:11 -05:00
2015-05-15 02:16:33 -05:00
# include "RimEclipseCase.h"
2013-09-04 01:03:11 -05:00
2015-09-25 08:57:43 -05:00
# include "cvfCollection.h"
2013-09-04 01:03:11 -05:00
# include <QTcpSocket>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class RiaGetWellNames : public RiaSocketCommand
{
public :
static QString commandName ( ) { return QString ( " GetWellNames " ) ; }
2018-10-18 12:45:57 -05:00
bool interpretCommand ( RiaSocketServer * server , const QList < QByteArray > & args , QDataStream & socketStream ) override
2013-09-04 01:03:11 -05:00
{
int caseId = args [ 1 ] . toInt ( ) ;
2015-05-15 01:40:27 -05:00
RimEclipseCase * rimCase = server - > findReservoir ( caseId ) ;
2013-09-04 01:03:11 -05:00
if ( ! rimCase )
{
2019-04-29 00:58:37 -05:00
server - > showErrorMessage ( RiaSocketServer : : tr ( " ResInsight SocketServer: \n " ) + RiaSocketServer : : tr ( " Could not find the case with ID : \" %1 \" " ) . arg ( caseId ) ) ;
2013-09-04 01:03:11 -05:00
return true ;
}
std : : vector < QString > wellNames ;
2017-10-13 06:44:53 -05:00
const cvf : : Collection < RigSimWellData > & wells = rimCase - > eclipseCaseData ( ) - > wellResults ( ) ;
2013-09-04 01:03:11 -05:00
for ( size_t wIdx = 0 ; wIdx < wells . size ( ) ; + + wIdx )
{
wellNames . push_back ( wells [ wIdx ] - > m_wellName ) ;
}
quint64 byteCount = sizeof ( quint64 ) ;
quint64 wellCount = wellNames . size ( ) ;
for ( size_t wIdx = 0 ; wIdx < wellCount ; wIdx + + )
{
byteCount + = wellNames [ wIdx ] . size ( ) * sizeof ( QChar ) ;
}
socketStream < < byteCount ;
socketStream < < wellCount ;
for ( size_t wIdx = 0 ; wIdx < wellCount ; wIdx + + )
{
socketStream < < wellNames [ wIdx ] ;
}
return true ;
}
} ;
static bool RiaGetWellNames_init = RiaSocketCommandFactory : : instance ( ) - > registerCreator < RiaGetWellNames > ( RiaGetWellNames : : commandName ( ) ) ;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class RiaGetWellStatus : public RiaSocketCommand
{
public :
static QString commandName ( ) { return QString ( " GetWellStatus " ) ; }
2018-10-18 12:45:57 -05:00
bool interpretCommand ( RiaSocketServer * server , const QList < QByteArray > & args , QDataStream & socketStream ) override
2013-09-04 01:03:11 -05:00
{
int caseId = args [ 1 ] . toInt ( ) ;
QString wellName = args [ 2 ] ;
2015-05-15 01:40:27 -05:00
RimEclipseCase * rimCase = server - > findReservoir ( caseId ) ;
2013-09-04 01:03:11 -05:00
if ( ! rimCase )
{
2019-04-29 00:58:37 -05:00
server - > showErrorMessage ( RiaSocketServer : : tr ( " ResInsight SocketServer: \n " ) + RiaSocketServer : : tr ( " Could not find the case with ID : \" %1 \" " ) . arg ( caseId ) ) ;
2013-09-04 01:03:11 -05:00
return true ;
}
// Create a list of all the requested time steps
std : : vector < size_t > requestedTimesteps ;
//First find the well result for the correct well
2017-10-13 06:44:53 -05:00
const cvf : : Collection < RigSimWellData > & allWellRes = rimCase - > eclipseCaseData ( ) - > wellResults ( ) ;
cvf : : ref < RigSimWellData > currentWellResult ;
2013-09-04 01:03:11 -05:00
for ( size_t tsIdx = 0 ; tsIdx < allWellRes . size ( ) ; + + tsIdx )
{
if ( allWellRes [ tsIdx ] - > m_wellName = = wellName )
{
currentWellResult = allWellRes [ tsIdx ] ;
break ;
}
}
if ( currentWellResult . isNull ( ) )
{
2019-04-29 00:58:37 -05:00
server - > showErrorMessage (
2013-09-04 01:03:11 -05:00
RiaSocketServer : : tr ( " ResInsight SocketServer: \n " ) + RiaSocketServer : : tr ( " Could not find the well with name : \" %1 \" " ) . arg ( wellName ) ) ;
return true ;
}
if ( args . size ( ) < = 3 )
{
// Select all timesteps.
for ( size_t tsIdx = 0 ; tsIdx < currentWellResult - > m_resultTimeStepIndexToWellTimeStepIndex . size ( ) ; + + tsIdx )
{
requestedTimesteps . push_back ( tsIdx ) ;
}
}
else
{
bool timeStepReadError = false ;
for ( int argIdx = 3 ; argIdx < args . size ( ) ; + + argIdx )
{
bool conversionOk = false ;
int tsIdx = args [ argIdx ] . toInt ( & conversionOk ) ;
if ( conversionOk )
{
requestedTimesteps . push_back ( tsIdx ) ;
}
else
{
timeStepReadError = true ;
}
}
if ( timeStepReadError )
{
2019-04-29 00:58:37 -05:00
server - > showErrorMessage ( RiaSocketServer : : tr ( " ResInsight SocketServer: riGetGridProperty : \n " )
2013-09-04 01:03:11 -05:00
+ RiaSocketServer : : tr ( " An error occured while interpreting the requested timesteps. " ) ) ;
}
}
std : : vector < QString > wellTypes ;
std : : vector < qint32 > wellStatuses ;
for ( size_t tsIdx = 0 ; tsIdx < requestedTimesteps . size ( ) ; + + tsIdx )
{
QString wellType = " NotDefined " ;
qint32 wellStatus = 0 ;
if ( currentWellResult - > hasWellResult ( tsIdx ) )
{
switch ( currentWellResult - > wellResultFrame ( tsIdx ) . m_productionType )
{
case RigWellResultFrame : : PRODUCER :
wellType = " Producer " ;
break ;
case RigWellResultFrame : : OIL_INJECTOR :
wellType = " OilInjector " ;
break ;
case RigWellResultFrame : : WATER_INJECTOR :
wellType = " WaterInjector " ;
break ;
case RigWellResultFrame : : GAS_INJECTOR :
wellType = " GasInjector " ;
break ;
}
wellStatus = currentWellResult - > wellResultFrame ( tsIdx ) . m_isOpen ? 1 : 0 ;
}
wellTypes . push_back ( wellType ) ;
wellStatuses . push_back ( wellStatus ) ;
}
quint64 byteCount = sizeof ( quint64 ) ;
quint64 timeStepCount = wellTypes . size ( ) ;
for ( size_t tsIdx = 0 ; tsIdx < timeStepCount ; tsIdx + + )
{
byteCount + = wellTypes [ tsIdx ] . size ( ) * sizeof ( QChar ) ;
byteCount + = sizeof ( qint32 ) ;
}
socketStream < < byteCount ;
socketStream < < timeStepCount ;
for ( size_t tsIdx = 0 ; tsIdx < timeStepCount ; tsIdx + + )
{
socketStream < < wellTypes [ tsIdx ] ;
socketStream < < wellStatuses [ tsIdx ] ;
}
return true ;
}
} ;
static bool RiaGetWellStatus_init = RiaSocketCommandFactory : : instance ( ) - > registerCreator < RiaGetWellStatus > ( RiaGetWellStatus : : commandName ( ) ) ;
2013-09-04 05:57:36 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class RiaGetWellCells : public RiaSocketCommand
{
public :
static QString commandName ( ) { return QString ( " GetWellCells " ) ; }
2018-10-18 12:45:57 -05:00
bool interpretCommand ( RiaSocketServer * server , const QList < QByteArray > & args , QDataStream & socketStream ) override
2013-09-04 05:57:36 -05:00
{
int caseId = args [ 1 ] . toInt ( ) ;
QString wellName = args [ 2 ] ;
size_t timeStepIdx = args [ 3 ] . toInt ( ) - 1 ; // Interpret timeStepIdx from octave as 1-based
2015-05-15 01:40:27 -05:00
RimEclipseCase * rimCase = server - > findReservoir ( caseId ) ;
2013-09-04 05:57:36 -05:00
if ( ! rimCase )
{
2019-04-29 00:58:37 -05:00
server - > showErrorMessage ( RiaSocketServer : : tr ( " ResInsight SocketServer: \n " ) + RiaSocketServer : : tr ( " Could not find the case with ID : \" %1 \" " ) . arg ( caseId ) ) ;
2013-09-04 05:57:36 -05:00
socketStream < < ( quint64 ) 0 ;
return true ;
}
2017-10-13 06:44:53 -05:00
const cvf : : Collection < RigSimWellData > & allWellRes = rimCase - > eclipseCaseData ( ) - > wellResults ( ) ;
cvf : : ref < RigSimWellData > currentWellResult ;
2013-09-04 05:57:36 -05:00
for ( size_t cIdx = 0 ; cIdx < allWellRes . size ( ) ; + + cIdx )
{
if ( allWellRes [ cIdx ] - > m_wellName = = wellName )
{
currentWellResult = allWellRes [ cIdx ] ;
break ;
}
}
if ( currentWellResult . isNull ( ) )
{
2019-04-29 00:58:37 -05:00
server - > showErrorMessage (
2013-09-04 05:57:36 -05:00
RiaSocketServer : : tr ( " ResInsight SocketServer: \n " ) + RiaSocketServer : : tr ( " Could not find the well with name : \" %1 \" " ) . arg ( wellName ) ) ;
socketStream < < ( quint64 ) 0 ;
return true ;
}
if ( ! currentWellResult - > hasWellResult ( timeStepIdx ) )
{
socketStream < < ( quint64 ) 0 ;
return true ;
}
std : : vector < qint32 > cellIs ;
std : : vector < qint32 > cellJs ;
std : : vector < qint32 > cellKs ;
std : : vector < qint32 > gridIndices ;
std : : vector < qint32 > cellStatuses ;
std : : vector < qint32 > branchIds ;
std : : vector < qint32 > segmentIds ;
// Fetch results
const RigWellResultFrame & wellResFrame = currentWellResult - > wellResultFrame ( timeStepIdx ) ;
std : : vector < RigGridBase * > grids ;
2017-03-15 03:10:16 -05:00
rimCase - > eclipseCaseData ( ) - > allGrids ( & grids ) ;
2013-09-04 05:57:36 -05:00
for ( size_t bIdx = 0 ; bIdx < wellResFrame . m_wellResultBranches . size ( ) ; + + bIdx )
{
const std : : vector < RigWellResultPoint > & branchResPoints = wellResFrame . m_wellResultBranches [ bIdx ] . m_branchResultPoints ;
for ( size_t rpIdx = 0 ; rpIdx < branchResPoints . size ( ) ; + + rpIdx )
{
const RigWellResultPoint & resPoint = branchResPoints [ rpIdx ] ;
if ( resPoint . isCell ( ) )
{
size_t i ;
size_t j ;
size_t k ;
size_t gridIdx = resPoint . m_gridIndex ;
grids [ gridIdx ] - > ijkFromCellIndex ( resPoint . m_gridCellIndex , & i , & j , & k ) ;
bool isOpen = resPoint . m_isOpen ;
int branchId = resPoint . m_ertBranchId ;
int segmentId = resPoint . m_ertSegmentId ;
2013-10-08 06:07:14 -05:00
cellIs . push_back ( static_cast < qint32 > ( i + 1 ) ) ; // NB: 1-based index in Octave
cellJs . push_back ( static_cast < qint32 > ( j + 1 ) ) ; // NB: 1-based index in Octave
cellKs . push_back ( static_cast < qint32 > ( k + 1 ) ) ; // NB: 1-based index in Octave
2013-09-04 05:57:36 -05:00
gridIndices . push_back ( static_cast < qint32 > ( gridIdx ) ) ;
cellStatuses . push_back ( static_cast < qint32 > ( isOpen ) ) ;
branchIds . push_back ( branchId ) ;
segmentIds . push_back ( segmentId ) ;
}
}
}
quint64 byteCount = sizeof ( quint64 ) ;
quint64 cellCount = cellIs . size ( ) ;
byteCount + = cellCount * ( 7 * sizeof ( qint32 ) ) ;
socketStream < < byteCount ;
socketStream < < cellCount ;
for ( size_t cIdx = 0 ; cIdx < cellCount ; cIdx + + )
{
socketStream < < cellIs [ cIdx ] ;
socketStream < < cellJs [ cIdx ] ;
socketStream < < cellKs [ cIdx ] ;
socketStream < < gridIndices [ cIdx ] ;
socketStream < < cellStatuses [ cIdx ] ;
socketStream < < branchIds [ cIdx ] ;
socketStream < < segmentIds [ cIdx ] ;
}
return true ;
}
} ;
static bool RiaGetWellCells_init = RiaSocketCommandFactory : : instance ( ) - > registerCreator < RiaGetWellCells > ( RiaGetWellCells : : commandName ( ) ) ;