|
3 | 3 | from dataclasses import dataclass, field |
4 | 4 | from enum import Enum |
5 | 5 | from functools import reduce |
6 | | -import io |
7 | 6 | import logging |
| 7 | +import time |
8 | 8 | from typing import Callable, Dict, List, Tuple |
9 | 9 | import weakref |
10 | 10 |
|
@@ -92,31 +92,23 @@ def get_solver_mesh_nodes( |
92 | 92 | self, request: FieldDataProtoModule.GetSolverMeshNodesRequest |
93 | 93 | ): |
94 | 94 | """GetSolverMeshNodesDouble RPC of FieldData service.""" |
95 | | - chuncked_responses = self._stub.GetSolverMeshNodesDouble( |
| 95 | + responses = self._stub.GetSolverMeshNodesDouble( |
96 | 96 | request, metadata=self._metadata |
97 | 97 | ) |
98 | | - buffer = io.BytesIO() |
99 | | - for chuncked_response in chuncked_responses: |
100 | | - buffer.write(chuncked_response.chunk) |
101 | | - serialized_response = buffer.getvalue() |
102 | | - response = FieldDataProtoModule.GetSolverMeshNodesDoubleResponse() |
103 | | - response.ParseFromString(serialized_response) |
104 | | - return response |
| 98 | + nested_nodes = [] |
| 99 | + for response in responses: |
| 100 | + nested_nodes.append(response.nodes) |
| 101 | + return nested_nodes |
105 | 102 |
|
106 | 103 | def get_solver_mesh_elements( |
107 | 104 | self, request: FieldDataProtoModule.GetSolverMeshElementsRequest |
108 | 105 | ): |
109 | 106 | """GetSolverMeshElements RPC of FieldData service.""" |
110 | | - chuncked_responses = self._stub.GetSolverMeshElements( |
111 | | - request, metadata=self._metadata |
112 | | - ) |
113 | | - buffer = io.BytesIO() |
114 | | - for chuncked_response in chuncked_responses: |
115 | | - buffer.write(chuncked_response.chunk) |
116 | | - serialized_response = buffer.getvalue() |
117 | | - response = FieldDataProtoModule.GetSolverMeshElementsResponse() |
118 | | - response.ParseFromString(serialized_response) |
119 | | - return response |
| 107 | + responses = self._stub.GetSolverMeshElements(request, metadata=self._metadata) |
| 108 | + elementss = [] |
| 109 | + for response in responses: |
| 110 | + elementss.append(response.elements) |
| 111 | + return elementss |
120 | 112 |
|
121 | 113 |
|
122 | 114 | class FieldInfo: |
@@ -1483,46 +1475,65 @@ def get_mesh(self, zone: str | int) -> Mesh: |
1483 | 1475 |
|
1484 | 1476 | # Mesh data is retrieved from the root domain in Fluent |
1485 | 1477 | logger.info(f"Getting nodes data for zone {zone_info._id}") |
| 1478 | + start_time = time.time() |
1486 | 1479 | nodes_request = FieldDataProtoModule.GetSolverMeshNodesRequest( |
1487 | 1480 | domain_id=ROOT_DOMAIN_ID, thread_id=zone_info._id |
1488 | 1481 | ) |
1489 | | - nodes_response = self._service.get_solver_mesh_nodes(nodes_request) |
1490 | | - logger.info("Nodes data received") |
| 1482 | + nested_nodes = self._service.get_solver_mesh_nodes(nodes_request) |
| 1483 | + logger.info(f"Nodes data received in {time.time() - start_time} seconds") |
1491 | 1484 | logger.info(f"Getting elements for zone {zone_info._id}") |
| 1485 | + start_time = time.time() |
1492 | 1486 | elements_request = FieldDataProtoModule.GetSolverMeshElementsRequest( |
1493 | 1487 | domain_id=ROOT_DOMAIN_ID, thread_id=zone_info._id |
1494 | 1488 | ) |
1495 | | - elements_response = self._service.get_solver_mesh_elements(elements_request) |
1496 | | - logger.info("Elements data received") |
| 1489 | + elementss_pb = self._service.get_solver_mesh_elements(elements_request) |
| 1490 | + logger.info(f"Elements data received in {time.time() - start_time} seconds") |
1497 | 1491 | logger.info("Constructing nodes structure in PyFluent") |
1498 | | - nodes = nodes_response.nodes |
1499 | | - nodes = [Node(_id=node.id, x=node.x, y=node.y, z=node.z) for node in nodes] |
1500 | | - node_index_by_id = {node._id: index for index, node in enumerate(nodes)} |
1501 | | - logger.info("Nodes structure constructed") |
| 1492 | + start_time = time.time() |
| 1493 | + node_count = sum(len(nodes) for nodes in nested_nodes) |
| 1494 | + nodes = np.empty(node_count, dtype=Node) |
| 1495 | + node_index_by_id = {} |
| 1496 | + i = 0 |
| 1497 | + for nodes_pb in nested_nodes: |
| 1498 | + for node_pb in nodes_pb: |
| 1499 | + nodes[i] = Node(_id=node_pb.id, x=node_pb.x, y=node_pb.y, z=node_pb.z) |
| 1500 | + node_index_by_id[node_pb.id] = i |
| 1501 | + i += 1 |
| 1502 | + logger.info( |
| 1503 | + f"Nodes structure constructed in {time.time() - start_time} seconds" |
| 1504 | + ) |
1502 | 1505 | logger.info("Constructing elements structure in PyFluent") |
1503 | | - elements_pb = elements_response.elements |
1504 | | - elements = [] |
1505 | | - for element_pb in elements_pb: |
1506 | | - element_type = CellElementType(element_pb.element_type) |
1507 | | - if element_type == CellElementType.POLYHEDRON: |
1508 | | - facets = [] |
1509 | | - for facet_pb in element_pb.facets: |
1510 | | - facet = Facet( |
1511 | | - node_indices=[node_index_by_id[id] for id in facet_pb.node] |
| 1506 | + start_time = time.time() |
| 1507 | + element_count = sum(len(elements) for elements in elementss_pb) |
| 1508 | + elements = np.empty(element_count, dtype=Element) |
| 1509 | + i = 0 |
| 1510 | + for elements_pb in elementss_pb: |
| 1511 | + for element_pb in elements_pb: |
| 1512 | + element_type = CellElementType(element_pb.element_type) |
| 1513 | + if element_type == CellElementType.POLYHEDRON: |
| 1514 | + facets = [] |
| 1515 | + for facet_pb in element_pb.facets: |
| 1516 | + facet = Facet( |
| 1517 | + node_indices=[node_index_by_id[id] for id in facet_pb.node] |
| 1518 | + ) |
| 1519 | + facets.append(facet) |
| 1520 | + element = Element( |
| 1521 | + _id=element_pb.id, |
| 1522 | + element_type=element_type, |
| 1523 | + facets=facets, |
1512 | 1524 | ) |
1513 | | - facets.append(facet) |
1514 | | - element = Element( |
1515 | | - _id=element_pb.id, |
1516 | | - element_type=element_type, |
1517 | | - facets=facets, |
1518 | | - ) |
1519 | | - else: |
1520 | | - element = Element( |
1521 | | - _id=element_pb.id, |
1522 | | - element_type=element_type, |
1523 | | - node_indices=[node_index_by_id[id] for id in element_pb.node_ids], |
1524 | | - ) |
1525 | | - elements.append(element) |
1526 | | - logger.info("Elements structure constructed") |
| 1525 | + else: |
| 1526 | + element = Element( |
| 1527 | + _id=element_pb.id, |
| 1528 | + element_type=element_type, |
| 1529 | + node_indices=[ |
| 1530 | + node_index_by_id[id] for id in element_pb.node_ids |
| 1531 | + ], |
| 1532 | + ) |
| 1533 | + elements[i] = element |
| 1534 | + i += 1 |
| 1535 | + logger.info( |
| 1536 | + f"Elements structure constructed in {time.time() - start_time} seconds" |
| 1537 | + ) |
1527 | 1538 | logger.info("Returning mesh") |
1528 | 1539 | return Mesh(nodes=nodes, elements=elements) |
0 commit comments