From 4b3353656f49bd5a733b6a0b8dfad4be7bdc475c Mon Sep 17 00:00:00 2001 From: Aseem Jain Date: Thu, 19 May 2022 18:30:31 +0530 Subject: [PATCH] PyFluent dash gui. --- protos/ansys/api/fluent/v0/events.proto | 9 + protos/ansys/api/fluent/v0/monitor.proto | 99 ++++ setup.py | 4 + src/ansys/api/fluent/v0/events_pb2.py | 68 ++- src/ansys/api/fluent/v0/monitor_pb2.py | 542 ++++++++++++++++++ src/ansys/api/fluent/v0/monitor_pb2_grpc.py | 101 ++++ src/ansys/fluent/core/meta.py | 28 +- src/ansys/fluent/core/services/monitor.py | 72 +++ src/ansys/fluent/core/session.py | 12 + src/ansys/fluent/core/solver/flobject.py | 23 +- .../fluent/core/solver/monitors_manager.py | 190 ++++++ 11 files changed, 1125 insertions(+), 23 deletions(-) create mode 100644 protos/ansys/api/fluent/v0/monitor.proto create mode 100644 src/ansys/api/fluent/v0/monitor_pb2.py create mode 100644 src/ansys/api/fluent/v0/monitor_pb2_grpc.py create mode 100644 src/ansys/fluent/core/services/monitor.py create mode 100644 src/ansys/fluent/core/solver/monitors_manager.py diff --git a/protos/ansys/api/fluent/v0/events.proto b/protos/ansys/api/fluent/v0/events.proto index f5889ac56bfb..585465913e3a 100644 --- a/protos/ansys/api/fluent/v0/events.proto +++ b/protos/ansys/api/fluent/v0/events.proto @@ -60,6 +60,14 @@ message DataReadEvent { message InitializedEvent { } +/** + * Event during solution progress. + */ +message ProgressEvent { + string message = 1; // Progress Message. + sint32 percentComplete = 2; // Percent completed. +} + message BeginStreamingResponse { oneof as { CaseReadEvent casereadevent = 2; @@ -69,5 +77,6 @@ message BeginStreamingResponse { TimestepEndedEvent timestependedevent = 10; CalculationsStartedEvent calculationsstartedevent = 11; CalculationsEndedEvent calculationsendedevent = 12; + ProgressEvent progressevent = 20; } } diff --git a/protos/ansys/api/fluent/v0/monitor.proto b/protos/ansys/api/fluent/v0/monitor.proto new file mode 100644 index 000000000000..de1dcca720c7 --- /dev/null +++ b/protos/ansys/api/fluent/v0/monitor.proto @@ -0,0 +1,99 @@ +// +// Copyright 1987-2022 ANSYS, Inc. All Rights Reserved. +// + +syntax = "proto3"; + +package grpcRemoting; + +service Monitor { + /* Get monitors info i.e. monitors name and their properties e.g. x-label, y-label, title etc*/ + rpc GetMonitors(GetMonitorsRequest) returns (GetMonitorsResponse) {} + /* Begin monitors data streaming i.e. monitors x-values and corresponding y-values.*/ + rpc BeginStreaming(StreamingRequest) returns (stream StreamingResponse) {} +} + +/** + * Monitor type. + */ +enum MonitorType { + Residual = 0; // Solver residuals. + Solution = 1; // Solution monitors. +} + +/** + * X-axis type. + */ +enum XAxisType { + Unset = 0; // Axis unset. + Iteration = 1; // Iteration axis. + Time = 2; // Time axis. +} + +/** + * Unit data. + */ +message UnitData { + string name = 1; // Unit name + string unit = 2; // Unit e.g. Fahrenheit + double factor = 3; // Unit factor e.g. for Fahrenheit it will be 0.5555556. + double offset = 4; // Unit offset e.g. for Fahrenheit it will be 459.67. +} + +/** + * Monitor set definition provided by GetMonitors. + */ +message MonitorSet { + string name = 1; // Monitor set name. + string title = 2; // Monitor set title. + string xlabel = 3; // Monitor set xlabel. + string ylabel = 4; // Monitor set ylabel. + sint64 frequency = 5; // Monitor set frequency. + MonitorType type = 6; // Monitor set type. + UnitData unitinfo = 7; // Monitor set unit info. + XAxisType axis = 8; // X-axis type. + repeated string monitors = 9; // Monitor set monitors. +} + +/** + * X axis data i.e. axis type and index provided by monitors streaming. + */ +message XAxisData { + XAxisType xaxistype = 1; // X-axis type. + sint64 xaxisindex = 2; // X-axis index. +} + +/** + * Y axis data i.e. monitor name and value provided by monitors streaming. + */ +message MonitorData { + string name = 1; + double value = 2; +} + +/** + * GetMonitors Request. + */ +message GetMonitorsRequest { +} + +/** + * GetMonitors Response. + */ +message GetMonitorsResponse { + repeated MonitorSet monitorset = 1; +} + +/** + * Streaming Request. + */ +message StreamingRequest { +} + +/** + * Streaming Response. + */ +message StreamingResponse { + XAxisData xaxisdata = 1; + repeated MonitorData yaxisvalues = 2; +} diff --git a/setup.py b/setup.py index 2ca72b96beae..e4e72f138162 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ """Setup file for ansys-fluent-solver.""" import os import shutil +import sys from setuptools import find_namespace_packages, setup @@ -21,14 +22,17 @@ ) shutil.copy2(_README_FILE, _DOCS_FILE) + install_requires = [ "ansys-platform-instancemanagement~=1.0", "grpcio>=1.30.0", "numpy>=1.21.5", "protobuf==3.20.1", "appdirs>=1.4.0", + "pandas>=1.4.1" if sys.version_info.minor > 7 else "pandas==1.3.5", ] + packages = [] for package in find_namespace_packages(where="src", include="ansys*"): if package.startswith("ansys.api"): diff --git a/src/ansys/api/fluent/v0/events_pb2.py b/src/ansys/api/fluent/v0/events_pb2.py index 3186b65b8319..2b09458c17d1 100644 --- a/src/ansys/api/fluent/v0/events_pb2.py +++ b/src/ansys/api/fluent/v0/events_pb2.py @@ -19,7 +19,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0c\x65vents.proto\x12\x0cgrpcRemoting\"\x17\n\x15\x42\x65ginStreamingRequest\"1\n\x12TimestepEndedEvent\x12\r\n\x05index\x18\x01 \x01(\x12\x12\x0c\n\x04size\x18\x02 \x01(\x01\"$\n\x13IterationEndedEvent\x12\r\n\x05index\x18\x01 \x01(\x12\"\x1a\n\x18\x43\x61lculationsStartedEvent\"\x18\n\x16\x43\x61lculationsEndedEvent\"%\n\rCaseReadEvent\x12\x14\n\x0c\x63\x61sefilepath\x18\x01 \x01(\t\"%\n\rDataReadEvent\x12\x14\n\x0c\x64\x61tafilepath\x18\x01 \x01(\t\"\x12\n\x10InitializedEvent\"\xdc\x03\n\x16\x42\x65ginStreamingResponse\x12\x34\n\rcasereadevent\x18\x02 \x01(\x0b\x32\x1b.grpcRemoting.CaseReadEventH\x00\x12:\n\x10initializedevent\x18\x04 \x01(\x0b\x32\x1e.grpcRemoting.InitializedEventH\x00\x12\x34\n\rdatareadevent\x18\x06 \x01(\x0b\x32\x1b.grpcRemoting.DataReadEventH\x00\x12@\n\x13iterationendedevent\x18\x08 \x01(\x0b\x32!.grpcRemoting.IterationEndedEventH\x00\x12>\n\x12timestependedevent\x18\n \x01(\x0b\x32 .grpcRemoting.TimestepEndedEventH\x00\x12J\n\x18\x63\x61lculationsstartedevent\x18\x0b \x01(\x0b\x32&.grpcRemoting.CalculationsStartedEventH\x00\x12\x46\n\x16\x63\x61lculationsendedevent\x18\x0c \x01(\x0b\x32$.grpcRemoting.CalculationsEndedEventH\x00\x42\x04\n\x02\x61s2i\n\x06\x45vents\x12_\n\x0e\x42\x65ginStreaming\x12#.grpcRemoting.BeginStreamingRequest\x1a$.grpcRemoting.BeginStreamingResponse\"\x00\x30\x01\x62\x06proto3' + serialized_pb=b'\n\x0c\x65vents.proto\x12\x0cgrpcRemoting\"\x17\n\x15\x42\x65ginStreamingRequest\"1\n\x12TimestepEndedEvent\x12\r\n\x05index\x18\x01 \x01(\x12\x12\x0c\n\x04size\x18\x02 \x01(\x01\"$\n\x13IterationEndedEvent\x12\r\n\x05index\x18\x01 \x01(\x12\"\x1a\n\x18\x43\x61lculationsStartedEvent\"\x18\n\x16\x43\x61lculationsEndedEvent\"%\n\rCaseReadEvent\x12\x14\n\x0c\x63\x61sefilepath\x18\x01 \x01(\t\"%\n\rDataReadEvent\x12\x14\n\x0c\x64\x61tafilepath\x18\x01 \x01(\t\"\x12\n\x10InitializedEvent\"9\n\rProgressEvent\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x17\n\x0fpercentComplete\x18\x02 \x01(\x11\"\x92\x04\n\x16\x42\x65ginStreamingResponse\x12\x34\n\rcasereadevent\x18\x02 \x01(\x0b\x32\x1b.grpcRemoting.CaseReadEventH\x00\x12:\n\x10initializedevent\x18\x04 \x01(\x0b\x32\x1e.grpcRemoting.InitializedEventH\x00\x12\x34\n\rdatareadevent\x18\x06 \x01(\x0b\x32\x1b.grpcRemoting.DataReadEventH\x00\x12@\n\x13iterationendedevent\x18\x08 \x01(\x0b\x32!.grpcRemoting.IterationEndedEventH\x00\x12>\n\x12timestependedevent\x18\n \x01(\x0b\x32 .grpcRemoting.TimestepEndedEventH\x00\x12J\n\x18\x63\x61lculationsstartedevent\x18\x0b \x01(\x0b\x32&.grpcRemoting.CalculationsStartedEventH\x00\x12\x46\n\x16\x63\x61lculationsendedevent\x18\x0c \x01(\x0b\x32$.grpcRemoting.CalculationsEndedEventH\x00\x12\x34\n\rprogressevent\x18\x14 \x01(\x0b\x32\x1b.grpcRemoting.ProgressEventH\x00\x42\x04\n\x02\x61s2i\n\x06\x45vents\x12_\n\x0e\x42\x65ginStreaming\x12#.grpcRemoting.BeginStreamingRequest\x1a$.grpcRemoting.BeginStreamingResponse\"\x00\x30\x01\x62\x06proto3' ) @@ -260,6 +260,45 @@ ) +_PROGRESSEVENT = _descriptor.Descriptor( + name='ProgressEvent', + full_name='grpcRemoting.ProgressEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='grpcRemoting.ProgressEvent.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='percentComplete', full_name='grpcRemoting.ProgressEvent.percentComplete', index=1, + number=2, type=17, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=296, + serialized_end=353, +) + + _BEGINSTREAMINGRESPONSE = _descriptor.Descriptor( name='BeginStreamingResponse', full_name='grpcRemoting.BeginStreamingResponse', @@ -317,6 +356,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='progressevent', full_name='grpcRemoting.BeginStreamingResponse.progressevent', index=7, + number=20, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -334,8 +380,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=297, - serialized_end=773, + serialized_start=356, + serialized_end=886, ) _BEGINSTREAMINGRESPONSE.fields_by_name['casereadevent'].message_type = _CASEREADEVENT @@ -345,6 +391,7 @@ _BEGINSTREAMINGRESPONSE.fields_by_name['timestependedevent'].message_type = _TIMESTEPENDEDEVENT _BEGINSTREAMINGRESPONSE.fields_by_name['calculationsstartedevent'].message_type = _CALCULATIONSSTARTEDEVENT _BEGINSTREAMINGRESPONSE.fields_by_name['calculationsendedevent'].message_type = _CALCULATIONSENDEDEVENT +_BEGINSTREAMINGRESPONSE.fields_by_name['progressevent'].message_type = _PROGRESSEVENT _BEGINSTREAMINGRESPONSE.oneofs_by_name['as'].fields.append( _BEGINSTREAMINGRESPONSE.fields_by_name['casereadevent']) _BEGINSTREAMINGRESPONSE.fields_by_name['casereadevent'].containing_oneof = _BEGINSTREAMINGRESPONSE.oneofs_by_name['as'] @@ -366,6 +413,9 @@ _BEGINSTREAMINGRESPONSE.oneofs_by_name['as'].fields.append( _BEGINSTREAMINGRESPONSE.fields_by_name['calculationsendedevent']) _BEGINSTREAMINGRESPONSE.fields_by_name['calculationsendedevent'].containing_oneof = _BEGINSTREAMINGRESPONSE.oneofs_by_name['as'] +_BEGINSTREAMINGRESPONSE.oneofs_by_name['as'].fields.append( + _BEGINSTREAMINGRESPONSE.fields_by_name['progressevent']) +_BEGINSTREAMINGRESPONSE.fields_by_name['progressevent'].containing_oneof = _BEGINSTREAMINGRESPONSE.oneofs_by_name['as'] DESCRIPTOR.message_types_by_name['BeginStreamingRequest'] = _BEGINSTREAMINGREQUEST DESCRIPTOR.message_types_by_name['TimestepEndedEvent'] = _TIMESTEPENDEDEVENT DESCRIPTOR.message_types_by_name['IterationEndedEvent'] = _ITERATIONENDEDEVENT @@ -374,6 +424,7 @@ DESCRIPTOR.message_types_by_name['CaseReadEvent'] = _CASEREADEVENT DESCRIPTOR.message_types_by_name['DataReadEvent'] = _DATAREADEVENT DESCRIPTOR.message_types_by_name['InitializedEvent'] = _INITIALIZEDEVENT +DESCRIPTOR.message_types_by_name['ProgressEvent'] = _PROGRESSEVENT DESCRIPTOR.message_types_by_name['BeginStreamingResponse'] = _BEGINSTREAMINGRESPONSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -433,6 +484,13 @@ }) _sym_db.RegisterMessage(InitializedEvent) +ProgressEvent = _reflection.GeneratedProtocolMessageType('ProgressEvent', (_message.Message,), { + 'DESCRIPTOR' : _PROGRESSEVENT, + '__module__' : 'events_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.ProgressEvent) + }) +_sym_db.RegisterMessage(ProgressEvent) + BeginStreamingResponse = _reflection.GeneratedProtocolMessageType('BeginStreamingResponse', (_message.Message,), { 'DESCRIPTOR' : _BEGINSTREAMINGRESPONSE, '__module__' : 'events_pb2' @@ -449,8 +507,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=775, - serialized_end=880, + serialized_start=888, + serialized_end=993, methods=[ _descriptor.MethodDescriptor( name='BeginStreaming', diff --git a/src/ansys/api/fluent/v0/monitor_pb2.py b/src/ansys/api/fluent/v0/monitor_pb2.py new file mode 100644 index 000000000000..045451fff2fe --- /dev/null +++ b/src/ansys/api/fluent/v0/monitor_pb2.py @@ -0,0 +1,542 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: monitor.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='monitor.proto', + package='grpcRemoting', + syntax='proto3', + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\rmonitor.proto\x12\x0cgrpcRemoting\"\x14\n\x12GetMonitorsRequest\"F\n\x08UnitData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04unit\x18\x02 \x01(\t\x12\x0e\n\x06\x66\x61\x63tor\x18\x03 \x01(\x01\x12\x0e\n\x06offset\x18\x04 \x01(\x01\"\xe8\x01\n\nMonitorSet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x0e\n\x06xlabel\x18\x03 \x01(\t\x12\x0e\n\x06ylabel\x18\x04 \x01(\t\x12\x11\n\tfrequency\x18\x05 \x01(\x12\x12\'\n\x04type\x18\x06 \x01(\x0e\x32\x19.grpcRemoting.MonitorType\x12(\n\x08unitinfo\x18\x07 \x01(\x0b\x32\x16.grpcRemoting.UnitData\x12%\n\x04\x61xis\x18\x08 \x01(\x0e\x32\x17.grpcRemoting.XAxisType\x12\x10\n\x08monitors\x18\t \x03(\t\"C\n\x13GetMonitorsResponse\x12,\n\nmonitorset\x18\x01 \x03(\x0b\x32\x18.grpcRemoting.MonitorSet\"\x12\n\x10StreamingRequest\"K\n\tXAxisData\x12*\n\txaxistype\x18\x01 \x01(\x0e\x32\x17.grpcRemoting.XAxisType\x12\x12\n\nxaxisindex\x18\x02 \x01(\x12\"*\n\x0bMonitorData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\"o\n\x11StreamingResponse\x12*\n\txaxisdata\x18\x01 \x01(\x0b\x32\x17.grpcRemoting.XAxisData\x12.\n\x0byaxisvalues\x18\x02 \x03(\x0b\x32\x19.grpcRemoting.MonitorData*/\n\tXAxisType\x12\t\n\x05Unset\x10\x00\x12\r\n\tIteration\x10\x01\x12\x08\n\x04Time\x10\x02*)\n\x0bMonitorType\x12\x0c\n\x08Residual\x10\x00\x12\x0c\n\x08Solution\x10\x01\x32\xb6\x01\n\x07Monitor\x12T\n\x0bGetMonitors\x12 .grpcRemoting.GetMonitorsRequest\x1a!.grpcRemoting.GetMonitorsResponse\"\x00\x12U\n\x0e\x42\x65ginStreaming\x12\x1e.grpcRemoting.StreamingRequest\x1a\x1f.grpcRemoting.StreamingResponse\"\x00\x30\x01\x62\x06proto3' +) + +_XAXISTYPE = _descriptor.EnumDescriptor( + name='XAxisType', + full_name='grpcRemoting.XAxisType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='Unset', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='Iteration', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='Time', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=683, + serialized_end=730, +) +_sym_db.RegisterEnumDescriptor(_XAXISTYPE) + +XAxisType = enum_type_wrapper.EnumTypeWrapper(_XAXISTYPE) +_MONITORTYPE = _descriptor.EnumDescriptor( + name='MonitorType', + full_name='grpcRemoting.MonitorType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='Residual', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='Solution', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=732, + serialized_end=773, +) +_sym_db.RegisterEnumDescriptor(_MONITORTYPE) + +MonitorType = enum_type_wrapper.EnumTypeWrapper(_MONITORTYPE) +Unset = 0 +Iteration = 1 +Time = 2 +Residual = 0 +Solution = 1 + + + +_GETMONITORSREQUEST = _descriptor.Descriptor( + name='GetMonitorsRequest', + full_name='grpcRemoting.GetMonitorsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=31, + serialized_end=51, +) + + +_UNITDATA = _descriptor.Descriptor( + name='UnitData', + full_name='grpcRemoting.UnitData', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='grpcRemoting.UnitData.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='unit', full_name='grpcRemoting.UnitData.unit', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='factor', full_name='grpcRemoting.UnitData.factor', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='offset', full_name='grpcRemoting.UnitData.offset', index=3, + number=4, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=53, + serialized_end=123, +) + + +_MONITORSET = _descriptor.Descriptor( + name='MonitorSet', + full_name='grpcRemoting.MonitorSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='grpcRemoting.MonitorSet.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='title', full_name='grpcRemoting.MonitorSet.title', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='xlabel', full_name='grpcRemoting.MonitorSet.xlabel', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='ylabel', full_name='grpcRemoting.MonitorSet.ylabel', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='frequency', full_name='grpcRemoting.MonitorSet.frequency', index=4, + number=5, type=18, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', full_name='grpcRemoting.MonitorSet.type', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='unitinfo', full_name='grpcRemoting.MonitorSet.unitinfo', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='axis', full_name='grpcRemoting.MonitorSet.axis', index=7, + number=8, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='monitors', full_name='grpcRemoting.MonitorSet.monitors', index=8, + number=9, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=126, + serialized_end=358, +) + + +_GETMONITORSRESPONSE = _descriptor.Descriptor( + name='GetMonitorsResponse', + full_name='grpcRemoting.GetMonitorsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='monitorset', full_name='grpcRemoting.GetMonitorsResponse.monitorset', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=360, + serialized_end=427, +) + + +_STREAMINGREQUEST = _descriptor.Descriptor( + name='StreamingRequest', + full_name='grpcRemoting.StreamingRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=429, + serialized_end=447, +) + + +_XAXISDATA = _descriptor.Descriptor( + name='XAxisData', + full_name='grpcRemoting.XAxisData', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='xaxistype', full_name='grpcRemoting.XAxisData.xaxistype', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='xaxisindex', full_name='grpcRemoting.XAxisData.xaxisindex', index=1, + number=2, type=18, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=449, + serialized_end=524, +) + + +_MONITORDATA = _descriptor.Descriptor( + name='MonitorData', + full_name='grpcRemoting.MonitorData', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='grpcRemoting.MonitorData.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', full_name='grpcRemoting.MonitorData.value', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=526, + serialized_end=568, +) + + +_STREAMINGRESPONSE = _descriptor.Descriptor( + name='StreamingResponse', + full_name='grpcRemoting.StreamingResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='xaxisdata', full_name='grpcRemoting.StreamingResponse.xaxisdata', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='yaxisvalues', full_name='grpcRemoting.StreamingResponse.yaxisvalues', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=570, + serialized_end=681, +) + +_MONITORSET.fields_by_name['type'].enum_type = _MONITORTYPE +_MONITORSET.fields_by_name['unitinfo'].message_type = _UNITDATA +_MONITORSET.fields_by_name['axis'].enum_type = _XAXISTYPE +_GETMONITORSRESPONSE.fields_by_name['monitorset'].message_type = _MONITORSET +_XAXISDATA.fields_by_name['xaxistype'].enum_type = _XAXISTYPE +_STREAMINGRESPONSE.fields_by_name['xaxisdata'].message_type = _XAXISDATA +_STREAMINGRESPONSE.fields_by_name['yaxisvalues'].message_type = _MONITORDATA +DESCRIPTOR.message_types_by_name['GetMonitorsRequest'] = _GETMONITORSREQUEST +DESCRIPTOR.message_types_by_name['UnitData'] = _UNITDATA +DESCRIPTOR.message_types_by_name['MonitorSet'] = _MONITORSET +DESCRIPTOR.message_types_by_name['GetMonitorsResponse'] = _GETMONITORSRESPONSE +DESCRIPTOR.message_types_by_name['StreamingRequest'] = _STREAMINGREQUEST +DESCRIPTOR.message_types_by_name['XAxisData'] = _XAXISDATA +DESCRIPTOR.message_types_by_name['MonitorData'] = _MONITORDATA +DESCRIPTOR.message_types_by_name['StreamingResponse'] = _STREAMINGRESPONSE +DESCRIPTOR.enum_types_by_name['XAxisType'] = _XAXISTYPE +DESCRIPTOR.enum_types_by_name['MonitorType'] = _MONITORTYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +GetMonitorsRequest = _reflection.GeneratedProtocolMessageType('GetMonitorsRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETMONITORSREQUEST, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.GetMonitorsRequest) + }) +_sym_db.RegisterMessage(GetMonitorsRequest) + +UnitData = _reflection.GeneratedProtocolMessageType('UnitData', (_message.Message,), { + 'DESCRIPTOR' : _UNITDATA, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.UnitData) + }) +_sym_db.RegisterMessage(UnitData) + +MonitorSet = _reflection.GeneratedProtocolMessageType('MonitorSet', (_message.Message,), { + 'DESCRIPTOR' : _MONITORSET, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.MonitorSet) + }) +_sym_db.RegisterMessage(MonitorSet) + +GetMonitorsResponse = _reflection.GeneratedProtocolMessageType('GetMonitorsResponse', (_message.Message,), { + 'DESCRIPTOR' : _GETMONITORSRESPONSE, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.GetMonitorsResponse) + }) +_sym_db.RegisterMessage(GetMonitorsResponse) + +StreamingRequest = _reflection.GeneratedProtocolMessageType('StreamingRequest', (_message.Message,), { + 'DESCRIPTOR' : _STREAMINGREQUEST, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.StreamingRequest) + }) +_sym_db.RegisterMessage(StreamingRequest) + +XAxisData = _reflection.GeneratedProtocolMessageType('XAxisData', (_message.Message,), { + 'DESCRIPTOR' : _XAXISDATA, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.XAxisData) + }) +_sym_db.RegisterMessage(XAxisData) + +MonitorData = _reflection.GeneratedProtocolMessageType('MonitorData', (_message.Message,), { + 'DESCRIPTOR' : _MONITORDATA, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.MonitorData) + }) +_sym_db.RegisterMessage(MonitorData) + +StreamingResponse = _reflection.GeneratedProtocolMessageType('StreamingResponse', (_message.Message,), { + 'DESCRIPTOR' : _STREAMINGRESPONSE, + '__module__' : 'monitor_pb2' + # @@protoc_insertion_point(class_scope:grpcRemoting.StreamingResponse) + }) +_sym_db.RegisterMessage(StreamingResponse) + + + +_MONITOR = _descriptor.ServiceDescriptor( + name='Monitor', + full_name='grpcRemoting.Monitor', + file=DESCRIPTOR, + index=0, + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_start=776, + serialized_end=958, + methods=[ + _descriptor.MethodDescriptor( + name='GetMonitors', + full_name='grpcRemoting.Monitor.GetMonitors', + index=0, + containing_service=None, + input_type=_GETMONITORSREQUEST, + output_type=_GETMONITORSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='BeginStreaming', + full_name='grpcRemoting.Monitor.BeginStreaming', + index=1, + containing_service=None, + input_type=_STREAMINGREQUEST, + output_type=_STREAMINGRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), +]) +_sym_db.RegisterServiceDescriptor(_MONITOR) + +DESCRIPTOR.services_by_name['Monitor'] = _MONITOR + +# @@protoc_insertion_point(module_scope) diff --git a/src/ansys/api/fluent/v0/monitor_pb2_grpc.py b/src/ansys/api/fluent/v0/monitor_pb2_grpc.py new file mode 100644 index 000000000000..dfa8459eea54 --- /dev/null +++ b/src/ansys/api/fluent/v0/monitor_pb2_grpc.py @@ -0,0 +1,101 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +import ansys.api.fluent.v0.monitor_pb2 as monitor__pb2 + + +class MonitorStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetMonitors = channel.unary_unary( + '/grpcRemoting.Monitor/GetMonitors', + request_serializer=monitor__pb2.GetMonitorsRequest.SerializeToString, + response_deserializer=monitor__pb2.GetMonitorsResponse.FromString, + ) + self.BeginStreaming = channel.unary_stream( + '/grpcRemoting.Monitor/BeginStreaming', + request_serializer=monitor__pb2.StreamingRequest.SerializeToString, + response_deserializer=monitor__pb2.StreamingResponse.FromString, + ) + + +class MonitorServicer(object): + """Missing associated documentation comment in .proto file.""" + + def GetMonitors(self, request, context): + """Get monitors info i.e. monitor name, montitor properties e.g. lable, title etc + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def BeginStreaming(self, request, context): + """Begin monitor streaming. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_MonitorServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetMonitors': grpc.unary_unary_rpc_method_handler( + servicer.GetMonitors, + request_deserializer=monitor__pb2.GetMonitorsRequest.FromString, + response_serializer=monitor__pb2.GetMonitorsResponse.SerializeToString, + ), + 'BeginStreaming': grpc.unary_stream_rpc_method_handler( + servicer.BeginStreaming, + request_deserializer=monitor__pb2.StreamingRequest.FromString, + response_serializer=monitor__pb2.StreamingResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'grpcRemoting.Monitor', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class Monitor(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def GetMonitors(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/grpcRemoting.Monitor/GetMonitors', + monitor__pb2.GetMonitorsRequest.SerializeToString, + monitor__pb2.GetMonitorsResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def BeginStreaming(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/grpcRemoting.Monitor/BeginStreaming', + monitor__pb2.StreamingRequest.SerializeToString, + monitor__pb2.StreamingResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/ansys/fluent/core/meta.py b/src/ansys/fluent/core/meta.py index 192335c884bb..0caa4b47239e 100644 --- a/src/ansys/fluent/core/meta.py +++ b/src/ansys/fluent/core/meta.py @@ -19,7 +19,7 @@ def __init__(self, obj): @staticmethod def surface_name_in_server(local_surface_name): - return "_dummy_surface_for_pyfluent:" + local_surface_name + return "_dummy_surface_for_pyfluent:" + local_surface_name.lower() def _get_api_handle(self): return self.obj._get_top_most_parent().session.solver.tui.surface @@ -68,6 +68,9 @@ def __init__(self, obj): self.obj = obj self.field_info = lambda: obj._get_top_most_parent().session.field_info self.field_data = lambda: obj._get_top_most_parent().session.field_data + self.monitors_manager = ( + lambda: obj._get_top_most_parent().session.monitors_manager + ) self.id = lambda: obj._get_top_most_parent().session.id if obj.__class__.__name__ == "Surface": self.surface_api = LocalObjectDataExtractor._SurfaceAPI(obj) @@ -147,22 +150,25 @@ def wrapper(self, value): attrs = getattr(self, "attributes", None) if attrs: for attr in attrs: - if attr == "range" and ( - value < self.range[0] or value > self.range[1] - ): - raise ValueError( - f"Value {value}, is not within valid range" - f" {self.range}." - ) - if attr == "allowed_values": + if attr == "range": + if self.range and ( + value < self.range[0] or value > self.range[1] + ): + raise ValueError( + f"Value {value}, is not within valid range" + f" {self.range}." + ) + elif attr == "allowed_values": if isinstance(value, list): - if not all(v in self.allowed_values for v in value): + if not all( + v is None or v in self.allowed_values for v in value + ): raise ValueError( f"Not all values in {value}, are in the " "list of allowed values " f"{self.allowed_values}." ) - elif value not in self.allowed_values: + elif value is not None and value not in self.allowed_values: raise ValueError( f"Value {value}, is not in the list of " f"allowed values {self.allowed_values}." diff --git a/src/ansys/fluent/core/services/monitor.py b/src/ansys/fluent/core/services/monitor.py new file mode 100644 index 000000000000..ca4cbf4f5ba8 --- /dev/null +++ b/src/ansys/fluent/core/services/monitor.py @@ -0,0 +1,72 @@ +"""Wrapper over the monitor grpc service of Fluent.""" + +from google.protobuf.json_format import MessageToDict +import grpc + +from ansys.api.fluent.v0 import monitor_pb2 as MonitorModule +from ansys.api.fluent.v0 import monitor_pb2_grpc as MonitorGrpcModule + + +class MonitorsService: + """Class wrapping the monitor grpc service of Fluent.""" + + def __init__(self, channel: grpc.Channel, metadata): + self.__stub = MonitorGrpcModule.MonitorStub(channel) + self.__metadata = metadata + self._streams = None + + def get_monitors_info(self) -> dict: + """Get monitors info. + + Parameters + ---------- + None + + Returns + ------- + dict + Dictionary containing monitors info. + """ + monitors_info = {} + request = MonitorModule.GetMonitorsRequest() + response = self.__stub.GetMonitors(request, metadata=self.__metadata) + for monitor_set in response.monitorset: + monitor_info = MessageToDict(monitor_set) + monitors_info[monitor_set.name] = monitor_info + return monitors_info + + def begin_streaming(self, started_evt): + """Begin monitor streaming from Fluent. + + Parameters + ---------- + None + + Yields + ------- + Monitor data + Monitor data i.e monitor x and y values. + """ + + request = MonitorModule.StreamingRequest() + self._streams = self.__stub.BeginStreaming(request, metadata=self.__metadata) + started_evt.set() + while True: + try: + yield next(self._streams) + except Exception: + break + + def end_streaming(self): + """End monitor streaming from Fluent. + + Parameters + ---------- + None + + Returns + ------- + None + """ + if self._streams and not self._streams.cancelled(): + self._streams.cancel() diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index 551b6b4fe58d..f8cfc7716eef 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -20,11 +20,13 @@ from ansys.fluent.core.services.events import EventsService from ansys.fluent.core.services.field_data import FieldData, FieldDataService, FieldInfo from ansys.fluent.core.services.health_check import HealthCheckService +from ansys.fluent.core.services.monitor import MonitorsService from ansys.fluent.core.services.scheme_eval import SchemeEval, SchemeEvalService from ansys.fluent.core.services.settings import SettingsService from ansys.fluent.core.services.transcript import TranscriptService from ansys.fluent.core.solver.events_manager import EventsManager from ansys.fluent.core.solver.flobject import get_root as settings_get_root +from ansys.fluent.core.solver.monitors_manager import MonitorsManager try: from ansys.fluent.core.solver.settings import root @@ -208,6 +210,16 @@ def __init__( self._events_service = EventsService(self._channel, self._metadata) self.events_manager = EventsManager(self._id, self._events_service) + self._monitors_service = MonitorsService(self._channel, self._metadata) + self.monitors_manager = MonitorsManager(self._id, self._monitors_service) + + self.events_manager.register_callback( + "InitializedEvent", self.monitors_manager.refresh + ) + self.events_manager.register_callback( + "DataReadEvent", self.monitors_manager.refresh + ) + self._datamodel_service_tui = DatamodelService_TUI( self._channel, self._metadata ) diff --git a/src/ansys/fluent/core/solver/flobject.py b/src/ansys/fluent/core/solver/flobject.py index a721d6f0e895..ca7f1e987903 100644 --- a/src/ansys/fluent/core/solver/flobject.py +++ b/src/ansys/fluent/core/solver/flobject.py @@ -86,15 +86,13 @@ class Base: def __init__(self, name: str = None, parent=None): """__init__ of Base class.""" self._parent = weakref.proxy(parent) if parent is not None else None + self._flproxy = None if name is not None: self._name = name - _flproxy = None - - @classmethod - def set_flproxy(cls, flproxy): + def set_flproxy(self, flproxy): """Set flproxy object.""" - cls._flproxy = flproxy + self._flproxy = flproxy @property def flproxy(self): @@ -619,6 +617,15 @@ class Map(SettingsBase[DictStateType]): class Command(Base): """Command object.""" + def __init__(self, name: str = None, parent=None): + """__init__ of Group class.""" + super().__init__(name, parent) + if hasattr(self, "argument_names"): + for argument in self.argument_names: + cls = getattr(self.__class__, argument) + setattr(self, argument, cls(None, self)) + self._initialized = True + def __call__(self, **kwds): """Call a command with the specified keyword arguments.""" newkwds = {} @@ -804,5 +811,7 @@ def get_root(flproxy) -> Group: except Exception: cls = get_cls("", obj_info) # pylint: disable=no-member - cls.set_flproxy(flproxy) - return cls() + root = cls() + root.set_flproxy(flproxy) + root._static_info = obj_info + return root diff --git a/src/ansys/fluent/core/solver/monitors_manager.py b/src/ansys/fluent/core/solver/monitors_manager.py new file mode 100644 index 000000000000..dbf12716f1d4 --- /dev/null +++ b/src/ansys/fluent/core/solver/monitors_manager.py @@ -0,0 +1,190 @@ +"""Module for monitors management.""" + +import threading +from typing import Dict, List, Tuple, Union + +import numpy as np +import pandas as pd + + +class MonitorsManager: + """Manages monitors e.g Fluent residuals and report definitions monitors. + + Parameters + ---------- + session_id : str + Session id. + service : MonitorsService + Monitors streaming service. + """ + + def __init__(self, session_id: str, service): + self._session_id: str = session_id + self._monitors_service = service + self._lock: threading.Lock = threading.Lock() + self._lock_refresh: threading.Lock = threading.Lock() + self._monitors_info = None + self._monitors_thread = None + self._data_frames = {} + + def get_monitor_set_names(self) -> List[str]: + """Get monitor set names. + Parameters + ---------- + None + + Returns + -------- + List[str] + List of all monitor set names. + """ + with self._lock: + return list(self._data_frames) + + def get_monitor_set_prop(self, monitor_set_name: str, property: str) -> str: + """Get monitor set property. + Parameters + ---------- + monitor_set_name : str + Monitor set name. + property : str + Monitor set property. It can be `title`, `xlabel`, `ylabel`. + + Returns + -------- + str + Monitor set property. + """ + with self._lock: + return self._monitors_info.get(monitor_set_name, {}).get(property) + + def get_monitor_set_plot( + self, monitor_set_name, *args, **kwargs + ) -> Union[None, object]: + """Get monitor set plot. + + Parameters + ---------- + monitor_set_name : str + Monitor set name. + + Returns + -------- + Union[None, object] + Returns None if DataFrame is empty. Otherwise plot object depending upon + ``plotting.backend``. + https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html + """ + with self._lock: + df = self._data_frames[monitor_set_name]["df"] + return None if df.empty else df.plot(*args, **kwargs) + + def get_monitor_set_data( + self, monitor_set_name + ) -> Tuple[np.array, Dict[str, np.array]]: + """Get monitor set data. + + Parameters + ---------- + monitor_set_name : str + Monitor set name. + + Returns + -------- + Tuple[np.array, Dict[str, np.array]] + Tuple contains numpy array of x-axis values and dictioary of monitor name and numpy array of + y-axis values. + """ + with self._lock: + df_data = self._data_frames[monitor_set_name] + df = df_data["df"] + + return ( + ([], {}) + if df.empty + else ( + df.index.to_numpy(), + {column: df[[column]].to_numpy() for column in df.columns}, + ) + ) + + def refresh(self, session_id, event_info) -> None: + """Monitors refresh callback. + + The callback is registered with events manager to refresh plots + during initialized and dataread events. + + Parameters + ---------- + session_id : str + Monitor set name. + event_info : object + Event info object. + + Returns + -------- + None + """ + with self._lock_refresh: + self._stop() + self._start() + + def _begin_streaming(self, started_evt): + """Begin monitors streaming.""" + responses = self._monitors_service.begin_streaming(started_evt) + + while True: + try: + data_received = {} + response = next(responses) + x_axis_type = response.xaxisdata.xaxistype + x_axis_index = response.xaxisdata.xaxisindex + data_received["xvalues"] = x_axis_index + for y_axis_value in response.yaxisvalues: + data_received[y_axis_value.name] = y_axis_value.value + with self._lock: + for monitor_set_name, df_data in self._data_frames.items(): + df = df_data["df"] + monitors = df_data["monitors"] + monitor_data = [] + for monitor_name in monitors: + if monitor_name not in data_received: + monitor_data = [] + break + monitor_data.append(data_received[monitor_name]) + + if monitor_data: + new_df = pd.DataFrame([monitor_data], columns=monitors) + new_df.set_index("xvalues", inplace=True) + # df_data["df"] = df.append(new_df) + df_data["df"] = pd.concat([df, new_df]) + + except StopIteration: + break + + def _start(self) -> str: + """Start monitors manager.""" + with self._lock: + if not self._monitors_thread: + self._monitors_info = self._monitors_service.get_monitors_info() + self._data_frames = {} + for monitor_set_name, monitor_set_info in self._monitors_info.items(): + self._data_frames[monitor_set_name] = {} + monitors_name = list(monitor_set_info["monitors"]) + ["xvalues"] + df = pd.DataFrame([], columns=monitors_name) + df.set_index("xvalues", inplace=True) + self._data_frames[monitor_set_name]["df"] = df + self._data_frames[monitor_set_name]["monitors"] = monitors_name + started_evt = threading.Event() + self._monitors_thread: threading.Thread = threading.Thread( + target=MonitorsManager._begin_streaming, args=(self, started_evt) + ) + self._monitors_thread.start() + started_evt.wait() + + def _stop(self): + """Stop monitors manager.""" + if self._monitors_thread: + self._monitors_service.end_streaming() + self._monitors_thread.join() + self._monitors_thread = None