Skip to content

Commit 545d664

Browse files
authored
add capability to disable dynamic result property creation (#115)
1 parent c833ae7 commit 545d664

File tree

7 files changed

+93
-16
lines changed

7 files changed

+93
-16
lines changed

ansys/dpf/core/available_result.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ def __init__(self, availableresult):
4444

4545
def __str__(self):
4646
txt = (
47-
self.name
48-
+ "\n"
49-
+ 'Operator name: "%s"\n' % self.operator_name
50-
+ "Number of components: %d\n" % self.n_components
51-
+ "Dimensionality: %s\n" % self.dimensionality
52-
+ "Homogeneity: %s\n" % self.homogeneity
47+
self.name
48+
+ "\n"
49+
+ 'Operator name: "%s"\n' % self.operator_name
50+
+ "Number of components: %d\n" % self.n_components
51+
+ "Dimensionality: %s\n" % self.dimensionality
52+
+ "Homogeneity: %s\n" % self.homogeneity
5353
)
5454
if self.unit:
5555
txt += "Units: %s\n" % self.unit
@@ -167,3 +167,12 @@ def native_scoping_location(self):
167167
"UTOT": {"location": "Nodal", "scripting_name": "raw_displacement"},
168168
"RFTOT": {"location": "Nodal", "scripting_name": "raw_reaction_force"},
169169
}
170+
171+
172+
def available_result_from_name(name) -> AvailableResult:
173+
message = available_result_pb2.AvailableResultResponse()
174+
message.physicsname = name
175+
for key, item in _result_properties.items():
176+
if item["scripting_name"] == name:
177+
message.name = key
178+
return AvailableResult(message)

ansys/dpf/core/misc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
DEFAULT_FILE_CHUNK_SIZE = 524288
9+
DYNAMIC_RESULTS = True
910

1011
# ANSYS CPython Workbench environment may not have scooby installed.
1112
try:

ansys/dpf/core/model.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from ansys.dpf.core.common import types
1414
from ansys.dpf.core.data_sources import DataSources
1515
from ansys.dpf.core.results import Results, CommonResults
16+
from ansys.dpf.core.server import LOG
17+
from ansys.dpf.core import misc
1618
from grpc._channel import _InactiveRpcError
1719

1820

@@ -46,11 +48,14 @@ def __init__(self, data_sources=None, server=None):
4648

4749
self._server = server
4850
self._metadata = Metadata(data_sources, self._server)
49-
try:
50-
self._results = Results(self)
51-
except Exception as e:
52-
self._results = None
53-
print(e)
51+
if misc.DYNAMIC_RESULTS:
52+
try:
53+
self._results = Results(self)
54+
except Exception as e:
55+
self._results = CommonResults(self)
56+
LOG.debug(str(e))
57+
else:
58+
self._results = CommonResults(self)
5459

5560
@property
5661
def metadata(self):
@@ -234,15 +239,15 @@ def __init__(self, data_sources, server):
234239
self._server = server
235240
self._set_data_sources(data_sources)
236241
self._meshed_region = None
237-
self.result_info = None
242+
self._result_info = None
238243
self._stream_provider = None
239244
self._time_freq_support = None
240245
self._cache_streams_provider()
241-
self._cache_result_info()
242246

243247
def _cache_result_info(self):
244248
"""Store result information."""
245-
self.result_info = self._load_result_info()
249+
if not self._result_info:
250+
self._result_info = self._load_result_info()
246251

247252
def _cache_streams_provider(self):
248253
"""Create a stream provider and cache it."""
@@ -416,6 +421,18 @@ def mesh_provider(self):
416421
mesh_provider.inputs.connect(self._stream_provider.outputs)
417422
return mesh_provider
418423

424+
@property
425+
def result_info(self):
426+
"""Result Info instance.
427+
428+
Returns
429+
-------
430+
result_info : :class:`ansys.dpf.core.ResultInfo`
431+
"""
432+
self._cache_result_info()
433+
434+
return self._result_info
435+
419436
@property
420437
def available_named_selections(self):
421438
"""List of available named selections.

ansys/dpf/core/result_info.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,10 @@ def _get_result(self, numres):
283283
return available_result.AvailableResult(res)
284284

285285
def __len__(self):
286-
return self._get_list().nresult
286+
try:
287+
return self._get_list().nresult
288+
except:
289+
return 0
287290

288291
def __iter__(self):
289292
for i in range(len(self)):

ansys/dpf/core/results.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,11 @@ def __init__(self, model, result_info):
194194
self._time_scoping = None
195195
self._mesh_scoping = None
196196
self._location = None
197-
self._result_info = result_info
197+
if isinstance(result_info, str):
198+
from ansys.dpf.core.available_result import available_result_from_name
199+
self._result_info = available_result_from_name(result_info)
200+
else:
201+
self._result_info = result_info
198202
self._specific_fc_type = None
199203
from ansys.dpf.core import operators
200204

@@ -562,6 +566,15 @@ class CommonResults(Results):
562566
Used to allow type hints and auto completion for the method:'results'
563567
of the class:'Results'.
564568
"""
569+
def __init__(self, model):
570+
self._model = model
571+
self._op_map_rev = dict(displacement="displacement",
572+
stress="stress",
573+
elastic_strain="elastic_strain",
574+
structural_temperature="structural_temperature",
575+
temperature="temperature",
576+
electric_potential="electric_potential")
577+
self._result_info = model.metadata.result_info
565578

566579
@property
567580
def displacement(self):

ansys/dpf/core/settings.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,22 @@ def disable_interpreter_properties_evaluation() -> bool:
3333

3434
def set_upload_chunk_size(num_bytes = misc.DEFAULT_FILE_CHUNK_SIZE) -> None:
3535
misc.DEFAULT_FILE_CHUNK_SIZE = num_bytes
36+
37+
def set_dynamic_available_results_capability(value) -> None:
38+
"""Disables the evaluation of the available results and
39+
the dynamic creation of the results properties when a ''Model'' is created.
40+
41+
Parameters
42+
----------
43+
value : bool
44+
With ''True'', models will dynamically generate results properties
45+
46+
Examples
47+
--------
48+
49+
>>> from ansys.dpf import core as dpf
50+
>>> dpf.settings.set_dynamic_available_results_capability(False)
51+
>>> dpf.settings.set_dynamic_available_results_capability(True)
52+
53+
"""
54+
misc.DYNAMIC_RESULTS = value

tests/test_model.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,21 @@ def test_result_splitted_subset(allkindofcomplexity):
194194
assert len(vol.eval()[1].scoping) == 1
195195

196196

197+
def test_result_not_dynamic(plate_msup):
198+
dpf.core.settings.set_dynamic_available_results_capability(False)
199+
model = dpf.core.Model(plate_msup)
200+
assert isinstance(model.results, dpf.core.results.CommonResults)
201+
stress = model.results.stress
202+
fc = stress.on_time_scoping([1, 2, 3, 19]).eval()
203+
assert len(fc) == 4
204+
fc = stress.on_time_scoping([0.115, 0.125]).eval()
205+
assert len(fc) == 2
206+
assert np.allclose(
207+
fc.time_freq_support.time_frequencies.data, np.array([0.115, 0.125])
208+
)
209+
dis = model.results.displacement().eval()
210+
dpf.core.settings.set_dynamic_available_results_capability(True)
211+
197212
# @pytest.mark.skipif(NO_PLOTTING, reason="Requires system to support plotting")
198213
# def test_displacements_plot(static_model):
199214
# from pyvista import CameraPosition

0 commit comments

Comments
 (0)