Skip to content

Commit

Permalink
Avoid type instability in SemidiscretizationCoupled (#1979)
Browse files Browse the repository at this point in the history
* Avoid type instability in `SemidiscretizationCoupled`

* Remove all allocations

---------

Co-authored-by: Michael Schlottke-Lakemper <[email protected]>
Co-authored-by: Simon Candelaresi <[email protected]>
Co-authored-by: Hendrik Ranocha <[email protected]>
  • Loading branch information
4 people authored Jun 21, 2024
1 parent 5a642f2 commit a70522f
Showing 1 changed file with 10 additions and 22 deletions.
32 changes: 10 additions & 22 deletions src/semidiscretization/semidiscretization_coupled.jl
Original file line number Diff line number Diff line change
Expand Up @@ -429,12 +429,11 @@ BoundaryConditionCoupled(2, (:j, :i_backwards, :end), Float64, fun)
!!! warning "Experimental code"
This is an experimental feature and can change any time.
"""
mutable struct BoundaryConditionCoupled{NDIMS, NDIMST2M1, uEltype <: Real, Indices,
CouplingConverter}
mutable struct BoundaryConditionCoupled{NDIMS, other_semi_index, NDIMST2M1,
uEltype <: Real, Indices, CouplingConverter}
# NDIMST2M1 == NDIMS * 2 - 1
# Buffer for boundary values: [variable, nodes_i, nodes_j, cell_i, cell_j]
u_boundary :: Array{uEltype, NDIMST2M1} # NDIMS * 2 - 1
other_semi_index :: Int
other_orientation :: Int
indices :: Indices
coupling_converter :: CouplingConverter
Expand All @@ -452,9 +451,9 @@ mutable struct BoundaryConditionCoupled{NDIMS, NDIMST2M1, uEltype <: Real, Indic
other_orientation = 3
end

new{NDIMS, NDIMS * 2 - 1, uEltype, typeof(indices),
new{NDIMS, other_semi_index, NDIMS * 2 - 1, uEltype, typeof(indices),
typeof(coupling_converter)}(u_boundary,
other_semi_index, other_orientation,
other_orientation,
indices, coupling_converter)
end
end
Expand Down Expand Up @@ -558,28 +557,17 @@ function copy_to_coupled_boundary!(boundary_conditions::Union{Tuple, NamedTuple}
boundary_conditions...)
end

function mesh_equations_solver_cache(other_semi_index, i, semi_, semi_tuple...)
if i == other_semi_index
return mesh_equations_solver_cache(semi_)
else
# Walk through semidiscretizations until we find `i`
mesh_equations_solver_cache(other_semi_index, i + 1, semi_tuple...)
end
end

# In 2D
function copy_to_coupled_boundary!(boundary_condition::BoundaryConditionCoupled{2},
u_ode,
semi_coupled, semi)
function copy_to_coupled_boundary!(boundary_condition::BoundaryConditionCoupled{2,
other_semi_index},
u_ode, semi_coupled, semi) where {other_semi_index}
@unpack u_indices = semi_coupled
@unpack other_semi_index, other_orientation, indices = boundary_condition
@unpack other_orientation, indices = boundary_condition
@unpack coupling_converter, u_boundary = boundary_condition

mesh_own, equations_own, solver_own, cache_own = mesh_equations_solver_cache(semi)

mesh_other, equations_other, solver_other, cache_other = mesh_equations_solver_cache(other_semi_index,
1,
semi_coupled.semis...)
other_semi = semi_coupled.semis[other_semi_index]
mesh_other, equations_other, solver_other, cache_other = mesh_equations_solver_cache(other_semi)

node_coordinates_other = cache_other.elements.node_coordinates
u_ode_other = get_system_u_ode(u_ode, other_semi_index, semi_coupled)
Expand Down

0 comments on commit a70522f

Please sign in to comment.