Skip to content

Commit b95cb87

Browse files
committed
improve performance for large models
1 parent 19888b5 commit b95cb87

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
### Changed
1313

14+
* Changed processing of stress field results to iterate of rows grouped per part.
15+
1416
### Removed
1517

1618

src/compas_fea2/model/parts.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ def find_element_by_key(self, key):
947947
return element
948948

949949
def find_elements_by_name(self, name):
950-
# type: (str) -> list(_Element)
950+
# type: (str) -> list[_Element]
951951
"""Find all elements with a given name.
952952
953953
Parameters

src/compas_fea2/results/fields.py

+23-16
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from itertools import groupby
12
from typing import Iterable
23
import numpy as np
34

@@ -364,9 +365,11 @@ def _get_results_from_db(self, members, steps):
364365
raise ValueError("Not an element")
365366

366367
results_set = self.rdb.get_rows(field_name, columns, {"key": members_keys, "part": parts_names, "step": steps_names})
367-
return self._to_fea2_results(results_set=results_set)
368+
part_results = {k: list(g) for k, g in groupby(results_set, lambda row: row[1])}
368369

369-
def _to_fea2_results(self, results_set):
370+
return self._to_fea2_results(part_results)
371+
372+
def _to_fea2_results(self, part_results):
370373
"""Convert a set of results from database format to the appropriate
371374
result object.
372375
@@ -381,21 +384,25 @@ def _to_fea2_results(self, results_set):
381384
Dictiorany grouping the results per Step.
382385
"""
383386
results = {}
384-
for r in results_set:
385-
step = self.problem.find_step_by_name(r[0])
386-
results.setdefault(step, [])
387-
part = self.model.find_part_by_name(r[1]) or self.model.find_part_by_name(r[1], casefold=True)
387+
for name, results in part_results.items():
388+
part = self.model.find_part_by_name(name) or self.model.find_part_by_name(name, casefold=True)
389+
388390
if not part:
389-
raise ValueError(f"Part {r[1]} not in model")
390-
m = getattr(part, self._results_func)(r[2])
391-
if isinstance(m, _Element3D):
392-
cls = self._results_class_3d
393-
columns = self._components_names_3d
394-
else:
395-
cls = self._results_class_2d
396-
columns = self._components_names_2d
397-
values = {k.lower(): v for k, v in zip(columns, r[3:])}
398-
results[step].append(cls(m, **values))
391+
raise ValueError(f"Part {name} not in model")
392+
393+
key_element = {e.key: e for e in part.elements}
394+
for r in results:
395+
step = self.problem.find_step_by_name(r[0])
396+
results.setdefault(step, [])
397+
m = key_element[r[2]]
398+
if isinstance(m, _Element3D):
399+
cls = self._results_class_3d
400+
columns = self._components_names_3d
401+
else:
402+
cls = self._results_class_2d
403+
columns = self._components_names_2d
404+
values = {k.lower(): v for k, v in zip(columns, r[3:])}
405+
results[step].append(cls(m, **values))
399406
return results
400407

401408
def get_max_component(self, component, step):

0 commit comments

Comments
 (0)