|
6 | 6 | import importlib
|
7 | 7 | import yaml
|
8 | 8 |
|
| 9 | +try: |
| 10 | + import vttv |
| 11 | + using_vttv = True |
| 12 | +except ModuleNotFoundError: |
| 13 | + using_vttv = False |
| 14 | + |
9 | 15 | # pylint:disable=C0413:wrong-import-position
|
10 | 16 | # Use lbaf module from source if lbaf package is not installed
|
11 | 17 | if importlib.util.find_spec('lbaf') is None:
|
|
14 | 20 | from lbaf import PROJECT_PATH, __version__
|
15 | 21 | from lbaf.Execution.lbsRuntime import Runtime
|
16 | 22 | from lbaf.IO.lbsConfigurationValidator import ConfigurationValidator
|
17 |
| -from lbaf.IO.lbsVisualizer import Visualizer |
18 | 23 | from lbaf.IO.lbsVTDataReader import LoadReader
|
19 | 24 | from lbaf.IO.lbsVTDataWriter import VTDataWriter
|
20 | 25 | from lbaf.Model.lbsPhase import Phase
|
@@ -113,6 +118,11 @@ def init_parameters(self, config: dict, base_dir: str):
|
113 | 118 |
|
114 | 119 | # Parse visualizer parameters when available
|
115 | 120 | if (viz := config.get("visualization")) is not None:
|
| 121 | + |
| 122 | + # Ensure that vttv module was found |
| 123 | + if not using_vttv: |
| 124 | + self.__logger.warning("Visualization enabled but vttv not found. No visualization will be generated.") |
| 125 | + |
116 | 126 | # Retrieve mandatory visualization parameters
|
117 | 127 | try:
|
118 | 128 | self.grid_size = []
|
@@ -570,21 +580,35 @@ def run(self):
|
570 | 580 | self.__parameters.object_qoi
|
571 | 581 | ]
|
572 | 582 |
|
573 |
| - # Instantiate and execute visualizer |
574 |
| - visualizer = Visualizer( |
575 |
| - self.__logger, |
576 |
| - qoi_request, |
577 |
| - self.__parameters.continuous_object_qoi, |
578 |
| - phases, |
579 |
| - self.__parameters.grid_size, |
580 |
| - self.__parameters.object_jitter, |
581 |
| - self.__parameters.output_dir, |
582 |
| - self.__parameters.output_file_stem, |
583 |
| - runtime.get_distributions(), |
584 |
| - runtime.get_statistics()) |
585 |
| - visualizer.generate( |
586 |
| - self.__parameters.save_meshes, |
587 |
| - not self.__parameters.rank_qoi is None) |
| 583 | + # Call vttv visualization |
| 584 | + if using_vttv: |
| 585 | + self.__logger.info("Calling vt-tv") |
| 586 | + |
| 587 | + # Serialize data to JSON-formatted string |
| 588 | + self.__rank_phases = {} |
| 589 | + for p in phases.values(): |
| 590 | + for r in p.get_ranks(): |
| 591 | + self.__rank_phases.setdefault(r.get_id(), {}) |
| 592 | + self.__rank_phases[r.get_id()][p.get_id()] = r |
| 593 | + |
| 594 | + ranks_json_str = [] |
| 595 | + for i in range(len(self.__rank_phases.items())): |
| 596 | + ranks_json_str.append(self.__json_writer._json_serializer((i, self.__rank_phases[i]))) |
| 597 | + |
| 598 | + vttv_params = { |
| 599 | + "x_ranks": self.__parameters.grid_size[0], |
| 600 | + "y_ranks": self.__parameters.grid_size[1], |
| 601 | + "z_ranks": self.__parameters.grid_size[2], |
| 602 | + "object_jitter": self.__parameters.object_jitter, |
| 603 | + "rank_qoi": self.__parameters.rank_qoi, |
| 604 | + "object_qoi": self.__parameters.object_qoi, |
| 605 | + "save_meshes": self.__parameters.save_meshes, |
| 606 | + "force_continuous_object_qoi": self.__parameters.continuous_object_qoi, |
| 607 | + "output_visualization_dir": self.__parameters.output_dir, |
| 608 | + "output_visualization_file_stem": self.__parameters.output_file_stem |
| 609 | + } |
| 610 | + num_ranks = self.__parameters.grid_size[0] * self.__parameters.grid_size[1] * self.__parameters.grid_size[2] |
| 611 | + vttv.tvFromJson(ranks_json_str, str(vttv_params), num_ranks) |
588 | 612 |
|
589 | 613 | # Report on rebalanced phase when available
|
590 | 614 | if rebalanced_phase:
|
|
0 commit comments