Skip to content

Commit 12095e6

Browse files
authored
Merge pull request #164 from Cthonios/fspace-cleanup
removing sideset bookkeeping stuff from function spaces since this is…
2 parents 266c78b + 44228ee commit 12095e6

17 files changed

+41
-137
lines changed

ext/FiniteElementContainersAdaptExt.jl

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,19 +113,11 @@ end
113113
function Adapt.adapt_structure(to, fspace::FunctionSpace)
114114
coords = adapt(to, fspace.coords)
115115
elem_conns = adapt(to, fspace.elem_conns)
116-
elem_id_maps = adapt(to, fspace.elem_id_maps)
117116
ref_fes = adapt(to, fspace.ref_fes)
118-
sideset_elems = adapt(to, fspace.sideset_elems)
119-
sideset_nodes = adapt(to, fspace.sideset_nodes)
120-
sideset_sides = adapt(to, fspace.sideset_sides)
121-
sideset_side_nodes = adapt(to, fspace.sideset_side_nodes)
122117
return FunctionSpace(
123118
coords,
124-
elem_conns, elem_id_maps,
125-
ref_fes,
126-
sideset_elems,
127-
sideset_nodes,
128-
sideset_sides, sideset_side_nodes
119+
elem_conns,
120+
ref_fes
129121
)
130122
end
131123

src/FiniteElementContainers.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ export num_dimensions
8383
export num_fields
8484
export num_nodes
8585
export num_nodes_per_element
86-
export num_q_points
8786
export sideset
8887
export sideset_ids
8988
export sideset_names

src/FunctionSpaces.jl

Lines changed: 8 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,12 @@ $(TYPEDFIELDS)
1313
"""
1414
struct FunctionSpace{
1515
Coords,
16-
ElemConns, ElemIdMaps,
17-
RefFEs,
18-
SSetIVs, SSetIMs
16+
ElemConns,
17+
RefFEs
1918
} <: AbstractFunctionSpace
2019
coords::Coords
2120
elem_conns::ElemConns
22-
elem_id_maps::ElemIdMaps
2321
ref_fes::RefFEs
24-
sideset_elems::SSetIVs
25-
sideset_nodes::SSetIVs
26-
sideset_sides::SSetIVs
27-
sideset_side_nodes::SSetIMs
2822
end
2923

3024
function _setup_ref_fes(mesh::AbstractMesh, interp_type, q_degree)
@@ -69,11 +63,8 @@ function FunctionSpace(mesh::AbstractMesh, ::Type{H1Field}, interp_type, q_degre
6963

7064
return FunctionSpace(
7165
coords,
72-
mesh.element_conns, mesh.element_id_maps,
73-
ref_fes,
74-
mesh.sideset_elems,
75-
mesh.sideset_nodes,
76-
mesh.sideset_sides, mesh.sideset_side_nodes
66+
mesh.element_conns,
67+
ref_fes
7768
)
7869
end
7970

@@ -100,11 +91,8 @@ function FunctionSpace(mesh::AbstractMesh, ::Type{L2ElementField}, interp_type,
10091

10192
return FunctionSpace(
10293
coords,
103-
nothing, nothing, # TODO what makes sense here?
104-
ref_fes,
105-
mesh.sideset_elems,
106-
mesh.sideset_nodes,
107-
mesh.sideset_sides, mesh.sideset_side_nodes
94+
nothing, # TODO what makes sense here?
95+
ref_fes
10896
)
10997
end
11098

@@ -123,24 +111,13 @@ function FunctionSpace(mesh::AbstractMesh, ::Type{L2QuadratureField}, interp_typ
123111
push!(coords_vals, coords_temp)
124112
end
125113

126-
if num_fields(mesh.nodal_coords) == 1
127-
temp_syms = (:coords_x,)
128-
elseif num_fields(mesh.nodal_coords) == 2
129-
temp_syms = (:coords_x, :coords_y)
130-
else
131-
temp_syms = (:coords_x, :coords_y, :coords_z)
132-
end
133-
134114
coords_vals = L2QuadratureField.(coords_vals)
135115
coords = NamedTuple{tuple(coords_syms...)}(tuple(coords_vals...))
136116

137117
return FunctionSpace(
138118
coords,
139-
nothing, nothing, # TODO what makes sense here?
140-
ref_fes,
141-
mesh.sideset_elems,
142-
mesh.sideset_nodes,
143-
mesh.sideset_sides, mesh.sideset_side_nodes
119+
nothing, # TODO what makes sense here?
120+
ref_fes
144121
)
145122
end
146123

@@ -153,68 +130,12 @@ function Base.show(io::IO, fspace::FunctionSpace)
153130
println(io, " Type: $(typeof(fspace.coords).name.name)")
154131
for (key, ref_fe) in enumerate(fspace.ref_fes)
155132
println(io, " Block: $key")
156-
# println(io, " Number of elements: $(fspace)")
157-
# println(io, " $ref_fe")
158133
end
159134
end
160135

161-
function connectivity(fspace, block)
162-
return Base.getproperty(fspace.elem_conns, block)
163-
end
164-
165-
function connectivity(fspace, e::Int, block::Symbol)
166-
temp = @views Base.getproperty(fspace.elem_conns, block)[:, e]
167-
# NN = num_vertices(fspace.ref_fes[block])
168-
# return SVector{NN, eltype(temp)}(temp)
169-
return temp
170-
end
171-
172-
function connectivity(fspace, e::Int, block_num::Int)
173-
block_sym = keys(fspace.elem_conns)[block_num]
174-
return @views Base.getproperty(fspace.elem_conns, block_sym)[:, e]
175-
end
176-
177-
# connectivity(fspace, e, block::Symbol) = _connectivity(fspace, e, Val(block))
178-
179-
function connectivity(fspace, n::Int, e::Int, block)
180-
return @views Base.getproperty(fspace.elem_conns, block)[n, e]
181-
end
182-
183-
coordinates(fspace::FunctionSpace) = fspace.coords
184-
185-
# function coordinates(fspace::FunctionSpace, e, block)
186-
# conn = _connectivity(fspace, e, block)
187-
# return @views fspace.coords[:, conn]
188-
# end
189-
190-
function dof_connectivity(fspace, e, block, n_dofs)
191-
ids = reshape(1:length(fspace.coords), size(fspace.coords)...)
192-
block_name = keys(fspace.elem_conns)[block]
193-
conns = getproperty(fspace.elem_conns, block_name)
194-
# dof_conn = @views reshape(ids[:, conns[:, e]], n_dofs * size(conns, 1))
195-
dof_conn = reshape(ids[:, conns[:, e]], n_dofs * size(conns, 1))
196-
return dof_conn
197-
end
198-
199136
function map_shape_function_gradients(X, ∇N_ξ)
200137
J = (X * ∇N_ξ)'
201138
J_inv = inv(J)
202139
∇N_X = (J_inv * ∇N_ξ')'
203140
return ∇N_X
204141
end
205-
206-
function num_dimensions(fspace::FunctionSpace, block_sym)
207-
return ReferenceFiniteElements.dimension(getproperty(fspace.ref_fes, block_sym))
208-
end
209-
210-
function num_elements(fspace::FunctionSpace, block_sym)
211-
return num_elements(getproperty(fspace.elem_conns, block_sym))
212-
end
213-
214-
function num_nodes_per_element(fspace::FunctionSpace, block_sym)
215-
return ReferenceFiniteElements.num_vertices(getproperty(fspace.ref_fes, block_sym))
216-
end
217-
218-
function num_q_points(fspace::FunctionSpace, block_sym)
219-
return ReferenceFiniteElements.num_quadrature_points(getproperty(fspace.ref_fes, block_sym))
220-
end

src/Parameters.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ end
4040
# 4. add different fspace types
4141
# 5. convert vectors of dbcs/nbcs into namedtuples - done
4242
function Parameters(
43-
assembler, physics,
43+
mesh, assembler, physics,
4444
properties,
4545
dirichlet_bcs,
4646
neumann_bcs,
@@ -86,11 +86,9 @@ function Parameters(
8686
# create state variables for this block physics
8787
NS = num_states(val)
8888
NQ = ReferenceFiniteElements.num_quadrature_points(
89-
# getfield(values(assembler.dof.H1_vars)[1].fspace.ref_fes, key)
9089
getfield(function_space(assembler.dof).ref_fes, key)
9190
)
9291
NE = size(
93-
# getfield(values(assembler.dof.H1_vars)[1].fspace.elem_conns, key),
9492
getfield(function_space(assembler.dof).elem_conns, key),
9593
2
9694
)
@@ -108,20 +106,20 @@ function Parameters(
108106

109107
# properties = NamedTuple{keys(physics)}(tuple(properties...))
110108

111-
state_new = copy(state_old)
109+
state_new = deepcopy(state_old)
112110
state_old = NamedTuple{keys(physics)}(tuple(state_old...))
113111
state_new = NamedTuple{keys(physics)}(tuple(state_new...))
114112

115113
dirichlet_bcs, dirichlet_bc_funcs = create_dirichlet_bcs(
116-
assembler.dof, dirichlet_bcs
114+
mesh, assembler.dof, dirichlet_bcs
117115
)
118116
# update_dofs!(assembler.dof, )
119117

120118
if neumann_bcs !== NamedTuple()
121119
syms = map(x -> Symbol("neumann_bc_$x"), 1:length(neumann_bcs))
122120

123121
if length(neumann_bcs) > 1
124-
neumann_bcs, neumann_bc_funcs = create_neumann_bcs(assembler.dof, neumann_bcs)
122+
neumann_bcs, neumann_bc_funcs = create_neumann_bcs(mesh, assembler.dof, neumann_bcs)
125123
else
126124
neumann_bcs = NamedTuple()
127125
neumann_bc_funcs = NamedTuple()
@@ -178,12 +176,12 @@ function Base.show(io::IO, parameters::Parameters)
178176
end
179177

180178
function create_parameters(
181-
assembler, physics, props;
179+
mesh, assembler, physics, props;
182180
dirichlet_bcs=DirichletBC[],
183181
neumann_bcs=NeumannBC[],
184182
times=nothing
185183
)
186-
return Parameters(assembler, physics, props, dirichlet_bcs, neumann_bcs, times)
184+
return Parameters(mesh, assembler, physics, props, dirichlet_bcs, neumann_bcs, times)
187185
end
188186

189187
function update_bcs!(p::Parameters)

src/bcs/BoundaryConditions.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ end
3131
$(TYPEDSIGNATURES)
3232
"""
3333
function BCBookKeeping(
34-
dof::DofManager, var_name::Symbol, sset_name::Symbol
34+
mesh, dof::DofManager, var_name::Symbol, sset_name::Symbol
3535
)
3636
# check if var exists
3737
# var_index = 0
@@ -66,17 +66,17 @@ function BCBookKeeping(
6666
fspace = function_space(dof)
6767

6868
# get sset specific fields
69-
elements = getproperty(fspace.sideset_elems, sset_name)
70-
nodes = getproperty(fspace.sideset_nodes, sset_name)
71-
sides = getproperty(fspace.sideset_sides, sset_name)
72-
side_nodes = getproperty(fspace.sideset_side_nodes, sset_name)
69+
elements = getproperty(mesh.sideset_elems, sset_name)
70+
nodes = getproperty(mesh.sideset_nodes, sset_name)
71+
sides = getproperty(mesh.sideset_sides, sset_name)
72+
side_nodes = getproperty(mesh.sideset_side_nodes, sset_name)
7373

7474
dofs = Vector{Int64}(undef, 0)
7575
blocks = Vector{Int64}(undef, 0)
7676

7777
# gather the blocks that are present in this sideset
7878
# TODO this isn't quite right
79-
for (n, val) in enumerate(values(fspace.elem_id_maps))
79+
for (n, val) in enumerate(values(mesh.element_id_maps))
8080
# note these are the local elem id to the block, e.g. starting from 1.
8181
indices_in_sset = indexin(val, elements)
8282
filter!(x -> x !== nothing, indices_in_sset)

src/bcs/DirichletBCs.jl

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ $(TYPEDEF)
4444
$(TYPEDSIGNATURES)
4545
$(TYPEDFIELDS)
4646
"""
47-
function DirichletBCContainer(dof::DofManager, dbc::DirichletBC)
48-
bk = BCBookKeeping(dof, dbc.var_name, dbc.sset_name)
47+
function DirichletBCContainer(mesh, dof::DofManager, dbc::DirichletBC)
48+
bk = BCBookKeeping(mesh, dof, dbc.var_name, dbc.sset_name)
4949

5050
# sort nodes and dofs for dirichlet bc
5151
dof_perm = _unique_sort_perm(bk.dofs)
@@ -66,10 +66,6 @@ function Base.length(bc::DirichletBCContainer)
6666
return length(bc.bookkeeping.dofs)
6767
end
6868

69-
# function bc_set_ids(bc::DirichletBCContainer)
70-
# return bc.bookkeeping.nodes
71-
# end
72-
7369
# need checks on if field types are compatable
7470
"""
7571
$(TYPEDSIGNATURES)
@@ -143,18 +139,16 @@ function _update_bcs!(bc::DirichletBCContainer, U, backend::KA.Backend)
143139
return nothing
144140
end
145141

146-
function create_dirichlet_bcs(dof::DofManager, dirichlet_bcs::Vector{<:DirichletBC})
142+
function create_dirichlet_bcs(mesh, dof::DofManager, dirichlet_bcs::Vector{<:DirichletBC})
147143
if length(dirichlet_bcs) == 0
148144
return NamedTuple(), NamedTuple()
149145
end
150146

151147
syms = map(x -> Symbol("dirichlet_bc_$x"), 1:length(dirichlet_bcs))
152-
# dbcs = NamedTuple{tuple(syms...)}(tuple(dbcs...))
153-
# dbcs = DirichletBCContainer(dbcs, size(assembler.dof.H1_vars[1].fspace.coords, 1))
154148
dirichlet_bc_funcs = NamedTuple{tuple(syms...)}(
155149
map(x -> x.func, dirichlet_bcs)
156150
)
157-
dirichlet_bcs = DirichletBCContainer.((dof,), dirichlet_bcs)
151+
dirichlet_bcs = DirichletBCContainer.((mesh,), (dof,), dirichlet_bcs)
158152

159153
if length(dirichlet_bcs) > 0
160154
temp_dofs = mapreduce(x -> x.bookkeeping.dofs, vcat, dirichlet_bcs)

src/bcs/NeumannBCs.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ end
9696

9797
# TODO below method also currently likely doesn't
9898
# handle blocks correclty
99-
function create_neumann_bcs(dof::DofManager, neumann_bcs::Vector{NeumannBC})
99+
function create_neumann_bcs(mesh, dof::DofManager, neumann_bcs::Vector{NeumannBC})
100100
sets = map(x -> x.sset_name, neumann_bcs)
101101
vars = map(x -> x.var_name, neumann_bcs)
102102
funcs = map(x -> x.func, neumann_bcs)
103-
bks = BCBookKeeping.((dof,), vars, sets)
103+
bks = BCBookKeeping.((mesh,), (dof,), vars, sets)
104104
# bks = _split_bookkeeping_by_block(bks)
105105
fspace = function_space(dof)
106106
new_bcs = NeumannBCContainer[]

test/TestAssemblers.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ include("poisson/TestPoissonCommon.jl")
2020
DirichletBC(:u, :sset_3, bc_func),
2121
DirichletBC(:u, :sset_4, bc_func),
2222
]
23-
p = create_parameters(asm, physics, props; dirichlet_bcs=dbcs)
23+
p = create_parameters(mesh, asm, physics, props; dirichlet_bcs=dbcs)
2424
Uu = create_unknowns(asm)
2525
Vu = create_unknowns(asm)
2626

test/TestBCs.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function test_dirichlet_bc_container_init()
1414
u = VectorFunction(fspace, :displ)
1515
dof = DofManager(u)
1616
bc_in = DirichletBC(:displ_x, :sset_1, dummy_func_1)
17-
bc = FiniteElementContainers.DirichletBCContainer(dof, bc_in)
17+
bc = FiniteElementContainers.DirichletBCContainer(mesh, dof, bc_in)
1818
end
1919

2020
function test_neumann_bc_input()
@@ -30,7 +30,7 @@ function test_neumann_bc_container_init()
3030
u = VectorFunction(fspace, :displ)
3131
dof = DofManager(u)
3232
bc_in = NeumannBC(:displ, :sset_1, dummy_func_2)
33-
bc = FiniteElementContainers.NeumannBCContainer(dof, bc_in)
33+
bc = FiniteElementContainers.NeumannBCContainer(mesh, dof, bc_in)
3434
end
3535

3636
@testset ExtendedTestSet "BoundaryConditions" begin

test/mechanics/TestMechanics.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ function mechanics_test()
2929

3030
# pre-setup some scratch arrays
3131
times = TimeStepper(0., 1., 1)
32-
p = create_parameters(asm, physics, props; dirichlet_bcs=dbcs, times=times)
32+
p = create_parameters(mesh, asm, physics, props; dirichlet_bcs=dbcs, times=times)
3333

3434
solver = NewtonSolver(IterativeLinearSolver(asm, :CgSolver))
3535
integrator = QuasiStaticIntegrator(solver)

0 commit comments

Comments
 (0)