Add elapsed time info for responses

- Total time
- Custom named events with elapsed time (map)

ddd
This commit is contained in:
jorgenherje 2024-03-19 09:45:31 +01:00
parent 88ef3a6fca
commit c2b41c17b8
8 changed files with 172 additions and 34 deletions

View File

@ -11,6 +11,12 @@ service GridGeometryExtraction
rpc CutAlongPolyline(CutAlongPolylineRequest) returns (CutAlongPolylineResponse);
}
message TimeElapsedInfo
{
fixed32 totalTimeElapsedMs = 1; // Total time elapsed for the entire request
map<string, fixed32> namedEventsAndTimeElapsedMs = 2; // Time elapsed for each custom named event
}
message IJKIndexFilter
{
int32 iMin = 1;
@ -49,6 +55,7 @@ message GetGridSurfaceResponse
repeated fixed32 sourceCellIndicesArr = 3; // The originating cell index per quad, longnumQuads long
Vec3i gridDimensions = 5;
Vec3d originUtm = 6;
TimeElapsedInfo timeElapsedInfo = 7;
}
message CutAlongPolylineRequest
@ -80,6 +87,7 @@ message CutAlongPolylineResponse
{
repeated FenceMeshSection fenceMeshSections = 1;
PolylineTestResponse polylineTestResponse = 2;
Vec3i gridDimensions = 3;
TimeElapsedInfo timeElapsedInfo = 3;
Vec3i gridDimensions = 4;
}

View File

@ -15,7 +15,7 @@ grid_geometry_extraction_stub = GridGeometryExtractionStub(rips_instance.channel
grid_file_name = "MOCKED_TEST_GRID"
grid_file_name = (
"D:\\Git\\resinsight-tutorials\\model-data\\norne\\NORNE_ATW2013_RFTPLT_V2.EGRID"
"D:/Git/resinsight-tutorials/model-data/norne/NORNE_ATW2013_RFTPLT_V2.EGRID"
)
# Test polylines
@ -53,6 +53,11 @@ cut_along_polyline_response: GridGeometryExtraction__pb2.CutAlongPolylineRespons
grid_geometry_extraction_stub.CutAlongPolyline(cut_along_polyline_request)
)
total_time_elapsed = cut_along_polyline_response.timeElapsedInfo.totalTimeElapsedMs
named_events_and_time_elapsed = (
cut_along_polyline_response.timeElapsedInfo.namedEventsAndTimeElapsedMs
)
fence_mesh_sections = cut_along_polyline_response.fenceMeshSections
print(f"Number of fence mesh sections: {len(fence_mesh_sections)}")
@ -201,5 +206,9 @@ fig = go.Figure(data=figure_data)
# f"Grid dimensions [I, J, K]: [{grid_dimensions.dimensions.i}, {grid_dimensions.dimensions.j}, {grid_dimensions.dimensions.k}]"
# )
print(fig.data)
print(f"Total time elapsed: {total_time_elapsed} ms")
# print(f"Time elapsed per event [ms]: {named_events_and_time_elapsed}")
for message, time_elapsed in named_events_and_time_elapsed.items():
print(f"{message}: {time_elapsed}")
fig.show()

View File

@ -13,7 +13,7 @@ grid_geometry_extraction_stub = GridGeometryExtractionStub(rips_instance.channel
# grid_file_name = "MOCKED_TEST_GRID"
grid_file_name = (
"D:\\Git\\resinsight-tutorials\\model-data\\norne\\NORNE_ATW2013_RFTPLT_V2.EGRID"
"D:/Git/resinsight-tutorials/model-data/norne/NORNE_ATW2013_RFTPLT_V2.EGRID"
)
# Test polylines

View File

@ -15,7 +15,7 @@ grid_geometry_extraction_stub = GridGeometryExtractionStub(rips_instance.channel
grid_file_name = "MOCKED_TEST_GRID"
grid_file_name = (
"D:\\Git\\resinsight-tutorials\\model-data\\norne\\NORNE_ATW2013_RFTPLT_V2.EGRID"
"D:/Git/resinsight-tutorials/model-data/norne/NORNE_ATW2013_RFTPLT_V2.EGRID"
)
# Test polylines

View File

@ -6,18 +6,22 @@ from rips.instance import *
from rips.generated.GridGeometryExtraction_pb2_grpc import *
from rips.generated.GridGeometryExtraction_pb2 import *
# from ..instance import *
# from ..generated.GridGeometryExtraction_pb2_grpc import *
# from ..generated.GridGeometryExtraction_pb2 import *
rips_instance = Instance.find()
grid_geometry_extraction_stub = GridGeometryExtractionStub(rips_instance.channel)
# grid_file_name = "MOCKED_TEST_GRID"
grid_file_name = (
"D:\\Git\\resinsight-tutorials\\model-data\\norne\\NORNE_ATW2013_RFTPLT_V2.EGRID"
"D:/Git/resinsight-tutorials/model-data/norne/NORNE_ATW2013_RFTPLT_V2.EGRID"
)
# grid_file_name = "MOCKED_TEST_GRID"
# ijk_index_filter = GridGeometryExtraction__pb2.IJKIndexFilter(
# iMin=0, iMax=1, jMin=1, jMax=3, kMin=3, kMax=3
# )
ijk_index_filter = None
ijk_index_filter = GridGeometryExtraction__pb2.IJKIndexFilter(
iMin=-1, iMax=-1, jMin=-1, jMax=-1, kMin=-1, kMax=-1
)
# ijk_index_filter = None
get_grid_surface_request = GridGeometryExtraction__pb2.GetGridSurfaceRequest(
gridFilename=grid_file_name,
@ -29,6 +33,11 @@ get_grid_surface_response: GridGeometryExtraction__pb2.GetGridSurfaceResponse =
grid_geometry_extraction_stub.GetGridSurface(get_grid_surface_request)
)
total_time_elapsed = get_grid_surface_response.timeElapsedInfo.totalTimeElapsedMs
named_events_and_time_elapsed = (
get_grid_surface_response.timeElapsedInfo.namedEventsAndTimeElapsedMs
)
vertex_array = get_grid_surface_response.vertexArray
quad_indices_array = get_grid_surface_response.quadIndicesArr
origin_utm = get_grid_surface_response.originUtm
@ -44,9 +53,9 @@ x_array = []
y_array = []
z_array = []
for i in range(0, len(vertex_array), num_vertex_coords):
x_array.append(vertex_array[i + 0] + origin_utm.x)
y_array.append(vertex_array[i + 1] + origin_utm.y)
z_array.append(vertex_array[i + 2] + origin_utm.z)
x_array.append(vertex_array[i + 0])
y_array.append(vertex_array[i + 1])
z_array.append(vertex_array[i + 2])
# Create triangular mesh
i_array = []
@ -75,6 +84,7 @@ fig = go.Figure(
]
)
print(f"Number of quads: {num_quads}")
print(f"Source cell indices array length: {len(source_cell_indices_arr)}")
print(
@ -85,4 +95,9 @@ print(
)
print(fig.data)
print(f"Total time elapsed: {total_time_elapsed} ms")
# print(f"Time elapsed per event [ms]: {named_events_and_time_elapsed}")
for message, time_elapsed in named_events_and_time_elapsed.items():
print(f"{message}: {time_elapsed}")
fig.show()

View File

@ -9,7 +9,7 @@ grid_geometry_extraction_stub = GridGeometryExtractionStub(rips_instance.channel
# grid_file_name = "MOCKED_TEST_GRID"
grid_file_name = (
"D:\\Git\\resinsight-tutorials\\model-data\\norne\\NORNE_ATW2013_RFTPLT_V2.EGRID"
"D:/Git/resinsight-tutorials/model-data/norne/NORNE_ATW2013_RFTPLT_V2.EGRID"
)
# ijk_index_filter = GridGeometryExtraction__pb2.IJKIndexFilter(

View File

@ -55,6 +55,29 @@
#include "qfileinfo.h"
#include "qstring.h"
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class ElapsedTimeCount
{
public:
ElapsedTimeCount(): m_start( std::chrono::high_resolution_clock::now() ){};
~ElapsedTimeCount() = default;
long long elapsedMsCount() const
{
const auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>( end - m_start );
return elapsed.count();
}
private:
const std::chrono::high_resolution_clock::time_point m_start;
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaGrpcGridGeometryExtractionService::RiaGrpcGridGeometryExtractionService()
{
}
@ -66,6 +89,9 @@ grpc::Status RiaGrpcGridGeometryExtractionService::GetGridSurface( grpc::ServerC
const rips::GetGridSurfaceRequest* request,
rips::GetGridSurfaceResponse* response )
{
m_elapsedTimeInfo.reset();
auto totalTimeCount = ElapsedTimeCount();
// Initialize pointers
grpc::Status status = initializeApplicationAndEclipseCaseFromAbsoluteFilePath( request->gridfilename() );
if ( status.error_code() != grpc::StatusCode::OK )
@ -90,33 +116,42 @@ grpc::Status RiaGrpcGridGeometryExtractionService::GetGridSurface( grpc::ServerC
}
}
// Ensure static geometry parts created for grid part manager in view
// Configure eclipse view
// - Ensure static geometry parts created for grid part manager in view
// - Initialize grid geometry generator
auto createGridGeometryPartsTimeCount = ElapsedTimeCount();
eclipseView->createGridGeometryParts();
m_elapsedTimeInfo.elapsedTimePerEventMs["CreateGridGeometryParts"] =
static_cast<std::uint32_t>( createGridGeometryPartsTimeCount.elapsedMsCount() );
// Initialize grid geometry generator
const bool useOpenMP = false;
auto gridGeometryGenerator = cvf::StructGridGeometryGenerator( m_eclipseCase->mainGrid(), useOpenMP );
auto gridGeometryGenerator = cvf::StructGridGeometryGenerator( eclipseView->mainGrid(), useOpenMP );
status = initializeGridGeometryGeneratorWithEclipseViewCellVisibility( gridGeometryGenerator, eclipseView );
if ( status.error_code() != grpc::StatusCode::OK )
{
return status;
}
auto* gridSurfaceVertices = gridGeometryGenerator.getOrCreateVertices();
// Create grid surface vertices
auto createVerticesTimeCount = ElapsedTimeCount();
auto* gridSurfaceVertices = gridGeometryGenerator.getOrCreateVertices();
if ( gridSurfaceVertices == nullptr )
{
return grpc::Status( grpc::StatusCode::NOT_FOUND, "No grid vertices found" );
}
m_elapsedTimeInfo.elapsedTimePerEventMs["CreateGridSurfaceVertices"] =
static_cast<std::uint32_t>( createVerticesTimeCount.elapsedMsCount() );
// Set vertex_array and quadindicesarr response
for ( int i = 0; i < gridSurfaceVertices->size(); ++i )
auto fillResponseTimeCount = ElapsedTimeCount();
for ( size_t i = 0; i < gridSurfaceVertices->size(); ++i )
{
const auto& vertex = gridSurfaceVertices->get( i );
response->add_vertexarray( vertex.x() );
response->add_vertexarray( vertex.y() );
response->add_vertexarray( vertex.z() );
response->add_quadindicesarr( i );
response->add_quadindicesarr( static_cast<google::protobuf::uint32>( i ));
}
// Origin in utm is the offset
@ -143,20 +178,34 @@ grpc::Status RiaGrpcGridGeometryExtractionService::GetGridSurface( grpc::ServerC
}
// Set grid dimensions
const auto countI = m_eclipseCase->mainGrid()->cellCountI();
const auto countJ = m_eclipseCase->mainGrid()->cellCountJ();
const auto countK = m_eclipseCase->mainGrid()->cellCountK();
rips::Vec3i* dimensions = new rips::Vec3i;
dimensions->set_i( countI );
dimensions->set_j( countJ );
dimensions->set_k( countK );
dimensions->set_i( m_eclipseCase->mainGrid()->cellCountK() );
dimensions->set_j( m_eclipseCase->mainGrid()->cellCountK() );
dimensions->set_k( m_eclipseCase->mainGrid()->cellCountK() );
response->set_allocated_griddimensions( dimensions );
m_elapsedTimeInfo.elapsedTimePerEventMs["FillResponse"] =
static_cast<std::uint32_t>( fillResponseTimeCount.elapsedMsCount() );
// Clear existing view
tearDownExistingViewsInEclipseCase();
eclipseView = nullptr;
delete eclipseView;
// Fill elapsed time info
m_elapsedTimeInfo.totalTimeElapsedMs = static_cast<std::uint32_t>( totalTimeCount.elapsedMsCount() );
// Add elapsed time info to response
rips::TimeElapsedInfo* elapsedTimeInfo = new rips::TimeElapsedInfo;
elapsedTimeInfo->set_totaltimeelapsedms( m_elapsedTimeInfo.totalTimeElapsedMs );
for ( const auto& event : m_elapsedTimeInfo.elapsedTimePerEventMs )
{
const auto& message = event.first;
const auto& timeElapsed = event.second;
( *elapsedTimeInfo->mutable_namedeventsandtimeelapsedms() )[message] = timeElapsed;
}
response->set_allocated_timeelapsedinfo( elapsedTimeInfo );
return grpc::Status::OK;
}
@ -167,6 +216,9 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
const rips::CutAlongPolylineRequest* request,
rips::CutAlongPolylineResponse* response )
{
m_elapsedTimeInfo.reset();
auto totalTimeCount = ElapsedTimeCount();
// Initialize pointers
grpc::Status status = initializeApplicationAndEclipseCaseFromAbsoluteFilePath( request->gridfilename() );
if ( status.error_code() != grpc::StatusCode::OK )
@ -188,7 +240,11 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
return grpc::Status( grpc::StatusCode::NOT_FOUND, "No eclipse view found" );
}
eclipseView->setShowInactiveCells( true );
auto createGridGeometryPartsTimeCount = ElapsedTimeCount();
eclipseView->createGridGeometryParts();
m_elapsedTimeInfo.elapsedTimePerEventMs["CreateGridGeometryParts"] =
static_cast<std::uint32_t>( createGridGeometryPartsTimeCount.elapsedMsCount() );
// Convert polyline to vector of cvf::Vec3d
std::vector<cvf::Vec2d> polylineUtmXy;
@ -213,13 +269,17 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
eclipseView->calculateCurrentTotalCellVisibility( &visibleCells, firstTimeStep );
// Generate intersection
auto generateIntersectionTimeCount = ElapsedTimeCount();
polylineIntersectionGenerator.generateIntersectionGeometry( &visibleCells );
if ( !polylineIntersectionGenerator.isAnyGeometryPresent() )
{
return grpc::Status( grpc::StatusCode::INVALID_ARGUMENT, "No intersection geometry present" );
}
m_elapsedTimeInfo.elapsedTimePerEventMs["GenerateIntersection"] =
static_cast<std::uint32_t>( generateIntersectionTimeCount.elapsedMsCount() );
// Add fence mesh sections
// Add fence mesh sections to response
auto fillResponseTimeCount = ElapsedTimeCount();
const auto& polylineSegmentsMeshData = polylineIntersectionGenerator.polylineSegmentsMeshData();
for ( const auto& segment : polylineSegmentsMeshData )
{
@ -262,9 +322,20 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
}
}
// Add grid dimensions
rips::Vec3i* dimensions = new rips::Vec3i;
dimensions->set_i( m_eclipseCase->mainGrid()->cellCountI() );
dimensions->set_j( m_eclipseCase->mainGrid()->cellCountJ() );
dimensions->set_k( m_eclipseCase->mainGrid()->cellCountK() );
response->set_allocated_griddimensions( dimensions );
m_elapsedTimeInfo.elapsedTimePerEventMs["FillResponse"] =
static_cast<std::uint32_t>( fillResponseTimeCount.elapsedMsCount() );
// Add temporary test response
{
rips::PolylineTestResponse* polylineTestResponse = new rips::PolylineTestResponse;
auto fillTestResponseTimeCount = ElapsedTimeCount();
rips::PolylineTestResponse* polylineTestResponse = new rips::PolylineTestResponse;
// Polygon vertices
const auto& polygonVertices = polylineIntersectionGenerator.polygonVxes();
@ -272,7 +343,7 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
{
return grpc::Status( grpc::StatusCode::NOT_FOUND, "No polygon vertices found for polyline" );
}
for ( int i = 0; i < polygonVertices->size(); ++i )
for ( size_t i = 0; i < polygonVertices->size(); ++i )
{
const auto& vertex = polygonVertices->get( i );
polylineTestResponse->add_polygonvertexarray( vertex.x() );
@ -295,6 +366,8 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
}
response->set_allocated_polylinetestresponse( polylineTestResponse );
m_elapsedTimeInfo.elapsedTimePerEventMs["FillResponse"] =
static_cast<std::uint32_t>( fillTestResponseTimeCount.elapsedMsCount() );
}
// Clear existing view
@ -302,6 +375,20 @@ grpc::Status RiaGrpcGridGeometryExtractionService::CutAlongPolyline( grpc::Serve
eclipseView = nullptr;
delete eclipseView;
// Fill elapsed time info
m_elapsedTimeInfo.totalTimeElapsedMs = static_cast<std::uint32_t>( totalTimeCount.elapsedMsCount() );
// Add elapsed time info to response
rips::TimeElapsedInfo* elapsedTimeInfo = new rips::TimeElapsedInfo;
elapsedTimeInfo->set_totaltimeelapsedms( m_elapsedTimeInfo.totalTimeElapsedMs );
for ( const auto& event : m_elapsedTimeInfo.elapsedTimePerEventMs )
{
const auto& message = event.first;
const auto& timeElapsed = event.second;
( *elapsedTimeInfo->mutable_namedeventsandtimeelapsedms() )[message] = timeElapsed;
}
response->set_allocated_timeelapsedinfo( elapsedTimeInfo );
return grpc::Status::OK;
}
@ -431,7 +518,7 @@ grpc::Status RiaGrpcGridGeometryExtractionService::initializeGridGeometryGenerat
return grpc::Status( grpc::StatusCode::NOT_FOUND, "Uninitialized eclipse view provided" );
}
auto* mainGrid = m_eclipseCase->mainGrid();
auto* mainGrid = view->mainGrid();
if ( mainGrid == nullptr )
{
return grpc::Status( grpc::StatusCode::NOT_FOUND, "No main grid found for eclipse view" );
@ -513,7 +600,10 @@ grpc::Status
else
{
// Load case from file name
auto status = loadGridGeometryFromAbsoluteFilePath( filePath );
auto loadCaseFromFileNameTimeCount = ElapsedTimeCount();
auto status = loadGridGeometryFromAbsoluteFilePath( filePath );
m_elapsedTimeInfo.elapsedTimePerEventMs["LoadGridFromFilePath"] =
static_cast<std::uint32_t>( loadCaseFromFileNameTimeCount.elapsedMsCount() );
if ( status.error_code() != grpc::StatusCode::OK ) return status;
}
@ -547,7 +637,10 @@ grpc::Status
}
if ( m_eclipseCase->views().empty() )
{
auto createAndAddViewTimeCount = ElapsedTimeCount();
m_eclipseCase->createAndAddReservoirView();
m_elapsedTimeInfo.elapsedTimePerEventMs["CreateAndAddView"] =
static_cast<std::uint32_t>( createAndAddViewTimeCount.elapsedMsCount() );
}
return grpc::Status::OK;

View File

@ -73,8 +73,21 @@ private:
grpc::Status initializeGridGeometryGeneratorWithEclipseViewCellVisibility( cvf::StructGridGeometryGenerator& generator,
RimEclipseView* view );
RiaApplication* m_application = nullptr;
RimEclipseCase* m_eclipseCase = nullptr;
RiaApplication* m_application = nullptr;
RimEclipseCase* m_eclipseCase = nullptr;
std::unique_ptr<RigGridCellFaceVisibilityFilter> m_faceVisibilityFilter = nullptr;
struct ElapsedTimeInfo
{
std::uint32_t totalTimeElapsedMs = 0; // Total time elapsed for entire request
std::map<std::string, std::uint32_t> elapsedTimePerEventMs; // Time elapsed for each custom named event
void reset()
{
totalTimeElapsedMs = 0;
elapsedTimePerEventMs.clear();
}
};
ElapsedTimeInfo m_elapsedTimeInfo;
};