diff --git a/src/ansys/dpf/core/custom_type_field.py b/src/ansys/dpf/core/custom_type_field.py index 863711a5415..4ffc686e232 100644 --- a/src/ansys/dpf/core/custom_type_field.py +++ b/src/ansys/dpf/core/custom_type_field.py @@ -169,7 +169,7 @@ def _init_api_env(self): @staticmethod def _field_create_internal_obj( api, - client, + server, nature, nentities, location=locations.nodal, @@ -178,6 +178,7 @@ def _field_create_internal_obj( with_type=None, ): dpf_type_name = numpy_type_to_dpf[with_type] + client = server.client if client is not None: return api.cscustom_type_field_new_on_client( client, dpf_type_name, with_type.itemsize, nentities, nentities diff --git a/src/ansys/dpf/core/field.py b/src/ansys/dpf/core/field.py index 259ddfaef00..16be4c7ef48 100644 --- a/src/ansys/dpf/core/field.py +++ b/src/ansys/dpf/core/field.py @@ -234,7 +234,7 @@ def _init_api_env(self): @staticmethod def _field_create_internal_obj( api: field_abstract_api.FieldAbstractAPI, - client, + server, nature, nentities, location=locations.nodal, @@ -243,6 +243,7 @@ def _field_create_internal_obj( with_type=None, ): dim = dimensionality.Dimensionality([ncomp_n, ncomp_m], nature) + client = server.client if dim.is_1d_dim(): if client is not None: @@ -659,9 +660,7 @@ def unit(self, value: str | tuple[Homogeneity, str]): Setting a named dimensionless unit requires DPF 11.0 (2026 R1) or above. """ - field_def = self.field_definition - field_def.unit = value - self.field_definition = field_def + self.field_definition.unit = value @property def dimensionality(self): diff --git a/src/ansys/dpf/core/field_base.py b/src/ansys/dpf/core/field_base.py index 36046522d12..537dd58c0f6 100644 --- a/src/ansys/dpf/core/field_base.py +++ b/src/ansys/dpf/core/field_base.py @@ -77,7 +77,7 @@ def __init__( else: self._internal_obj = self.__class__._field_create_internal_obj( self._api, - client=self._server.client, + server=self._server, nature=nature, nentities=nentities, location=location, @@ -97,7 +97,7 @@ def _api(self): @abstractmethod def _field_create_internal_obj( api: field_abstract_api.FieldAbstractAPI, - client, + server, nature, nentities, location=locations.nodal, diff --git a/src/ansys/dpf/core/fields_factory.py b/src/ansys/dpf/core/fields_factory.py index 11964cc0517..386fe396d2d 100644 --- a/src/ansys/dpf/core/fields_factory.py +++ b/src/ansys/dpf/core/fields_factory.py @@ -393,7 +393,7 @@ def _create_field( api.init_field_environment(server) internal_obj = Field._field_create_internal_obj( api=api, - client=server.client, + server=server, nature=nature, nentities=n_entities, location=str(location), diff --git a/src/ansys/dpf/core/property_field.py b/src/ansys/dpf/core/property_field.py index 6434db8c5dc..6d5dbe294be 100644 --- a/src/ansys/dpf/core/property_field.py +++ b/src/ansys/dpf/core/property_field.py @@ -114,7 +114,7 @@ def _init_api_env(self): @staticmethod def _field_create_internal_obj( api: property_field_abstract_api.PropertyFieldAbstractAPI, - client, + server, nature, nentities, location=locations.nodal, @@ -123,12 +123,23 @@ def _field_create_internal_obj( with_type=None, ): dim = dimensionality.Dimensionality([ncomp_n, ncomp_m], nature) - if client is not None: - return api.csproperty_field_new_on_client( - client, nentities, nentities * dim.component_count - ) + client = server.client + if meets_version(server.version, "11.0"): + if client is not None: + return api.csproperty_field_new_location_on_client( + client, nentities, nentities * dim.component_count, location + ) + else: + return api.csproperty_field_new_location( + nentities, nentities * dim.component_count, location + ) else: - return api.csproperty_field_new(nentities, nentities * dim.component_count) + if client is not None: + return api.csproperty_field_new_on_client( + client, nentities, nentities * dim.component_count + ) + else: + return api.csproperty_field_new(nentities, nentities * dim.component_count) @version_requires("8.1") def _load_field_definition(self): @@ -141,8 +152,8 @@ def _load_field_definition(self): def location(self): """Location of the property field. - A property field contains a scoping, which is the location that is read. - To update location, directly update the scoping location. + The property field location is the one contained in its field definition. + To update location, just update the property field location. Returns ------- @@ -156,16 +167,18 @@ def location(self): >>> from ansys.dpf import core as dpf >>> pfield = dpf.PropertyField() - >>> list_ids = [1, 2, 4, 6, 7] - >>> scop = dpf.Scoping(ids = list_ids, location = dpf.locations.nodal) - >>> pfield.scoping = scop - >>> pfield.scoping.location = dpf.locations.nodal + >>> pfield.location = dpf.locations.nodal >>> pfield.location 'Nodal' """ - location = self.scoping.location - return location if location else None + if meets_version(self._server.version, "11.0"): + if self._field_definition: + return self._field_definition.location + elif self.scoping: + return self.scoping.location + else: + return None @location.setter def location(self, value): @@ -181,14 +194,27 @@ def location(self, value): -------- >>> from ansys.dpf import core as dpf >>> pfield = dpf.PropertyField() - >>> scop = dpf.Scoping(ids = list_ids, location = dpf.locations.nodal) - >>> pfield.scoping = scop + >>> list_ids = [1, 2, 4, 6, 7] >>> pfield.location = 'Nodal' >>> pfield.location 'Nodal' """ - self.scoping.location = value + if meets_version(self._server.version, "11.0"): + if self._field_definition: + self._field_definition.location = value + return + else: + raise Exception( + "Property field location is based on field definition, and field definition is not defined" + ) + elif self.scoping: + self.scoping.location = value + return + else: + raise Exception( + "Property field location before is based on scoping, and scoping is not defined" + ) @property def component_count(self): diff --git a/src/ansys/dpf/core/string_field.py b/src/ansys/dpf/core/string_field.py index b767aab7b6f..4e29f4fc0bb 100644 --- a/src/ansys/dpf/core/string_field.py +++ b/src/ansys/dpf/core/string_field.py @@ -103,7 +103,7 @@ def _init_api_env(self): @staticmethod def _field_create_internal_obj( api: string_field_abstract_api.StringFieldAbstractAPI, - client, + server, nature, nentities, location=locations.nodal, @@ -111,6 +111,7 @@ def _field_create_internal_obj( ncomp_m=0, with_type=None, ): + client = server.client if client is not None: return api.csstring_field_new_on_client(client, nentities, nentities) else: diff --git a/src/ansys/dpf/gate/property_field_grpcapi.py b/src/ansys/dpf/gate/property_field_grpcapi.py index 0f6d59afe53..ae7612754fc 100644 --- a/src/ansys/dpf/gate/property_field_grpcapi.py +++ b/src/ansys/dpf/gate/property_field_grpcapi.py @@ -24,6 +24,16 @@ def csproperty_field_new_on_client(client, numEntities, data_size): request.datatype = "int" return field_grpcapi._get_stub(client).Create(request) + @staticmethod + def csproperty_field_new_location_on_client(client, numEntities, data_size, location): + from ansys.grpc.dpf import field_pb2 + request = field_pb2.FieldRequest() + request.size.scoping_size = numEntities + request.size.data_size = data_size + request.location.location = location + request.datatype = "int" + return field_grpcapi._get_stub(client).Create(request) + @staticmethod def csproperty_field_get_number_elementary_data(field): return api_to_call.csfield_get_number_elementary_data(field)