Skip to content

Commit 2e022e1

Browse files
committed
Added find_local_indices
1 parent e9612c5 commit 2e022e1

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

docs/src/reference/primitives.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ scatter!
1616
allocate_scatter
1717
```
1818

19-
## Emit
19+
## Multicast
2020

2121
```@docs
2222
multicast

src/PartitionedArrays.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export assemble
130130
export consistent
131131
export repartition
132132
export repartition!
133+
export find_local_indices
133134
include("p_vector.jl")
134135

135136
export OldPSparseMatrix

src/p_vector.jl

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,4 +1076,44 @@ function repartition!(w::PVector,v::PVector,cache;reversed=false)
10761076
end
10771077
end
10781078

1079+
function find_local_indices(node_to_mask::PVector)
1080+
n_own_dofs = map(count,own_values(node_to_mask))
1081+
n_dofs = sum(n_own_dofs)
1082+
dof_partition = variable_partition(n_own_dofs,n_dofs)
1083+
node_partition = partition(axes(node_to_mask,1))
1084+
node_to_global_dof = pzeros(Int,node_partition)
1085+
function fill_own_dofs!(own_node_to_global_dof,own_node_to_boundary,dofs)
1086+
own_to_global_dof = own_to_global(dofs)
1087+
own_node_to_global_dof[own_node_to_boundary] = own_to_global_dof
1088+
end
1089+
map(fill_own_dofs!,own_values(node_to_global_dof),own_values(node_to_mask),dof_partition)
1090+
consistent!(node_to_global_dof) |> wait
1091+
function add_ghost_dofs(ghost_node_to_global_dof,nodes,dofs)
1092+
ghost_node_to_owner = ghost_to_owner(nodes)
1093+
free_ghost_nodes = findall(global_dof->global_dof!=0,ghost_node_to_global_dof)
1094+
owners = view(ghost_node_to_owner,free_ghost_nodes)
1095+
ghost_dofs = view(ghost_node_to_global_dof,free_ghost_nodes)
1096+
union_ghost(dofs,ghost_dofs,owners)
1097+
end
1098+
dof_partition = map(add_ghost_dofs,ghost_values(node_to_global_dof),node_partition,dof_partition)
1099+
neighbors = assembly_graph(node_partition)
1100+
assembly_neighbors(dof_partition;neighbors)
1101+
node_to_local_dof = pzeros(Int32,node_partition)
1102+
dof_to_local_node = pzeros(Int32,dof_partition)
1103+
function finalize!(local_node_to_global_dof,local_node_to_local_dof,local_dof_to_local_node,dofs)
1104+
global_to_local_dof = global_to_local(dofs)
1105+
n_local_nodes = length(local_node_to_global_dof)
1106+
for local_node in 1:n_local_nodes
1107+
global_dof = local_node_to_global_dof[local_node]
1108+
if global_dof == 0
1109+
continue
1110+
end
1111+
local_dof = global_to_local_dof[global_dof]
1112+
local_node_to_local_dof[local_node] = local_dof
1113+
local_dof_to_local_node[local_dof] = local_node
1114+
end
1115+
end
1116+
map(finalize!,partition(node_to_global_dof),partition(node_to_local_dof),partition(dof_to_local_node),dof_partition)
1117+
dof_to_local_node, node_to_local_dof
1118+
end
10791119

0 commit comments

Comments
 (0)