ResInsight/ApplicationCode/GrpcInterface/RiaGrpcPropertiesService.cpp

324 lines
15 KiB
C++
Raw Normal View History

/////////////////////////////////////////////////////////////////////////////////
//
// 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 "RiaGrpcPropertiesService.h"
#include "RiaGrpcCallbacks.h"
2019-05-21 09:33:41 -05:00
#include "RiaGrpcGridInfoService.h"
2019-05-21 09:33:41 -05:00
#include "RigActiveCellInfo.h"
#include "RigActiveCellsResultAccessor.h"
#include "RigAllGridCellsResultAccessor.h"
#include "RigCaseCellResultsData.h"
#include "RigEclipseCaseData.h"
#include "RigEclipseResultAddress.h"
2019-05-21 09:33:41 -05:00
#include "RigMainGrid.h"
#include "RigResultAccessor.h"
#include "RigResultAccessorFactory.h"
#include "RigResultModifier.h"
#include "RigResultModifierFactory.h"
#include "Rim3dView.h"
#include "RimEclipseCase.h"
using namespace rips;
//--------------------------------------------------------------------------------------------------
2019-05-21 09:33:41 -05:00
/// Abstract handler base class for streaming cell results to client
///
//--------------------------------------------------------------------------------------------------
2019-05-21 09:33:41 -05:00
class RiaCellResultsStateHandler
{
2019-05-21 09:33:41 -05:00
typedef grpc::Status Status;
public:
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaCellResultsStateHandler()
: m_request(nullptr)
, m_currentCellIdx(0u)
{
2019-05-21 09:33:41 -05:00
}
2019-05-21 09:33:41 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Status init(const ResultRequest* request)
{
int caseId = request->request_case().id();
m_eclipseCase = dynamic_cast<RimEclipseCase*>(RiaGrpcServiceInterface::findCase(caseId));
if (m_eclipseCase)
{
2019-05-21 09:33:41 -05:00
auto porosityModel = static_cast<RiaDefines::PorosityModelType>(request->porosity_model());
auto caseData = m_eclipseCase->eclipseCaseData();
2019-05-21 09:33:41 -05:00
auto resultData = caseData->results(porosityModel);
auto resultType = static_cast<RiaDefines::ResultCatType>(request->property_type());
size_t timeStep = static_cast<size_t>(request->time_step());
RigEclipseResultAddress resAddr(resultType, QString::fromStdString(request->property_name()));
if (resultData->ensureKnownResultLoaded(resAddr))
{
2019-05-24 00:55:15 -05:00
if (timeStep < resultData->timeStepCount(resAddr))
2019-05-21 09:33:41 -05:00
{
initResultAccess(caseData, request->grid_index(), porosityModel, timeStep, resAddr);
return grpc::Status::OK;
}
return grpc::Status(grpc::NOT_FOUND, "No such time step");
}
2019-05-21 09:33:41 -05:00
return grpc::Status(grpc::NOT_FOUND, "No such result");
}
2019-05-21 09:33:41 -05:00
return grpc::Status(grpc::NOT_FOUND, "Couldn't find an Eclipse case matching the case Id");
}
//--------------------------------------------------------------------------------------------------
/// Client streamers need to be initialised with the encapsulated parameters
//--------------------------------------------------------------------------------------------------
Status init(const ResultRequestChunk* request)
{
if (request->has_params())
{
return init(&(request->params()));
}
return grpc::Status(grpc::INVALID_ARGUMENT, "Need to have ResultRequest parameters in first message");
}
2019-05-21 09:33:41 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Status assignStreamReply(ResultArray* reply)
{
const size_t packageSize = RiaGrpcServiceInterface::numberOfMessagesForByteCount(sizeof(rips::ResultArray));
size_t packageIndex = 0u;
reply->mutable_values()->Reserve((int)packageSize);
2019-05-21 09:33:41 -05:00
for (; packageIndex < packageSize && m_currentCellIdx < m_cellCount; ++packageIndex, ++m_currentCellIdx)
{
2019-05-21 09:33:41 -05:00
reply->add_values(cellResult(m_currentCellIdx));
}
if (packageIndex > 0u)
{
return grpc::Status::OK;
}
2019-05-21 09:33:41 -05:00
return grpc::Status(grpc::OUT_OF_RANGE,
"We've reached the end. This is not an error but means transmission is finished");
}
2019-05-21 09:33:41 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Status receiveStreamRequest(const ResultRequestChunk* request)
{
if (request->has_values())
{
auto values = request->values().values();
for (int i = 0; i < values.size() && m_currentCellIdx < m_cellCount; ++i, ++m_currentCellIdx)
{
setCellResult(m_currentCellIdx, values[i]);
}
if (m_currentCellIdx == m_cellCount - 1)
{
return grpc::Status(grpc::OUT_OF_RANGE, "All values have been written");
}
return Status::OK;
}
return grpc::Status(grpc::OUT_OF_RANGE, "No messages to write");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void finish()
{
for (Rim3dView* view : m_eclipseCase->views())
{
view->setCurrentTimeStepAndUpdate(view->currentTimeStep());
view->createDisplayModelAndRedraw();
}
}
2019-05-21 09:33:41 -05:00
protected:
virtual void initResultAccess(RigEclipseCaseData* caseData,
size_t gridIndex,
RiaDefines::PorosityModelType porosityModel,
size_t timeStepIndex,
RigEclipseResultAddress resVarAddr) = 0;
virtual double cellResult(size_t currentCellIndex) const = 0;
virtual void setCellResult(size_t currentCellIndex, double value) = 0;
2019-05-21 09:33:41 -05:00
protected:
const rips::ResultRequest* m_request;
RimEclipseCase* m_eclipseCase;
2019-05-21 09:33:41 -05:00
size_t m_currentCellIdx;
size_t m_cellCount;
};
class RiaActiveCellResultsStateHandler : public RiaCellResultsStateHandler
{
protected:
void initResultAccess(RigEclipseCaseData* caseData,
size_t gridIndex,
RiaDefines::PorosityModelType porosityModel,
size_t timeStepIndex,
RigEclipseResultAddress resVarAddr) override
{
auto activeCellInfo = caseData->activeCellInfo(porosityModel);
m_resultValues = &(caseData->results(porosityModel)->modifiableCellScalarResult(resVarAddr, timeStepIndex));
2019-05-21 09:33:41 -05:00
m_cellCount = activeCellInfo->reservoirActiveCellCount();
}
double cellResult(size_t currentCellIndex) const override
{
return (*m_resultValues)[currentCellIndex];
}
void setCellResult(size_t currentCellIndex, double value) override
{
(*m_resultValues)[currentCellIndex] = value;
}
2019-05-21 09:33:41 -05:00
private:
std::vector<double>* m_resultValues;
2019-05-21 09:33:41 -05:00
};
class RiaGridCellResultsStateHandler : public RiaCellResultsStateHandler
{
protected:
void initResultAccess(RigEclipseCaseData* caseData,
size_t gridIndex,
RiaDefines::PorosityModelType porosityModel,
size_t timeStepIndex,
RigEclipseResultAddress resVarAddr) override
{
m_resultAccessor = RigResultAccessorFactory::createFromResultAddress(caseData, gridIndex, porosityModel, timeStepIndex, resVarAddr);
m_resultModifier = RigResultModifierFactory::createResultModifier(caseData, gridIndex, porosityModel, timeStepIndex, resVarAddr);
2019-05-21 09:33:41 -05:00
m_cellCount = caseData->grid(gridIndex)->cellCount();
}
double cellResult(size_t currentCellIndex) const override
{
return m_resultAccessor->cellScalar(currentCellIndex);
}
void setCellResult(size_t currentCellIndex, double value) override
{
return m_resultModifier->setCellScalar(currentCellIndex, value);
}
2019-05-21 09:33:41 -05:00
private:
cvf::ref<RigResultAccessor> m_resultAccessor;
cvf::ref<RigResultModifier> m_resultModifier;
2019-05-21 09:33:41 -05:00
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::GetAvailableProperties(grpc::ServerContext* context,
const PropertiesRequest* request,
AvailableProperties* reply)
{
int caseId = request->request_case().id();
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(RiaGrpcServiceInterface::findCase(caseId));
if (eclipseCase)
{
auto porosityModel = static_cast<RiaDefines::PorosityModelType>(request->porosity_model());
auto resultData = eclipseCase->eclipseCaseData()->results(porosityModel);
auto resultType = static_cast<RiaDefines::ResultCatType>(request->property_type());
QStringList resultNames = resultData->resultNames(resultType);
if (!resultNames.empty())
{
for (QString resultName : resultNames)
{
reply->add_property_names(resultName.toStdString());
}
return grpc::Status::OK;
}
return grpc::Status(grpc::NOT_FOUND, "Could not find any results matching result type");
}
return grpc::Status(grpc::NOT_FOUND, "No such case");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2019-05-21 09:33:41 -05:00
grpc::Status RiaGrpcPropertiesService::GetActiveCellResults(grpc::ServerContext* context,
const ResultRequest* request,
ResultArray* reply,
2019-05-21 09:33:41 -05:00
RiaActiveCellResultsStateHandler* stateHandler)
{
return stateHandler->assignStreamReply(reply);
2019-05-21 09:33:41 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::GetGridResults(grpc::ServerContext* context,
const rips::ResultRequest* request,
rips::ResultArray* reply,
2019-05-21 09:33:41 -05:00
RiaGridCellResultsStateHandler* stateHandler)
{
return stateHandler->assignStreamReply(reply);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::SetActiveCellResults(grpc::ServerContext* context,
const rips::ResultRequestChunk* request,
rips::Empty* reply,
RiaActiveCellResultsStateHandler* stateHandler)
{
return stateHandler->receiveStreamRequest(request);
}
2019-05-22 12:58:12 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcPropertiesService::SetGridResults(grpc::ServerContext* context,
const rips::ResultRequestChunk* request,
rips::Empty* reply,
RiaGridCellResultsStateHandler* stateHandler)
{
return stateHandler->receiveStreamRequest(request);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RiaAbstractGrpcCallback*> RiaGrpcPropertiesService::createCallbacks()
{
typedef RiaGrpcPropertiesService Self;
2019-05-21 09:33:41 -05:00
return {new RiaGrpcCallback<Self, PropertiesRequest, AvailableProperties>(
this, &Self::GetAvailableProperties, &Self::RequestGetAvailableProperties),
new RiaGrpcStreamCallback<Self, ResultRequest, ResultArray, RiaActiveCellResultsStateHandler>(
2019-05-21 09:33:41 -05:00
this, &Self::GetActiveCellResults, &Self::RequestGetActiveCellResults, new RiaActiveCellResultsStateHandler),
new RiaGrpcStreamCallback<Self, ResultRequest, ResultArray, RiaGridCellResultsStateHandler>(
this, &Self::GetGridResults, &Self::RequestGetGridResults, new RiaGridCellResultsStateHandler),
new RiaGrpcClientStreamCallback<Self, ResultRequestChunk, Empty, RiaActiveCellResultsStateHandler>(
2019-05-22 12:58:12 -05:00
this, &Self::SetActiveCellResults, &Self::RequestSetActiveCellResults, new RiaActiveCellResultsStateHandler),
new RiaGrpcClientStreamCallback<Self, ResultRequestChunk, Empty, RiaGridCellResultsStateHandler>(
this, &Self::SetGridResults, &Self::RequestSetGridResults, new RiaGridCellResultsStateHandler)
};
}
2019-05-22 12:58:12 -05:00
2019-05-21 09:33:41 -05:00
static bool RiaGrpcPropertiesService_init =
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcPropertiesService>(typeid(RiaGrpcPropertiesService).hash_code());