Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
67277fd
update rtol to make callable in problem
kaelyndunnell Jan 27, 2025
be656dc
adjust default rtol
kaelyndunnell Jan 27, 2025
4e3874c
adjust default rtol
kaelyndunnell Jan 27, 2025
ffa890d
update atol to make callable in problem.py
kaelyndunnell Feb 10, 2025
9ac79df
fix bug
kaelyndunnell Feb 10, 2025
d3fd8a7
add temp export
kaelyndunnell Feb 22, 2025
eb5cdd4
surface temperature export class
kaelyndunnell Feb 23, 2025
77da114
add surfacetemp to festim attribute
kaelyndunnell Feb 23, 2025
9b20f01
update surfacetemperature class
kaelyndunnell Feb 23, 2025
aa813e5
circular import
kaelyndunnell Feb 23, 2025
b9f700a
fix circular import
kaelyndunnell Feb 23, 2025
d4a5e9f
fix surface temperature export
kaelyndunnell Feb 23, 2025
773b291
add post processing surfacetemp update
kaelyndunnell Feb 23, 2025
b3f4488
update compute method for surface temp
kaelyndunnell Feb 23, 2025
3e70f37
fix double count surface temp
kaelyndunnell Feb 24, 2025
d1b71de
typos
kaelyndunnell Feb 24, 2025
d67fa20
Merge branch 'festim-dev:fenicsx' into fenicsx
kaelyndunnell Feb 24, 2025
6a52a39
add surface temperature export class
kaelyndunnell Feb 24, 2025
4e5e68b
add surface temp to derived quantities test
kaelyndunnell Feb 25, 2025
9a9106d
add better doc, add surface temp test
kaelyndunnell Feb 25, 2025
f03ae7d
add pytest to import
kaelyndunnell Feb 25, 2025
aefcdaa
add my_export quantity
kaelyndunnell Feb 25, 2025
806502a
delete extra line
kaelyndunnell Feb 25, 2025
91f1d5b
fix exported value comparison
kaelyndunnell Feb 25, 2025
1e5e2b0
add temp field value to surface temp
kaelyndunnell Feb 25, 2025
7b0ea6d
add temp field setter
kaelyndunnell Feb 25, 2025
528492c
initialise exports
kaelyndunnell Feb 25, 2025
1971774
remove surface temp from derived quantities
kaelyndunnell Feb 25, 2025
7d687de
change func name, add float and int to temp types
kaelyndunnell Feb 26, 2025
37d59f6
test if test or definition problem
kaelyndunnell Feb 26, 2025
98167a0
fix test
kaelyndunnell Feb 26, 2025
a044ecf
fix test
kaelyndunnell Feb 26, 2025
eb486c3
fix temp field setter
kaelyndunnell Feb 26, 2025
e0b1820
fix setter
kaelyndunnell Feb 26, 2025
9e2937e
simplify setter
kaelyndunnell Feb 26, 2025
38a6ae1
testing export.value
kaelyndunnell Feb 26, 2025
7e8d843
update test
kaelyndunnell Feb 26, 2025
f414bd1
update test
kaelyndunnell Feb 26, 2025
66ad788
uodate test
kaelyndunnell Feb 26, 2025
60eb9e7
update test
kaelyndunnell Feb 26, 2025
c1bac95
update test
kaelyndunnell Feb 26, 2025
03148d1
add test
kaelyndunnell Feb 26, 2025
c955d9f
black formatted
kaelyndunnell Feb 26, 2025
8c2f0bf
add test for title
kaelyndunnell Feb 26, 2025
f6b5ff6
black formatted
kaelyndunnell Feb 26, 2025
339a94a
additional tests
kaelyndunnell Feb 26, 2025
e960b5a
black formatted
kaelyndunnell Feb 26, 2025
97b3b17
add mesh, fix temp_field name
kaelyndunnell Feb 26, 2025
c69e971
fix failing tests
kaelyndunnell Feb 26, 2025
134a8ff
temperature cannot be a string
kaelyndunnell Feb 26, 2025
e1ed3bd
Update src/festim/exports/surface_temperature.py
kaelyndunnell Mar 2, 2025
38d68c7
delete unneeded lines when inherit from F.SurfaceQuantity
kaelyndunnell Mar 2, 2025
baa374d
also inherited now
kaelyndunnell Mar 2, 2025
ecf4532
also inherited
kaelyndunnell Mar 2, 2025
8ef1981
remove old line
kaelyndunnell Mar 2, 2025
dd3ed99
rename to AverageSurfaceTemperature
kaelyndunnell Mar 2, 2025
15fe0ad
set temp field as an attribute
kaelyndunnell Mar 2, 2025
3454d35
fix surfacequantity inheritance
kaelyndunnell Mar 2, 2025
96bf5dd
truncate computation of AverageSurfaceTemperature in hydrogentranspor…
kaelyndunnell Mar 2, 2025
78d34ce
fix festim init
kaelyndunnell Mar 2, 2025
e2b7b9a
renamed class
kaelyndunnell Mar 2, 2025
f0123dc
remove temp field from arguments
kaelyndunnell Mar 2, 2025
7ede0ec
remove unneeded test
kaelyndunnell Mar 2, 2025
b542a18
fix if statement
kaelyndunnell Mar 2, 2025
b774070
add line
kaelyndunnell Mar 2, 2025
fe8f5c6
add test line, simply HTP
kaelyndunnell Mar 2, 2025
b1d7ec7
fix test
kaelyndunnell Mar 2, 2025
352fb85
fix temp line
kaelyndunnell Mar 2, 2025
7fb1fc1
simplify HTP
kaelyndunnell Mar 2, 2025
e531a88
ruff formatted
kaelyndunnell Mar 2, 2025
bc9aa19
Merge branch 'fenicsx' into export-surface-temp
RemDelaporteMathurin Apr 1, 2025
2b2c38a
remove unneeded tests
kaelyndunnell Oct 24, 2025
2af4b73
Merge branch 'fenicsx' into export-surface-temp
kaelyndunnell Oct 24, 2025
a722253
add averagesurfacetemperature to export init
kaelyndunnell Oct 24, 2025
b9795ba
updates/rebase
kaelyndunnell Oct 24, 2025
c568c21
full integration test
kaelyndunnell Oct 24, 2025
d1eeb8b
fix integration tests and test
kaelyndunnell Oct 24, 2025
5b36778
ruff
kaelyndunnell Oct 24, 2025
dc51fb6
add not implemented error for discontinuous problem
kaelyndunnell Oct 24, 2025
0bcd616
ruff
kaelyndunnell Oct 24, 2025
b331392
update testing coverage
kaelyndunnell Oct 24, 2025
d268289
ruff
kaelyndunnell Oct 24, 2025
a9e9e20
Update src/festim/exports/surface_temperature.py
kaelyndunnell Oct 27, 2025
262a912
simplify
kaelyndunnell Oct 27, 2025
b592a68
Merge branch 'fenicsx' into export-surface-temp
kaelyndunnell Oct 27, 2025
0e2fa61
add changes erased in resolve conflicts
kaelyndunnell Oct 27, 2025
c7b5464
ruff
kaelyndunnell Oct 27, 2025
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
1 change: 1 addition & 0 deletions src/festim/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from .exports.profile_1d import Profile1DExport
from .exports.surface_flux import SurfaceFlux
from .exports.surface_quantity import SurfaceQuantity
from .exports.surface_temperature import AverageSurfaceTemperature
from .exports.total_surface import TotalSurface
from .exports.total_volume import TotalVolume
from .exports.volume_quantity import VolumeQuantity
Expand Down
2 changes: 2 additions & 0 deletions src/festim/exports/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from .profile_1d import Profile1DExport
from .surface_flux import SurfaceFlux
from .surface_quantity import SurfaceQuantity
from .surface_temperature import AverageSurfaceTemperature
from .total_surface import TotalSurface
from .total_volume import TotalVolume
from .volume_quantity import VolumeQuantity
Expand All @@ -30,4 +31,5 @@
"VTXTemperatureExport",
"VolumeQuantity",
"XDMFExport",
"AverageSurfaceTemperature",
]
55 changes: 55 additions & 0 deletions src/festim/exports/surface_temperature.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import csv
from dolfinx import fem
import ufl
from .surface_quantity import SurfaceQuantity
from festim.subdomain.surface_subdomain import SurfaceSubdomain


class AverageSurfaceTemperature(SurfaceQuantity):
"""Exports the average temperature on a given surface.

Args:
surface: the surface subdomain
filename: name of the file to which the average surface temperature is exported

Attributes:
temperature_field: the temperature field
surface (int or festim.SurfaceSubdomain): the surface subdomain
filename (str): name of the file to which the surface temperature is exported
t (list): list of time values
data (list): list of average temperature values on the surface
"""

surface: int | SurfaceSubdomain
filename: str | None

temperature_field: fem.Constant | fem.Function

def __init__(self, surface, filename: str = None) -> None:
self.surface = surface
self.filename = filename

self.temperature_field = None
self.t = []
self.data = []
self._first_time_export = True

@property
def title(self):
return f"Temperature surface {self.surface.id}"

def compute(self, ds):
"""Computes the average temperature on the surface.

Args:
ds (ufl.Measure): surface measure of the model
"""
temperature_field = self.temperature_field

self.value = fem.assemble_scalar(
fem.form(temperature_field * ds(self.surface.id))
) / fem.assemble_scalar(
fem.form(1 * ds(self.surface.id))
) # integral over surface / surface area

self.data.append(self.value)
16 changes: 16 additions & 0 deletions src/festim/hydrogen_transport_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,8 @@ def initialise_exports(self):
a string, find species object in self.species"""

for export in self.exports:
if isinstance(export, exports.AverageSurfaceTemperature):
continue
if isinstance(export, exports.ExportBaseClass):
if export.times:
for time in export.times:
Expand Down Expand Up @@ -478,6 +480,8 @@ def initialise_exports(self):

for export in self.exports:
if isinstance(export, exports.SurfaceQuantity):
if isinstance(export, exports.AverageSurfaceTemperature):
continue
if export.field in spe_to_D_global:
# if already computed then use the same D
D = spe_to_D_global[export.field]
Expand All @@ -491,6 +495,10 @@ def initialise_exports(self):
# add the global D to the export
export.D = D
export.D_expr = D_expr

if isinstance(export, exports.AverageSurfaceTemperature):
export.temperature_field = self.temperature_fenics

if isinstance(
export,
exports.MaximumVolume
Expand Down Expand Up @@ -1026,6 +1034,8 @@ def post_processing(self):
"evaluation of surface flux values"
)
export.compute(export.field.solution, self.ds)
elif isinstance(export, exports.AverageSurfaceTemperature):
export.compute(self.ds)
else:
export.compute()
# update export data
Expand All @@ -1034,6 +1044,7 @@ def post_processing(self):
# if filename given write export data to file
if export.filename is not None:
export.write(t=float(self.t))

elif isinstance(export, exports.VolumeQuantity):
if isinstance(export, exports.TotalVolume | exports.AverageVolume):
export.compute(u=export.field.solution, dx=self.dx)
Expand Down Expand Up @@ -1708,6 +1719,11 @@ def initialise_exports(self):
# HydrogenTransportProblem
for export in self.exports:
if isinstance(export, exports.SurfaceQuantity):
if isinstance(export, exports.AverageSurfaceTemperature):
raise NotImplementedError(
f"Export type {type(export)} not implemented for "
f"mixed-domain approach"
)
volume = self.surface_to_volume[export.surface]
D = volume.material.get_diffusion_coefficient(
self.mesh.mesh, self.temperature_fenics, export.field
Expand Down
127 changes: 127 additions & 0 deletions test/test_surface_temperature.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import numpy as np
import ufl
from dolfinx import fem
import pytest
import os

import festim as F


@pytest.mark.parametrize(
"T_function, expected_values",
[
(3, 3),
(lambda t: t, 3.0),
(lambda x, t: 1.0 + x[0] + t, 10.0),
],
)
def test_surface_temperature_compute_1D(T_function, expected_values):
"""Test that the average surface temperature export computes the correct value."""

# BUILD
L = 6.0
my_mesh = F.Mesh1D(np.linspace(0, L, 10000))
dummy_surface = F.SurfaceSubdomain1D(id=1, x=L)
dummy_volume = F.VolumeSubdomain1D(
id=1, borders=(0.0, L), material=F.Material(D_0=1, E_D=1, name="dummy")
)

facet_meshtags, temp = my_mesh.define_meshtags(
surface_subdomains=[dummy_surface], volume_subdomains=[dummy_volume]
)
ds = ufl.Measure("ds", domain=my_mesh.mesh, subdomain_data=facet_meshtags)

dt = F.Stepsize(initial_value=1)
settings = F.Settings(atol=1e05, rtol=1e-10, stepsize=dt, final_time=10)
my_model = F.HydrogenTransportProblem(
mesh=my_mesh, temperature=T_function, settings=settings
)

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

my_model.t = fem.Constant(my_mesh.mesh, 0.0)
dt = fem.Constant(my_mesh.mesh, 1.0)

my_model.define_temperature()

my_export = F.AverageSurfaceTemperature(surface=dummy_surface)
my_export.temperature_field = my_model.temperature_fenics
my_model.exports = [my_export]

# RUN
for _ in range(3):
my_model.t.value += dt.value
my_model.update_time_dependent_values()

my_model.initialise()
my_model.run()

# TEST
assert np.isclose(my_export.value, expected_values)


def test_title(tmp_path):
surf_1 = F.SurfaceSubdomain(id=1)
results = "test.csv"
temp = 400
surface_temp = F.AverageSurfaceTemperature(surface=surf_1, filename=results)

my_model = F.HydrogenTransportProblem(
temperature=temp,
)
surface_temp.filename = os.path.join(tmp_path, "test.csv")
surface_temp.value = 1

assert surface_temp.title == "Temperature surface 1"


@pytest.mark.parametrize("value", ["my_export.csv", "my_export.txt"])
def test_title_generation(tmp_path, value):
"""Test that the title is made to be written to the header in a csv or txt file"""
my_model = F.HydrogenTransportProblem(
mesh=F.Mesh1D(np.linspace(0, 6.0, 10000)), temperature=500
)
my_model.define_temperature()

my_export = F.AverageSurfaceTemperature(
filename=os.path.join(tmp_path, f"{value}"),
surface=F.SurfaceSubdomain1D(id=35, x=1),
)
my_export.value = 2.0
my_export.write(0)
title = np.genfromtxt(my_export.filename, delimiter=",", max_rows=1, dtype=str)

expected_title = "Temperature surface 35"

assert title[1] == expected_title


def test_not_implemented_error_raised_with_initialise_exports_multiple_subdomains():
"""Test that NotImplementedError is raised for problems with multiple volume domains."""

# BUILD
L = 1.0
test_mesh = F.Mesh1D(vertices=np.linspace(0, L, num=101))

my_mat = F.Material(D_0=1, E_D=1)
dummy_surface = F.SurfaceSubdomain1D(id=1, x=L)
vol_1 = F.VolumeSubdomain1D(id=1, borders=[0, 0.5], material=my_mat)
vol_2 = F.VolumeSubdomain1D(id=1, borders=[0.5, L], material=my_mat)

H = F.Species("H")
my_model = F.HydrogenTransportProblemDiscontinuous(
mesh=test_mesh,
temperature=10,
subdomains=[dummy_surface, vol_1, vol_2],
species=[F.Species("H")],
)

my_model.exports = [F.AverageSurfaceTemperature(surface=dummy_surface)]

# TEST
with pytest.raises(NotImplementedError):
my_model.initialise_exports()
Loading