diff --git a/src/ansys/dpf/core/field.py b/src/ansys/dpf/core/field.py index c4a05dc9411..e65d2af6e47 100644 --- a/src/ansys/dpf/core/field.py +++ b/src/ansys/dpf/core/field.py @@ -30,6 +30,7 @@ from ansys import dpf from ansys.dpf.core import dimensionality, errors, meshed_region, scoping, time_freq_support +from ansys.dpf.core.available_result import Homogeneity from ansys.dpf.core.common import ( _get_size_of_list, locations, @@ -617,12 +618,18 @@ def unit(self): return self.field_definition.unit @unit.setter - def unit(self, value): + def unit(self, value: str | tuple[Homogeneity, str]): """Change the unit for the field. + A single string is interpreted as a known physical unit with an associated homogeneity. + + For DPF 11.0 (2026 R1) and above: A tuple of two strings is interpreted as a homogeneity and a unit name. + If the homogeneity is :py:attr:`Homogeneity.dimensionless`, then the unit string is kept as a name. + Otherwise, the homogeneity is ignored, and the unit string interpreted as a known physical unit with an associated homogeneity. + Parameters ---------- - value : str + value: Units for the field. Examples @@ -635,10 +642,24 @@ def unit(self, value): >>> my_field.unit 'm' + + Named dimensionless unit. + + >>> from ansys.dpf import core as dpf + >>> from ansys.dpf.core.available_result import Homogeneity + >>> my_field = dpf.Field(10) + >>> my_field.unit = (Homogeneity.dimensionless, "dollars") + >>> print(my_field.unit) + 'dollars' + + Notes + ----- + Setting a named dimensionless unit requires DPF 11.0 (2026 R1) or above. + """ - fielddef = self.field_definition - fielddef.unit = value - self.field_definition = fielddef + field_def = self.field_definition + field_def.unit = value + self.field_definition = field_def @property def dimensionality(self): diff --git a/src/ansys/dpf/core/field_definition.py b/src/ansys/dpf/core/field_definition.py index 2271c469f13..fb87d249812 100644 --- a/src/ansys/dpf/core/field_definition.py +++ b/src/ansys/dpf/core/field_definition.py @@ -22,11 +22,14 @@ """FieldDefinition.""" +from __future__ import annotations + import traceback import warnings from ansys.dpf.core import server as server_module -from ansys.dpf.core.check_version import version_requires +from ansys.dpf.core.available_result import Homogeneity +from ansys.dpf.core.check_version import server_meet_version_and_raise, version_requires from ansys.dpf.core.common import natures, shell_layers from ansys.dpf.core.dimensionality import Dimensionality from ansys.dpf.gate import ( @@ -204,8 +207,44 @@ def is_of_quantity_type(self, quantity_type): return is_of_quantity_type @unit.setter - def unit(self, value): - self._api.csfield_definition_set_unit(self, value, None, 0, 0, 0) + def unit(self, value: str | tuple[Homogeneity, str]): + """Change the unit for the field definition. + + A single string is interpreted as a known physical unit with an associated homogeneity. + + For DPF 11.0 (2026 R1) and above: A tuple of two strings is interpreted as a homogeneity and a unit name. + If the homogeneity is :py:attr:`Homogeneity.dimensionless`, then the unit string is kept as a name. + Otherwise, the homogeneity is ignored, and the unit string interpreted as a known physical unit with an associated homogeneity. + + Parameters + ---------- + value: + Units for the field. + + Notes + ----- + Setting a named dimensionless unit requires DPF 11.0 (2026 R1) or above. + + """ + # setter with explicit homogeneity: homogeneity is taken into account if it is dimensionless + if ( + isinstance(value, tuple) + and len(value) == 2 + and isinstance(value[0], Homogeneity) + and isinstance(value[1], str) + ): + server_meet_version_and_raise( + required_version="11.0", + server=self._server, + msg="Setting a named dimensionless unit requires DPF 11.0 (2026 R1) or above.", + ) + # csfield_definition_set_unit will ignore the homogeneity if it is not dimensionless + self._api.csfield_definition_set_unit(self, value[1], None, value[0].value, 0, 0) + # standard unit setter, using string interpreter + elif isinstance(value, str): + self._api.csfield_definition_set_unit(self, value, None, 0, 0, 0) + else: + raise ValueError("Unit setter supports either string or tuple(Homogeneity, str)") @location.setter def location(self, value): diff --git a/src/ansys/dpf/gatebin/Ans.Dpf.GrpcClient.dll b/src/ansys/dpf/gatebin/Ans.Dpf.GrpcClient.dll index 8df36d644ea..fc87c1ab745 100644 Binary files a/src/ansys/dpf/gatebin/Ans.Dpf.GrpcClient.dll and b/src/ansys/dpf/gatebin/Ans.Dpf.GrpcClient.dll differ diff --git a/src/ansys/dpf/gatebin/DPFClientAPI.dll b/src/ansys/dpf/gatebin/DPFClientAPI.dll index d706bb3f094..d2666db0971 100644 Binary files a/src/ansys/dpf/gatebin/DPFClientAPI.dll and b/src/ansys/dpf/gatebin/DPFClientAPI.dll differ diff --git a/src/ansys/dpf/gatebin/libAns.Dpf.GrpcClient.so b/src/ansys/dpf/gatebin/libAns.Dpf.GrpcClient.so index 14e0ee3e556..ed4b15e3d4d 100644 Binary files a/src/ansys/dpf/gatebin/libAns.Dpf.GrpcClient.so and b/src/ansys/dpf/gatebin/libAns.Dpf.GrpcClient.so differ diff --git a/src/ansys/dpf/gatebin/libDPFClientAPI.so b/src/ansys/dpf/gatebin/libDPFClientAPI.so index 318882a72ab..cb1c67b385b 100644 Binary files a/src/ansys/dpf/gatebin/libDPFClientAPI.so and b/src/ansys/dpf/gatebin/libDPFClientAPI.so differ diff --git a/src/ansys/grpc/dpf/available_result_pb2.py b/src/ansys/grpc/dpf/available_result_pb2.py index 38b96d50af7..029e244efa6 100644 --- a/src/ansys/grpc/dpf/available_result_pb2.py +++ b/src/ansys/grpc/dpf/available_result_pb2.py @@ -16,7 +16,7 @@ import ansys.grpc.dpf.label_space_pb2 as label__space__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x61vailable_result.proto\x12!ansys.api.dpf.available_result.v0\x1a\nbase.proto\x1a\x11label_space.proto\"?\n\tSubResult\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07op_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xe5\x03\n\x17\x41vailableResultResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bphysicsname\x18\x02 \x01(\t\x12\r\n\x05ncomp\x18\x03 \x01(\x05\x12\x35\n\x0e\x64imensionality\x18\x04 \x01(\x0e\x32\x1d.ansys.api.dpf.base.v0.Nature\x12\x43\n\x0bhomogeneity\x18\x05 \x01(\x0e\x32..ansys.api.dpf.available_result.v0.Homogeneity\x12\x0c\n\x04unit\x18\x06 \x01(\t\x12=\n\x07sub_res\x18\x07 \x03(\x0b\x32,.ansys.api.dpf.available_result.v0.SubResult\x12^\n\nproperties\x18\x08 \x03(\x0b\x32J.ansys.api.dpf.available_result.v0.AvailableResultResponse.PropertiesEntry\x12<\n\nqualifiers\x18\t \x03(\x0b\x32(.ansys.api.dpf.label_space.v0.LabelSpace\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*\xb7\x08\n\x0bHomogeneity\x12\x10\n\x0c\x41\x43\x43\x45LERATION\x10\x00\x12\t\n\x05\x41NGLE\x10\x01\x12\x14\n\x10\x41NGULAR_VELOCITY\x10\x02\x12\x0b\n\x07SURFACE\x10\x03\x12\x0f\n\x0b\x43\x41PACITANCE\x10\x04\x12\x13\n\x0f\x45LECTRIC_CHARGE\x10\x05\x12\x1b\n\x17\x45LECTRIC_CHARGE_DENSITY\x10\x06\x12\x10\n\x0c\x43ONDUCTIVITY\x10\x07\x12\x0b\n\x07\x43URRENT\x10\t\x12\x0b\n\x07\x44\x45NSITY\x10\n\x12\x10\n\x0c\x44ISPLACEMENT\x10\x0b\x12\x19\n\x15\x45LECTRIC_CONDUCTIVITY\x10\x0c\x12\x12\n\x0e\x45LECTRIC_FIELD\x10\r\x12\x19\n\x15\x45LECTRIC_FLUX_DENSITY\x10\x0e\x12\x18\n\x14\x45LECTRIC_RESISTIVITY\x10\x0f\x12\n\n\x06\x45NERGY\x10\x10\x12\x14\n\x10\x46ILM_COEFFICIENT\x10\x11\x12\t\n\x05\x46ORCE\x10\x12\x12\x13\n\x0f\x46ORCE_INTENSITY\x10\x13\x12\r\n\tFREQUENCY\x10\x14\x12\r\n\tHEAT_FLUX\x10\x15\x12\x13\n\x0fHEAT_GENERATION\x10\x16\x12\r\n\tHEAT_RATE\x10\x17\x12\x0e\n\nINDUCTANCE\x10\x18\x12\x12\n\x0eINVERSE_STRESS\x10\x19\x12\n\n\x06LENGTH\x10\x1a\x12\x1c\n\x18MAGNETIC_FIELD_INTENSITY\x10\x1b\x12\x11\n\rMAGNETIC_FLUX\x10\x1c\x12\x19\n\x15MAGNETIC_FLUX_DENSITY\x10\x1d\x12\x08\n\x04MASS\x10\x1e\x12\n\n\x06MOMENT\x10\x1f\x12\x13\n\x0fMOMENT_INTERTIA\x10 \x12\x10\n\x0cPERMEABILITY\x10!\x12\x10\n\x0cPERMITTIVITY\x10\"\x12\x0b\n\x07POISSON\x10#\x12\t\n\x05POWER\x10$\x12\x0c\n\x08PRESSURE\x10%\x12\x19\n\x15RELATIVE_PERMEABILITY\x10&\x12\x19\n\x15RELATIVE_PERMITTIVITY\x10\'\x12\x13\n\x0fSECTION_MODULUS\x10(\x12\x11\n\rSPECIFIC_HEAT\x10)\x12\x13\n\x0fSPECIFIC_WEIGHT\x10*\x12\x10\n\x0cSHEAR_STRAIN\x10+\x12\r\n\tSTIFFNESS\x10,\x12\n\n\x06STRAIN\x10-\x12\n\n\x06STRESS\x10.\x12\x0c\n\x08STRENGTH\x10/\x12\x15\n\x11THERMAL_EXPANSION\x10\x30\x12\x0f\n\x0bTEMPERATURE\x10\x31\x12\x08\n\x04TIME\x10\x32\x12\x0c\n\x08VELOCITY\x10\x33\x12\x0b\n\x07VOLTAGE\x10\x34\x12\n\n\x06VOLUME\x10\x35\x12\x17\n\x13MOMENT_INERTIA_MASS\x10\x37\x12\x1b\n\x17STRESS_INTENSITY_FACTOR\x10\\\x12\x14\n\x10THERMAL_GRADIENT\x10_\x12\x0f\n\nRESISTANCE\x10\xe8\x07\x12\x0b\n\x07UNKNOWN\x10o\x12\x11\n\rDIMENSIONLESS\x10uB#\xaa\x02 Ansys.Api.Dpf.AvailableResult.V0b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x61vailable_result.proto\x12!ansys.api.dpf.available_result.v0\x1a\nbase.proto\x1a\x11label_space.proto\"?\n\tSubResult\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07op_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"\xe5\x03\n\x17\x41vailableResultResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bphysicsname\x18\x02 \x01(\t\x12\r\n\x05ncomp\x18\x03 \x01(\x05\x12\x35\n\x0e\x64imensionality\x18\x04 \x01(\x0e\x32\x1d.ansys.api.dpf.base.v0.Nature\x12\x43\n\x0bhomogeneity\x18\x05 \x01(\x0e\x32..ansys.api.dpf.available_result.v0.Homogeneity\x12\x0c\n\x04unit\x18\x06 \x01(\t\x12=\n\x07sub_res\x18\x07 \x03(\x0b\x32,.ansys.api.dpf.available_result.v0.SubResult\x12^\n\nproperties\x18\x08 \x03(\x0b\x32J.ansys.api.dpf.available_result.v0.AvailableResultResponse.PropertiesEntry\x12<\n\nqualifiers\x18\t \x03(\x0b\x32(.ansys.api.dpf.label_space.v0.LabelSpace\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*\xde\n\n\x0bHomogeneity\x12\x10\n\x0c\x41\x43\x43\x45LERATION\x10\x00\x12\t\n\x05\x41NGLE\x10\x01\x12\x14\n\x10\x41NGULAR_VELOCITY\x10\x02\x12\x0b\n\x07SURFACE\x10\x03\x12\x0f\n\x0b\x43\x41PACITANCE\x10\x04\x12\x13\n\x0f\x45LECTRIC_CHARGE\x10\x05\x12\x1b\n\x17\x45LECTRIC_CHARGE_DENSITY\x10\x06\x12\x10\n\x0c\x43ONDUCTIVITY\x10\x07\x12\x0b\n\x07\x43URRENT\x10\x08\x12\x13\n\x0f\x43URRENT_DENSITY\x10\t\x12\x0b\n\x07\x44\x45NSITY\x10\n\x12\x10\n\x0c\x44ISPLACEMENT\x10\x0b\x12\x19\n\x15\x45LECTRIC_CONDUCTIVITY\x10\x0c\x12\x12\n\x0e\x45LECTRIC_FIELD\x10\r\x12\x19\n\x15\x45LECTRIC_FLUX_DENSITY\x10\x0e\x12\x18\n\x13\x45LECTRIC_RESISTANCE\x10\xe8\x07\x12\x18\n\x14\x45LECTRIC_RESISTIVITY\x10\x0f\x12\n\n\x06\x45NERGY\x10\x10\x12\x14\n\x10\x46ILM_COEFFICIENT\x10\x11\x12\t\n\x05\x46ORCE\x10\x12\x12\x13\n\x0f\x46ORCE_INTENSITY\x10\x13\x12\r\n\tFREQUENCY\x10\x14\x12\r\n\tHEAT_FLUX\x10\x15\x12\x13\n\x0fHEAT_GENERATION\x10\x16\x12\r\n\tHEAT_RATE\x10\x17\x12\x0e\n\nINDUCTANCE\x10\x18\x12\x12\n\x0eINVERSE_STRESS\x10\x19\x12\n\n\x06LENGTH\x10\x1a\x12\x1c\n\x18MAGNETIC_FIELD_INTENSITY\x10\x1b\x12\x11\n\rMAGNETIC_FLUX\x10\x1c\x12\x19\n\x15MAGNETIC_FLUX_DENSITY\x10\x1d\x12\x08\n\x04MASS\x10\x1e\x12\n\n\x06MOMENT\x10\x1f\x12\x13\n\x0fMOMENT_INTERTIA\x10 \x12\x12\n\x0eMOMENT_INERTIA\x10 \x12\x17\n\x13MOMENT_INERTIA_MASS\x10\x37\x12\x10\n\x0cPERMEABILITY\x10!\x12\x10\n\x0cPERMITTIVITY\x10\"\x12\x0b\n\x07POISSON\x10#\x12\t\n\x05POWER\x10$\x12\x0c\n\x08PRESSURE\x10%\x12\x19\n\x15RELATIVE_PERMEABILITY\x10&\x12\x19\n\x15RELATIVE_PERMITTIVITY\x10\'\x12\x13\n\x0fSECTION_MODULUS\x10(\x12\x11\n\rSPECIFIC_HEAT\x10)\x12\x13\n\x0fSPECIFIC_WEIGHT\x10*\x12\x10\n\x0cSHEAR_STRAIN\x10+\x12\r\n\tSTIFFNESS\x10,\x12\n\n\x06STRAIN\x10-\x12\n\n\x06STRESS\x10.\x12\x0c\n\x08STRENGTH\x10/\x12\x15\n\x11THERMAL_EXPANSION\x10\x30\x12\x0f\n\x0bTEMPERATURE\x10\x31\x12\x1a\n\x16TEMPERATURE_DIFFERENCE\x10N\x12\x08\n\x04TIME\x10\x32\x12\x0c\n\x08VELOCITY\x10\x33\x12\x0b\n\x07VOLTAGE\x10\x34\x12\n\n\x06VOLUME\x10\x35\x12\x1b\n\x17STRESS_INTENSITY_FACTOR\x10\\\x12\x14\n\x10THERMAL_GRADIENT\x10_\x12\x18\n\x14\x41NGULAR_ACCELERATION\x10?\x12\x11\n\rDIMENSIONLESS\x10u\x12\r\n\tVISCOSITY\x10v\x12\x14\n\x10\x44ISSIPATION_RATE\x10w\x12\x0c\n\x08MOMENTUM\x10x\x12\x14\n\x10VOLUME_FLOW_RATE\x10y\x12\x12\n\x0eMASS_FLOW_RATE\x10z\x12\x13\n\x0fSPECIFIC_ENERGY\x10{\x12\x14\n\x10SPECIFIC_ENTROPY\x10|\x12\x11\n\rFORCE_DENSITY\x10}\x12\x1d\n\x19MAGNETIC_VECTOR_POTENTIAL\x10~\x12\x0c\n\x07UNKNOWN\x10\x90N\x1a\x02\x10\x01\x42#\xaa\x02 Ansys.Api.Dpf.AvailableResult.V0b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,10 +24,12 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\252\002 Ansys.Api.Dpf.AvailableResult.V0' + _globals['_HOMOGENEITY']._options = None + _globals['_HOMOGENEITY']._serialized_options = b'\020\001' _globals['_AVAILABLERESULTRESPONSE_PROPERTIESENTRY']._options = None _globals['_AVAILABLERESULTRESPONSE_PROPERTIESENTRY']._serialized_options = b'8\001' _globals['_HOMOGENEITY']._serialized_start=646 - _globals['_HOMOGENEITY']._serialized_end=1725 + _globals['_HOMOGENEITY']._serialized_end=2020 _globals['_SUBRESULT']._serialized_start=92 _globals['_SUBRESULT']._serialized_end=155 _globals['_AVAILABLERESULTRESPONSE']._serialized_start=158 diff --git a/src/ansys/grpc/dpf/field_definition_pb2.py b/src/ansys/grpc/dpf/field_definition_pb2.py index dd7ede12dc4..610869935ca 100644 --- a/src/ansys/grpc/dpf/field_definition_pb2.py +++ b/src/ansys/grpc/dpf/field_definition_pb2.py @@ -16,7 +16,7 @@ import ansys.grpc.dpf.available_result_pb2 as available__result__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66ield_definition.proto\x12!ansys.api.dpf.field_definition.v0\x1a\nbase.proto\x1a\x16\x61vailable_result.proto\"F\n\x0f\x46ieldDefinition\x12\x33\n\x02id\x18\x01 \x01(\x0b\x32\'.ansys.api.dpf.base.v0.EntityIdentifier\"\xb9\x01\n\tDimension\x12\x0c\n\x04mass\x18\x01 \x01(\x01\x12\x0e\n\x06length\x18\x02 \x01(\x01\x12\x0c\n\x04time\x18\x03 \x01(\x01\x12\x17\n\x0f\x65lectric_charge\x18\x04 \x01(\x01\x12\x13\n\x0btemperature\x18\x05 \x01(\x01\x12\r\n\x05\x61ngle\x18\x06 \x01(\x01\x12\x43\n\x0bhomogeneity\x18\x07 \x01(\x0e\x32..ansys.api.dpf.available_result.v0.Homogeneity\"M\n\x0e\x44imensionality\x12-\n\x06nature\x18\x01 \x01(\x0e\x32\x1d.ansys.api.dpf.base.v0.Nature\x12\x0c\n\x04size\x18\x02 \x03(\x05\"#\n\x11UnitParseBySymbol\x12\x0e\n\x06symbol\x18\x01 \x01(\t\"p\n\x04Unit\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x39\n\x03\x64im\x18\x02 \x01(\x0b\x32,.ansys.api.dpf.field_definition.v0.Dimension\x12\x0e\n\x06\x66\x61\x63tor\x18\x03 \x01(\x01\x12\r\n\x05shift\x18\x04 \x01(\x01\"+\n\x11ListQuantityTypes\x12\x16\n\x0equantity_types\x18\x01 \x03(\t\"\x8e\x03\n\x13\x46ieldDefinitionData\x12\x35\n\x04unit\x18\x01 \x01(\x0b\x32\'.ansys.api.dpf.field_definition.v0.Unit\x12\x31\n\x08location\x18\x02 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.Location\x12J\n\x0f\x64imensionnality\x18\x03 \x01(\x0b\x32\x31.ansys.api.dpf.field_definition.v0.Dimensionality\x12\x44\n\x0cshell_layers\x18\x05 \x01(\x0e\x32..ansys.api.dpf.field_definition.v0.ShellLayers\x12L\n\x0equantity_types\x18\x06 \x01(\x0b\x32\x34.ansys.api.dpf.field_definition.v0.ListQuantityTypes\x12-\n\x04name\x18\x07 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.PBString\"\xcc\x04\n\x1c\x46ieldDefinitionUpdateRequest\x12L\n\x10\x66ield_definition\x18\x01 \x01(\x0b\x32\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x12\x37\n\x04unit\x18\x02 \x01(\x0b\x32\'.ansys.api.dpf.field_definition.v0.UnitH\x00\x12K\n\x0bunit_symbol\x18\x03 \x01(\x0b\x32\x34.ansys.api.dpf.field_definition.v0.UnitParseBySymbolH\x00\x12\x31\n\x08location\x18\x04 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.Location\x12J\n\x0f\x64imensionnality\x18\x05 \x01(\x0b\x32\x31.ansys.api.dpf.field_definition.v0.Dimensionality\x12\x44\n\x0cshell_layers\x18\x06 \x01(\x0e\x32..ansys.api.dpf.field_definition.v0.ShellLayers\x12L\n\x0equantity_types\x18\x07 \x01(\x0b\x32\x34.ansys.api.dpf.field_definition.v0.ListQuantityTypes\x12-\n\x04name\x18\x08 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.PBStringB\x16\n\x14unit_definition_type*}\n\x0bShellLayers\x12\n\n\x06NOTSET\x10\x00\x12\x07\n\x03TOP\x10\x01\x12\n\n\x06\x42OTTOM\x10\x02\x12\r\n\tTOPBOTTOM\x10\x03\x12\x07\n\x03MID\x10\x04\x12\x10\n\x0cTOPBOTTOMMID\x10\x05\x12\r\n\tNONELAYER\x10\x06\x12\x14\n\x10LAYERINDEPENDENT\x10\x07\x32\xad\x03\n\x16\x46ieldDefinitionService\x12Z\n\x06\x43reate\x12\x1c.ansys.api.dpf.base.v0.Empty\x1a\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x12g\n\x06Update\x12?.ansys.api.dpf.field_definition.v0.FieldDefinitionUpdateRequest\x1a\x1c.ansys.api.dpf.base.v0.Empty\x12r\n\x04List\x12\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x1a\x36.ansys.api.dpf.field_definition.v0.FieldDefinitionData\x12Z\n\x06\x44\x65lete\x12\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x1a\x1c.ansys.api.dpf.base.v0.EmptyB#\xaa\x02 Ansys.Api.Dpf.FieldDefinition.V0b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66ield_definition.proto\x12!ansys.api.dpf.field_definition.v0\x1a\nbase.proto\x1a\x16\x61vailable_result.proto\"F\n\x0f\x46ieldDefinition\x12\x33\n\x02id\x18\x01 \x01(\x0b\x32\'.ansys.api.dpf.base.v0.EntityIdentifier\"\xb9\x01\n\tDimension\x12\x0c\n\x04mass\x18\x01 \x01(\x01\x12\x0e\n\x06length\x18\x02 \x01(\x01\x12\x0c\n\x04time\x18\x03 \x01(\x01\x12\x17\n\x0f\x65lectric_charge\x18\x04 \x01(\x01\x12\x13\n\x0btemperature\x18\x05 \x01(\x01\x12\r\n\x05\x61ngle\x18\x06 \x01(\x01\x12\x43\n\x0bhomogeneity\x18\x07 \x01(\x0e\x32..ansys.api.dpf.available_result.v0.Homogeneity\"M\n\x0e\x44imensionality\x12-\n\x06nature\x18\x01 \x01(\x0e\x32\x1d.ansys.api.dpf.base.v0.Nature\x12\x0c\n\x04size\x18\x02 \x03(\x05\"h\n\x11UnitParseBySymbol\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x43\n\x0bhomogeneity\x18\x02 \x01(\x0e\x32..ansys.api.dpf.available_result.v0.Homogeneity\"p\n\x04Unit\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x39\n\x03\x64im\x18\x02 \x01(\x0b\x32,.ansys.api.dpf.field_definition.v0.Dimension\x12\x0e\n\x06\x66\x61\x63tor\x18\x03 \x01(\x01\x12\r\n\x05shift\x18\x04 \x01(\x01\"+\n\x11ListQuantityTypes\x12\x16\n\x0equantity_types\x18\x01 \x03(\t\"\x8e\x03\n\x13\x46ieldDefinitionData\x12\x35\n\x04unit\x18\x01 \x01(\x0b\x32\'.ansys.api.dpf.field_definition.v0.Unit\x12\x31\n\x08location\x18\x02 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.Location\x12J\n\x0f\x64imensionnality\x18\x03 \x01(\x0b\x32\x31.ansys.api.dpf.field_definition.v0.Dimensionality\x12\x44\n\x0cshell_layers\x18\x05 \x01(\x0e\x32..ansys.api.dpf.field_definition.v0.ShellLayers\x12L\n\x0equantity_types\x18\x06 \x01(\x0b\x32\x34.ansys.api.dpf.field_definition.v0.ListQuantityTypes\x12-\n\x04name\x18\x07 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.PBString\"\xcc\x04\n\x1c\x46ieldDefinitionUpdateRequest\x12L\n\x10\x66ield_definition\x18\x01 \x01(\x0b\x32\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x12\x37\n\x04unit\x18\x02 \x01(\x0b\x32\'.ansys.api.dpf.field_definition.v0.UnitH\x00\x12K\n\x0bunit_symbol\x18\x03 \x01(\x0b\x32\x34.ansys.api.dpf.field_definition.v0.UnitParseBySymbolH\x00\x12\x31\n\x08location\x18\x04 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.Location\x12J\n\x0f\x64imensionnality\x18\x05 \x01(\x0b\x32\x31.ansys.api.dpf.field_definition.v0.Dimensionality\x12\x44\n\x0cshell_layers\x18\x06 \x01(\x0e\x32..ansys.api.dpf.field_definition.v0.ShellLayers\x12L\n\x0equantity_types\x18\x07 \x01(\x0b\x32\x34.ansys.api.dpf.field_definition.v0.ListQuantityTypes\x12-\n\x04name\x18\x08 \x01(\x0b\x32\x1f.ansys.api.dpf.base.v0.PBStringB\x16\n\x14unit_definition_type*}\n\x0bShellLayers\x12\n\n\x06NOTSET\x10\x00\x12\x07\n\x03TOP\x10\x01\x12\n\n\x06\x42OTTOM\x10\x02\x12\r\n\tTOPBOTTOM\x10\x03\x12\x07\n\x03MID\x10\x04\x12\x10\n\x0cTOPBOTTOMMID\x10\x05\x12\r\n\tNONELAYER\x10\x06\x12\x14\n\x10LAYERINDEPENDENT\x10\x07\x32\xad\x03\n\x16\x46ieldDefinitionService\x12Z\n\x06\x43reate\x12\x1c.ansys.api.dpf.base.v0.Empty\x1a\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x12g\n\x06Update\x12?.ansys.api.dpf.field_definition.v0.FieldDefinitionUpdateRequest\x1a\x1c.ansys.api.dpf.base.v0.Empty\x12r\n\x04List\x12\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x1a\x36.ansys.api.dpf.field_definition.v0.FieldDefinitionData\x12Z\n\x06\x44\x65lete\x12\x32.ansys.api.dpf.field_definition.v0.FieldDefinition\x1a\x1c.ansys.api.dpf.base.v0.EmptyB#\xaa\x02 Ansys.Api.Dpf.FieldDefinition.V0b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,8 +24,8 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['DESCRIPTOR']._options = None _globals['DESCRIPTOR']._serialized_options = b'\252\002 Ansys.Api.Dpf.FieldDefinition.V0' - _globals['_SHELLLAYERS']._serialized_start=1624 - _globals['_SHELLLAYERS']._serialized_end=1749 + _globals['_SHELLLAYERS']._serialized_start=1693 + _globals['_SHELLLAYERS']._serialized_end=1818 _globals['_FIELDDEFINITION']._serialized_start=97 _globals['_FIELDDEFINITION']._serialized_end=167 _globals['_DIMENSION']._serialized_start=170 @@ -33,15 +33,15 @@ _globals['_DIMENSIONALITY']._serialized_start=357 _globals['_DIMENSIONALITY']._serialized_end=434 _globals['_UNITPARSEBYSYMBOL']._serialized_start=436 - _globals['_UNITPARSEBYSYMBOL']._serialized_end=471 - _globals['_UNIT']._serialized_start=473 - _globals['_UNIT']._serialized_end=585 - _globals['_LISTQUANTITYTYPES']._serialized_start=587 - _globals['_LISTQUANTITYTYPES']._serialized_end=630 - _globals['_FIELDDEFINITIONDATA']._serialized_start=633 - _globals['_FIELDDEFINITIONDATA']._serialized_end=1031 - _globals['_FIELDDEFINITIONUPDATEREQUEST']._serialized_start=1034 - _globals['_FIELDDEFINITIONUPDATEREQUEST']._serialized_end=1622 - _globals['_FIELDDEFINITIONSERVICE']._serialized_start=1752 - _globals['_FIELDDEFINITIONSERVICE']._serialized_end=2181 + _globals['_UNITPARSEBYSYMBOL']._serialized_end=540 + _globals['_UNIT']._serialized_start=542 + _globals['_UNIT']._serialized_end=654 + _globals['_LISTQUANTITYTYPES']._serialized_start=656 + _globals['_LISTQUANTITYTYPES']._serialized_end=699 + _globals['_FIELDDEFINITIONDATA']._serialized_start=702 + _globals['_FIELDDEFINITIONDATA']._serialized_end=1100 + _globals['_FIELDDEFINITIONUPDATEREQUEST']._serialized_start=1103 + _globals['_FIELDDEFINITIONUPDATEREQUEST']._serialized_end=1691 + _globals['_FIELDDEFINITIONSERVICE']._serialized_start=1821 + _globals['_FIELDDEFINITIONSERVICE']._serialized_end=2250 # @@protoc_insertion_point(module_scope) diff --git a/tests/test_field.py b/tests/test_field.py index fa77deec0b9..5ef760ee711 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -29,8 +29,10 @@ from ansys import dpf from ansys.dpf import core from ansys.dpf.core import FieldDefinition, operators as ops +from ansys.dpf.core.available_result import Homogeneity from ansys.dpf.core.check_version import server_meet_version from ansys.dpf.core.common import locations, shell_layers +from ansys.dpf.gate.errors import DPFServerException, DpfVersionNotSupported import conftest from conftest import SERVERS_VERSION_GREATER_THAN_OR_EQUAL_TO_8_0, running_docker @@ -1417,3 +1419,28 @@ def test_deep_copy_big_field_remote(server_type, server_type_remote_process): out = dpf.core.core._deep_copy(field_a, server_type_remote_process) assert np.allclose(out.data, data) + + +def test_set_units(server_type): + data = np.random.random(100) + field = dpf.core.field_from_array(data) + # use string setter with recognized string + field.unit = "m" + assert field.unit == "m" + + if server_meet_version("11.0", server_type): + # use tuple(Homogeneity, string) setter + field.unit = (Homogeneity.dimensionless, "sones") + assert field.unit == "sones" + else: + with pytest.raises(DpfVersionNotSupported): + # use tuple(Homogeneity, string) setter + field.unit = (Homogeneity.dimensionless, "sones") + + # use unrecognized string + with pytest.raises(DPFServerException): + field.unit = "sones" + + # use wrong type of arguments + with pytest.raises(ValueError): + field.unit = 1.0