mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#4477 Add python methods to get NNC connection and available properties
Equivalent to GetNNCPropertyNames and GetNNCConnections in Octave.
This commit is contained in:
parent
795c29bfb3
commit
1a05430123
@ -13,6 +13,7 @@ set ( SOURCE_GROUP_HEADER_FILES
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.h
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcAppService.h
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcAppService.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.h
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcNNCPropertiesService.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPdmObjectService.h
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPdmObjectService.h
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -27,6 +28,7 @@ set ( SOURCE_GROUP_SOURCE_FILES
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcCommandService.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcAppService.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcAppService.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPropertiesService.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcNNCPropertiesService.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPdmObjectService.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RiaGrpcPdmObjectService.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -88,6 +90,7 @@ set(PROTO_FILES
|
|||||||
"SimulationWell"
|
"SimulationWell"
|
||||||
"Project"
|
"Project"
|
||||||
"Commands"
|
"Commands"
|
||||||
|
"NNCProperties"
|
||||||
"App"
|
"App"
|
||||||
"Properties"
|
"Properties"
|
||||||
"Grid"
|
"Grid"
|
||||||
|
43
ApplicationCode/GrpcInterface/GrpcProtos/NNCProperties.proto
Normal file
43
ApplicationCode/GrpcInterface/GrpcProtos/NNCProperties.proto
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
import "Case.proto";
|
||||||
|
import "Definitions.proto";
|
||||||
|
|
||||||
|
package rips;
|
||||||
|
|
||||||
|
service NNCProperties
|
||||||
|
{
|
||||||
|
rpc GetAvailableNNCProperties(CaseRequest) returns (AvailableNNCProperties) {}
|
||||||
|
rpc GetNNCConnections(CaseRequest) returns (stream NNCConnections) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum NNCPropertyType
|
||||||
|
{
|
||||||
|
NNC_DYNAMIC = 0;
|
||||||
|
NNC_STATIC = 1;
|
||||||
|
NNC_GENERATED = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AvailableNNCProperty
|
||||||
|
{
|
||||||
|
string name = 1;
|
||||||
|
NNCPropertyType property_type = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AvailableNNCProperties
|
||||||
|
{
|
||||||
|
repeated AvailableNNCProperty properties = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message NNCConnection
|
||||||
|
{
|
||||||
|
int32 cell_grid_index1 = 1;
|
||||||
|
int32 cell_grid_index2 = 2;
|
||||||
|
Vec3i cell1 = 3;
|
||||||
|
Vec3i cell2 = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message NNCConnections
|
||||||
|
{
|
||||||
|
repeated NNCConnection connections = 1;
|
||||||
|
}
|
@ -17,6 +17,9 @@ import rips.generated.PdmObject_pb2 as PdmObject_pb2
|
|||||||
import rips.generated.Properties_pb2 as Properties_pb2
|
import rips.generated.Properties_pb2 as Properties_pb2
|
||||||
import rips.generated.Properties_pb2_grpc as Properties_pb2_grpc
|
import rips.generated.Properties_pb2_grpc as Properties_pb2_grpc
|
||||||
|
|
||||||
|
import rips.generated.NNCProperties_pb2 as NNCProperties_pb2
|
||||||
|
import rips.generated.NNCProperties_pb2_grpc as NNCProperties_pb2_grpc
|
||||||
|
|
||||||
from rips.grid import Grid
|
from rips.grid import Grid
|
||||||
from rips.pdmobject import PdmObject
|
from rips.pdmobject import PdmObject
|
||||||
from rips.view import View
|
from rips.view import View
|
||||||
@ -50,6 +53,8 @@ class Case(PdmObject):
|
|||||||
info = self.__case_stub.GetCaseInfo(self.__request)
|
info = self.__case_stub.GetCaseInfo(self.__request)
|
||||||
self.__properties_stub = Properties_pb2_grpc.PropertiesStub(
|
self.__properties_stub = Properties_pb2_grpc.PropertiesStub(
|
||||||
self.__channel)
|
self.__channel)
|
||||||
|
self.__nnc_properties_stub = NNCProperties_pb2_grpc.NNCPropertiesStub(
|
||||||
|
self.__channel)
|
||||||
PdmObject.__init__(self, self.__case_stub.GetPdmObject(self.__request),
|
PdmObject.__init__(self, self.__case_stub.GetPdmObject(self.__request),
|
||||||
self.__channel, project)
|
self.__channel, project)
|
||||||
|
|
||||||
@ -980,3 +985,31 @@ class Case(PdmObject):
|
|||||||
for each entry.
|
for each entry.
|
||||||
"""
|
"""
|
||||||
return self.__case_stub.GetCoarseningInfoArray(self.__request).data
|
return self.__case_stub.GetCoarseningInfoArray(self.__request).data
|
||||||
|
|
||||||
|
|
||||||
|
def available_nnc_properties(self):
|
||||||
|
"""Get a list of available NNC properties
|
||||||
|
"""
|
||||||
|
return self.__nnc_properties_stub.GetAvailableNNCProperties(self.__request).properties
|
||||||
|
|
||||||
|
|
||||||
|
def nnc_connections_async(self):
|
||||||
|
"""Get the NNC connections. Async, so returns an iterator.
|
||||||
|
Returns:
|
||||||
|
An iterator to a chunk object containing an array NNCConnection objects.
|
||||||
|
Loop through the chunks and then the connection within the chunk to get all connections.
|
||||||
|
"""
|
||||||
|
return self.__nnc_properties_stub.GetNNCConnections(self.__request)
|
||||||
|
|
||||||
|
def nnc_connections(self):
|
||||||
|
"""Get the NNC connection. Synchronous, so returns a list.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of NNCConnection objects.
|
||||||
|
"""
|
||||||
|
connections = []
|
||||||
|
generator = self.nnc_connections_async()
|
||||||
|
for chunk in generator:
|
||||||
|
for value in chunk.connections:
|
||||||
|
connections.append(value)
|
||||||
|
return connections
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import grpc
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
import rips.generated.NNCProperties_pb2 as NNCProperties_pb2
|
||||||
|
|
||||||
|
sys.path.insert(1, os.path.join(sys.path[0], '../../'))
|
||||||
|
import rips
|
||||||
|
|
||||||
|
import dataroot
|
||||||
|
|
||||||
|
|
||||||
|
def test_10kSync(rips_instance, initialize_test):
|
||||||
|
casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
|
||||||
|
case = rips_instance.project.load_case(path=casePath)
|
||||||
|
|
||||||
|
properties = case.available_nnc_properties()
|
||||||
|
assert(len(properties) == 3)
|
||||||
|
|
||||||
|
assert("TRAN" == properties[0].name)
|
||||||
|
assert(NNCProperties_pb2.NNCPropertyType.NNC_STATIC == properties[0].property_type)
|
||||||
|
assert("Binary Formation Allen" == properties[1].name)
|
||||||
|
assert(NNCProperties_pb2.NNCPropertyType.NNC_GENERATED == properties[1].property_type)
|
||||||
|
assert("Formation Allen" == properties[2].name)
|
||||||
|
assert(NNCProperties_pb2.NNCPropertyType.NNC_GENERATED == properties[2].property_type)
|
||||||
|
|
||||||
|
nnc_connections = case.nnc_connections()
|
||||||
|
assert(len(nnc_connections) == 84759)
|
||||||
|
|
||||||
|
connection = nnc_connections[0]
|
||||||
|
assert(connection.cell1.i == 33)
|
||||||
|
assert(connection.cell1.j == 40)
|
||||||
|
assert(connection.cell1.k == 14)
|
||||||
|
assert(connection.cell_grid_index1 == 0)
|
181
ApplicationCode/GrpcInterface/RiaGrpcNNCPropertiesService.cpp
Normal file
181
ApplicationCode/GrpcInterface/RiaGrpcNNCPropertiesService.cpp
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2020- 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 "RiaGrpcNNCPropertiesService.h"
|
||||||
|
|
||||||
|
#include "RiaGrpcCallbacks.h"
|
||||||
|
#include "RiaGrpcCaseService.h"
|
||||||
|
|
||||||
|
#include "RigCaseCellResultsData.h"
|
||||||
|
#include "RigEclipseCaseData.h"
|
||||||
|
#include "RigEclipseResultAddress.h"
|
||||||
|
#include "RigEclipseResultInfo.h"
|
||||||
|
#include "RigMainGrid.h"
|
||||||
|
#include "RimEclipseCase.h"
|
||||||
|
|
||||||
|
using namespace rips;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RiaNNCConnectionsStateHandler::RiaNNCConnectionsStateHandler()
|
||||||
|
: m_request( nullptr )
|
||||||
|
, m_eclipseCase( nullptr )
|
||||||
|
, m_currentIdx( 0u )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
grpc::Status RiaNNCConnectionsStateHandler::init( const rips::CaseRequest* request )
|
||||||
|
{
|
||||||
|
CAF_ASSERT( request );
|
||||||
|
m_request = request;
|
||||||
|
|
||||||
|
RimCase* rimCase = RiaGrpcServiceInterface::findCase( m_request->id() );
|
||||||
|
m_eclipseCase = dynamic_cast<RimEclipseCase*>( rimCase );
|
||||||
|
|
||||||
|
if ( !( m_eclipseCase && m_eclipseCase->eclipseCaseData() && m_eclipseCase->eclipseCaseData()->mainGrid() ) )
|
||||||
|
{
|
||||||
|
return grpc::Status( grpc::NOT_FOUND, "Eclipse Case not found" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return grpc::Status::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
rips::Vec3i* createConnectionVec3i( const RigCell& cell )
|
||||||
|
{
|
||||||
|
RigGridBase* hostGrid = cell.hostGrid();
|
||||||
|
size_t gridLocalCellIndex = cell.gridLocalCellIndex();
|
||||||
|
size_t i, j, k;
|
||||||
|
hostGrid->ijkFromCellIndex( gridLocalCellIndex, &i, &j, &k );
|
||||||
|
|
||||||
|
rips::Vec3i* vec = new rips::Vec3i;
|
||||||
|
vec->set_i( i );
|
||||||
|
vec->set_j( j );
|
||||||
|
vec->set_k( k );
|
||||||
|
|
||||||
|
return vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
grpc::Status RiaNNCConnectionsStateHandler::assignReply( rips::NNCConnections* reply )
|
||||||
|
{
|
||||||
|
RigMainGrid* mainGrid = m_eclipseCase->eclipseCaseData()->mainGrid();
|
||||||
|
std::vector<RigConnection> connections = mainGrid->nncData()->connections();
|
||||||
|
|
||||||
|
size_t connectionCount = connections.size();
|
||||||
|
const size_t packageSize = RiaGrpcServiceInterface::numberOfDataUnitsInPackage( sizeof( rips::NNCConnection ) );
|
||||||
|
size_t indexInPackage = 0u;
|
||||||
|
reply->mutable_connections()->Reserve( (int)packageSize );
|
||||||
|
for ( ; indexInPackage < packageSize && m_currentIdx < connectionCount; ++indexInPackage )
|
||||||
|
{
|
||||||
|
RigConnection& connection = connections[m_currentIdx];
|
||||||
|
const RigCell& cell1 = mainGrid->globalCellArray()[connection.m_c1GlobIdx];
|
||||||
|
const RigCell& cell2 = mainGrid->globalCellArray()[connection.m_c2GlobIdx];
|
||||||
|
|
||||||
|
NNCConnection* nncConnection = reply->add_connections();
|
||||||
|
nncConnection->set_allocated_cell1( createConnectionVec3i( cell1 ) );
|
||||||
|
nncConnection->set_allocated_cell2( createConnectionVec3i( cell2 ) );
|
||||||
|
nncConnection->set_cell_grid_index1( cell1.hostGrid()->gridIndex() );
|
||||||
|
nncConnection->set_cell_grid_index2( cell2.hostGrid()->gridIndex() );
|
||||||
|
|
||||||
|
m_currentIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( indexInPackage > 0u )
|
||||||
|
{
|
||||||
|
return Status::OK;
|
||||||
|
}
|
||||||
|
return Status( grpc::OUT_OF_RANGE, "We've reached the end. This is not an error but means transmission is finished" );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
grpc::Status RiaGrpcNNCPropertiesService::GetNNCConnections( grpc::ServerContext* context,
|
||||||
|
const rips::CaseRequest* request,
|
||||||
|
rips::NNCConnections* reply,
|
||||||
|
RiaNNCConnectionsStateHandler* stateHandler )
|
||||||
|
{
|
||||||
|
return stateHandler->assignReply( reply );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
grpc::Status RiaGrpcNNCPropertiesService::GetAvailableNNCProperties( grpc::ServerContext* context,
|
||||||
|
const CaseRequest* request,
|
||||||
|
AvailableNNCProperties* reply )
|
||||||
|
{
|
||||||
|
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( RiaGrpcServiceInterface::findCase( request->id() ) );
|
||||||
|
if ( eclipseCase && eclipseCase->eclipseCaseData() && eclipseCase->eclipseCaseData()->mainGrid() )
|
||||||
|
{
|
||||||
|
RigNNCData* nncData = eclipseCase->eclipseCaseData()->mainGrid()->nncData();
|
||||||
|
|
||||||
|
std::vector<RigNNCData::NNCResultType> resultTypes;
|
||||||
|
resultTypes.push_back( RigNNCData::NNC_DYNAMIC );
|
||||||
|
resultTypes.push_back( RigNNCData::NNC_STATIC );
|
||||||
|
resultTypes.push_back( RigNNCData::NNC_GENERATED );
|
||||||
|
|
||||||
|
for ( size_t rtIdx = 0; rtIdx < resultTypes.size(); ++rtIdx )
|
||||||
|
{
|
||||||
|
std::vector<QString> availableParameters = nncData->availableProperties( resultTypes[rtIdx] );
|
||||||
|
|
||||||
|
for ( const QString& parameter : availableParameters )
|
||||||
|
{
|
||||||
|
AvailableNNCProperty* property = reply->add_properties();
|
||||||
|
property->set_name( parameter.toStdString() );
|
||||||
|
property->set_property_type( static_cast<NNCPropertyType>( resultTypes[rtIdx] ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grpc::Status::OK;
|
||||||
|
}
|
||||||
|
return grpc::Status( grpc::NOT_FOUND, "No such case" );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<RiaGrpcCallbackInterface*> RiaGrpcNNCPropertiesService::createCallbacks()
|
||||||
|
{
|
||||||
|
typedef RiaGrpcNNCPropertiesService Self;
|
||||||
|
|
||||||
|
std::vector<RiaGrpcCallbackInterface*> callbacks;
|
||||||
|
callbacks = {new RiaGrpcUnaryCallback<Self, CaseRequest, AvailableNNCProperties>( this,
|
||||||
|
&Self::GetAvailableNNCProperties,
|
||||||
|
&Self::RequestGetAvailableNNCProperties ),
|
||||||
|
new RiaGrpcServerToClientStreamCallback<Self,
|
||||||
|
CaseRequest,
|
||||||
|
rips::NNCConnections,
|
||||||
|
RiaNNCConnectionsStateHandler>( this,
|
||||||
|
&Self::GetNNCConnections,
|
||||||
|
&Self::RequestGetNNCConnections,
|
||||||
|
new RiaNNCConnectionsStateHandler )};
|
||||||
|
return callbacks;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool RiaGrpcNNCPropertiesService_init =
|
||||||
|
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcNNCPropertiesService>(
|
||||||
|
typeid( RiaGrpcNNCPropertiesService ).hash_code() );
|
65
ApplicationCode/GrpcInterface/RiaGrpcNNCPropertiesService.h
Normal file
65
ApplicationCode/GrpcInterface/RiaGrpcNNCPropertiesService.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2020- 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 "RiaGrpcServiceInterface.h"
|
||||||
|
|
||||||
|
#include "NNCProperties.grpc.pb.h"
|
||||||
|
|
||||||
|
#include <grpcpp/grpcpp.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class RimEclipseCase;
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
// State handler for streaming of NNC connections
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RiaNNCConnectionsStateHandler
|
||||||
|
{
|
||||||
|
typedef grpc::Status Status;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RiaNNCConnectionsStateHandler();
|
||||||
|
grpc::Status init( const rips::CaseRequest* request );
|
||||||
|
grpc::Status assignReply( rips::NNCConnections* reply );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const rips::CaseRequest* m_request;
|
||||||
|
RimEclipseCase* m_eclipseCase;
|
||||||
|
size_t m_currentIdx;
|
||||||
|
};
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
// gRPC-service answering requests about NNC property information for a given case and time step
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RiaGrpcNNCPropertiesService final : public rips::NNCProperties::AsyncService, public RiaGrpcServiceInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
grpc::Status GetAvailableNNCProperties( grpc::ServerContext* context,
|
||||||
|
const rips::CaseRequest* request,
|
||||||
|
rips::AvailableNNCProperties* reply ) override;
|
||||||
|
grpc::Status GetNNCConnections( grpc::ServerContext* context,
|
||||||
|
const rips::CaseRequest* request,
|
||||||
|
rips::NNCConnections* reply,
|
||||||
|
RiaNNCConnectionsStateHandler* stateHandler );
|
||||||
|
|
||||||
|
std::vector<RiaGrpcCallbackInterface*> createCallbacks() override;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user