mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
133 lines
7.1 KiB
Python
133 lines
7.1 KiB
Python
import grpc
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../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)
|
|
for chunk in self.propertiesStub.GetGridProperty(request):
|
|
yield chunk
|
|
|
|
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)
|