1+ module NonConformingGridTopologies
2+
3+ using Gridap
4+ using Gridap. Helpers
5+
6+ import Gridap. Geometry: get_faces
7+ using Gridap. Geometry: GridTopology
8+ using Gridap. Geometry: UnstructuredGridTopology
9+ using Gridap. Geometry: get_grid_topology
10+ using Gridap. Arrays: Table, length_to_ptrs!
11+
12+ using GridapDistributed
13+
14+ using GridapP4est: OctreeDistributedDiscreteModel
15+ using GridapP4est: NonConformingGlue
16+
17+ struct NonConformingGridTopology{Dc,Dp,T,O} <: GridTopology{Dc,Dp}
18+ conforming_grid_topology:: UnstructuredGridTopology{Dc,Dp,T,O}
19+ coarse_cell_to_hanging_faces:: Vector{Table{Int32,Vector{Int32},Vector{Int32}}}
20+ hanging_faces_to_coarse_cell:: Vector{Table{Int32,Vector{Int32},Vector{Int32}}}
21+ end
22+
23+ function NonConformingGridTopology (model:: OctreeDistributedDiscreteModel )
24+ map (local_views (model),model. non_conforming_glue) do model,ncg
25+ conforming_grid_topology = get_grid_topology (model)
26+ coarse_cell_to_hanging_faces, hanging_faces_to_coarse_cell =
27+ generate_hanging_faces_to_coarse_cell_glue (ncg,
28+ num_cells (model),
29+ num_dims (model))
30+ NonConformingGridTopology (conforming_grid_topology,
31+ coarse_cell_to_hanging_faces,
32+ hanging_faces_to_coarse_cell)
33+ end
34+ end
35+
36+ function generate_hanging_faces_to_coarse_cell_glue (
37+ ncg:: NonConformingGlue ,num_cells:: Int ,D:: Int )
38+
39+ hanging_faces_to_cell_data =
40+ map (Broadcasting (first),ncg. hanging_faces_glue)
41+
42+ hanging_faces_to_cell_ptrs =
43+ map (Broadcasting (ones),tfill (Int32,Val {D} ()),ncg. num_hanging_faces.+ 1 )
44+ map (length_to_ptrs!,hanging_faces_to_cell_ptrs)
45+
46+ cell_to_hanging_faces_data =
47+ map (sortperm,hanging_faces_to_cell_data)
48+ cell_to_hanging_faces_data =
49+ map (Broadcasting (+ ),cell_to_hanging_faces_data,ncg. num_regular_faces)
50+
51+ cell_to_hanging_faces_ptrs =
52+ map (_count_owned_hanging_faces,
53+ hanging_faces_to_cell_data,
54+ tfill (num_cells,Val {D} ()))
55+ map (length_to_ptrs!,cell_to_hanging_faces_ptrs)
56+
57+ # Convert data from Int64 to Int32
58+ cell_to_hanging_faces_data =
59+ map (Broadcasting (Int32),cell_to_hanging_faces_data)
60+ hanging_faces_to_cell_data =
61+ map (Broadcasting (Int32),hanging_faces_to_cell_data)
62+
63+ coarse_cell_to_hanging_faces = map (cell_to_hanging_faces_data,
64+ cell_to_hanging_faces_ptrs) do d,p
65+ Table (d,p)
66+ end
67+ hanging_faces_to_coarse_cell = map (hanging_faces_to_cell_data,
68+ hanging_faces_to_cell_ptrs) do d,p
69+ Table (d,p)
70+ end
71+
72+ hanging_faces_to_coarse_cell, coarse_cell_to_hanging_faces
73+ end
74+
75+ function _count_owned_hanging_faces (x:: AbstractArray{<:Integer} ,num_cells:: Int )
76+ r = zeros (Int32,num_cells+ 1 )
77+ for xi in x
78+ r[xi+ 1 ] += 1
79+ end
80+ return r
81+ end
82+
83+ export NonConformingGridTopology
84+
85+ # Implementation of abstract API
86+
87+ OrientationStyle (
88+ :: Type{<:NonConformingGridTopology{Dc,Dp,T,O}} ) where
89+ {Dc,Dp,T,O} = O ()
90+
91+ RegularityStyle (
92+ :: Type{<:NonConformingGridTopology{Dc,Dp,T,O}} ) where
93+ {Dc,Dp,T,O} = Irregular ()
94+
95+ get_vertex_coordinates (ncgt:: NonConformingGridTopology ) =
96+ ncgt. conforming_grid_topology. vertex_coordinates
97+
98+ get_cell_type (ncgt:: NonConformingGridTopology ) =
99+ ncgt. conforming_grid_topology. cell_type
100+
101+ get_polytopes (ncgt:: NonConformingGridTopology ) =
102+ collect1d (ncgt. conforming_grid_topology. polytopes)
103+
104+ function get_faces (ncgt:: NonConformingGridTopology{Dc,Dp,T,O} ,
105+ :: Val{Dc} ,dimto:: Integer ) where {Dc,Dp,T,O}
106+ @show ncgt. coarse_cell_to_hanging_faces[dimto+ 1 ]
107+ end
108+
109+ function get_faces (ncgt:: NonConformingGridTopology{Dc,Dp,T,O} ,
110+ dimfrom:: Integer ,:: Val{Dc} ) where {Dc,Dp,T,O}
111+ @show ncgt. hanging_faces_to_coarse_cell[dimfrom+ 1 ]
112+ end
113+
114+ # What other procs do I need? Review CA (e.g., facet_to_inoutcut)
115+
116+ end # module
0 commit comments