#4457 Python: clean up grpc api, Python client API and make installable python package (#4456)

* gRPC: Make names more consistent

* gRPC: clean up case info and improve Python API for cases

* gRPC: much more object oriented Python interface

* Python: Make a proper pip-installable package

* Update rips Python package to auto generate setup.py with version number

* Python: add setup.py to gitignore

* Python: Update Python RIPS interface

* gRPC: Remove example client from cmake file and unit test

* gRPC: Fix up unit test after merge and hide warnings

* gRPC: fix up python client code
This commit is contained in:
Gaute Lindkvist
2019-06-03 14:33:16 +02:00
committed by GitHub
parent 936fab3e32
commit a468532d7f
50 changed files with 1058 additions and 698 deletions

View File

@@ -313,12 +313,12 @@ if (MSVC)
set( EXE_FILES WIN32) set( EXE_FILES WIN32)
if (RESINSIGHT_ENABLE_GRPC) if (RESINSIGHT_ENABLE_GRPC)
# GRPC generates a lot of harmless warnings on MSVC # GRPC generates a lot of harmless warnings on MSVC
set_source_files_properties(${GRPC_CPP_SOURCES} PROPERTIES COMPILE_FLAGS "/wd4251 /wd4702 /wd4005 /wd4244 /wd4125") set_source_files_properties(${GRPC_CPP_SOURCES} ${GRPC_UNIT_TEST_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "/wd4251 /wd4702 /wd4005 /wd4244 /wd4125")
endif(RESINSIGHT_ENABLE_GRPC) endif(RESINSIGHT_ENABLE_GRPC)
elseif (APPLE) elseif (APPLE)
set( EXE_FILES MACOSX_BUNDLE) set( EXE_FILES MACOSX_BUNDLE)
else() else()
set_source_files_properties(${GRPC_CPP_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-overloaded-virtual") set_source_files_properties(${GRPC_CPP_SOURCES} ${GRPC_UNIT_TESTS_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-Wno-overloaded-virtual")
endif() endif()
set( EXE_FILES set( EXE_FILES
${EXE_FILES} ${EXE_FILES}

View File

@@ -5,20 +5,22 @@ set ( SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCallbacks.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCallbacks.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCallbacks.inl ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCallbacks.inl
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcServiceInterface.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcServiceInterface.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcGridInfoService.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCaseService.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcProjectInfoService.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcGridService.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcProjectService.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcResInfoService.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcAppInfoService.h
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.h ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.h
) )
set ( SOURCE_GROUP_SOURCE_FILES set ( SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcServer.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcServer.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcServiceInterface.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcServiceInterface.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcGridInfoService.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCaseService.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcProjectInfoService.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcGridService.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcProjectService.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcResInfoService.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcAppInfoService.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.cpp
) )
@@ -70,12 +72,12 @@ endif(PYTHON_EXECUTABLE AND EXISTS ${PYTHON_EXECUTABLE})
# Proto files # Proto files
set(PROTO_FILES set(PROTO_FILES
"Empty" "Empty"
"CaseInfo" "Case"
"GridInfo" "Project"
"ProjectInfo"
"Commands" "Commands"
"ResInfo" "AppInfo"
"Properties" "Properties"
"Grid"
) )
set(GRPC_PYTHON_SOURCE_PATH "${CMAKE_CURRENT_LIST_DIR}/Python") set(GRPC_PYTHON_SOURCE_PATH "${CMAKE_CURRENT_LIST_DIR}/Python")
@@ -138,24 +140,33 @@ foreach(proto_file ${PROTO_FILES})
endforeach(proto_file) endforeach(proto_file)
if (PYTHON_EXECUTABLE AND EXISTS ${PYTHON_EXECUTABLE}) if (PYTHON_EXECUTABLE AND EXISTS ${PYTHON_EXECUTABLE})
list(APPEND GRPC_PYTHON_SOURCES list(APPEND GRPC_PYTHON_SOURCES
${GRPC_PYTHON_GENERATED_SOURCES} ${GRPC_PYTHON_GENERATED_SOURCES}
"generated/RiaVersionInfo.py" "generated/RiaVersionInfo.py"
"api/__init__.py" "rips/__init__.py"
"api/ResInsight.py" "rips/AppInfo.py"
"rips/Case.py"
"rips/Commands.py"
"rips/Grid.py"
"rips/Project.py"
"rips/Properties.py"
"rips/Instance.py"
"examples/CommandExample.py" "examples/CommandExample.py"
"examples/GridInfoStreamingExample.py" "examples/CaseInfoStreamingExample.py"
"examples/PoroPermXSync.py" "examples/PoroPermXSync.py"
"examples/PoroPermXAsync.py" "examples/PoroPermXAsync.py"
"examples/SoilPorvAsync.py" "examples/SoilPorvAsync.py"
"examples/SoilPorvSync.py" "examples/SoilPorvSync.py"
"examples/ResultValues.py"
"examples/SelectedCases.py" "examples/SelectedCases.py"
"examples/AllCases.py" "examples/AllCases.py"
"examples/SetActiveCellProperties.py"
"examples/SetGridProperties.py" "examples/SetGridProperties.py"
"examples/GridInformation.py"
"tests/test_sample.py" "tests/test_sample.py"
"requirements.txt"
"setup.py.cmake"
"README.md"
"LICENSE"
) )
foreach(PYTHON_SCRIPT ${GRPC_PYTHON_SOURCES}) foreach(PYTHON_SCRIPT ${GRPC_PYTHON_SOURCES})
@@ -173,6 +184,9 @@ list ( APPEND GRPC_CPP_SOURCES ${SOURCE_GROUP_SOURCE_FILES})
CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/ApplicationCode/Adm/RiaVersionInfo.py.cmake CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/ApplicationCode/Adm/RiaVersionInfo.py.cmake
${GRPC_PYTHON_SOURCE_PATH}/generated/RiaVersionInfo.py ${GRPC_PYTHON_SOURCE_PATH}/generated/RiaVersionInfo.py
) )
CONFIGURE_FILE( ${GRPC_PYTHON_SOURCE_PATH}/setup.py.cmake
${GRPC_PYTHON_SOURCE_PATH}/setup.py
)
source_group( "GrpcInterface" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.cmake ) source_group( "GrpcInterface" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.cmake )
source_group( "GrpcInterface\\GrpcProtos" FILES ${GRPC_PROTO_FILES_FULL_PATH} ) source_group( "GrpcInterface\\GrpcProtos" FILES ${GRPC_PROTO_FILES_FULL_PATH} )

View File

@@ -4,7 +4,7 @@ package rips;
import "Empty.proto"; import "Empty.proto";
service ResInfo { service AppInfo {
rpc GetVersion(Empty) returns (Version) {} rpc GetVersion(Empty) returns (Version) {}
} }

View File

@@ -1,19 +1,44 @@
syntax = "proto3"; syntax = "proto3";
import "CaseInfo.proto";
package rips; package rips;
service GridInfo service Case
{ {
// This function returns a two dimensional matrix: One row for each grid, starting with the main grid. rpc GetGridCount(CaseRequest) returns(GridCount) {}
rpc GetGridCount(Case) returns(GridCount) {}
rpc GetGridDimensions(Case) returns (GridDimensions) {}
rpc GetCellCount(CellInfoRequest) returns (CellCount) {} rpc GetCellCount(CellInfoRequest) returns (CellCount) {}
rpc GetCellInfoForActiveCells(CellInfoRequest) returns (stream CellInfoArray) {} rpc GetCellInfoForActiveCells(CellInfoRequest) returns (stream CellInfoArray) {}
rpc GetAllCoarseningInfoArray(Case) returns (CoarseningInfoArray) {} rpc GetCoarseningInfoArray(CaseRequest) returns (CoarseningInfoArray) {}
rpc GetTimeSteps(Case) returns (TimeStepDates) {} rpc GetTimeSteps(CaseRequest) returns (TimeStepDates) {}
rpc GetTimeStepDaysSinceStart(Case) returns (DoubleDates) {} rpc GetTimeStepDaysSinceStart(CaseRequest) returns (DoubleDates) {}
rpc GetCaseInfo(CaseRequest) returns (CaseInfo) {}
}
message CaseRequest {
int32 id = 1;
}
message CaseInfo
{
int32 id = 1;
int32 group_id = 2;
string name = 3;
string type = 4;
}
message CaseInfoArray
{
repeated CaseInfo data = 1;
}
message CaseGroup
{
int32 id = 1;
string name = 2;
}
message CaseGroups
{
repeated CaseGroup case_groups = 1;
} }
message GridCount message GridCount
@@ -21,11 +46,6 @@ message GridCount
int32 count = 1; int32 count = 1;
} }
message GridDimensions
{
repeated Vec3i dimensions = 1;
}
message Vec3i { message Vec3i {
int32 i = 1; int32 i = 1;
int32 j = 2; int32 j = 2;
@@ -46,7 +66,7 @@ enum PorosityModelType
message CellInfoRequest message CellInfoRequest
{ {
int32 case_id = 1; CaseRequest case_request = 1;
PorosityModelType porosity_model = 2; PorosityModelType porosity_model = 2;
} }
@@ -77,7 +97,7 @@ message CoarseningInfo
message TimeStepDates message TimeStepDates
{ {
repeated TimeStepDate date = 1; repeated TimeStepDate dates = 1;
} }
message TimeStepDate message TimeStepDate
@@ -92,5 +112,5 @@ message TimeStepDate
message DoubleDates message DoubleDates
{ {
repeated double date_decimal = 1; repeated double date_decimals = 1;
} }

View File

@@ -1,31 +0,0 @@
syntax = "proto3";
package rips;
message Case {
int32 id = 1;
}
message CaseInfo
{
int32 id = 1;
int32 group_id = 2;
string name = 3;
string type = 4;
}
message CaseInfos
{
repeated CaseInfo case_info = 1;
}
message CaseGroup
{
int32 id = 1;
string name = 2;
}
message CaseGroups
{
repeated CaseGroup case_group = 1;
}

View File

@@ -1,6 +1,6 @@
syntax = "proto3"; syntax = "proto3";
import "CaseInfo.proto"; import "Case.proto";
import "Empty.proto"; import "Empty.proto";
package rips; package rips;
@@ -272,8 +272,8 @@ message CommandReply
{ {
oneof result oneof result
{ {
Empty emptyResult = 1; Empty emptyResult = 1;
Case loadCaseResult = 2; CaseRequest loadCaseResult = 2;
} }
} }

View File

@@ -0,0 +1,34 @@
syntax = "proto3";
package rips;
import "Case.proto";
service Grid
{
rpc GetCellCenters(GridRequest) returns(CellCenters) {}
rpc GetDimensions(GridRequest) returns (GridDimensions) {}
}
message GridRequest
{
CaseRequest case_request = 1;
int32 grid_index = 2;
}
message Vec3d
{
double x = 1;
double y = 2;
double z = 3;
}
message CellCenters
{
repeated Vec3d centers = 1;
}
message GridDimensions
{
Vec3i dimensions = 1;
}

View File

@@ -0,0 +1,14 @@
syntax = "proto3";
import "Case.proto";
import "Empty.proto";
package rips;
service Project {
rpc GetCurrentCase(Empty) returns (CaseRequest) {}
rpc GetSelectedCases(Empty) returns (CaseInfoArray) {}
rpc GetAllCaseGroups(Empty) returns (CaseGroups) {}
rpc GetAllCases(Empty) returns (CaseInfoArray) {}
rpc GetCasesInGroup(CaseGroup) returns (CaseInfoArray) {}
}

View File

@@ -1,16 +0,0 @@
syntax = "proto3";
import "CaseInfo.proto";
import "Empty.proto";
package rips;
service ProjectInfo {
rpc CurrentCase(Empty) returns (Case) {}
rpc CurrentCaseInfo(Empty) returns (CaseInfo) {}
rpc CaseInfoFromCase(Case) returns (CaseInfo) {}
rpc SelectedCases(Empty) returns (CaseInfos) {}
rpc AllCaseGroups(Empty) returns (CaseGroups) {}
rpc AllCases(Empty) returns (CaseInfos) {}
rpc CasesInGroup(CaseGroup) returns (CaseInfos) {}
}

View File

@@ -1,18 +1,17 @@
syntax = "proto3"; syntax = "proto3";
import "Empty.proto"; import "Empty.proto";
import "CaseInfo.proto"; import "Case.proto";
import "GridInfo.proto";
package rips; package rips;
service Properties service Properties
{ {
rpc GetAvailableProperties(PropertiesRequest) returns (AvailableProperties) {} rpc GetAvailableProperties(AvailablePropertiesRequest) returns (AvailableProperties) {}
rpc GetActiveCellResults(ResultRequest) returns (stream ResultArray) {} rpc GetActiveCellProperty(PropertyRequest) returns (stream PropertyChunk) {}
rpc GetGridResults(ResultRequest) returns (stream ResultArray) {} rpc GetGridProperty(PropertyRequest) returns (stream PropertyChunk) {}
rpc SetActiveCellResults(stream ResultRequestChunk) returns (Empty) {} rpc SetActiveCellProperty(stream PropertyInputChunk) returns (Empty) {}
rpc SetGridResults(stream ResultRequestChunk) returns (Empty) {} rpc SetGridProperty(stream PropertyInputChunk) returns (Empty) {}
} }
enum PropertyType enum PropertyType
@@ -29,9 +28,9 @@ enum PropertyType
UNDEFINED = 999; UNDEFINED = 999;
} }
message PropertiesRequest message AvailablePropertiesRequest
{ {
Case request_case = 1; CaseRequest case_request = 1;
PropertyType property_type = 2; PropertyType property_type = 2;
PorosityModelType porosity_model = 3; PorosityModelType porosity_model = 3;
} }
@@ -41,9 +40,9 @@ message AvailableProperties
repeated string property_names = 1; repeated string property_names = 1;
} }
message ResultRequest message PropertyRequest
{ {
Case request_case = 1; CaseRequest case_request = 1;
PropertyType property_type = 2; PropertyType property_type = 2;
string property_name = 3; string property_name = 3;
int32 time_step = 4; int32 time_step = 4;
@@ -56,14 +55,17 @@ message TimeStep
int32 index = 1; int32 index = 1;
} }
message ResultRequestChunk message PropertyInputChunk
{ {
// Params needs to be sent in the first message oneof ChunkType
ResultRequest params = 1; {
ResultArray values = 2; // Params needs to be sent in the first message
PropertyRequest params = 1;
PropertyChunk values = 2;
}
} }
message ResultArray message PropertyChunk
{ {
repeated double values = 1; repeated double values = 1;
} }

View File

@@ -1,3 +1,7 @@
__pycache__ __pycache__
.pytest_cache .pytest_cache
generated generated
dist
build
rips.egg-info
setup.py

View File

@@ -0,0 +1,14 @@
Copyright (C) 2019- Equinor ASA
ResInsight is free software: you can redistribute it andor 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.orglicensesgpl.html>
for more details.

View File

@@ -0,0 +1,5 @@
# ResInsight Processing Server - rips
A Python interface for the ResInsight visualization and post-processing suite for Reservoir Simulations
[Learn More](https://www.resinsight.org)

View File

@@ -1,302 +0,0 @@
from __future__ import print_function
import grpc
import os
import sys
import socket
import logging
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
from Empty_pb2 import Empty
import CaseInfo_pb2
import CaseInfo_pb2_grpc
import Commands_pb2 as Cmd
import Commands_pb2_grpc as CmdRpc
import GridInfo_pb2
import GridInfo_pb2_grpc
import ProjectInfo_pb2
import ProjectInfo_pb2_grpc
import ResInfo_pb2
import ResInfo_pb2_grpc
import Properties_pb2
import Properties_pb2_grpc
import RiaVersionInfo
class ResInfo:
def __init__(self, channel):
self.resInfo = ResInfo_pb2_grpc.ResInfoStub(channel)
def versionMessage(self):
return self.resInfo.GetVersion(Empty())
def majorVersion(self):
return self.versionMessage().major_version
def minorVersion(self):
return self.versionMessage().minor_version
def patchVersion(self):
return self.versionMessage().patch_version
def versionString(self):
return str(self.majorVersion()) + "." + str(self.minorVersion()) + "." + str(self.patchVersion())
class CommandExecutor:
def __init__(self, channel):
self.commands = CmdRpc.CommandsStub(channel)
def execute(self, commandParams):
try:
return self.commands.Execute(commandParams)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error")
def setTimeStep(self, caseId, timeStep):
return self.execute(Cmd.CommandParams(setTimeStep=Cmd.SetTimeStepParams(caseId=caseId, timeStep=timeStep)))
def setMainWindowSize(self, width, height):
return self.execute(Cmd.CommandParams(setMainWindowSize=Cmd.SetMainWindowSizeParams(width=width, height=height)))
def openProject(self, path):
return self.execute(Cmd.CommandParams(openProject=Cmd.FilePathRequest(path=path)))
def loadCase(self, path):
commandReply = self.execute(Cmd.CommandParams(loadCase=Cmd.FilePathRequest(path=path)))
assert commandReply.HasField("loadCaseResult")
return commandReply.loadCaseResult.id
def closeProject(self):
return self.execute(Cmd.CommandParams(closeProject=Empty()))
def exportWellPaths(self, wellPaths=[], mdStepSize=5.0):
if isinstance(wellPaths, str):
wellPathArray = [str]
elif isinstance(wellPaths, list):
wellPathArray = wellPaths
return self.execute(Cmd.CommandParams(exportWellPaths=Cmd.ExportWellPathRequest(wellPathNames=wellPathArray, mdStepSize=mdStepSize)))
class GridInfo:
def __init__(self, channel):
self.gridInfo = GridInfo_pb2_grpc.GridInfoStub(channel)
def gridCount(self, caseId=0):
return self.gridInfo.GetGridCount(CaseInfo_pb2.Case(id=caseId)).count
def gridDimensions(self, caseId=0):
return self.gridInfo.GetGridDimensions(CaseInfo_pb2.Case(id=caseId)).dimensions
def cellCount(self, caseId=0, porosityModel='MATRIX_MODEL'):
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = GridInfo_pb2.CellInfoRequest(case_id=caseId,
porosity_model=porosityModel)
return self.gridInfo.GetCellCount(request)
def cellInfoForActiveCells(self, caseId=0, porosityModel='MATRIX_MODEL'):
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = GridInfo_pb2.CellInfoRequest(case_id=caseId,
porosity_model=porosityModel)
return self.gridInfo.GetCellInfoForActiveCells(request)
def timeSteps(self, caseId=0):
return self.gridInfo.GetTimeSteps(CaseInfo_pb2.Case(id=caseId))
class ProjectInfo:
def __init__(self, channel):
self.projectInfo = ProjectInfo_pb2_grpc.ProjectInfoStub(channel)
def selectedCases(self):
selected = self.projectInfo.SelectedCases(Empty())
if selected is not None:
return selected.case_info
else:
return None
def allCases(self):
cases = self.projectInfo.AllCases(Empty())
if cases is not None:
return cases.case_info
else:
return None
class Properties:
def __init__(self, channel):
self.properties = Properties_pb2_grpc.PropertiesStub(channel)
def generateResultRequestArrayIterator(self, values_iterator, parameters):
chunk = Properties_pb2.ResultRequestChunk()
chunk.params.CopyFrom(parameters)
yield chunk
for values in values_iterator:
valmsg = Properties_pb2.ResultArray(values = values)
chunk.values.CopyFrom(valmsg)
yield chunk
def generateResultRequestChunks(self, array, parameters):
# Each double is 8 bytes. A good chunk size is 64KiB = 65536B
# Meaning ideal number of doubles would be 8192.
# However we need overhead space, so if we choose 8160 in chunk size
# We have 256B left for overhead which should be plenty
chunkSize = 8000
index = -1
while index < len(array):
chunk = Properties_pb2.ResultRequestChunk()
if index is -1:
chunk.params.CopyFrom(parameters)
index += 1;
else:
actualChunkSize = min(len(array) - index + 1, chunkSize)
chunk.values.CopyFrom(Properties_pb2.ResultArray(values = array[index:index+actualChunkSize]))
index += actualChunkSize
yield chunk
# Final empty message to signal completion
chunk = Properties_pb2.ResultRequestChunk()
yield chunk
def availableProperties(self, caseId, propertyType, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.PropertiesRequest (request_case = CaseInfo_pb2.Case(id=caseId),
property_type = propertyTypeEnum,
porosity_model = porosityModelEnum)
return self.properties.GetAvailableProperties(request).property_names
def activeCellResults(self, caseId, propertyType, propertyName, timeStep, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.ResultRequest(request_case = CaseInfo_pb2.Case(id=caseId),
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
porosity_model = porosityModelEnum)
for chunk in self.properties.GetActiveCellResults(request):
yield chunk
def gridCellResults(self, caseId, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.ResultRequest(request_case = CaseInfo_pb2.Case(id=caseId),
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
return self.properties.GetGridResults(request)
def setActiveCellResultsAsync(self, values_iterator, caseId, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.ResultRequest(request_case = CaseInfo_pb2.Case(id=caseId),
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
try:
reply_iterator = self.generateResultRequestArrayIterator(values_iterator, request)
self.properties.SetActiveCellResults(reply_iterator)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error", e)
def setActiveCellResults(self, values, caseId, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.ResultRequest(request_case = CaseInfo_pb2.Case(id=caseId),
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
try:
request_iterator = self.generateResultRequestChunks(values, request)
self.properties.SetActiveCellResults(request_iterator)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error", e)
def setGridResults(self, values, caseId, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = GridInfo_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.ResultRequest(request_case = CaseInfo_pb2.Case(id=caseId),
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
try:
request_iterator = self.generateResultRequestArrays(values, request)
self.properties.SetGridResults(request_iterator)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error", e)
class Instance:
@staticmethod
def is_port_in_use(port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(0.2)
return s.connect_ex(('localhost', port)) == 0
@staticmethod
def launch():
port = 50051
portEnv = os.environ.get('RESINSIGHT_GRPC_PORT')
if portEnv:
port = int(portEnv)
resInsightExecutable = os.environ.get('RESINSIGHT_EXECUTABLE')
if resInsightExecutable is None:
print('Error: Could not launch any ResInsight instances because RESINSIGHT_EXECUTABLE is not set')
return None
while Instance.is_port_in_use(port):
port += 1
print('Port ' + str(port))
print('Trying to launch', resInsightExecutable)
pid = os.spawnl(os.P_NOWAIT, resInsightExecutable, " --grpcserver " + str(port))
print(pid)
return Instance(port)
@staticmethod
def find(startPort = 50051, endPort = 50071):
portEnv = os.environ.get('RESINSIGHT_GRPC_PORT')
if portEnv:
startPort = int(portEnv)
endPort = startPort + 20
for tryPort in range(startPort, endPort):
if Instance.is_port_in_use(tryPort):
return Instance(tryPort)
print('Error: Could not find any ResInsight instances responding between ports ' + str(startPort) + ' and ' + str(endPort))
return None
def __init__(self, port = 50051):
logging.basicConfig()
location = "localhost:" + str(port)
self.channel = grpc.insecure_channel(location)
# Main version check package
self.resInfo = ResInfo(self.channel)
try:
majorVersionOk = self.resInfo.majorVersion() == int(RiaVersionInfo.RESINSIGHT_MAJOR_VERSION)
minorVersionOk = self.resInfo.minorVersion() == int(RiaVersionInfo.RESINSIGHT_MINOR_VERSION)
if not (majorVersionOk and minorVersionOk):
raise Exception('Version of ResInsight does not match version of Python API')
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.UNAVAILABLE:
print('Info: Could not find any instances at port ' + str(port))
except Exception as e:
print('Error:', e)
# Service packages
self.commands = CommandExecutor(self.channel)
self.gridInfo = GridInfo(self.channel)
self.projectInfo = ProjectInfo(self.channel)
self.properties = Properties(self.channel)

View File

@@ -1,13 +1,11 @@
import sys import sys
import os import os
sys.path.insert(1, os.path.join(sys.path[0], '../api')) import rips
import ResInsight resInsight = rips.Instance.find()
resInsight = ResInsight.Instance.find()
if resInsight is not None: if resInsight is not None:
caseInfos = resInsight.projectInfo.allCases() cases = resInsight.project.cases()
print ("Got " + str(len(caseInfos)) + " cases: ") print ("Got " + str(len(cases)) + " cases: ")
for caseInfo in caseInfos: for case in cases:
print(caseInfo.name) print(case.name)

View File

@@ -7,10 +7,12 @@ resInsight = ResInsight.Instance.find()
#gridCount = resInsight.gridInfo.getGridCount(caseId=0) #gridCount = resInsight.gridInfo.getGridCount(caseId=0)
#gridDimensions = resInsight.gridInfo.getAllGridDimensions(caseId=0) #gridDimensions = resInsight.gridInfo.getAllGridDimensions(caseId=0)
cellCounts = resInsight.gridInfo.cellCount(caseId=0) case = resInsight.project.case(id = 0)
cellCounts = case.cellCount()
print("Number of active cells: " + str(cellCounts.active_cell_count)) print("Number of active cells: " + str(cellCounts.active_cell_count))
activeCellInfoChunks = resInsight.gridInfo.cellInfoForActiveCells(caseId=0) activeCellInfoChunks = case.cellInfoForActiveCells()
#print("Number of grids: " + str(gridCount)) #print("Number of grids: " + str(gridCount))
#print(gridDimensions) #print(gridDimensions)

View File

@@ -0,0 +1,18 @@
import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '../api'))
import ResInsight
resInsight = ResInsight.Instance.find()
cases = resInsight.project.cases()
print("Number of cases found: ", len(cases))
for case in cases:
print(case.name)
grids = case.grids()
print("Number of grids: ", len(grids))
for grid in grids:
print("Grid dimensions: ", grid.dimensions())

View File

@@ -11,12 +11,12 @@ def createResult(poroChunks, permxChunks):
yield resultChunk yield resultChunk
resInsight = ResInsight.Instance.find() resInsight = ResInsight.Instance.find()
case = resInsight.project.case(id=0)
poroChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PORO', 0) poroChunks = case.properties.activeCellProperty('STATIC_NATIVE', 'PORO', 0)
permxChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PERMX', 0) permxChunks = case.properties.activeCellProperty('STATIC_NATIVE', 'PERMX', 0)
resInsight.properties.setActiveCellResultsAsync(createResult(poroChunks, permxChunks), 0, 'GENERATED', 'POROPERMXAS', 0) case.properties.setActiveCellPropertyAsync(createResult(poroChunks, permxChunks), 'GENERATED', 'POROPERMXAS', 0)
print("Transferred all results back") print("Transferred all results back")

View File

@@ -4,26 +4,25 @@ sys.path.insert(1, os.path.join(sys.path[0], '../api'))
import ResInsight import ResInsight
resInsight = ResInsight.Instance.find() resInsight = ResInsight.Instance.find()
#gridCount = resInsight.gridInfo.getGridCount(caseId=0)
#gridDimensions = resInsight.gridInfo.getAllGridDimensions(caseId=0)
for i in range(0, 40): case = resInsight.project.case(id=0)
poroChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PORO', 0)
poroResults = []
for poroChunk in poroChunks:
for poro in poroChunk.values:
poroResults.append(poro)
permxChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PERMX', 0) poroChunks = case.properties.activeCellProperty('STATIC_NATIVE', 'PORO', 0)
permxResults = [] poroResults = []
for permxChunk in permxChunks: for poroChunk in poroChunks:
for permx in permxChunk.values: for poro in poroChunk.values:
permxResults.append(permx) poroResults.append(poro)
results = [] permxChunks = case.properties.activeCellProperty('STATIC_NATIVE', 'PERMX', 0)
for (poro, permx) in zip(poroResults, permxResults): permxResults = []
results.append(poro * permx) for permxChunk in permxChunks:
for permx in permxChunk.values:
permxResults.append(permx)
resInsight.properties.setActiveCellResults(results, 0, 'GENERATED', 'POROPERMXSY', 0) results = []
for (poro, permx) in zip(poroResults, permxResults):
results.append(poro * permx)
case.properties.setActiveCellProperty(results, 'GENERATED', 'POROPERMXSY', 0)
print("Transferred all results back") print("Transferred all results back")

View File

@@ -1,28 +0,0 @@
import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '../api'))
import ResInsight
resInsight = ResInsight.Instance.find()
#gridCount = resInsight.gridInfo.getGridCount(caseId=0)
#gridDimensions = resInsight.gridInfo.getAllGridDimensions(caseId=0)
poroChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PORO', 0)
poroResults = []
for poroChunk in poroChunks:
for poro in poroChunk.values:
poroResults.append(poro)
permxChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PERMX', 0)
permxResults = []
for permxChunk in permxChunks:
for permx in permxChunk.values:
permxResults.append(permx)
results = []
for (poro, permx) in zip(poroResults, permxResults):
results.append(poro * permx)
print("Transferred " + str(len(results)) + " cell results")
print("30th active cell: ")
print(results[29])

View File

@@ -6,9 +6,12 @@ import ResInsight
resInsight = ResInsight.Instance.find() resInsight = ResInsight.Instance.find()
if resInsight is not None: if resInsight is not None:
caseInfos = resInsight.projectInfo.selectedCases() cases = resInsight.project.selectedCases()
print ("Got " + str(len(cases)) + " cases: ")
for case in cases:
print(case.name)
for property in case.properties.available('DYNAMIC_NATIVE'):
print(property)
print ("Got " + str(len(caseInfos)) + " cases: ")
for caseInfo in caseInfos:
print(caseInfo.name)

View File

@@ -1,19 +0,0 @@
import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '../api'))
import ResInsight
resInsight = ResInsight.Instance.find()
activeCellCount = resInsight.gridInfo.cellCount(caseId=0).active_cell_count
values = []
for i in range(0, activeCellCount):
values.append(i % 2 * 0.5);
timeSteps = resInsight.gridInfo.timeSteps(caseId=0)
for i in range(0, len(timeSteps.date)):
print("Applying values to all time step " + str(i))
resInsight.properties.setActiveCellResults(values, 0, 'DYNAMIC_NATIVE', 'SOIL', i)

View File

@@ -5,12 +5,13 @@ import ResInsight
resInsight = ResInsight.Instance.find() resInsight = ResInsight.Instance.find()
totalCellCount = resInsight.gridInfo.cellCount(caseId=0).reservoir_cell_count case = resInsight.project.case(id=0)
totalCellCount = case.cellCount().reservoir_cell_count
values = [] values = []
for i in range(0, totalCellCount): for i in range(0, totalCellCount):
values.append(i % 2 * 0.75); values.append(i % 2 * 0.75);
print("Applying values to full grid") print("Applying values to full grid")
resInsight.properties.setGridResults(values, 0, 'DYNAMIC_NATIVE', 'SOIL', 0) case.properties.setGridProperty(values, 'DYNAMIC_NATIVE', 'SOIL', 0)

View File

@@ -14,18 +14,18 @@ def createResult(soilChunks, porvChunks):
resInsight = ResInsight.Instance.find() resInsight = ResInsight.Instance.find()
case = resInsight.project.case(id=0)
timeStepInfo = case.timeSteps()
timeStepInfo = resInsight.gridInfo.timeSteps(0) porvChunks = case.properties.activeCellProperty('STATIC_NATIVE', 'PORV', 0)
porvChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PORV', 0)
porvArray = [] porvArray = []
for porvChunk in porvChunks: for porvChunk in porvChunks:
porvArray.append(porvChunk) porvArray.append(porvChunk)
for i in range (0, len(timeStepInfo.date)): for i in range (0, len(timeStepInfo.dates)):
soilChunks = resInsight.properties.activeCellResults(0, 'DYNAMIC_NATIVE', 'SOIL', i) soilChunks = case.properties.activeCellProperty('DYNAMIC_NATIVE', 'SOIL', i)
input_iterator = createResult(soilChunks, iter(porvArray)) input_iterator = createResult(soilChunks, iter(porvArray))
resInsight.properties.setActiveCellResultsAsync(input_iterator, 0, 'GENERATED', 'SOILPORVAsync', i) case.properties.setActiveCellPropertyAsync(input_iterator, 'GENERATED', 'SOILPORVAsync', i)
print("Transferred all results back") print("Transferred all results back")

View File

@@ -3,20 +3,19 @@ import os
sys.path.insert(1, os.path.join(sys.path[0], '../api')) sys.path.insert(1, os.path.join(sys.path[0], '../api'))
import ResInsight import ResInsight
resInsight = ResInsight.Instance.find() resInsight = ResInsight.Instance.find()
#gridCount = resInsight.gridInfo.getGridCount(caseId=0) case = resInsight.case(id=0)
#gridDimensions = resInsight.gridInfo.getAllGridDimensions(caseId=0)
porvChunks = resInsight.properties.activeCellResults(0, 'STATIC_NATIVE', 'PORV', 0) porvChunks = case.properties.activeCellProperty('STATIC_NATIVE', 'PORV', 0)
porvResults = [] porvResults = []
for porvChunk in porvChunks: for porvChunk in porvChunks:
for porv in porvChunk.values: for porv in porvChunk.values:
porvResults.append(porv) porvResults.append(porv)
timeStepInfo = resInsight.gridInfo.timeSteps(0) timeStepInfo = case.timeSteps()
for i in range (0, len(timeStepInfo.date)): for i in range (0, len(timeStepInfo.dates)):
soilChunks = resInsight.properties.activeCellResults(0, 'DYNAMIC_NATIVE', 'SOIL', i) soilChunks = case.properties.activeCellProperty('DYNAMIC_NATIVE', 'SOIL', i)
soilResults = [] soilResults = []
for soilChunk in soilChunks: for soilChunk in soilChunks:
for soil in soilChunk.values: for soil in soilChunk.values:
@@ -25,5 +24,5 @@ for i in range (0, len(timeStepInfo.date)):
for (soil, porv) in zip(soilResults, porvResults): for (soil, porv) in zip(soilResults, porvResults):
results.append(soil * porv) results.append(soil * porv)
resInsight.properties.setActiveCellResults(results, 0, 'GENERATED', 'SOILPORVSync', i) case.properties.setActiveCellProperty(results, 'GENERATED', 'SOILPORVSync', i)
print("Transferred all results back") print("Transferred all results back")

View File

@@ -0,0 +1,3 @@
grpcio
grpcio-tools
protobuf

View File

@@ -0,0 +1,25 @@
import grpc
import os
import sys
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
from Empty_pb2 import Empty
import AppInfo_pb2
import AppInfo_pb2_grpc
class AppInfo:
def __init__(self, channel):
self.appInfo = AppInfo_pb2_grpc.AppInfoStub(channel)
def versionMessage(self):
return self.appInfo.GetVersion(Empty())
def majorVersion(self):
return self.versionMessage().major_version
def minorVersion(self):
return self.versionMessage().minor_version
def patchVersion(self):
return self.versionMessage().patch_version
def versionString(self):
return str(self.majorVersion()) + "." + str(self.minorVersion()) + "." + str(self.patchVersion())

View File

@@ -0,0 +1,56 @@
import grpc
import os
import sys
from .Grid import Grid
from .Properties import Properties
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
import Case_pb2
import Case_pb2_grpc
class Case:
def __init__(self, channel, id):
self.channel = channel
self.stub = Case_pb2_grpc.CaseStub(channel)
self.id = id
info = self.stub.GetCaseInfo(Case_pb2.CaseRequest(id=self.id))
self.name = info.name
self.groupId = info.group_id
self.type = info.type
self.properties = Properties(self)
self.request = Case_pb2.CaseRequest(id=self.id)
def gridCount(self):
try:
return self.stub.GetGridCount(self.request).count
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
return 0
print("ERROR: ", e)
return 0
def grid(self, index):
return Grid(index, self)
def grids(self):
gridList = []
for i in range(0, self.gridCount()):
gridList.append(Grid(i, self))
return gridList
def cellCount(self, porosityModel='MATRIX_MODEL'):
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Case_pb2.CellInfoRequest(request_case=self.request,
porosity_model=porosityModel)
return self.stub.GetCellCount(request)
def cellInfoForActiveCells(self, porosityModel='MATRIX_MODEL'):
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Case_pb2.CellInfoRequest(request_case=self.request,
porosity_model=porosityModel)
return self.stub.GetCellInfoForActiveCells(request)
def timeSteps(self):
return self.stub.GetTimeSteps(self.request)

View File

@@ -0,0 +1,43 @@
import grpc
import os
import sys
import Commands_pb2 as Cmd
import Commands_pb2_grpc as CmdRpc
class Commands:
def __init__(self, channel):
self.commands = CmdRpc.CommandsStub(channel)
def execute(self, commandParams):
try:
return self.commands.Execute(commandParams)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error")
def setTimeStep(self, caseId, timeStep):
return self.execute(Cmd.CommandParams(setTimeStep=Cmd.SetTimeStepParams(caseId=caseId, timeStep=timeStep)))
def setMainWindowSize(self, width, height):
return self.execute(Cmd.CommandParams(setMainWindowSize=Cmd.SetMainWindowSizeParams(width=width, height=height)))
def openProject(self, path):
return self.execute(Cmd.CommandParams(openProject=Cmd.FilePathRequest(path=path)))
def loadCase(self, path):
commandReply = self.execute(Cmd.CommandParams(loadCase=Cmd.FilePathRequest(path=path)))
assert commandReply.HasField("loadCaseResult")
return commandReply.loadCaseResult.id
def closeProject(self):
return self.execute(Cmd.CommandParams(closeProject=Empty()))
def exportWellPaths(self, wellPaths=[], mdStepSize=5.0):
if isinstance(wellPaths, str):
wellPathArray = [str]
elif isinstance(wellPaths, list):
wellPathArray = wellPaths
return self.execute(Cmd.CommandParams(exportWellPaths=Cmd.ExportWellPathRequest(wellPathNames=wellPathArray, mdStepSize=mdStepSize)))

View File

@@ -0,0 +1,18 @@
import grpc
import os
import sys
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
import Grid_pb2
import Grid_pb2_grpc
class Grid:
def __init__(self, index, case):
self.case = case
self.index = index
self.stub = Grid_pb2_grpc.GridStub(self.case.channel)
def dimensions(self):
return self.stub.GetDimensions(Grid_pb2.GridRequest(case_request = self.case.request, grid_index = self.index)).dimensions

View File

@@ -0,0 +1,78 @@
import grpc
import os
import sys
import socket
import logging
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
import RiaVersionInfo
from .AppInfo import AppInfo
from .Commands import Commands
from .Project import Project
class Instance:
@staticmethod
def is_port_in_use(port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(0.2)
return s.connect_ex(('localhost', port)) == 0
@staticmethod
def launch():
port = 50051
portEnv = os.environ.get('RESINSIGHT_GRPC_PORT')
if portEnv:
port = int(portEnv)
resInsightExecutable = os.environ.get('RESINSIGHT_EXECUTABLE')
if resInsightExecutable is None:
print('Error: Could not launch any ResInsight instances because RESINSIGHT_EXECUTABLE is not set')
return None
while Instance.is_port_in_use(port):
port += 1
print('Port ' + str(port))
print('Trying to launch', resInsightExecutable)
pid = os.spawnl(os.P_NOWAIT, resInsightExecutable, " --grpcserver " + str(port))
print(pid)
return Instance(port)
@staticmethod
def find(startPort = 50051, endPort = 50071):
portEnv = os.environ.get('RESINSIGHT_GRPC_PORT')
if portEnv:
startPort = int(portEnv)
endPort = startPort + 20
for tryPort in range(startPort, endPort):
if Instance.is_port_in_use(tryPort):
return Instance(tryPort)
print('Error: Could not find any ResInsight instances responding between ports ' + str(startPort) + ' and ' + str(endPort))
return None
def __init__(self, port = 50051):
logging.basicConfig()
location = "localhost:" + str(port)
self.channel = grpc.insecure_channel(location)
# Main version check package
self.appInfo = AppInfo(self.channel)
try:
majorVersionOk = self.appInfo.majorVersion() == int(RiaVersionInfo.RESINSIGHT_MAJOR_VERSION)
minorVersionOk = self.appInfo.minorVersion() == int(RiaVersionInfo.RESINSIGHT_MINOR_VERSION)
if not (majorVersionOk and minorVersionOk):
raise Exception('Version of ResInsight does not match version of Python API')
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.UNAVAILABLE:
print('Info: Could not find any instances at port ' + str(port))
except Exception as e:
print('Error:', e)
# Service packages
self.commands = Commands(self.channel)
self.project = Project(self.channel)

View File

@@ -0,0 +1,45 @@
import grpc
import os
import sys
from .Case import Case
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
from Empty_pb2 import Empty
import Project_pb2
import Project_pb2_grpc
class Project:
def __init__(self, channel):
self.channel = channel
self.project = Project_pb2_grpc.ProjectStub(channel)
def selectedCases(self):
caseInfos = self.project.GetSelectedCases(Empty())
cases = []
for caseInfo in caseInfos.data:
cases.append(Case(self.channel, caseInfo.id))
return cases
def cases(self):
try:
caseInfos = self.project.GetAllCases(Empty())
cases = []
for caseInfo in caseInfos.data:
cases.append(Case(self.channel, caseInfo.id))
return cases
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
return []
else:
print("ERROR: ", e)
return []
def case(self, id):
try:
case = Case(self.channel, id)
return case
except grpc.RpcError as e:
return None

View File

@@ -0,0 +1,130 @@
import grpc
import os
import sys
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
import Properties_pb2
import Properties_pb2_grpc
import Case_pb2
import Case_pb2_grpc
class Properties:
def __init__(self, case):
self.case = case
self.propertiesStub = Properties_pb2_grpc.PropertiesStub(self.case.channel)
def generatePropertyInputIterator(self, values_iterator, parameters):
chunk = Properties_pb2.PropertyInputChunk()
chunk.params.CopyFrom(parameters)
yield chunk
for values in values_iterator:
valmsg = Properties_pb2.PropertyChunk(values = values)
chunk.values.CopyFrom(valmsg)
yield chunk
def generatePropertyInputChunks(self, array, parameters):
# Each double is 8 bytes. A good chunk size is 64KiB = 65536B
# Meaning ideal number of doubles would be 8192.
# However we need overhead space, so if we choose 8160 in chunk size
# We have 256B left for overhead which should be plenty
chunkSize = 8000
index = -1
while index < len(array):
chunk = Properties_pb2.PropertyInputChunk()
if index is -1:
chunk.params.CopyFrom(parameters)
index += 1;
else:
actualChunkSize = min(len(array) - index + 1, chunkSize)
chunk.values.CopyFrom(Properties_pb2.PropertyChunk(values = array[index:index+actualChunkSize]))
index += actualChunkSize
yield chunk
# Final empty message to signal completion
chunk = Properties_pb2.PropertyInputChunk()
yield chunk
def available(self, propertyType, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.AvailablePropertiesRequest (case_request = Case_pb2.CaseRequest(id=self.case.id),
property_type = propertyTypeEnum,
porosity_model = porosityModelEnum)
return self.propertiesStub.GetAvailableProperties(request).property_names
def activeCellProperty(self, propertyType, propertyName, timeStep, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.PropertyRequest(case_request = Case_pb2.CaseRequest(id=self.case.id),
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
porosity_model = porosityModelEnum)
for chunk in self.propertiesStub.GetActiveCellProperty(request):
yield chunk
def gridProperty(self, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.PropertyRequest(case_request = self.case.request,
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
return self.propertiesStub.GetGridProperty(request)
def setActiveCellPropertyAsync(self, values_iterator, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.PropertyRequest(case_request = self.case.request,
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
try:
reply_iterator = self.generatePropertyInputIterator(values_iterator, request)
self.propertiesStub.SetActiveCellProperty(reply_iterator)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error", e)
def setActiveCellProperty(self, values, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.PropertyRequest(case_request = self.case.request,
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
try:
request_iterator = self.generatePropertyInputChunks(values, request)
self.propertiesStub.SetActiveCellProperty(request_iterator)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error", e)
def setGridProperty(self, values, propertyType, propertyName, timeStep, gridIndex = 0, porosityModel = 'MATRIX_MODEL'):
propertyTypeEnum = Properties_pb2.PropertyType.Value(propertyType)
porosityModelEnum = Case_pb2.PorosityModelType.Value(porosityModel)
request = Properties_pb2.PropertyRequest(case_request = self.case.request,
property_type = propertyTypeEnum,
property_name = propertyName,
time_step = timeStep,
grid_index = gridIndex,
porosity_model = porosityModelEnum)
try:
request_iterator = self.generatePropertyInputChunks(values, request)
self.propertiesStub.SetGridProperty(request_iterator)
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found")
else:
print("Other error", e)

View File

@@ -0,0 +1,78 @@
import grpc
import os
import sys
import socket
import logging
sys.path.insert(1, os.path.join(sys.path[0], '../generated'))
import RiaVersionInfo
from AppInfo import AppInfo
from Commands import Commands
from Project import Project
class Instance:
@staticmethod
def is_port_in_use(port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(0.2)
return s.connect_ex(('localhost', port)) == 0
@staticmethod
def launch():
port = 50051
portEnv = os.environ.get('RESINSIGHT_GRPC_PORT')
if portEnv:
port = int(portEnv)
resInsightExecutable = os.environ.get('RESINSIGHT_EXECUTABLE')
if resInsightExecutable is None:
print('Error: Could not launch any ResInsight instances because RESINSIGHT_EXECUTABLE is not set')
return None
while Instance.is_port_in_use(port):
port += 1
print('Port ' + str(port))
print('Trying to launch', resInsightExecutable)
pid = os.spawnl(os.P_NOWAIT, resInsightExecutable, " --grpcserver " + str(port))
print(pid)
return Instance(port)
@staticmethod
def find(startPort = 50051, endPort = 50071):
portEnv = os.environ.get('RESINSIGHT_GRPC_PORT')
if portEnv:
startPort = int(portEnv)
endPort = startPort + 20
for tryPort in range(startPort, endPort):
if Instance.is_port_in_use(tryPort):
return Instance(tryPort)
print('Error: Could not find any ResInsight instances responding between ports ' + str(startPort) + ' and ' + str(endPort))
return None
def __init__(self, port = 50051):
logging.basicConfig()
location = "localhost:" + str(port)
self.channel = grpc.insecure_channel(location)
# Main version check package
self.appInfo = AppInfo(self.channel)
try:
majorVersionOk = self.appInfo.majorVersion() == int(RiaVersionInfo.RESINSIGHT_MAJOR_VERSION)
minorVersionOk = self.appInfo.minorVersion() == int(RiaVersionInfo.RESINSIGHT_MINOR_VERSION)
if not (majorVersionOk and minorVersionOk):
raise Exception('Version of ResInsight does not match version of Python API')
except grpc.RpcError as e:
if e.code() == grpc.StatusCode.UNAVAILABLE:
print('Info: Could not find any instances at port ' + str(port))
except Exception as e:
print('Error:', e)
# Service packages
self.commands = Commands(self.channel)
self.project = Project(self.channel)

View File

@@ -0,0 +1,5 @@
name = "rips"
from .Case import Case
from .Grid import Grid
from .Properties import Properties
from .Instance import Instance

View File

@@ -0,0 +1,21 @@
from setuptools import setup, find_packages
with open('README.md') as f:
readme = f.read()
with open('LICENSE') as f:
license = f.read()
RIPS_DIST_VERSION = '1'
setup(
name='rips',
version='@RESINSIGHT_MAJOR_VERSION@.@RESINSIGHT_MINOR_VERSION@.@RESINSIGHT_PATCH_VERSION@.' + RIPS_DIST_VERSION,
description='Python Interface for ResInsight',
long_description=readme,
author='Ceetron Solutions',
author_email='info@ceetronsolutions.com',
url='http://www.resinsight.org',
license=license,
packages=find_packages(exclude=('tests', 'docs', '__pycache', 'examples'))
)

View File

@@ -15,7 +15,7 @@
// for more details. // for more details.
// //
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
#include "RiaGrpcResInfoService.h" #include "RiaGrpcAppInfoService.h"
#include "RiaVersionInfo.h" #include "RiaVersionInfo.h"
#include "RiaGrpcCallbacks.h" #include "RiaGrpcCallbacks.h"
@@ -23,7 +23,7 @@
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcResInfoService::GetVersion(grpc::ServerContext* context, const rips::Empty* request, rips::Version* reply) grpc::Status RiaGrpcAppInfoService::GetVersion(grpc::ServerContext* context, const rips::Empty* request, rips::Version* reply)
{ {
reply->set_major_version(RESINSIGHT_MAJOR_VERSION); reply->set_major_version(RESINSIGHT_MAJOR_VERSION);
reply->set_minor_version(RESINSIGHT_MINOR_VERSION); reply->set_minor_version(RESINSIGHT_MINOR_VERSION);
@@ -34,11 +34,11 @@ grpc::Status RiaGrpcResInfoService::GetVersion(grpc::ServerContext* context, con
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<RiaGrpcCallbackInterface*> RiaGrpcResInfoService::createCallbacks() std::vector<RiaGrpcCallbackInterface*> RiaGrpcAppInfoService::createCallbacks()
{ {
typedef RiaGrpcResInfoService Self; typedef RiaGrpcAppInfoService Self;
return { new RiaGrpcUnaryCallback<Self, rips::Empty, rips::Version>(this, &Self::GetVersion, &Self::RequestGetVersion) }; return { new RiaGrpcUnaryCallback<Self, rips::Empty, rips::Version>(this, &Self::GetVersion, &Self::RequestGetVersion) };
} }
static bool RiaGrpcResInfoService_init = static bool RiaGrpcAppInfoService_init =
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcResInfoService>(typeid(RiaGrpcResInfoService).hash_code()); RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcAppInfoService>(typeid(RiaGrpcAppInfoService).hash_code());

View File

@@ -21,7 +21,7 @@
#include "RiaGrpcServiceInterface.h" #include "RiaGrpcServiceInterface.h"
#include "ResInfo.grpc.pb.h" #include "AppInfo.grpc.pb.h"
#include <grpcpp/grpcpp.h> #include <grpcpp/grpcpp.h>
#include <vector> #include <vector>
@@ -39,7 +39,7 @@ class PdmValueField;
class RiaGrpcCallbackInterface; class RiaGrpcCallbackInterface;
class RiaGrpcResInfoService : public rips::ResInfo::AsyncService, public RiaGrpcServiceInterface class RiaGrpcAppInfoService : public rips::AppInfo::AsyncService, public RiaGrpcServiceInterface
{ {
public: public:
grpc::Status GetVersion(grpc::ServerContext* context, const rips::Empty* request, rips::Version* reply) override; grpc::Status GetVersion(grpc::ServerContext* context, const rips::Empty* request, rips::Version* reply) override;

View File

@@ -15,8 +15,9 @@
// for more details. // for more details.
// //
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
#include "RiaGrpcGridInfoService.h" #include "RiaGrpcCaseService.h"
#include "RiaGrpcCallbacks.h" #include "RiaGrpcCallbacks.h"
#include "RiaSocketTools.h"
#include "RigActiveCellInfo.h" #include "RigActiveCellInfo.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
@@ -49,7 +50,7 @@ grpc::Status RiaActiveCellInfoStateHandler::init(const rips::CellInfoRequest* re
m_request = request; m_request = request;
m_porosityModel = RiaDefines::PorosityModelType(m_request->porosity_model()); m_porosityModel = RiaDefines::PorosityModelType(m_request->porosity_model());
RimCase* rimCase = RiaGrpcServiceInterface::findCase(m_request->case_id()); RimCase* rimCase = RiaGrpcServiceInterface::findCase(m_request->case_request().id());
m_eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase); m_eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase);
if (!m_eclipseCase) if (!m_eclipseCase)
@@ -213,7 +214,7 @@ grpc::Status RiaActiveCellInfoStateHandler::assignReply(rips::CellInfoArray* rep
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcGridInfoService::GetGridCount(grpc::ServerContext* context, const rips::Case* request, rips::GridCount* reply) grpc::Status RiaGrpcCaseService::GetGridCount(grpc::ServerContext* context, const rips::CaseRequest* request, rips::GridCount* reply)
{ {
RimCase* rimCase = findCase(request->id()); RimCase* rimCase = findCase(request->id());
@@ -230,36 +231,9 @@ grpc::Status RiaGrpcGridInfoService::GetGridCount(grpc::ServerContext* context,
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcGridInfoService::GetGridDimensions(grpc::ServerContext* context, grpc::Status RiaGrpcCaseService::GetCellCount(grpc::ServerContext* context, const rips::CellInfoRequest* request, rips::CellCount* reply)
const rips::Case* request,
rips::GridDimensions* reply)
{ {
RimCase* rimCase = findCase(request->id()); RimCase* rimCase = findCase(request->case_request().id());
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase);
if (eclipseCase)
{
size_t gridCount = eclipseCase->mainGrid()->gridCount();
for (size_t i = 0; i < gridCount; ++i)
{
const RigGridBase* grid = eclipseCase->mainGrid()->gridByIndex(i);
rips::Vec3i* dimensions = reply->add_dimensions();
dimensions->set_i((int)grid->cellCountI());
dimensions->set_j((int)grid->cellCountJ());
dimensions->set_k((int)grid->cellCountK());
}
return grpc::Status::OK;
}
return grpc::Status(grpc::NOT_FOUND, "Eclipse Case not found");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcGridInfoService::GetCellCount(grpc::ServerContext* context, const rips::CellInfoRequest* request, rips::CellCount* reply)
{
RimCase* rimCase = findCase(request->case_id());
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase); RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase);
if (eclipseCase) if (eclipseCase)
@@ -278,7 +252,7 @@ grpc::Status RiaGrpcGridInfoService::GetCellCount(grpc::ServerContext* context,
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status grpc::Status
RiaGrpcGridInfoService::GetTimeSteps(grpc::ServerContext* context, const rips::Case* request, rips::TimeStepDates* reply) RiaGrpcCaseService::GetTimeSteps(grpc::ServerContext* context, const rips::CaseRequest* request, rips::TimeStepDates* reply)
{ {
RimCase* rimCase = findCase(request->id()); RimCase* rimCase = findCase(request->id());
@@ -288,7 +262,7 @@ RiaGrpcGridInfoService::GetTimeSteps(grpc::ServerContext* context, const rips::C
std::vector<QDateTime> timeStepDates = eclipseCase->timeStepDates(); std::vector<QDateTime> timeStepDates = eclipseCase->timeStepDates();
for (QDateTime dateTime : timeStepDates) for (QDateTime dateTime : timeStepDates)
{ {
rips::TimeStepDate* date = reply->add_date(); rips::TimeStepDate* date = reply->add_dates();
date->set_year(dateTime.date().year()); date->set_year(dateTime.date().year());
date->set_month(dateTime.date().month()); date->set_month(dateTime.date().month());
date->set_day(dateTime.date().day()); date->set_day(dateTime.date().day());
@@ -301,10 +275,34 @@ RiaGrpcGridInfoService::GetTimeSteps(grpc::ServerContext* context, const rips::C
return grpc::Status(grpc::NOT_FOUND, "Eclipse Case not found"); return grpc::Status(grpc::NOT_FOUND, "Eclipse Case not found");
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcGridInfoService::GetCellInfoForActiveCells(grpc::ServerContext* context, grpc::Status
RiaGrpcCaseService::GetCaseInfo(grpc::ServerContext* context, const rips::CaseRequest* request, rips::CaseInfo* reply)
{
RimCase* rimCase = findCase(request->id());
if (rimCase)
{
qint64 caseId = rimCase->caseId();
qint64 caseGroupId = -1;
QString caseName, caseType;
RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId);
reply->set_id(caseId);
reply->set_group_id(caseGroupId);
reply->set_name(caseName.toStdString());
reply->set_type(caseType.toStdString());
return Status::OK;
}
return Status(grpc::NOT_FOUND, "No cases found");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcCaseService::GetCellInfoForActiveCells(grpc::ServerContext* context,
const rips::CellInfoRequest* request, const rips::CellInfoRequest* request,
rips::CellInfoArray* reply, rips::CellInfoArray* reply,
RiaActiveCellInfoStateHandler* stateHandler) RiaActiveCellInfoStateHandler* stateHandler)
@@ -315,17 +313,17 @@ grpc::Status RiaGrpcGridInfoService::GetCellInfoForActiveCells(grpc::ServerConte
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<RiaGrpcCallbackInterface*> RiaGrpcGridInfoService::createCallbacks() std::vector<RiaGrpcCallbackInterface*> RiaGrpcCaseService::createCallbacks()
{ {
typedef RiaGrpcGridInfoService Self; typedef RiaGrpcCaseService Self;
return {new RiaGrpcUnaryCallback<Self, Case, GridCount>(this, &Self::GetGridCount, &Self::RequestGetGridCount), return {new RiaGrpcUnaryCallback<Self, CaseRequest, GridCount>(this, &Self::GetGridCount, &Self::RequestGetGridCount),
new RiaGrpcUnaryCallback<Self, Case, GridDimensions>(this, &Self::GetGridDimensions, &Self::RequestGetGridDimensions),
new RiaGrpcUnaryCallback<Self, CellInfoRequest, CellCount>(this, &Self::GetCellCount, &Self::RequestGetCellCount), new RiaGrpcUnaryCallback<Self, CellInfoRequest, CellCount>(this, &Self::GetCellCount, &Self::RequestGetCellCount),
new RiaGrpcUnaryCallback<Self, Case, TimeStepDates>(this, &Self::GetTimeSteps, &Self::RequestGetTimeSteps), new RiaGrpcUnaryCallback<Self, CaseRequest, TimeStepDates>(this, &Self::GetTimeSteps, &Self::RequestGetTimeSteps),
new RiaGrpcUnaryCallback<Self, CaseRequest, CaseInfo>(this, &Self::GetCaseInfo, &Self::RequestGetCaseInfo),
new RiaGrpcServerStreamCallback<Self, CellInfoRequest, CellInfoArray, RiaActiveCellInfoStateHandler>( new RiaGrpcServerStreamCallback<Self, CellInfoRequest, CellInfoArray, RiaActiveCellInfoStateHandler>(
this, &Self::GetCellInfoForActiveCells, &Self::RequestGetCellInfoForActiveCells, new RiaActiveCellInfoStateHandler)}; this, &Self::GetCellInfoForActiveCells, &Self::RequestGetCellInfoForActiveCells, new RiaActiveCellInfoStateHandler)};
} }
static bool RiaGrpcGridInfoService_init = static bool RiaGrpcCaseService_init =
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcGridInfoService>(typeid(RiaGrpcGridInfoService).hash_code()); RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcCaseService>(typeid(RiaGrpcCaseService).hash_code());

View File

@@ -17,7 +17,7 @@
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
#pragma once #pragma once
#include "GridInfo.grpc.pb.h" #include "Case.grpc.pb.h"
#include "RiaGrpcServiceInterface.h" #include "RiaGrpcServiceInterface.h"
#include "RiaPorosityModel.h" #include "RiaPorosityModel.h"
@@ -26,7 +26,7 @@
namespace rips namespace rips
{ {
class Case; class CaseRequest;
} }
class RiaGrpcCallbackInterface; class RiaGrpcCallbackInterface;
@@ -66,13 +66,13 @@ protected:
// gRPC-service answering requests about grid information for a given case // gRPC-service answering requests about grid information for a given case
// //
//================================================================================================== //==================================================================================================
class RiaGrpcGridInfoService final : public rips::GridInfo::AsyncService, public RiaGrpcServiceInterface class RiaGrpcCaseService final : public rips::Case::AsyncService, public RiaGrpcServiceInterface
{ {
public: public:
grpc::Status GetGridCount(grpc::ServerContext* context, const rips::Case* request, rips::GridCount* reply) override; grpc::Status GetGridCount(grpc::ServerContext* context, const rips::CaseRequest* request, rips::GridCount* reply) override;
grpc::Status GetGridDimensions(grpc::ServerContext* context, const rips::Case* request, rips::GridDimensions* reply) override;
grpc::Status GetCellCount(grpc::ServerContext* context, const rips::CellInfoRequest* request, rips::CellCount* reply) override; grpc::Status GetCellCount(grpc::ServerContext* context, const rips::CellInfoRequest* request, rips::CellCount* reply) override;
grpc::Status GetTimeSteps(grpc::ServerContext* context, const rips::Case* request, rips::TimeStepDates* reply) override; grpc::Status GetTimeSteps(grpc::ServerContext* context, const rips::CaseRequest* request, rips::TimeStepDates* reply) override;
grpc::Status GetCaseInfo(grpc::ServerContext* context, const rips::CaseRequest* request, rips::CaseInfo* reply) override;
grpc::Status GetCellInfoForActiveCells(grpc::ServerContext* context, grpc::Status GetCellInfoForActiveCells(grpc::ServerContext* context,
const rips::CellInfoRequest* request, const rips::CellInfoRequest* request,

View File

@@ -0,0 +1,75 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor ASA
//
// 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 "RiaGrpcGridService.h"
#include "RiaGrpcCallbacks.h"
#include "RigEclipseCaseData.h"
#include "RigMainGrid.h"
#include "RimEclipseCase.h"
using namespace rips;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcGridService::GetDimensions(grpc::ServerContext* context,
const GridRequest* request,
GridDimensions* reply)
{
RimCase* rimCase = findCase(request->case_request().id());
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase);
if (eclipseCase)
{
size_t gridIndex = (size_t) request->grid_index();
if (gridIndex < eclipseCase->mainGrid()->gridCount())
{
const RigGridBase* grid = eclipseCase->mainGrid()->gridByIndex(gridIndex);
Vec3i* dimensions = new Vec3i;
dimensions->set_i((int)grid->cellCountI());
dimensions->set_j((int)grid->cellCountJ());
dimensions->set_k((int)grid->cellCountK());
reply->set_allocated_dimensions(dimensions);
return grpc::Status::OK;
}
return grpc::Status(grpc::NOT_FOUND, "Grid not found");
}
return grpc::Status(grpc::NOT_FOUND, "Eclipse Case not found");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RiaGrpcCallbackInterface*> RiaGrpcGridService::createCallbacks()
{
typedef RiaGrpcGridService Self;
return {
new RiaGrpcUnaryCallback<Self, GridRequest, GridDimensions>(
this, &Self::GetDimensions, &Self::RequestGetDimensions)
};
}
static bool RiaGrpcGridService_init =
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcGridService>(typeid(RiaGrpcGridService).hash_code());

View File

@@ -0,0 +1,30 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor ASA
//
// 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.
//
//////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "Grid.grpc.pb.h"
#include "RiaGrpcServiceInterface.h"
class RiaGrpcGridService final : public rips::Grid::AsyncService, public RiaGrpcServiceInterface
{
public:
grpc::Status GetDimensions(grpc::ServerContext* context, const rips::GridRequest* request, rips::GridDimensions* reply) override;
std::vector<RiaGrpcCallbackInterface*> createCallbacks() override;
};

View File

@@ -1,4 +1,4 @@
#include "RiaGrpcProjectInfoService.h" #include "RiaGrpcProjectService.h"
#include "RiaApplication.h" #include "RiaApplication.h"
#include "RiaGrpcCallbacks.h" #include "RiaGrpcCallbacks.h"
@@ -16,7 +16,7 @@
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include "CaseInfo.grpc.pb.h" #include "Case.grpc.pb.h"
using grpc::ServerCompletionQueue; using grpc::ServerCompletionQueue;
using grpc::ServerContext; using grpc::ServerContext;
@@ -27,7 +27,7 @@ using namespace rips;
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Status RiaGrpcProjectInfoService::CurrentCase(ServerContext* context, const rips::Empty* request, rips::Case* reply) Status RiaGrpcProjectService::GetCurrentCase(ServerContext* context, const rips::Empty* request, rips::CaseRequest* reply)
{ {
RimGridView* view = RiaApplication::instance()->activeGridView(); RimGridView* view = RiaApplication::instance()->activeGridView();
if (view) if (view)
@@ -45,56 +45,7 @@ Status RiaGrpcProjectInfoService::CurrentCase(ServerContext* context, const rips
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Status RiaGrpcProjectInfoService::CurrentCaseInfo(ServerContext* context, const rips::Empty* request, rips::CaseInfo* reply) Status RiaGrpcProjectService::GetSelectedCases(ServerContext* context, const rips::Empty* request, rips::CaseInfoArray* reply)
{
RimGridView* view = RiaApplication::instance()->activeGridView();
if (view)
{
RimCase* currentCase = view->ownerCase();
if (currentCase)
{
qint64 caseId = currentCase->caseId();
qint64 caseGroupId = -1;
QString caseName, caseType;
RiaSocketTools::getCaseInfoFromCase(currentCase, caseId, caseName, caseType, caseGroupId);
reply->set_id(caseId);
reply->set_group_id(caseGroupId);
reply->set_name(caseName.toStdString());
reply->set_type(caseType.toStdString());
return Status::OK;
}
}
return Status(grpc::NOT_FOUND, "No current case found");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status
RiaGrpcProjectInfoService::CaseInfoFromCase(grpc::ServerContext* context, const rips::Case* request, rips::CaseInfo* reply)
{
RimCase* rimCase = findCase(request->id());
if (rimCase)
{
qint64 caseId = rimCase->caseId();
qint64 caseGroupId = -1;
QString caseName, caseType;
RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId);
reply->set_id(caseId);
reply->set_group_id(caseGroupId);
reply->set_name(caseName.toStdString());
reply->set_type(caseType.toStdString());
return Status::OK;
}
return Status(grpc::NOT_FOUND, "No cases found");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Status RiaGrpcProjectInfoService::SelectedCases(ServerContext* context, const rips::Empty* request, rips::CaseInfos* reply)
{ {
std::vector<RimCase*> cases; std::vector<RimCase*> cases;
caf::SelectionManager::instance()->objectsByType(&cases); caf::SelectionManager::instance()->objectsByType(&cases);
@@ -111,7 +62,7 @@ Status RiaGrpcProjectInfoService::SelectedCases(ServerContext* context, const ri
QString caseName, caseType; QString caseName, caseType;
RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId); RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId);
rips::CaseInfo* caseInfo = reply->add_case_info(); rips::CaseInfo* caseInfo = reply->add_data();
caseInfo->set_id(caseId); caseInfo->set_id(caseId);
caseInfo->set_group_id(caseGroupId); caseInfo->set_group_id(caseGroupId);
caseInfo->set_name(caseName.toStdString()); caseInfo->set_name(caseName.toStdString());
@@ -124,7 +75,7 @@ Status RiaGrpcProjectInfoService::SelectedCases(ServerContext* context, const ri
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status grpc::Status
RiaGrpcProjectInfoService::AllCaseGroups(grpc::ServerContext* context, const rips::Empty* request, rips::CaseGroups* reply) RiaGrpcProjectService::GetAllCaseGroups(grpc::ServerContext* context, const rips::Empty* request, rips::CaseGroups* reply)
{ {
RimProject* proj = RiaApplication::instance()->project(); RimProject* proj = RiaApplication::instance()->project();
RimEclipseCaseCollection* analysisModels = RimEclipseCaseCollection* analysisModels =
@@ -133,7 +84,7 @@ grpc::Status
{ {
for (RimIdenticalGridCaseGroup* cg : analysisModels->caseGroups()) for (RimIdenticalGridCaseGroup* cg : analysisModels->caseGroups())
{ {
rips::CaseGroup* caseGroup = reply->add_case_group(); rips::CaseGroup* caseGroup = reply->add_case_groups();
caseGroup->set_id(cg->groupId()); caseGroup->set_id(cg->groupId());
caseGroup->set_name(cg->name().toStdString()); caseGroup->set_name(cg->name().toStdString());
} }
@@ -145,7 +96,7 @@ grpc::Status
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcProjectInfoService::AllCases(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfos* reply) grpc::Status RiaGrpcProjectService::GetAllCases(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfoArray* reply)
{ {
std::vector<RimCase*> cases; std::vector<RimCase*> cases;
RiaApplication::instance()->project()->allCases(cases); RiaApplication::instance()->project()->allCases(cases);
@@ -162,7 +113,7 @@ grpc::Status RiaGrpcProjectInfoService::AllCases(grpc::ServerContext* context, c
QString caseName, caseType; QString caseName, caseType;
RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId); RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId);
rips::CaseInfo* caseInfo = reply->add_case_info(); rips::CaseInfo* caseInfo = reply->add_data();
caseInfo->set_id(caseId); caseInfo->set_id(caseId);
caseInfo->set_group_id(caseGroupId); caseInfo->set_group_id(caseGroupId);
caseInfo->set_name(caseName.toStdString()); caseInfo->set_name(caseName.toStdString());
@@ -175,7 +126,7 @@ grpc::Status RiaGrpcProjectInfoService::AllCases(grpc::ServerContext* context, c
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status grpc::Status
RiaGrpcProjectInfoService::CasesInGroup(grpc::ServerContext* context, const rips::CaseGroup* request, rips::CaseInfos* reply) RiaGrpcProjectService::GetCasesInGroup(grpc::ServerContext* context, const rips::CaseGroup* request, rips::CaseInfoArray* reply)
{ {
RimProject* proj = RiaApplication::instance()->project(); RimProject* proj = RiaApplication::instance()->project();
RimEclipseCaseCollection* analysisModels = RimEclipseCaseCollection* analysisModels =
@@ -217,7 +168,7 @@ grpc::Status
QString caseName, caseType; QString caseName, caseType;
RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId); RiaSocketTools::getCaseInfoFromCase(rimCase, caseId, caseName, caseType, caseGroupId);
rips::CaseInfo* caseInfo = reply->add_case_info(); rips::CaseInfo* caseInfo = reply->add_data();
caseInfo->set_id(caseId); caseInfo->set_id(caseId);
caseInfo->set_group_id(caseGroupId); caseInfo->set_group_id(caseGroupId);
caseInfo->set_name(caseName.toStdString()); caseInfo->set_name(caseName.toStdString());
@@ -231,19 +182,17 @@ grpc::Status
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::vector<RiaGrpcCallbackInterface*> RiaGrpcProjectInfoService::createCallbacks() std::vector<RiaGrpcCallbackInterface*> RiaGrpcProjectService::createCallbacks()
{ {
typedef RiaGrpcProjectInfoService Self; typedef RiaGrpcProjectService Self;
return { return {
new RiaGrpcUnaryCallback<Self, Empty, Case>(this, &Self::CurrentCase, &Self::RequestCurrentCase), new RiaGrpcUnaryCallback<Self, Empty, CaseRequest>(this, &Self::GetCurrentCase, &Self::RequestGetCurrentCase),
new RiaGrpcUnaryCallback<Self, Empty, CaseInfo>(this, &Self::CurrentCaseInfo, &Self::RequestCurrentCaseInfo), new RiaGrpcUnaryCallback<Self, Empty, CaseInfoArray>(this, &Self::GetSelectedCases, &Self::RequestGetSelectedCases),
new RiaGrpcUnaryCallback<Self, Case, CaseInfo>(this, &Self::CaseInfoFromCase, &Self::RequestCaseInfoFromCase), new RiaGrpcUnaryCallback<Self, Empty, CaseGroups>(this, &Self::GetAllCaseGroups, &Self::RequestGetAllCaseGroups),
new RiaGrpcUnaryCallback<Self, Empty, CaseInfos>(this, &Self::SelectedCases, &Self::RequestSelectedCases), new RiaGrpcUnaryCallback<Self, Empty, CaseInfoArray>(this, &Self::GetAllCases, &Self::RequestGetAllCases),
new RiaGrpcUnaryCallback<Self, Empty, CaseGroups>(this, &Self::AllCaseGroups, &Self::RequestAllCaseGroups), new RiaGrpcUnaryCallback<Self, CaseGroup, CaseInfoArray>(this, &Self::GetCasesInGroup, &Self::RequestGetCasesInGroup)};
new RiaGrpcUnaryCallback<Self, Empty, CaseInfos>(this, &Self::AllCases, &Self::RequestAllCases),
new RiaGrpcUnaryCallback<Self, CaseGroup, CaseInfos>(this, &Self::CasesInGroup, &Self::RequestCasesInGroup)};
} }
static bool RiaGrpcProjectInfoService_init = static bool RiaGrpcProjectService_init =
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcProjectInfoService>(typeid(RiaGrpcProjectInfoService).hash_code()); RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcProjectService>(typeid(RiaGrpcProjectService).hash_code());

View File

@@ -17,7 +17,7 @@
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
#pragma once #pragma once
#include "ProjectInfo.grpc.pb.h" #include "Project.grpc.pb.h"
#include "RiaGrpcServiceInterface.h" #include "RiaGrpcServiceInterface.h"
#include <grpcpp/grpcpp.h> #include <grpcpp/grpcpp.h>
@@ -25,7 +25,7 @@
namespace rips namespace rips
{ {
class Empty; class Empty;
class CaseInfo; class CaseRequest;
} // namespace rips } // namespace rips
class RiaGrpcCallbackInterface; class RiaGrpcCallbackInterface;
@@ -35,16 +35,14 @@ class RiaGrpcCallbackInterface;
// gRPC-service answering requests about project information // gRPC-service answering requests about project information
// //
//================================================================================================== //==================================================================================================
class RiaGrpcProjectInfoService final : public rips::ProjectInfo::AsyncService, public RiaGrpcServiceInterface class RiaGrpcProjectService final : public rips::Project::AsyncService, public RiaGrpcServiceInterface
{ {
public: public:
grpc::Status CurrentCase(grpc::ServerContext* context, const rips::Empty* request, rips::Case* reply) override; grpc::Status GetCurrentCase(grpc::ServerContext* context, const rips::Empty* request, rips::CaseRequest* reply) override;
grpc::Status CurrentCaseInfo(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfo* reply) override; grpc::Status GetSelectedCases(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfoArray* reply) override;
grpc::Status CaseInfoFromCase(grpc::ServerContext* context, const rips::Case* request, rips::CaseInfo* reply) override; grpc::Status GetAllCaseGroups(grpc::ServerContext* context, const rips::Empty* request, rips::CaseGroups* reply) override;
grpc::Status SelectedCases(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfos* reply) override; grpc::Status GetAllCases(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfoArray* reply) override;
grpc::Status AllCaseGroups(grpc::ServerContext* context, const rips::Empty* request, rips::CaseGroups* reply) override; grpc::Status GetCasesInGroup(grpc::ServerContext* context, const rips::CaseGroup* request, rips::CaseInfoArray* reply) override;
grpc::Status AllCases(grpc::ServerContext* context, const rips::Empty* request, rips::CaseInfos* reply) override;
grpc::Status CasesInGroup(grpc::ServerContext* context, const rips::CaseGroup* request, rips::CaseInfos* reply) override;
public: public:
std::vector<RiaGrpcCallbackInterface*> createCallbacks() override; std::vector<RiaGrpcCallbackInterface*> createCallbacks() override;

View File

@@ -18,7 +18,7 @@
#include "RiaGrpcPropertiesService.h" #include "RiaGrpcPropertiesService.h"
#include "RiaGrpcCallbacks.h" #include "RiaGrpcCallbacks.h"
#include "RiaGrpcGridInfoService.h" #include "RiaGrpcCaseService.h"
#include "RigActiveCellInfo.h" #include "RigActiveCellInfo.h"
#include "RigActiveCellsResultAccessor.h" #include "RigActiveCellsResultAccessor.h"
@@ -61,9 +61,9 @@ public:
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Status init(const ResultRequest* request) Status init(const PropertyRequest* request)
{ {
int caseId = request->request_case().id(); int caseId = request->case_request().id();
m_eclipseCase = dynamic_cast<RimEclipseCase*>(RiaGrpcServiceInterface::findCase(caseId)); m_eclipseCase = dynamic_cast<RimEclipseCase*>(RiaGrpcServiceInterface::findCase(caseId));
if (m_eclipseCase) if (m_eclipseCase)
@@ -110,21 +110,21 @@ public:
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// Client streamers need to be initialised with the encapsulated parameters /// Client streamers need to be initialised with the encapsulated parameters
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Status init(const ResultRequestChunk* request) Status init(const PropertyInputChunk* chunk)
{ {
if (request->has_params()) if (chunk->has_params())
{ {
return init(&(request->params())); return init(&(chunk->params()));
} }
return grpc::Status(grpc::INVALID_ARGUMENT, "Need to have ResultRequest parameters in first message"); return grpc::Status(grpc::INVALID_ARGUMENT, "Need to have PropertyRequest parameters in first message");
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Status assignStreamReply(ResultArray* reply) Status assignStreamReply(PropertyChunk* reply)
{ {
const size_t packageSize = RiaGrpcServiceInterface::numberOfMessagesForByteCount(sizeof(rips::ResultArray)); const size_t packageSize = RiaGrpcServiceInterface::numberOfMessagesForByteCount(sizeof(rips::PropertyChunk));
size_t packageIndex = 0u; size_t packageIndex = 0u;
reply->mutable_values()->Reserve((int)packageSize); reply->mutable_values()->Reserve((int)packageSize);
for (; packageIndex < packageSize && m_currentCellIdx < m_cellCount; ++packageIndex, ++m_currentCellIdx) for (; packageIndex < packageSize && m_currentCellIdx < m_cellCount; ++packageIndex, ++m_currentCellIdx)
@@ -142,7 +142,7 @@ public:
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
Status receiveStreamRequest(const ResultRequestChunk* request) Status receiveStreamRequest(const PropertyInputChunk* request)
{ {
if (request->has_values()) if (request->has_values())
{ {
@@ -183,7 +183,7 @@ protected:
virtual void setCellResult(size_t currentCellIndex, double value) = 0; virtual void setCellResult(size_t currentCellIndex, double value) = 0;
protected: protected:
const rips::ResultRequest* m_request; const rips::PropertyRequest* m_request;
RimEclipseCase* m_eclipseCase; RimEclipseCase* m_eclipseCase;
size_t m_currentCellIdx; size_t m_currentCellIdx;
size_t m_cellCount; size_t m_cellCount;
@@ -263,11 +263,11 @@ private:
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::GetAvailableProperties(grpc::ServerContext* context, grpc::Status RiaGrpcPropertiesService::GetAvailableProperties(grpc::ServerContext* context,
const PropertiesRequest* request, const AvailablePropertiesRequest* request,
AvailableProperties* reply) AvailableProperties* reply)
{ {
int caseId = request->request_case().id(); int caseId = request->case_request().id();
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(RiaGrpcServiceInterface::findCase(caseId)); RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(RiaGrpcServiceInterface::findCase(caseId));
if (eclipseCase) if (eclipseCase)
{ {
@@ -291,9 +291,9 @@ grpc::Status RiaGrpcPropertiesService::GetAvailableProperties(grpc::ServerContex
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::GetActiveCellResults(grpc::ServerContext* context, grpc::Status RiaGrpcPropertiesService::GetActiveCellProperty(grpc::ServerContext* context,
const ResultRequest* request, const PropertyRequest* request,
ResultArray* reply, PropertyChunk* reply,
RiaActiveCellResultsStateHandler* stateHandler) RiaActiveCellResultsStateHandler* stateHandler)
{ {
return stateHandler->assignStreamReply(reply); return stateHandler->assignStreamReply(reply);
@@ -303,9 +303,9 @@ grpc::Status RiaGrpcPropertiesService::GetActiveCellResults(grpc::ServerContext*
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::GetGridResults(grpc::ServerContext* context, grpc::Status RiaGrpcPropertiesService::GetGridProperty(grpc::ServerContext* context,
const rips::ResultRequest* request, const rips::PropertyRequest* request,
rips::ResultArray* reply, rips::PropertyChunk* reply,
RiaGridCellResultsStateHandler* stateHandler) RiaGridCellResultsStateHandler* stateHandler)
{ {
return stateHandler->assignStreamReply(reply); return stateHandler->assignStreamReply(reply);
@@ -314,8 +314,8 @@ grpc::Status RiaGrpcPropertiesService::GetGridResults(grpc::ServerContext*
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::SetActiveCellResults(grpc::ServerContext* context, grpc::Status RiaGrpcPropertiesService::SetActiveCellProperty(grpc::ServerContext* context,
const rips::ResultRequestChunk* request, const rips::PropertyInputChunk* request,
rips::Empty* reply, rips::Empty* reply,
RiaActiveCellResultsStateHandler* stateHandler) RiaActiveCellResultsStateHandler* stateHandler)
{ {
@@ -326,8 +326,8 @@ grpc::Status RiaGrpcPropertiesService::SetActiveCellResults(grpc::ServerContext*
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::SetGridResults(grpc::ServerContext* context, grpc::Status RiaGrpcPropertiesService::SetGridProperty(grpc::ServerContext* context,
const rips::ResultRequestChunk* request, const rips::PropertyInputChunk* request,
rips::Empty* reply, rips::Empty* reply,
RiaGridCellResultsStateHandler* stateHandler) RiaGridCellResultsStateHandler* stateHandler)
{ {
@@ -340,16 +340,16 @@ std::vector<RiaGrpcCallbackInterface*> RiaGrpcPropertiesService::createCallbacks
{ {
typedef RiaGrpcPropertiesService Self; typedef RiaGrpcPropertiesService Self;
return {new RiaGrpcUnaryCallback<Self, PropertiesRequest, AvailableProperties>( return {new RiaGrpcUnaryCallback<Self, AvailablePropertiesRequest, AvailableProperties>(
this, &Self::GetAvailableProperties, &Self::RequestGetAvailableProperties), this, &Self::GetAvailableProperties, &Self::RequestGetAvailableProperties),
new RiaGrpcServerStreamCallback<Self, ResultRequest, ResultArray, RiaActiveCellResultsStateHandler>( new RiaGrpcServerStreamCallback<Self, PropertyRequest, PropertyChunk, RiaActiveCellResultsStateHandler>(
this, &Self::GetActiveCellResults, &Self::RequestGetActiveCellResults, new RiaActiveCellResultsStateHandler), this, &Self::GetActiveCellProperty, &Self::RequestGetActiveCellProperty, new RiaActiveCellResultsStateHandler),
new RiaGrpcServerStreamCallback<Self, ResultRequest, ResultArray, RiaGridCellResultsStateHandler>( new RiaGrpcServerStreamCallback<Self, PropertyRequest, PropertyChunk, RiaGridCellResultsStateHandler>(
this, &Self::GetGridResults, &Self::RequestGetGridResults, new RiaGridCellResultsStateHandler), this, &Self::GetGridProperty, &Self::RequestGetGridProperty, new RiaGridCellResultsStateHandler),
new RiaGrpcClientStreamCallback<Self, ResultRequestChunk, Empty, RiaActiveCellResultsStateHandler>( new RiaGrpcClientStreamCallback<Self, PropertyInputChunk, Empty, RiaActiveCellResultsStateHandler>(
this, &Self::SetActiveCellResults, &Self::RequestSetActiveCellResults, new RiaActiveCellResultsStateHandler(true)), this, &Self::SetActiveCellProperty, &Self::RequestSetActiveCellProperty, new RiaActiveCellResultsStateHandler(true)),
new RiaGrpcClientStreamCallback<Self, ResultRequestChunk, Empty, RiaGridCellResultsStateHandler>( new RiaGrpcClientStreamCallback<Self, PropertyInputChunk, Empty, RiaGridCellResultsStateHandler>(
this, &Self::SetGridResults, &Self::RequestSetGridResults, new RiaGridCellResultsStateHandler(true)) this, &Self::SetGridProperty, &Self::RequestSetGridProperty, new RiaGridCellResultsStateHandler(true))
}; };
} }

View File

@@ -34,25 +34,25 @@ class RiaGridCellResultsStateHandler;
class RiaGrpcPropertiesService final : public rips::Properties::AsyncService, public RiaGrpcServiceInterface class RiaGrpcPropertiesService final : public rips::Properties::AsyncService, public RiaGrpcServiceInterface
{ {
public: public:
grpc::Status GetAvailableProperties(grpc::ServerContext* context, grpc::Status GetAvailableProperties(grpc::ServerContext* context,
const rips::PropertiesRequest* request, const rips::AvailablePropertiesRequest* request,
rips::AvailableProperties* reply) override; rips::AvailableProperties* reply) override;
grpc::Status GetActiveCellResults(grpc::ServerContext* context, grpc::Status GetActiveCellProperty(grpc::ServerContext* context,
const rips::ResultRequest* request, const rips::PropertyRequest* request,
rips::ResultArray* reply, rips::PropertyChunk* reply,
RiaActiveCellResultsStateHandler* stateHandler); RiaActiveCellResultsStateHandler* stateHandler);
grpc::Status GetGridResults(grpc::ServerContext* context, grpc::Status GetGridProperty(grpc::ServerContext* context,
const rips::ResultRequest* request, const rips::PropertyRequest* request,
rips::ResultArray* reply, rips::PropertyChunk* reply,
RiaGridCellResultsStateHandler* stateHandler); RiaGridCellResultsStateHandler* stateHandler);
grpc::Status SetActiveCellResults(grpc::ServerContext* context, grpc::Status SetActiveCellProperty(grpc::ServerContext* context,
const rips::ResultRequestChunk* request, const rips::PropertyInputChunk* chunk,
rips::Empty* reply, rips::Empty* reply,
RiaActiveCellResultsStateHandler* stateHandler); RiaActiveCellResultsStateHandler* stateHandler);
grpc::Status SetGridResults(grpc::ServerContext* context, grpc::Status SetGridProperty(grpc::ServerContext* context,
const rips::ResultRequestChunk* request, const rips::PropertyInputChunk* chunk,
rips::Empty* reply, rips::Empty* reply,
RiaGridCellResultsStateHandler* stateHandler); RiaGridCellResultsStateHandler* stateHandler);
std::vector<RiaGrpcCallbackInterface*> createCallbacks() override; std::vector<RiaGrpcCallbackInterface*> createCallbacks() override;
}; };

View File

@@ -23,7 +23,7 @@
#include "RiaGrpcCallbacks.h" #include "RiaGrpcCallbacks.h"
#include "RiaGrpcServiceInterface.h" #include "RiaGrpcServiceInterface.h"
#include "RiaGrpcGridInfoService.h" #include "RiaGrpcCaseService.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
#include "RigMainGrid.h" #include "RigMainGrid.h"

View File

@@ -57,6 +57,15 @@ ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions-Test.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection-Test.cpp
) )
if (RESINSIGHT_ENABLE_GRPC)
list(APPEND GPRC_UNIT_TEST_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcInterface-Test.cpp
)
list(APPEND SOURCE_GROUP_SOURCE_FILES
${GRPC_UNIT_TEST_SOURCE_FILES}
)
endif(RESINSIGHT_ENABLE_GRPC)
list(APPEND CODE_HEADER_FILES list(APPEND CODE_HEADER_FILES
${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_HEADER_FILES}
) )

View File

@@ -0,0 +1,68 @@
#include "gtest/gtest.h"
#include <grpc/grpc.h>
#include <grpcpp/channel.h>
#include <grpcpp/client_context.h>
#include <grpcpp/create_channel.h>
#include <grpcpp/security/credentials.h>
#include <numeric>
#include <memory>
#include "Properties.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::ClientReader;
using grpc::ClientReaderWriter;
using grpc::ClientWriter;
using grpc::Status;
class PropertiesClient
{
public:
PropertiesClient(std::shared_ptr<Channel> channel)
: m_stub(rips::Properties::NewStub(channel))
{
}
Status GetActiveCellProperty(rips::PropertyType propType, const std::string& propertyName, int timeStep, std::vector<double>* results) const
{
rips::PropertyRequest request;
rips::CaseRequest* requestCase = new rips::CaseRequest;
requestCase->set_id(0);
request.set_allocated_case_request(requestCase);
request.set_grid_index(0);
request.set_porosity_model(rips::PorosityModelType::MATRIX_MODEL);
request.set_property_type(propType);
request.set_property_name(propertyName);
request.set_time_step(timeStep);
rips::PropertyChunk resultArray;
ClientContext context;
std::unique_ptr<ClientReader<rips::PropertyChunk>> reader = m_stub->GetActiveCellProperty(&context, request);
while (reader->Read(&resultArray))
{
results->insert(results->end(), resultArray.values().begin(), resultArray.values().end());
}
return reader->Finish();
}
private:
std::unique_ptr<rips::Properties::Stub> m_stub;
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST(DISABLED_RiaGrpcInterface, SoilAverage)
{
PropertiesClient client(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));
for (size_t i = 0; i < 10; ++i)
{
std::vector<double> results;
Status status = client.GetActiveCellProperty(rips::PropertyType::DYNAMIC_NATIVE, "SOIL", i, &results);
std::cout << "Number of results: " << results.size() << std::endl;
double sum = std::accumulate(results.begin(), results.end(), 0.0);
std::cout << "Avg: " << sum / static_cast<double>(results.size()) << std::endl;
EXPECT_EQ(grpc::OK, status.error_code());
}
}