From 4499633b1db44a0ddb5913cdbca4324a864372b2 Mon Sep 17 00:00:00 2001 From: Knut Andreas Meyer Date: Mon, 20 May 2024 20:43:47 +0200 Subject: [PATCH 1/2] Speed up table construction --- src/Grid/topology.jl | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/Grid/topology.jl b/src/Grid/topology.jl index 31560453f1..5654cc4b60 100644 --- a/src/Grid/topology.jl +++ b/src/Grid/topology.jl @@ -187,24 +187,10 @@ function ExclusiveTopology(cells::Vector{C}) where C <: AbstractCell end # Setup matrices - vertex_table = Matrix{EntityNeighborhood{VertexIndex}}(undef, length(cells), max_vertices) - for j = 1:size(vertex_table,2) - for i = 1:size(vertex_table,1) - vertex_table[i,j] = EntityNeighborhood{VertexIndex}(VertexIndex[]) - end - end - face_table = Matrix{EntityNeighborhood{FaceIndex}}(undef, length(cells), max_faces) - for j = 1:size(face_table,2) - for i = 1:size(face_table,1) - face_table[i,j] = EntityNeighborhood{FaceIndex}(FaceIndex[]) - end - end - edge_table = Matrix{EntityNeighborhood{EdgeIndex}}(undef, length(cells), max_edges) - for j = 1:size(edge_table,2) - for i = 1:size(edge_table,1) - edge_table[i,j] = EntityNeighborhood{EdgeIndex}(EdgeIndex[]) - end - end + vertex_table = [EntityNeighborhood{VertexIndex}(VertexIndex[]) for _ in 1:length(cells), _ in 1:max_vertices] + edge_table = [EntityNeighborhood{EdgeIndex }(EdgeIndex[] ) for _ in 1:length(cells), _ in 1:max_edges] + face_table = [EntityNeighborhood{FaceIndex }(FaceIndex[] ) for _ in 1:length(cells), _ in 1:max_faces] + cell_neighbor_table = Vector{EntityNeighborhood{CellIndex}}(undef, length(cells)) _exclusive_topology_ctor(cells, vertex_cell_table, vertex_table, face_table, edge_table, cell_neighbor_table) From b09ac4bb4c2f487c59bdbffacba1bfb30a14156a Mon Sep 17 00:00:00 2001 From: Knut Andreas Meyer Date: Mon, 20 May 2024 20:59:13 +0200 Subject: [PATCH 2/2] Reuse set for cell table, and avoid double allocation --- src/Grid/topology.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Grid/topology.jl b/src/Grid/topology.jl index 5654cc4b60..9f1412ae7f 100644 --- a/src/Grid/topology.jl +++ b/src/Grid/topology.jl @@ -107,9 +107,10 @@ function _num_shared_vertices(cell_a::C1, cell_b::C2) where {C1, C2} end function _exclusive_topology_ctor(cells::Vector{C}, vertex_cell_table::Array{Set{Int}}, vertex_table, face_table, edge_table, cell_neighbor_table) where C <: AbstractCell + cell_neighbor_ids = Set{Int}() for (cell_id, cell) in enumerate(cells) # Gather all cells which are connected via vertices - cell_neighbor_ids = Set{Int}() + empty!(cell_neighbor_ids) for vertex ∈ vertices(cell) for vertex_cell_id ∈ vertex_cell_table[vertex] if vertex_cell_id != cell_id @@ -117,7 +118,7 @@ function _exclusive_topology_ctor(cells::Vector{C}, vertex_cell_table::Array{Set end end end - cell_neighbor_table[cell_id] = EntityNeighborhood(CellIndex.(collect(cell_neighbor_ids))) + cell_neighbor_table[cell_id] = EntityNeighborhood([CellIndex(cell_id) for cell_id in cell_neighbor_ids]) # Any of the neighbors is now sorted in the respective categories for cell_neighbor_id ∈ cell_neighbor_ids