From 460f16a5d6dd9e7a916ea9dfade339003f314577 Mon Sep 17 00:00:00 2001 From: ansys-akarcher <128720408+ansys-akarcher@users.noreply.github.com> Date: Tue, 11 Jul 2023 12:05:55 +0200 Subject: [PATCH] Fixed handling of empty Time Freq Support (#996) * Fixed factory regarding time freq support * Revert "Fixed factory regarding time freq support" This reverts commit 227566151add0e84c6c453d65aea5be688387362. * Fixed nullptr handling of timefreq support * Fixed unit setting when None * Added tests * Workaround to avoid throwing when retrieving no tf support * Do not raise exception only if support not present * breaks retro due to C++ changes --- src/ansys/dpf/core/collection.py | 17 ++++++++++++++- .../dpf/core/fields_container_factory.py | 3 ++- tests/test_fieldscontainer.py | 21 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/ansys/dpf/core/collection.py b/src/ansys/dpf/core/collection.py index bc91c97c68..6f9770aee0 100644 --- a/src/ansys/dpf/core/collection.py +++ b/src/ansys/dpf/core/collection.py @@ -383,14 +383,29 @@ def _get_time_freq_support(self): capi=data_processing_capi.DataProcessingCAPI, grpcapi=data_processing_grpcapi.DataProcessingGRPCAPI, ) + internal_obj = None + # LegacyGrpcServer throws UNAVAILABLE when retrieving nullptr + # This is all to obtain a None instead of throwing + import ansys.dpf.gate.errors as err + + try: + internal_obj = self._api.collection_get_support(self, "time") + except err.DPFServerException as e: + str_to_ignore = "The collection does not have a support." + if str_to_ignore not in str(e): + raise e + if not internal_obj: + return None + support = object_handler.ObjHandler( data_processing_api=data_api, - internal_obj=self._api.collection_get_support(self, "time"), + internal_obj=internal_obj, server=self._server, ) support_api = self._server.get_api_for_type( capi=support_capi.SupportCAPI, grpcapi=support_grpcapi.SupportGRPCAPI ) + time_freq = support_api.support_get_as_time_freq_support(support) res = TimeFreqSupport(time_freq_support=time_freq, server=self._server) return res diff --git a/src/ansys/dpf/core/fields_container_factory.py b/src/ansys/dpf/core/fields_container_factory.py index ba76c342d6..6d81110660 100644 --- a/src/ansys/dpf/core/fields_container_factory.py +++ b/src/ansys/dpf/core/fields_container_factory.py @@ -62,7 +62,8 @@ def over_time_freq_fields_container(fields, time_freq_unit=None, server=None): len(fields), location=locations.time_freq, server=server ) time_freq_field.append(time_freq, 1) - time_freq_field.unit = time_freq_unit + if time_freq_unit: + time_freq_field.unit = time_freq_unit time_freq_support = TimeFreqSupport(server=server) time_freq_support.time_frequencies = time_freq_field fc.time_freq_support = time_freq_support diff --git a/tests/test_fieldscontainer.py b/tests/test_fieldscontainer.py index cf13b78f54..24ac3daacb 100644 --- a/tests/test_fieldscontainer.py +++ b/tests/test_fieldscontainer.py @@ -503,10 +503,31 @@ def test_dot_operator_fields_container(): assert np.allclose(out[0].data, -field.data) +def test_fields_container_factory_with_dict(): + field1 = dpf.Field() + field1.data = [1, 2, 3] + field2 = dpf.Field() + field2.data = [2, 3, 4] + fields_container = dpf.fields_container_factory.over_time_freq_fields_container( + fields={0.1: field1, 0.2: field2} + ) + + assert fields_container[0].unit == "" + + def test_fields_container_get_time_scoping(server_type, disp_fc): freq_scoping = disp_fc.get_time_scoping() assert freq_scoping.size == 1 +@pytest.mark.skipif( + not conftest.SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_7_0, reason="Available for servers >=7.0" +) +def test_fields_container_empty_tf_support(server_type): + fields_container = dpf.FieldsContainer(server=server_type) + + assert fields_container.time_freq_support == None + + if __name__ == "__main__": test_add_field_by_time_id()