Skip to content

Commit f7be394

Browse files
authored
DpfVector BUG: DpfVector were created on one clayer and deleted in another (#2141)
* Fix DpfVector * try
1 parent e2a1cf0 commit f7be394

File tree

7 files changed

+50
-52
lines changed

7 files changed

+50
-52
lines changed

src/ansys/dpf/core/collection_base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ def _set_integral_entries(self, input):
655655
def get_integral_entries(self):
656656
"""Get integral entries."""
657657
try:
658-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
658+
vec = dpf_vector.DPFVectorInt(owner=self)
659659
self._api.collection_get_data_as_int_for_dpf_vector(
660660
self, vec, vec.internal_data, vec.internal_size
661661
)
@@ -715,7 +715,7 @@ def _set_integral_entries(self, input):
715715
def get_integral_entries(self):
716716
"""Get integral entries."""
717717
try:
718-
vec = dpf_vector.DPFVectorDouble(client=self._server.client)
718+
vec = dpf_vector.DPFVectorDouble(owner=self)
719719
self._api.collection_get_data_as_double_for_dpf_vector(
720720
self, vec, vec.internal_data, vec.internal_size
721721
)

src/ansys/dpf/core/custom_type_field.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ def get_entity_data(self, index):
326326
327327
"""
328328
try:
329-
vec = dpf_vector.DPFVectorCustomType(self._type, client=self._server.client)
329+
vec = dpf_vector.DPFVectorCustomType(self._type, owner=self)
330330
self._api.cscustom_type_field_get_entity_data_for_dpf_vector(
331331
self, vec, vec.internal_data, vec.internal_size, index
332332
)
@@ -366,7 +366,7 @@ def get_entity_data_by_id(self, id):
366366
367367
"""
368368
try:
369-
vec = dpf_vector.DPFVectorCustomType(self._type, client=self._server.client)
369+
vec = dpf_vector.DPFVectorCustomType(self._type, owner=self)
370370
self._api.cscustom_type_field_get_entity_data_by_id_for_dpf_vector(
371371
self, vec, vec.internal_data, vec.internal_size, id
372372
)
@@ -390,7 +390,7 @@ def append(self, data, scopingid):
390390

391391
def _get_data_pointer(self):
392392
try:
393-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
393+
vec = dpf_vector.DPFVectorInt(owner=self)
394394
self._api.cscustom_type_field_get_data_pointer_for_dpf_vector(
395395
self, vec, vec.internal_data, vec.internal_size
396396
)
@@ -404,7 +404,7 @@ def _set_data_pointer(self, data):
404404

405405
def _get_data(self, np_array=True):
406406
try:
407-
vec = dpf_vector.DPFVectorCustomType(self._type, client=self._server.client)
407+
vec = dpf_vector.DPFVectorCustomType(self._type, owner=self)
408408
self._api.cscustom_type_field_get_data_for_dpf_vector(
409409
self, vec, vec.internal_data, vec.internal_size
410410
)

src/ansys/dpf/core/field.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ def shell_layers(self, value):
409409
def get_entity_data(self, index: int) -> dpf_array.DPFArray:
410410
"""Retrieve entity data by index."""
411411
try:
412-
vec = dpf_vector.DPFVectorDouble(client=self._server.client)
412+
vec = dpf_vector.DPFVectorDouble(owner=self)
413413
self._api.csfield_get_entity_data_for_dpf_vector(
414414
self, vec, vec.internal_data, vec.internal_size, index
415415
)
@@ -425,7 +425,7 @@ def get_entity_data(self, index: int) -> dpf_array.DPFArray:
425425
def get_entity_data_by_id(self, id: int) -> dpf_array.DPFArray:
426426
"""Retrieve entity data by id."""
427427
try:
428-
vec = dpf_vector.DPFVectorDouble(client=self._server.client)
428+
vec = dpf_vector.DPFVectorDouble(owner=self)
429429
self._api.csfield_get_entity_data_by_id_for_dpf_vector(
430430
self, vec, vec.internal_data, vec.internal_size, id
431431
)
@@ -450,7 +450,7 @@ def append(self, data, scopingid):
450450

451451
def _get_data_pointer(self):
452452
try:
453-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
453+
vec = dpf_vector.DPFVectorInt(owner=self)
454454
self._api.csfield_get_data_pointer_for_dpf_vector(
455455
self, vec, vec.internal_data, vec.internal_size
456456
)
@@ -464,7 +464,7 @@ def _set_data_pointer(self, data):
464464

465465
def _get_data(self, np_array=True):
466466
try:
467-
vec = dpf_vector.DPFVectorDouble(client=self._server.client)
467+
vec = dpf_vector.DPFVectorDouble(owner=self)
468468
self._api.csfield_get_data_for_dpf_vector(
469469
self, vec, vec.internal_data, vec.internal_size
470470
)

src/ansys/dpf/core/property_field.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def _get_scoping(self):
223223
def get_entity_data(self, index):
224224
"""Return the data associated with the entity by index."""
225225
try:
226-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
226+
vec = dpf_vector.DPFVectorInt(owner=self)
227227
self._api.csproperty_field_get_entity_data_for_dpf_vector(
228228
self, vec, vec.internal_data, vec.internal_size, index
229229
)
@@ -239,7 +239,7 @@ def get_entity_data(self, index):
239239
def get_entity_data_by_id(self, id):
240240
"""Return the data associated with entity by id."""
241241
try:
242-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
242+
vec = dpf_vector.DPFVectorInt(owner=self)
243243
self._api.csproperty_field_get_entity_data_by_id_for_dpf_vector(
244244
self, vec, vec.internal_data, vec.internal_size, id
245245
)
@@ -264,7 +264,7 @@ def append(self, data, scopingid):
264264

265265
def _get_data_pointer(self):
266266
try:
267-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
267+
vec = dpf_vector.DPFVectorInt(owner=self)
268268
self._api.csproperty_field_get_data_pointer_for_dpf_vector(
269269
self, vec, vec.internal_data, vec.internal_size
270270
)
@@ -278,7 +278,7 @@ def _set_data_pointer(self, data):
278278

279279
def _get_data(self, np_array=True):
280280
try:
281-
vec = dpf_vector.DPFVectorInt(client=self._server.client)
281+
vec = dpf_vector.DPFVectorInt(owner=self)
282282
self._api.csproperty_field_get_data_for_dpf_vector(
283283
self, vec, vec.internal_data, vec.internal_size
284284
)

src/ansys/dpf/core/scoping.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,7 @@ def _get_ids(self, np_array=None):
235235

236236
np_array = settings.get_runtime_client_config(self._server).return_arrays
237237
try:
238-
vec = dpf_vector.DPFVectorInt(
239-
client=self._server.client,
240-
api=self._server.get_api_for_type(
241-
capi=dpf_vector_capi.DpfVectorCAPI,
242-
grpcapi=dpf_vector_abstract_api.DpfVectorAbstractAPI,
243-
),
244-
)
238+
vec = dpf_vector.DPFVectorInt(owner=self)
245239
self._api.scoping_get_ids_for_dpf_vector(
246240
self, vec, vec.internal_data, vec.internal_size
247241
)

src/ansys/dpf/core/string_field.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def _get_scoping(self):
201201
def get_entity_data(self, index):
202202
"""Return entity data."""
203203
try:
204-
vec = dpf_vector.DPFVectorString(client=self._server.client)
204+
vec = dpf_vector.DPFVectorString(owner=self)
205205
self._api.csstring_field_get_entity_data_for_dpf_vector(
206206
self, vec, vec.internal_data, vec.internal_size, index
207207
)
@@ -213,7 +213,7 @@ def get_entity_data(self, index):
213213
def get_entity_data_by_id(self, id):
214214
"""Return entity data corresponding to the provided id."""
215215
try:
216-
vec = dpf_vector.DPFVectorString(client=self._server.client)
216+
vec = dpf_vector.DPFVectorString(owner=self)
217217
self._api.csstring_field_get_entity_data_by_id_for_dpf_vector(
218218
self, vec, vec.internal_data, vec.internal_size, id
219219
)
@@ -236,7 +236,7 @@ def append(self, data: List[str], scopingid: int):
236236

237237
def _get_data(self, np_array=True):
238238
try:
239-
vec = dpf_vector.DPFVectorString(client=self._server.client)
239+
vec = dpf_vector.DPFVectorString(owner=self)
240240
self._api.csstring_field_get_data_for_dpf_vector(
241241
self, vec, vec.internal_data, vec.internal_size
242242
)

src/ansys/dpf/gate/dpf_vector.py

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import copy
22
import ctypes
33
import numpy as np
4+
5+
from ansys.dpf.core.check_version import server_meet_version
46
from ansys.dpf.gate.generated import dpf_vector_capi
57
from ansys.dpf.gate.integral_types import MutableListInt32, MutableInt32, MutableListDouble, \
68
MutableListString, MutableListChar
@@ -23,23 +25,22 @@ class DPFVectorBase:
2325
2426
Parameters
2527
----------
26-
client: object having _internal_obj attribute and a shared CLayer Client instance, optional
28+
owner: object having _internal_obj attribute and a shared CLayer Client instance, optional
2729
Enables DPFClientAPI to choose the right API to use.
2830
2931
api: DpfVectorAbstractAPI, optional
3032
"""
3133

32-
def __init__(self, client, api):
34+
def __init__(self, owner, api):
3335
self.dpf_vector_api = api
3436
self._modified = False
3537
self._check_changes = True
3638
try:
37-
if not client:
38-
self._internal_obj = self.dpf_vector_api.dpf_vector_new()
39+
self._internal_obj = self.dpf_vector_api.dpf_vector_new_for_object(owner)
40+
if not server_meet_version("4.1",
41+
owner._server) and owner._server.client is None: # BUG in 22.2: DpfVector is not holding the data owner and not call to data owner should be done at delete
3942
self._check_changes = False
40-
else:
41-
self._internal_obj = self.dpf_vector_api.dpf_vector_new_for_object(client)
42-
except AttributeError:
43+
except ctypes.ArgumentError:
4344
raise NotImplementedError
4445

4546
@property
@@ -81,7 +82,6 @@ def has_changed(self):
8182
self._modified = True
8283
return self._modified
8384

84-
8585
@property
8686
def np_array(self) -> np.ndarray:
8787
"""
@@ -94,7 +94,7 @@ def np_array(self) -> np.ndarray:
9494
--------
9595
Memory of the DPFVector is not managed in this object. Use a ```DPFArray``` instead.
9696
"""
97-
if not self._array.pointer or self.size==0:
97+
if not self._array.pointer or self.size == 0:
9898
return np.empty((0,), dtype=self._array.np_type)
9999
return np.ctypeslib.as_array(self._array.pointer, shape=(self.size,))
100100

@@ -140,8 +140,8 @@ def __del__(self):
140140

141141

142142
class DPFVectorInt(DPFVectorBase):
143-
def __init__(self, client=None, api=dpf_vector_capi.DpfVectorCAPI):
144-
super().__init__(client, api)
143+
def __init__(self, owner=None, api=dpf_vector_capi.DpfVectorCAPI):
144+
super().__init__(owner, api)
145145
self._array = MutableListInt32()
146146

147147
@property
@@ -164,15 +164,16 @@ def commit(self) -> None:
164164
def __del__(self):
165165
try:
166166
if self._array:
167-
self.dpf_vector_api.dpf_vector_int_free(self, self.internal_data, self.internal_size, self.has_changed())
167+
self.dpf_vector_api.dpf_vector_int_free(self, self.internal_data, self.internal_size,
168+
self.has_changed())
168169
except:
169170
pass
170171
super().__del__()
171172

172173

173174
class DPFVectorDouble(DPFVectorBase):
174-
def __init__(self, client=None, api=dpf_vector_capi.DpfVectorCAPI):
175-
super().__init__(client, api)
175+
def __init__(self, owner=None, api=dpf_vector_capi.DpfVectorCAPI):
176+
super().__init__(owner, api)
176177
self._array = MutableListDouble()
177178

178179
@property
@@ -195,16 +196,17 @@ def commit(self) -> None:
195196
def __del__(self):
196197
try:
197198
if self._array:
198-
self.dpf_vector_api.dpf_vector_double_free(self, self.internal_data, self.internal_size, self.has_changed())
199+
self.dpf_vector_api.dpf_vector_double_free(self, self.internal_data, self.internal_size,
200+
self.has_changed())
199201
except:
200202
pass
201203
super().__del__()
202204

203205

204206
class DPFVectorCustomType(DPFVectorBase):
205-
def __init__(self, unitary_type, client=None, api=dpf_vector_capi.DpfVectorCAPI):
207+
def __init__(self, unitary_type, owner=None, api=dpf_vector_capi.DpfVectorCAPI):
206208
self.type = unitary_type
207-
super().__init__(client, api)
209+
super().__init__(owner, api)
208210
self._array = MutableListChar()
209211

210212
@property
@@ -222,7 +224,8 @@ def commit(self) -> None:
222224
if self._check_changes is set to True, compares the initial data computed in
223225
```start_checking_modification``` (which should have been called beforehand) to the current one.
224226
"""
225-
self.dpf_vector_api.dpf_vector_char_commit(self, self.internal_data, self.size*self.type.itemsize, self.has_changed())
227+
self.dpf_vector_api.dpf_vector_char_commit(self, self.internal_data, self.size * self.type.itemsize,
228+
self.has_changed())
226229

227230
@property
228231
def size(self) -> int:
@@ -241,7 +244,7 @@ def np_array(self) -> np.ndarray:
241244
--------
242245
Memory of the DPFVector is not managed in this object. Use a ```DPFArray``` instead.
243246
"""
244-
if not self._array.pointer or self.size==0:
247+
if not self._array.pointer or self.size == 0:
245248
return np.empty((0,), dtype=self._array.np_type)
246249
return np.ctypeslib.as_array(
247250
ctypes.cast(self._array.pointer, ctypes.POINTER(np.ctypeslib.as_ctypes_type(self.type))),
@@ -251,15 +254,16 @@ def np_array(self) -> np.ndarray:
251254
def __del__(self):
252255
try:
253256
if self._array:
254-
self.dpf_vector_api.dpf_vector_char_free(self, self.internal_data, self.size*self.type.itemsize, self.has_changed())
257+
self.dpf_vector_api.dpf_vector_char_free(self, self.internal_data, self.size * self.type.itemsize,
258+
self.has_changed())
255259
except:
256260
pass
257261
super().__del__()
258262

259263

260264
class DPFVectorString(DPFVectorBase):
261-
def __init__(self, client=None, api=dpf_vector_capi.DpfVectorCAPI):
262-
super().__init__(client, api)
265+
def __init__(self, owner=None, api=dpf_vector_capi.DpfVectorCAPI):
266+
super().__init__(owner, api)
263267
self._array = MutableListString()
264268

265269
@property
@@ -275,7 +279,8 @@ def internal_data(self) -> MutableListString:
275279
def __del__(self):
276280
try:
277281
if self._array:
278-
self.dpf_vector_api.dpf_vector_char_ptr_free(self, self.internal_data, self.internal_size, self.has_changed())
282+
self.dpf_vector_api.dpf_vector_char_ptr_free(self, self.internal_data, self.internal_size,
283+
self.has_changed())
279284
except:
280285
pass
281286
super().__del__()
@@ -293,7 +298,7 @@ def __iter__(self):
293298
def __next__(self):
294299
if self.n < len(self):
295300
self.n += 1
296-
return self.__getitem__(self.n-1)
301+
return self.__getitem__(self.n - 1)
297302
else:
298303
raise StopIteration
299304

@@ -310,12 +315,11 @@ def __ne__(self, other):
310315

311316
def __str__(self):
312317
out = f"DPFVectorString["
313-
for i in range(min(5, len(self)-1)):
318+
for i in range(min(5, len(self) - 1)):
314319
out += f"'{self[i]}', "
315-
if len(self)>2:
320+
if len(self) > 2:
316321
out += "..., "
317322
if len(self) >= 2:
318-
out += f"'{self[len(self)-1]}'"
323+
out += f"'{self[len(self) - 1]}'"
319324
out += "]"
320325
return out
321-

0 commit comments

Comments
 (0)