Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid type instability in SemidiscretizationCoupled #1979

Merged
merged 8 commits into from
Jun 21, 2024
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...)
SimonCan marked this conversation as resolved.
Show resolved Hide resolved
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
Loading