Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/festim/hydrogen_transport_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -1147,14 +1147,14 @@ def initialise(self):
self.define_temperature()
self.convert_source_input_values_to_fenics_objects()
self.convert_advection_term_to_fenics_objects()
self.define_boundary_conditions()
self.create_flux_values_fenics()
self.create_initial_conditions()

for subdomain in self.volume_subdomains:
self.create_subdomain_formulation(subdomain)
subdomain.u.name = f"u_{subdomain.id}"

self.define_boundary_conditions()
self.create_formulation()
self.create_solver()
self.initialise_exports()
Expand Down Expand Up @@ -1408,7 +1408,7 @@ def create_subdomain_formulation(self, subdomain: _subdomain.VolumeSubdomain):
)

# add fluxes
for bc in self.boundary_conditions:
for bc in self._unpacked_bcs:
if isinstance(bc, boundary_conditions.ParticleFluxBC):
# check that the bc is applied on a surface
# belonging to this subdomain
Expand Down Expand Up @@ -1631,7 +1631,7 @@ def create_solver(self):

def create_flux_values_fenics(self):
"""For each particle flux create the ``value_fenics`` attribute"""
for bc in self.boundary_conditions:
for bc in self._unpacked_bcs:
if isinstance(bc, boundary_conditions.ParticleFluxBC):
volume_subdomain = self.surface_to_volume[bc.subdomain]
bc.create_value_fenics(
Expand Down Expand Up @@ -1908,7 +1908,7 @@ def create_formulation(self):
)

# add fluxes
for bc in self.boundary_conditions:
for bc in self._unpacked_bcs:
if isinstance(bc, boundary_conditions.ParticleFluxBC):
self.formulation -= (
bc.value_fenics
Expand Down
84 changes: 84 additions & 0 deletions test/test_h_transport_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -1373,3 +1373,87 @@ def test_traps_with_CG_elements():

# TEST
assert my_model.function_space.sub(0).element.basix_element.discontinuous is False


def test_surface_reaction_BC_discontinuous():
"""Test that surface reaction BC conserves flux"""

# BUILD
my_model = F.HydrogenTransportProblemDiscontinuous()

right_mat = F.Material(
D_0=1,
E_D=0,
K_S_0=1,
E_K_S=0,
)
left_mat = F.Material(D_0=1, E_D=0, K_S_0=2, E_K_S=0)

left_vol = F.VolumeSubdomain1D(id=1, borders=[0, 1], material=left_mat)
right_vol = F.VolumeSubdomain1D(
id=2,
borders=[1, 2],
material=right_mat,
)

vertices_left = np.linspace(0, 1, num=1000, endpoint=False)
vertices_right = np.linspace(1, 2, num=1000)
vertices = np.concatenate([vertices_left, vertices_right])
my_model.mesh = F.Mesh1D(vertices)

inlet = F.SurfaceSubdomain1D(id=3, x=0)
outlet = F.SurfaceSubdomain1D(id=4, x=2)

my_model.subdomains = [
left_vol,
right_vol,
inlet,
outlet,
]

my_model.surface_to_volume = {
inlet: left_vol,
outlet: right_vol,
}

my_model.method_interface = F.InterfaceMethod.nitsche
my_model.interfaces = [
F.Interface(id=5, subdomains=[left_vol, right_vol], penalty_term=10),
]

H = F.Species("H", subdomains=my_model.volume_subdomains)
my_model.species = [H]

my_model.temperature = 600

my_model.boundary_conditions = [
F.FixedConcentrationBC(
subdomain=inlet,
value=1,
species=H,
),
F.SurfaceReactionBC(
reactant=[H, H],
gas_pressure=0,
k_r0=1,
E_kr=0,
k_d0=0,
E_kd=0,
subdomain=outlet,
),
]
permeation_flux = F.SurfaceFlux(field=H, surface=outlet)
inlet_flux = F.SurfaceFlux(field=H, surface=inlet)
my_model.exports = [permeation_flux, inlet_flux]

my_model.settings = F.Settings(
atol=1e-10,
rtol=1e-09,
transient=False,
)

my_model.initialise()
my_model.run()

# TEST
assert np.isclose(permeation_flux.data[-1], -inlet_flux.data[-1], rtol=1e-5)
Loading