66# ! format: noindent
77
88# Container data structure (structure-of-arrays style) for DG elements
9- mutable struct ElementContainer1D{RealT <: Real , uEltype <: Real } <: AbstractContainer
9+ mutable struct TreeElementContainer1D{RealT <: Real , uEltype <: Real } < :
10+ AbstractTreeElementContainer
1011 inverse_jacobian:: Vector{RealT} # [elements]
1112 node_coordinates:: Array{RealT, 3} # [orientation, i, elements]
1213 surface_flux_values:: Array{uEltype, 3} # [variables, direction, elements]
@@ -16,16 +17,12 @@ mutable struct ElementContainer1D{RealT <: Real, uEltype <: Real} <: AbstractCon
1617 _surface_flux_values:: Vector{uEltype}
1718end
1819
19- nvariables (elements:: ElementContainer1D ) = size (elements. surface_flux_values, 1 )
20- nnodes (elements:: ElementContainer1D ) = size (elements. node_coordinates, 2 )
21- Base. eltype (elements:: ElementContainer1D ) = eltype (elements. surface_flux_values)
22-
2320# Only one-dimensional `Array`s are `resize!`able in Julia.
2421# Hence, we use `Vector`s as internal storage and `resize!`
2522# them whenever needed. Then, we reuse the same memory by
2623# `unsafe_wrap`ping multi-dimensional `Array`s around the
2724# internal storage.
28- function Base. resize! (elements:: ElementContainer1D , capacity)
25+ function Base. resize! (elements:: TreeElementContainer1D , capacity)
2926 n_nodes = nnodes (elements)
3027 n_variables = nvariables (elements)
3128 @unpack _node_coordinates, _surface_flux_values,
@@ -46,9 +43,9 @@ function Base.resize!(elements::ElementContainer1D, capacity)
4643 return nothing
4744end
4845
49- function ElementContainer1D {RealT, uEltype} (capacity:: Integer , n_variables,
50- n_nodes) where {RealT <: Real ,
51- uEltype <: Real }
46+ function TreeElementContainer1D {RealT, uEltype} (capacity:: Integer , n_variables,
47+ n_nodes) where {RealT <: Real ,
48+ uEltype <: Real }
5249 nan_RealT = convert (RealT, NaN )
5350 nan_uEltype = convert (uEltype, NaN )
5451
@@ -65,33 +62,21 @@ function ElementContainer1D{RealT, uEltype}(capacity::Integer, n_variables,
6562
6663 cell_ids = fill (typemin (Int), capacity)
6764
68- return ElementContainer1D {RealT, uEltype} (inverse_jacobian, node_coordinates,
69- surface_flux_values, cell_ids,
70- _node_coordinates, _surface_flux_values)
65+ return TreeElementContainer1D {RealT, uEltype} (inverse_jacobian, node_coordinates,
66+ surface_flux_values, cell_ids,
67+ _node_coordinates,
68+ _surface_flux_values)
7169end
7270
73- # Return number of elements
74- @inline nelements (elements:: ElementContainer1D ) = length (elements. cell_ids)
75- # TODO : Taal performance, 1:nelements(elements) vs. Base.OneTo(nelements(elements))
76- """
77- eachelement(elements::ElementContainer1D)
78-
79- Return an iterator over the indices that specify the location in relevant data structures
80- for the elements in `elements`.
81- In particular, not the elements themselves are returned.
82- """
83- @inline eachelement (elements:: ElementContainer1D ) = Base. OneTo (nelements (elements))
84- @inline Base. real (elements:: ElementContainer1D ) = eltype (elements. node_coordinates)
85-
8671# Create element container and initialize element data
8772function init_elements (cell_ids, mesh:: TreeMesh1D ,
8873 equations:: AbstractEquations{1} ,
8974 basis, :: Type{RealT} ,
9075 :: Type{uEltype} ) where {RealT <: Real , uEltype <: Real }
9176 # Initialize container
9277 n_elements = length (cell_ids)
93- elements = ElementContainer1D {RealT, uEltype} (n_elements, nvariables (equations),
94- nnodes (basis))
78+ elements = TreeElementContainer1D {RealT, uEltype} (n_elements, nvariables (equations),
79+ nnodes (basis))
9580
9681 init_elements! (elements, cell_ids, mesh, basis)
9782 return elements
192177
193178# Create interface container and initialize interface data in `elements`.
194179function init_interfaces (cell_ids, mesh:: TreeMesh1D ,
195- elements:: ElementContainer1D )
180+ elements:: TreeElementContainer1D )
196181 # Initialize container
197182 n_interfaces = count_required_interfaces (mesh, cell_ids)
198183 interfaces = InterfaceContainer1D {eltype(elements)} (n_interfaces,
@@ -284,7 +269,8 @@ function init_interfaces!(interfaces, elements, mesh::TreeMesh1D)
284269end
285270
286271# Container data structure (structure-of-arrays style) for DG boundaries
287- mutable struct BoundaryContainer1D{RealT <: Real , uEltype <: Real } <: AbstractContainer
272+ mutable struct TreeBoundaryContainer1D{RealT <: Real , uEltype <: Real } < :
273+ AbstractTreeBoundaryContainer
288274 u:: Array{uEltype, 3} # [leftright, variables, boundaries]
289275 neighbor_ids:: Vector{Int} # [boundaries]
290276 orientations:: Vector{Int} # [boundaries]
@@ -296,11 +282,11 @@ mutable struct BoundaryContainer1D{RealT <: Real, uEltype <: Real} <: AbstractCo
296282 _node_coordinates:: Vector{RealT}
297283end
298284
299- nvariables (boundaries :: BoundaryContainer1D ) = size (boundaries . u, 2 )
300- Base . eltype (boundaries:: BoundaryContainer1D ) = eltype (boundaries . u)
285+ # 1D: Only one boundary node
286+ nnodes (boundaries:: TreeBoundaryContainer1D ) = 1
301287
302288# See explanation of Base.resize! for the element container
303- function Base. resize! (boundaries:: BoundaryContainer1D , capacity)
289+ function Base. resize! (boundaries:: TreeBoundaryContainer1D , capacity)
304290 n_variables = nvariables (boundaries)
305291 @unpack _u, _node_coordinates,
306292 neighbor_ids, orientations, neighbor_sides = boundaries
@@ -322,9 +308,9 @@ function Base.resize!(boundaries::BoundaryContainer1D, capacity)
322308 return nothing
323309end
324310
325- function BoundaryContainer1D {RealT, uEltype} (capacity:: Integer , n_variables ,
326- n_nodes ) where {RealT <: Real ,
327- uEltype <: Real }
311+ function TreeBoundaryContainer1D {RealT, uEltype} (capacity:: Integer ,
312+ n_variables ) where {RealT <: Real ,
313+ uEltype <: Real }
328314 nan_RealT = convert (RealT, NaN )
329315 nan_uEltype = convert (uEltype, NaN )
330316
@@ -345,24 +331,20 @@ function BoundaryContainer1D{RealT, uEltype}(capacity::Integer, n_variables,
345331
346332 n_boundaries_per_direction = SVector (0 , 0 )
347333
348- return BoundaryContainer1D {RealT, uEltype} (u, neighbor_ids, orientations,
349- neighbor_sides,
350- node_coordinates,
351- n_boundaries_per_direction,
352- _u, _node_coordinates)
334+ return TreeBoundaryContainer1D {RealT, uEltype} (u, neighbor_ids, orientations,
335+ neighbor_sides,
336+ node_coordinates,
337+ n_boundaries_per_direction,
338+ _u, _node_coordinates)
353339end
354340
355- # Return number of boundaries
356- nboundaries (boundaries:: BoundaryContainer1D ) = length (boundaries. orientations)
357-
358341# Create boundaries container and initialize boundary data in `elements`.
359342function init_boundaries (cell_ids, mesh:: TreeMesh1D ,
360- elements:: ElementContainer1D )
343+ elements:: TreeElementContainer1D )
361344 # Initialize container
362345 n_boundaries = count_required_boundaries (mesh, cell_ids)
363- boundaries = BoundaryContainer1D {real(elements), eltype(elements)} (n_boundaries,
364- nvariables (elements),
365- nnodes (elements))
346+ boundaries = TreeBoundaryContainer1D {real(elements), eltype(elements)} (n_boundaries,
347+ nvariables (elements))
366348
367349 # Connect elements with boundaries
368350 init_boundaries! (boundaries, elements, mesh)
0 commit comments