Write custom classes#

Objectives

  • Learn how to write custom classes to add more functionality to FESTIM

FESTIM is very flexible. However you may want to customise it further.

You can do this by creating your own classes.

We show here a few examples:

  • Creating custom derived quantities

  • Reading the temperature from tabulated data

  • Add functionalities to the solver

Compute the advection flux#

This example builds upon the previous task Advection-diffusion problem where we obtained a hydrodgen concentration field under the influence of a velocity field.

image

We would now like to compute the flux \(J\) on the right surface \(\Gamma_\mathrm{right}\) including advection:

\[ J = \int_{\Gamma_\mathrm{right}} c \ v \cdot \mathbf{n} \ ds \]

where \(v\) is the velocity vector in \(\mathrm{m/s}\), \(c\) is the hydrogen concentration in \(\mathrm{H/m^3}\), and \(\mathbf{n}\) is the outward normal vector.

Just like the advection term in the governing equations, this derived quantity is not natively supported in FESTIM.

It is however possible to make our own DerivedQuantity class to achieve this result. For more information on class inheritance in python, have a look at this tutorial.

To do so, let’s create a class called SurfaceAdvectionFlux inheriting from festim.SurfaceQuantity. By doing so, we can inherit from the existing functionalities of the parent class while adding more and overriding the parent class’s behaviour.

This new class will have an argument velocity_field that will take a fenics.Function as value. This will be stored as an attribute of the class so that we can use it in other methods. We then add the compute method to compute the correct flux.

import fenics as f
import festim as F


class SurfaceAdvectionFlux(F.SurfaceQuantity):
    def __init__(self, field, surface, velocity_field):

        super().__init__(field=field, surface=surface)

        self.velocity_field = velocity_field
        self.title = "Surface Advection Flux"

    def compute(self):
        # assemble is for integral computation
        # dot is for scalar product
        # n is the normal vector
        # self.function in this case is the concentration
        flux = f.assemble( 
            f.dot(
                self.velocity_field * self.function,
                self.n,
            )
            * self.ds(self.surface)
        )
        return flux

Let’s build our model. For details regarding this implementation, have a look at the Advection-diffusion problem task.

from fenics import UnitSquareMesh, CompiledSubDomain, MeshFunction

my_model = F.Simulation()
# creating a mesh with FEniCS
nx = ny = 20
mesh_fenics = UnitSquareMesh(nx, ny)


# marking physical groups (volumes and surfaces)
volume_markers = MeshFunction("size_t", mesh_fenics, mesh_fenics.topology().dim())
volume_markers.set_all(1)

tol = 1e-14

left_surface = CompiledSubDomain("on_boundary && near(x[0], 0, tol)", tol=tol)
right_surface = CompiledSubDomain("on_boundary && near(x[0], 1, tol)", tol=tol)
bottom_surface = CompiledSubDomain("on_boundary && near(x[1], 0, tol)", tol=tol)
top_surface = CompiledSubDomain("on_boundary && near(x[1], 1, tol)", tol=tol)

surface_markers = MeshFunction("size_t", mesh_fenics, mesh_fenics.topology().dim() - 1)
surface_markers.set_all(0)

left_id = 1
top_and_bottom_id = 2
right_id = 3
left_surface.mark(surface_markers, left_id)
right_surface.mark(surface_markers, right_id)
top_surface.mark(surface_markers, top_and_bottom_id)
bottom_surface.mark(surface_markers, top_and_bottom_id)

my_model.mesh = F.Mesh(
    mesh=mesh_fenics, volume_markers=volume_markers, surface_markers=surface_markers
)

my_model.materials = F.Material(id=1, D_0=1, E_D=0)

my_model.T = F.Temperature(500)

my_model.boundary_conditions = [
    F.DirichletBC(field=0, surfaces=top_and_bottom_id, value=0),
    F.DirichletBC(field=0, surfaces=left_id, value=1),
]

my_model.settings = F.Settings(
    absolute_tolerance=1e-10, relative_tolerance=1e-10, transient=False
)

from fenics import interpolate, Expression, VectorFunctionSpace

functionspace = VectorFunctionSpace(my_model.mesh.mesh, "CG", 1)

velocity = Expression(("-100*x[1]*(x[1] - 1)", "0"), degree=2)

velocity = interpolate(velocity, functionspace)

Now we can use our custom derived quantity class and add it to our problem’s exports:

my_model.exports = [
    F.DerivedQuantities(
        [
            SurfaceAdvectionFlux(
                field="solute", surface=right_id, velocity_field=velocity
            )
        ],
        show_units=True,
    )
]

Let’s add the advection term to the governing equations and run the simulation:

from fenics import inner, dot, grad

my_model.initialise()

hydrogen_concentration = my_model.h_transport_problem.mobile.mobile_concentration()
test_function_solute = my_model.h_transport_problem.mobile.test_function

advection_term = (
    inner(dot(grad(hydrogen_concentration), velocity), test_function_solute)
    * my_model.mesh.dx
)

my_model.h_transport_problem.F += advection_term

my_model.run()

Hide code cell output

Defining initial values
Defining variational problem
Defining source terms
Defining boundary conditions
Solving steady state problem...
Calling FFC just-in-time (JIT) compiler, this may take some time.
Solved problem in 0.70 s

We can now compute the flux taking into account the advection field!

flux = my_model.exports[0][0].data[0]
print(f"{flux: .2f} H/m/s")
 10.08 H/m/s

Calculate recombination flux#

Another example is computing the flux of hydrogen \(J\) from:

\[ J = K_r \ c^2 \]

instead of:

\[ J = -D \nabla c \cdot n \]

To do so, we can create a custom SurfaceQuantity:

class RecombinationFluxQuantity(F.SurfaceQuantity):
    def __init__(self, Kr_0, E_Kr, order, surface):
        super().__init__(surface=surface, field=0)
        self.Kr_0 = Kr_0
        self.E_Kr = E_Kr
        self.order = order
        self.title = "Recombination flux"

    def compute(self):
        K_r = self.Kr_0 * f.exp(-self.E_Kr / (F.k_B * self.T))
        flux = f.assemble(K_r * self.function**self.order * self.ds(self.surface))
        return flux
import numpy as np

my_model = F.Simulation()
my_model.mesh = F.MeshFromVertices(vertices=np.linspace(0, 7e-5, num=1000))
my_model.materials = F.Material(id=1, D_0=1e-7, E_D=0.2)
my_model.T = F.Temperature(value=700)
my_model.boundary_conditions = [
    F.DirichletBC(surfaces=[1], value=1e15, field=0),
    F.RecombinationFlux(surfaces=[2], Kr_0=1e-15, E_Kr=0.5, order=2),
]
my_model.settings = F.Settings(
    absolute_tolerance=1e8, relative_tolerance=1e-10, final_time=1
)

derived_quantities = F.DerivedQuantities(
    [
        RecombinationFluxQuantity(Kr_0=1e-15, E_Kr=0.5, order=2, surface=2),
        F.SurfaceFlux(field=0, surface=2),
    ],
    show_units=True,
)
my_model.exports = [derived_quantities]


my_model.dt = F.Stepsize(1e-3, stepsize_change_ratio=1.1)

my_model.initialise()

# we just need to teach our custom derived quantity what is the temperature
derived_quantities[0].T = my_model.T.T
my_model.run()

Hide code cell output

Defining initial values
Defining variational problem
Defining source terms
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
/home/docs/checkouts/readthedocs.org/user_builds/festim-workshop/conda/festim1/lib/python3.11/site-packages/mpmath/libmp/libintmath.py:75: DeprecationWarning: bitcount function is deprecated
  warnings.warn("bitcount function is deprecated",
Defining boundary conditions
Time stepping...
Calling FFC just-in-time (JIT) compiler, this may take some time.
Calling FFC just-in-time (JIT) compiler, this may take some time.
0.1 %        1.0e-03 s    Elapsed time so far: 1.1 s
Calling FFC just-in-time (JIT) compiler, this may take some time.
0.2 %        2.1e-03 s    Elapsed time so far: 1.5 s
0.3 %        3.3e-03 s    Elapsed time so far: 1.5 s
0.5 %        4.6e-03 s    Elapsed time so far: 1.5 s
0.6 %        6.1e-03 s    Elapsed time so far: 1.6 s
0.8 %        7.7e-03 s    Elapsed time so far: 1.6 s
0.9 %        9.5e-03 s    Elapsed time so far: 1.6 s
1.1 %        1.1e-02 s    Elapsed time so far: 1.6 s
1.4 %        1.4e-02 s    Elapsed time so far: 1.6 s
1.6 %        1.6e-02 s    Elapsed time so far: 1.6 s
1.9 %        1.9e-02 s    Elapsed time so far: 1.6 s
2.1 %        2.1e-02 s    Elapsed time so far: 1.6 s
2.5 %        2.5e-02 s    Elapsed time so far: 1.6 s
2.8 %        2.8e-02 s    Elapsed time so far: 1.6 s
3.2 %        3.2e-02 s    Elapsed time so far: 1.6 s
3.6 %        3.6e-02 s    Elapsed time so far: 1.6 s
4.0 %        4.1e-02 s    Elapsed time so far: 1.6 s
4.6 %        4.6e-02 s    Elapsed time so far: 1.6 s
5.1 %        5.1e-02 s    Elapsed time so far: 1.6 s
5.7 %        5.7e-02 s    Elapsed time so far: 1.6 s
6.4 %        6.4e-02 s    Elapsed time so far: 1.6 s
7.1 %        7.1e-02 s    Elapsed time so far: 1.6 s
8.0 %        8.0e-02 s    Elapsed time so far: 1.6 s
8.8 %        8.8e-02 s    Elapsed time so far: 1.6 s
9.8 %        9.8e-02 s    Elapsed time so far: 1.6 s
10.9 %        1.1e-01 s    Elapsed time so far: 1.6 s
12.1 %        1.2e-01 s    Elapsed time so far: 1.7 s
13.4 %        1.3e-01 s    Elapsed time so far: 1.7 s
14.9 %        1.5e-01 s    Elapsed time so far: 1.7 s
16.4 %        1.6e-01 s    Elapsed time so far: 1.7 s
18.2 %        1.8e-01 s    Elapsed time so far: 1.7 s
20.1 %        2.0e-01 s    Elapsed time so far: 1.7 s
22.2 %        2.2e-01 s    Elapsed time so far: 1.7 s
24.6 %        2.5e-01 s    Elapsed time so far: 1.7 s
27.1 %        2.7e-01 s    Elapsed time so far: 1.7 s
29.9 %        3.0e-01 s    Elapsed time so far: 1.7 s
33.0 %        3.3e-01 s    Elapsed time so far: 1.7 s
36.4 %        3.6e-01 s    Elapsed time so far: 1.7 s
40.1 %        4.0e-01 s    Elapsed time so far: 1.7 s
44.3 %        4.4e-01 s    Elapsed time so far: 1.7 s
48.8 %        4.9e-01 s    Elapsed time so far: 1.7 s
53.8 %        5.4e-01 s    Elapsed time so far: 1.7 s
59.2 %        5.9e-01 s    Elapsed time so far: 1.7 s
65.3 %        6.5e-01 s    Elapsed time so far: 1.7 s
71.9 %        7.2e-01 s    Elapsed time so far: 1.7 s
79.2 %        7.9e-01 s    Elapsed time so far: 1.7 s
87.2 %        8.7e-01 s    Elapsed time so far: 1.7 s
96.0 %        9.6e-01 s    Elapsed time so far: 1.8 s
100.0 %        1.0e+00 s    Elapsed time so far: 1.8 s
import matplotlib.pyplot as plt

recomb_flux = np.array(derived_quantities[0].data)
surface_flux = -np.array(derived_quantities[1].data)

plt.plot(derived_quantities.t, recomb_flux, label="Recombination flux")
plt.plot(derived_quantities.t, surface_flux, label="Surface flux", linestyle="--")
plt.legend()
plt.xlabel("Time (s)")
plt.ylabel("Flux (m$^{-2}$ s$^{-1}$)")
plt.show()
../_images/8910e0727c05b260c8efb88c0ce3ad9903043474e39c7dc34dde20a2a14c4f77.png

Temperature from tabulated data#

Using tabulated data for the temperature isn’t natively supported in FESTIM. It doesn’t mean it’s not doable!

Although this requires a bit of FEniCS knowledge, we can extend the Temperature class to make it accept an interpolated object from say scipy.interp1d.

class InterpolatedExpression(f.UserExpression):
    def __init__(self, f):
        """InterpolatedExpression

        Args:
            f (callable): callable y=f(t) that will be used to evaluate the expression
        """
        super().__init__()
        self.f = f
        self.t = 0

    def eval(self, value, x):
        value[0] = self.f(self.t)


class TemperatureFromData(F.Temperature):
    def __init__(self, f):
        value = InterpolatedExpression(f)
        super().__init__(value)

    # override the create_functions method
    def create_functions(self, mesh):
        """Creates functions self.T, self.T_n

        Args:
            mesh (festim.Mesh): the mesh
        """
        V = f.FunctionSpace(mesh.mesh, "CG", 1)
        self.T = f.Function(V, name="T")
        self.T_n = f.Function(V, name="T_n")
        self.expression = self.value
        self.T.assign(f.interpolate(self.expression, V))
        self.T_n.assign(self.T)

Let’s fabricate some tabulated data:

from scipy.interpolate import interp1d

t = np.linspace(0, 10, num=10000)
T = 400 + 10 * np.sin(2 * np.pi * t)

# add noise
T += np.random.normal(0, 1, size=T.shape)

T_f = interp1d(t, T)

We can then use this new custom temperature class in our model.

my_model = F.Simulation()

my_model.mesh = F.MeshFromVertices(np.linspace(0, 3e-6))
my_model.materials = F.Material(id=1, D_0=1e-7, E_D=0.2)


my_model.T = TemperatureFromData(T_f)


my_model.boundary_conditions = [
    F.DirichletBC(surfaces=[1], value=1e15, field=0),
    F.DirichletBC(surfaces=[2], value=0, field=0),
]

my_model.settings = F.Settings(
    absolute_tolerance=1e10, relative_tolerance=1e-10, transient=True, final_time=5
)

my_model.dt = F.Stepsize(0.0005, stepsize_change_ratio=1.1, max_stepsize=0.01)
my_model.exports = [
    F.DerivedQuantities(
        [
            F.AverageVolume("T", volume=1),
            F.SurfaceFlux("0", surface=2),
        ],
        show_units=True,
    )
]

my_model.initialise()

my_model.run()

Hide code cell output

WARNING: user expression has not supplied value_shape method or an element. Assuming scalar element.
Defining initial values
Defining variational problem
Defining source terms
Defining boundary conditions
Time stepping...
Calling FFC just-in-time (JIT) compiler, this may take some time.
Calling FFC just-in-time (JIT) compiler, this may take some time.
0.0 %        5.0e-04 s    Elapsed time so far: 1.0 s
0.0 %        1.1e-03 s    Elapsed time so far: 1.0 s
0.0 %        1.7e-03 s    Elapsed time so far: 1.0 s
0.1 %        2.3e-03 s    Elapsed time so far: 1.0 s
0.1 %        3.1e-03 s    Elapsed time so far: 1.0 s
0.1 %        3.9e-03 s    Elapsed time so far: 1.0 s
0.1 %        4.7e-03 s    Elapsed time so far: 1.0 s
0.1 %        5.7e-03 s    Elapsed time so far: 1.0 s
0.1 %        6.8e-03 s    Elapsed time so far: 1.0 s
0.2 %        8.0e-03 s    Elapsed time so far: 1.1 s
0.2 %        9.3e-03 s    Elapsed time so far: 1.1 s
0.2 %        1.1e-02 s    Elapsed time so far: 1.1 s
0.2 %        1.2e-02 s    Elapsed time so far: 1.1 s
0.3 %        1.4e-02 s    Elapsed time so far: 1.1 s
0.3 %        1.6e-02 s    Elapsed time so far: 1.1 s
0.4 %        1.8e-02 s    Elapsed time so far: 1.1 s
0.4 %        2.0e-02 s    Elapsed time so far: 1.1 s
0.5 %        2.3e-02 s    Elapsed time so far: 1.1 s
0.5 %        2.6e-02 s    Elapsed time so far: 1.1 s
0.6 %        2.9e-02 s    Elapsed time so far: 1.1 s
0.6 %        3.2e-02 s    Elapsed time so far: 1.1 s
0.7 %        3.6e-02 s    Elapsed time so far: 1.1 s
0.8 %        4.0e-02 s    Elapsed time so far: 1.1 s
0.9 %        4.4e-02 s    Elapsed time so far: 1.1 s
1.0 %        4.9e-02 s    Elapsed time so far: 1.1 s
1.1 %        5.5e-02 s    Elapsed time so far: 1.2 s
1.2 %        6.1e-02 s    Elapsed time so far: 1.2 s
1.3 %        6.7e-02 s    Elapsed time so far: 1.2 s
1.5 %        7.4e-02 s    Elapsed time so far: 1.2 s
1.6 %        8.2e-02 s    Elapsed time so far: 1.2 s
1.8 %        9.1e-02 s    Elapsed time so far: 1.2 s
2.0 %        1.0e-01 s    Elapsed time so far: 1.2 s
2.2 %        1.1e-01 s    Elapsed time so far: 1.2 s
2.4 %        1.2e-01 s    Elapsed time so far: 1.2 s
2.6 %        1.3e-01 s    Elapsed time so far: 1.2 s
2.8 %        1.4e-01 s    Elapsed time so far: 1.2 s
3.0 %        1.5e-01 s    Elapsed time so far: 1.2 s
3.2 %        1.6e-01 s    Elapsed time so far: 1.2 s
3.4 %        1.7e-01 s    Elapsed time so far: 1.2 s
3.6 %        1.8e-01 s    Elapsed time so far: 1.2 s
3.8 %        1.9e-01 s    Elapsed time so far: 1.2 s
4.0 %        2.0e-01 s    Elapsed time so far: 1.2 s
4.2 %        2.1e-01 s    Elapsed time so far: 1.2 s
4.4 %        2.2e-01 s    Elapsed time so far: 1.3 s
4.6 %        2.3e-01 s    Elapsed time so far: 1.3 s
4.8 %        2.4e-01 s    Elapsed time so far: 1.3 s
5.0 %        2.5e-01 s    Elapsed time so far: 1.3 s
5.2 %        2.6e-01 s    Elapsed time so far: 1.3 s
5.4 %        2.7e-01 s    Elapsed time so far: 1.3 s
5.6 %        2.8e-01 s    Elapsed time so far: 1.3 s
5.8 %        2.9e-01 s    Elapsed time so far: 1.3 s
6.0 %        3.0e-01 s    Elapsed time so far: 1.3 s
6.2 %        3.1e-01 s    Elapsed time so far: 1.3 s
6.4 %        3.2e-01 s    Elapsed time so far: 1.3 s
6.6 %        3.3e-01 s    Elapsed time so far: 1.3 s
6.8 %        3.4e-01 s    Elapsed time so far: 1.3 s
7.0 %        3.5e-01 s    Elapsed time so far: 1.3 s
7.2 %        3.6e-01 s    Elapsed time so far: 1.4 s
7.4 %        3.7e-01 s    Elapsed time so far: 1.4 s
7.6 %        3.8e-01 s    Elapsed time so far: 1.4 s
7.8 %        3.9e-01 s    Elapsed time so far: 1.4 s
8.0 %        4.0e-01 s    Elapsed time so far: 1.4 s
8.2 %        4.1e-01 s    Elapsed time so far: 1.4 s
8.4 %        4.2e-01 s    Elapsed time so far: 1.4 s
8.6 %        4.3e-01 s    Elapsed time so far: 1.4 s
8.8 %        4.4e-01 s    Elapsed time so far: 1.4 s
9.0 %        4.5e-01 s    Elapsed time so far: 1.4 s
9.2 %        4.6e-01 s    Elapsed time so far: 1.4 s
9.4 %        4.7e-01 s    Elapsed time so far: 1.4 s
9.6 %        4.8e-01 s    Elapsed time so far: 1.4 s
9.8 %        4.9e-01 s    Elapsed time so far: 1.4 s
10.0 %        5.0e-01 s    Elapsed time so far: 1.4 s
10.2 %        5.1e-01 s    Elapsed time so far: 1.4 s
10.4 %        5.2e-01 s    Elapsed time so far: 1.4 s
10.6 %        5.3e-01 s    Elapsed time so far: 1.4 s
10.8 %        5.4e-01 s    Elapsed time so far: 1.4 s
11.0 %        5.5e-01 s    Elapsed time so far: 1.5 s
11.2 %        5.6e-01 s    Elapsed time so far: 1.5 s
11.4 %        5.7e-01 s    Elapsed time so far: 1.5 s
11.6 %        5.8e-01 s    Elapsed time so far: 1.5 s
11.8 %        5.9e-01 s    Elapsed time so far: 1.5 s
12.0 %        6.0e-01 s    Elapsed time so far: 1.5 s
12.2 %        6.1e-01 s    Elapsed time so far: 1.5 s
12.4 %        6.2e-01 s    Elapsed time so far: 1.5 s
12.6 %        6.3e-01 s    Elapsed time so far: 1.5 s
12.8 %        6.4e-01 s    Elapsed time so far: 1.5 s
13.0 %        6.5e-01 s    Elapsed time so far: 1.5 s
13.2 %        6.6e-01 s    Elapsed time so far: 1.5 s
13.4 %        6.7e-01 s    Elapsed time so far: 1.5 s
13.6 %        6.8e-01 s    Elapsed time so far: 1.5 s
13.8 %        6.9e-01 s    Elapsed time so far: 1.5 s
14.0 %        7.0e-01 s    Elapsed time so far: 1.5 s
14.2 %        7.1e-01 s    Elapsed time so far: 1.5 s
14.4 %        7.2e-01 s    Elapsed time so far: 1.5 s
14.6 %        7.3e-01 s    Elapsed time so far: 1.5 s
14.8 %        7.4e-01 s    Elapsed time so far: 1.6 s
15.0 %        7.5e-01 s    Elapsed time so far: 1.6 s
15.2 %        7.6e-01 s    Elapsed time so far: 1.6 s
15.4 %        7.7e-01 s    Elapsed time so far: 1.6 s
15.6 %        7.8e-01 s    Elapsed time so far: 1.6 s
15.8 %        7.9e-01 s    Elapsed time so far: 1.6 s
16.0 %        8.0e-01 s    Elapsed time so far: 1.6 s
16.2 %        8.1e-01 s    Elapsed time so far: 1.6 s
16.4 %        8.2e-01 s    Elapsed time so far: 1.6 s
16.6 %        8.3e-01 s    Elapsed time so far: 1.6 s
16.8 %        8.4e-01 s    Elapsed time so far: 1.6 s
17.0 %        8.5e-01 s    Elapsed time so far: 1.6 s
17.2 %        8.6e-01 s    Elapsed time so far: 1.6 s
17.4 %        8.7e-01 s    Elapsed time so far: 1.6 s
17.6 %        8.8e-01 s    Elapsed time so far: 1.6 s
17.8 %        8.9e-01 s    Elapsed time so far: 1.6 s
18.0 %        9.0e-01 s    Elapsed time so far: 1.6 s
18.2 %        9.1e-01 s    Elapsed time so far: 1.7 s
18.4 %        9.2e-01 s    Elapsed time so far: 1.7 s
18.6 %        9.3e-01 s    Elapsed time so far: 1.7 s
18.8 %        9.4e-01 s    Elapsed time so far: 1.7 s
19.0 %        9.5e-01 s    Elapsed time so far: 1.7 s
19.2 %        9.6e-01 s    Elapsed time so far: 1.7 s
19.4 %        9.7e-01 s    Elapsed time so far: 1.7 s
19.6 %        9.8e-01 s    Elapsed time so far: 1.7 s
19.8 %        9.9e-01 s    Elapsed time so far: 1.7 s
20.0 %        1.0e+00 s    Elapsed time so far: 1.7 s
20.2 %        1.0e+00 s    Elapsed time so far: 1.7 s
20.4 %        1.0e+00 s    Elapsed time so far: 1.7 s
20.6 %        1.0e+00 s    Elapsed time so far: 1.7 s
20.8 %        1.0e+00 s    Elapsed time so far: 1.7 s
21.0 %        1.1e+00 s    Elapsed time so far: 1.7 s
21.2 %        1.1e+00 s    Elapsed time so far: 1.7 s
21.4 %        1.1e+00 s    Elapsed time so far: 1.8 s
21.6 %        1.1e+00 s    Elapsed time so far: 1.8 s
21.8 %        1.1e+00 s    Elapsed time so far: 1.8 s
22.0 %        1.1e+00 s    Elapsed time so far: 1.8 s
22.2 %        1.1e+00 s    Elapsed time so far: 1.8 s
22.4 %        1.1e+00 s    Elapsed time so far: 1.8 s
22.6 %        1.1e+00 s    Elapsed time so far: 1.8 s
22.8 %        1.1e+00 s    Elapsed time so far: 1.8 s
23.0 %        1.2e+00 s    Elapsed time so far: 1.8 s
23.2 %        1.2e+00 s    Elapsed time so far: 1.8 s
23.4 %        1.2e+00 s    Elapsed time so far: 1.8 s
23.6 %        1.2e+00 s    Elapsed time so far: 1.8 s
23.8 %        1.2e+00 s    Elapsed time so far: 1.8 s
24.0 %        1.2e+00 s    Elapsed time so far: 1.8 s
24.2 %        1.2e+00 s    Elapsed time so far: 1.8 s
24.4 %        1.2e+00 s    Elapsed time so far: 1.8 s
24.6 %        1.2e+00 s    Elapsed time so far: 1.9 s
24.8 %        1.2e+00 s    Elapsed time so far: 1.9 s
25.0 %        1.3e+00 s    Elapsed time so far: 1.9 s
25.2 %        1.3e+00 s    Elapsed time so far: 1.9 s
25.4 %        1.3e+00 s    Elapsed time so far: 1.9 s
25.6 %        1.3e+00 s    Elapsed time so far: 1.9 s
25.8 %        1.3e+00 s    Elapsed time so far: 1.9 s
26.0 %        1.3e+00 s    Elapsed time so far: 1.9 s
26.2 %        1.3e+00 s    Elapsed time so far: 1.9 s
26.4 %        1.3e+00 s    Elapsed time so far: 1.9 s
26.6 %        1.3e+00 s    Elapsed time so far: 1.9 s
26.8 %        1.3e+00 s    Elapsed time so far: 1.9 s
27.0 %        1.4e+00 s    Elapsed time so far: 1.9 s
27.2 %        1.4e+00 s    Elapsed time so far: 1.9 s
27.4 %        1.4e+00 s    Elapsed time so far: 1.9 s
27.6 %        1.4e+00 s    Elapsed time so far: 1.9 s
27.8 %        1.4e+00 s    Elapsed time so far: 1.9 s
28.0 %        1.4e+00 s    Elapsed time so far: 2.0 s
28.2 %        1.4e+00 s    Elapsed time so far: 2.0 s
28.4 %        1.4e+00 s    Elapsed time so far: 2.0 s
28.6 %        1.4e+00 s    Elapsed time so far: 2.0 s
28.8 %        1.4e+00 s    Elapsed time so far: 2.0 s
29.0 %        1.5e+00 s    Elapsed time so far: 2.0 s
29.2 %        1.5e+00 s    Elapsed time so far: 2.0 s
29.4 %        1.5e+00 s    Elapsed time so far: 2.0 s
29.6 %        1.5e+00 s    Elapsed time so far: 2.0 s
29.8 %        1.5e+00 s    Elapsed time so far: 2.0 s
30.0 %        1.5e+00 s    Elapsed time so far: 2.0 s
30.2 %        1.5e+00 s    Elapsed time so far: 2.0 s
30.4 %        1.5e+00 s    Elapsed time so far: 2.0 s
30.6 %        1.5e+00 s    Elapsed time so far: 2.0 s
30.8 %        1.5e+00 s    Elapsed time so far: 2.0 s
31.0 %        1.6e+00 s    Elapsed time so far: 2.0 s
31.2 %        1.6e+00 s    Elapsed time so far: 2.1 s
31.4 %        1.6e+00 s    Elapsed time so far: 2.1 s
31.6 %        1.6e+00 s    Elapsed time so far: 2.1 s
31.8 %        1.6e+00 s    Elapsed time so far: 2.1 s
32.0 %        1.6e+00 s    Elapsed time so far: 2.1 s
32.2 %        1.6e+00 s    Elapsed time so far: 2.1 s
32.4 %        1.6e+00 s    Elapsed time so far: 2.1 s
32.6 %        1.6e+00 s    Elapsed time so far: 2.1 s
32.8 %        1.6e+00 s    Elapsed time so far: 2.1 s
33.0 %        1.7e+00 s    Elapsed time so far: 2.1 s
33.2 %        1.7e+00 s    Elapsed time so far: 2.1 s
33.4 %        1.7e+00 s    Elapsed time so far: 2.1 s
33.6 %        1.7e+00 s    Elapsed time so far: 2.1 s
33.8 %        1.7e+00 s    Elapsed time so far: 2.1 s
34.0 %        1.7e+00 s    Elapsed time so far: 2.1 s
34.2 %        1.7e+00 s    Elapsed time so far: 2.1 s
34.4 %        1.7e+00 s    Elapsed time so far: 2.2 s
34.6 %        1.7e+00 s    Elapsed time so far: 2.2 s
34.8 %        1.7e+00 s    Elapsed time so far: 2.2 s
35.0 %        1.8e+00 s    Elapsed time so far: 2.2 s
35.2 %        1.8e+00 s    Elapsed time so far: 2.2 s
35.4 %        1.8e+00 s    Elapsed time so far: 2.2 s
35.6 %        1.8e+00 s    Elapsed time so far: 2.2 s
35.8 %        1.8e+00 s    Elapsed time so far: 2.2 s
36.0 %        1.8e+00 s    Elapsed time so far: 2.2 s
36.2 %        1.8e+00 s    Elapsed time so far: 2.2 s
36.4 %        1.8e+00 s    Elapsed time so far: 2.2 s
36.6 %        1.8e+00 s    Elapsed time so far: 2.2 s
36.8 %        1.8e+00 s    Elapsed time so far: 2.2 s
37.0 %        1.9e+00 s    Elapsed time so far: 2.2 s
37.2 %        1.9e+00 s    Elapsed time so far: 2.2 s
37.4 %        1.9e+00 s    Elapsed time so far: 2.2 s
37.6 %        1.9e+00 s    Elapsed time so far: 2.2 s
37.8 %        1.9e+00 s    Elapsed time so far: 2.3 s
38.0 %        1.9e+00 s    Elapsed time so far: 2.3 s
38.2 %        1.9e+00 s    Elapsed time so far: 2.3 s
38.4 %        1.9e+00 s    Elapsed time so far: 2.3 s
38.6 %        1.9e+00 s    Elapsed time so far: 2.3 s
38.8 %        1.9e+00 s    Elapsed time so far: 2.3 s
39.0 %        2.0e+00 s    Elapsed time so far: 2.3 s
39.2 %        2.0e+00 s    Elapsed time so far: 2.3 s
39.4 %        2.0e+00 s    Elapsed time so far: 2.3 s
39.6 %        2.0e+00 s    Elapsed time so far: 2.3 s
39.8 %        2.0e+00 s    Elapsed time so far: 2.3 s
40.0 %        2.0e+00 s    Elapsed time so far: 2.3 s
40.2 %        2.0e+00 s    Elapsed time so far: 2.3 s
40.4 %        2.0e+00 s    Elapsed time so far: 2.3 s
40.6 %        2.0e+00 s    Elapsed time so far: 2.3 s
40.8 %        2.0e+00 s    Elapsed time so far: 2.4 s
41.0 %        2.1e+00 s    Elapsed time so far: 2.4 s
41.2 %        2.1e+00 s    Elapsed time so far: 2.4 s
41.4 %        2.1e+00 s    Elapsed time so far: 2.4 s
41.6 %        2.1e+00 s    Elapsed time so far: 2.4 s
41.8 %        2.1e+00 s    Elapsed time so far: 2.4 s
42.0 %        2.1e+00 s    Elapsed time so far: 2.4 s
42.2 %        2.1e+00 s    Elapsed time so far: 2.4 s
42.4 %        2.1e+00 s    Elapsed time so far: 2.4 s
42.6 %        2.1e+00 s    Elapsed time so far: 2.4 s
42.8 %        2.1e+00 s    Elapsed time so far: 2.4 s
43.0 %        2.2e+00 s    Elapsed time so far: 2.4 s
43.2 %        2.2e+00 s    Elapsed time so far: 2.4 s
43.4 %        2.2e+00 s    Elapsed time so far: 2.4 s
43.6 %        2.2e+00 s    Elapsed time so far: 2.4 s
43.8 %        2.2e+00 s    Elapsed time so far: 2.4 s
44.0 %        2.2e+00 s    Elapsed time so far: 2.5 s
44.2 %        2.2e+00 s    Elapsed time so far: 2.5 s
44.4 %        2.2e+00 s    Elapsed time so far: 2.5 s
44.6 %        2.2e+00 s    Elapsed time so far: 2.5 s
44.8 %        2.2e+00 s    Elapsed time so far: 2.5 s
45.0 %        2.3e+00 s    Elapsed time so far: 2.5 s
45.2 %        2.3e+00 s    Elapsed time so far: 2.5 s
45.4 %        2.3e+00 s    Elapsed time so far: 2.5 s
45.6 %        2.3e+00 s    Elapsed time so far: 2.5 s
45.8 %        2.3e+00 s    Elapsed time so far: 2.5 s
46.0 %        2.3e+00 s    Elapsed time so far: 2.5 s
46.2 %        2.3e+00 s    Elapsed time so far: 2.5 s
46.4 %        2.3e+00 s    Elapsed time so far: 2.5 s
46.6 %        2.3e+00 s    Elapsed time so far: 2.5 s
46.8 %        2.3e+00 s    Elapsed time so far: 2.5 s
47.0 %        2.4e+00 s    Elapsed time so far: 2.5 s
47.2 %        2.4e+00 s    Elapsed time so far: 2.6 s
47.4 %        2.4e+00 s    Elapsed time so far: 2.6 s
47.6 %        2.4e+00 s    Elapsed time so far: 2.6 s
47.8 %        2.4e+00 s    Elapsed time so far: 2.6 s
48.0 %        2.4e+00 s    Elapsed time so far: 2.6 s
48.2 %        2.4e+00 s    Elapsed time so far: 2.6 s
48.4 %        2.4e+00 s    Elapsed time so far: 2.6 s
48.6 %        2.4e+00 s    Elapsed time so far: 2.6 s
48.8 %        2.4e+00 s    Elapsed time so far: 2.6 s
49.0 %        2.5e+00 s    Elapsed time so far: 2.6 s
49.2 %        2.5e+00 s    Elapsed time so far: 2.6 s
49.4 %        2.5e+00 s    Elapsed time so far: 2.6 s
49.6 %        2.5e+00 s    Elapsed time so far: 2.6 s
49.8 %        2.5e+00 s    Elapsed time so far: 2.6 s
50.0 %        2.5e+00 s    Elapsed time so far: 2.6 s
50.2 %        2.5e+00 s    Elapsed time so far: 2.6 s
50.4 %        2.5e+00 s    Elapsed time so far: 2.7 s
50.6 %        2.5e+00 s    Elapsed time so far: 2.7 s
50.8 %        2.5e+00 s    Elapsed time so far: 2.7 s
51.0 %        2.6e+00 s    Elapsed time so far: 2.7 s
51.2 %        2.6e+00 s    Elapsed time so far: 2.7 s
51.4 %        2.6e+00 s    Elapsed time so far: 2.7 s
51.6 %        2.6e+00 s    Elapsed time so far: 2.7 s
51.8 %        2.6e+00 s    Elapsed time so far: 2.7 s
52.0 %        2.6e+00 s    Elapsed time so far: 2.7 s
52.2 %        2.6e+00 s    Elapsed time so far: 2.7 s
52.4 %        2.6e+00 s    Elapsed time so far: 2.7 s
52.6 %        2.6e+00 s    Elapsed time so far: 2.7 s
52.8 %        2.6e+00 s    Elapsed time so far: 2.7 s
53.0 %        2.7e+00 s    Elapsed time so far: 2.7 s
53.2 %        2.7e+00 s    Elapsed time so far: 2.7 s
53.4 %        2.7e+00 s    Elapsed time so far: 2.7 s
53.6 %        2.7e+00 s    Elapsed time so far: 2.7 s
53.8 %        2.7e+00 s    Elapsed time so far: 2.8 s
54.0 %        2.7e+00 s    Elapsed time so far: 2.8 s
54.2 %        2.7e+00 s    Elapsed time so far: 2.8 s
54.4 %        2.7e+00 s    Elapsed time so far: 2.8 s
54.6 %        2.7e+00 s    Elapsed time so far: 2.8 s
54.8 %        2.7e+00 s    Elapsed time so far: 2.8 s
55.0 %        2.8e+00 s    Elapsed time so far: 2.8 s
55.2 %        2.8e+00 s    Elapsed time so far: 2.8 s
55.4 %        2.8e+00 s    Elapsed time so far: 2.8 s
55.6 %        2.8e+00 s    Elapsed time so far: 2.8 s
55.8 %        2.8e+00 s    Elapsed time so far: 2.8 s
56.0 %        2.8e+00 s    Elapsed time so far: 2.8 s
56.2 %        2.8e+00 s    Elapsed time so far: 2.8 s
56.4 %        2.8e+00 s    Elapsed time so far: 2.8 s
56.6 %        2.8e+00 s    Elapsed time so far: 2.8 s
56.8 %        2.8e+00 s    Elapsed time so far: 2.8 s
57.0 %        2.9e+00 s    Elapsed time so far: 2.9 s
57.2 %        2.9e+00 s    Elapsed time so far: 2.9 s
57.4 %        2.9e+00 s    Elapsed time so far: 2.9 s
57.6 %        2.9e+00 s    Elapsed time so far: 2.9 s
57.8 %        2.9e+00 s    Elapsed time so far: 2.9 s
58.0 %        2.9e+00 s    Elapsed time so far: 2.9 s
58.2 %        2.9e+00 s    Elapsed time so far: 2.9 s
58.4 %        2.9e+00 s    Elapsed time so far: 2.9 s
58.6 %        2.9e+00 s    Elapsed time so far: 2.9 s
58.8 %        2.9e+00 s    Elapsed time so far: 2.9 s
59.0 %        3.0e+00 s    Elapsed time so far: 2.9 s
59.2 %        3.0e+00 s    Elapsed time so far: 2.9 s
59.4 %        3.0e+00 s    Elapsed time so far: 2.9 s
59.6 %        3.0e+00 s    Elapsed time so far: 2.9 s
59.8 %        3.0e+00 s    Elapsed time so far: 2.9 s
60.0 %        3.0e+00 s    Elapsed time so far: 2.9 s
60.2 %        3.0e+00 s    Elapsed time so far: 3.0 s
60.4 %        3.0e+00 s    Elapsed time so far: 3.0 s
60.6 %        3.0e+00 s    Elapsed time so far: 3.0 s
60.8 %        3.0e+00 s    Elapsed time so far: 3.0 s
61.0 %        3.1e+00 s    Elapsed time so far: 3.0 s
61.2 %        3.1e+00 s    Elapsed time so far: 3.0 s
61.4 %        3.1e+00 s    Elapsed time so far: 3.0 s
61.6 %        3.1e+00 s    Elapsed time so far: 3.0 s
61.8 %        3.1e+00 s    Elapsed time so far: 3.0 s
62.0 %        3.1e+00 s    Elapsed time so far: 3.0 s
62.2 %        3.1e+00 s    Elapsed time so far: 3.0 s
62.4 %        3.1e+00 s    Elapsed time so far: 3.0 s
62.6 %        3.1e+00 s    Elapsed time so far: 3.0 s
62.8 %        3.1e+00 s    Elapsed time so far: 3.0 s
63.0 %        3.2e+00 s    Elapsed time so far: 3.0 s
63.2 %        3.2e+00 s    Elapsed time so far: 3.0 s
63.4 %        3.2e+00 s    Elapsed time so far: 3.1 s
63.6 %        3.2e+00 s    Elapsed time so far: 3.1 s
63.8 %        3.2e+00 s    Elapsed time so far: 3.1 s
64.0 %        3.2e+00 s    Elapsed time so far: 3.1 s
64.2 %        3.2e+00 s    Elapsed time so far: 3.1 s
64.4 %        3.2e+00 s    Elapsed time so far: 3.1 s
64.6 %        3.2e+00 s    Elapsed time so far: 3.1 s
64.8 %        3.2e+00 s    Elapsed time so far: 3.1 s
65.0 %        3.3e+00 s    Elapsed time so far: 3.1 s
65.2 %        3.3e+00 s    Elapsed time so far: 3.1 s
65.4 %        3.3e+00 s    Elapsed time so far: 3.1 s
65.6 %        3.3e+00 s    Elapsed time so far: 3.1 s
65.8 %        3.3e+00 s    Elapsed time so far: 3.1 s
66.0 %        3.3e+00 s    Elapsed time so far: 3.1 s
66.2 %        3.3e+00 s    Elapsed time so far: 3.1 s
66.4 %        3.3e+00 s    Elapsed time so far: 3.1 s
66.6 %        3.3e+00 s    Elapsed time so far: 3.1 s
66.8 %        3.3e+00 s    Elapsed time so far: 3.2 s
67.0 %        3.4e+00 s    Elapsed time so far: 3.2 s
67.2 %        3.4e+00 s    Elapsed time so far: 3.2 s
67.4 %        3.4e+00 s    Elapsed time so far: 3.2 s
67.6 %        3.4e+00 s    Elapsed time so far: 3.2 s
67.8 %        3.4e+00 s    Elapsed time so far: 3.2 s
68.0 %        3.4e+00 s    Elapsed time so far: 3.2 s
68.2 %        3.4e+00 s    Elapsed time so far: 3.2 s
68.4 %        3.4e+00 s    Elapsed time so far: 3.2 s
68.6 %        3.4e+00 s    Elapsed time so far: 3.2 s
68.8 %        3.4e+00 s    Elapsed time so far: 3.2 s
69.0 %        3.5e+00 s    Elapsed time so far: 3.2 s
69.2 %        3.5e+00 s    Elapsed time so far: 3.2 s
69.4 %        3.5e+00 s    Elapsed time so far: 3.2 s
69.6 %        3.5e+00 s    Elapsed time so far: 3.2 s
69.8 %        3.5e+00 s    Elapsed time so far: 3.2 s
70.0 %        3.5e+00 s    Elapsed time so far: 3.2 s
70.2 %        3.5e+00 s    Elapsed time so far: 3.2 s
70.4 %        3.5e+00 s    Elapsed time so far: 3.3 s
70.6 %        3.5e+00 s    Elapsed time so far: 3.3 s
70.8 %        3.5e+00 s    Elapsed time so far: 3.3 s
71.0 %        3.6e+00 s    Elapsed time so far: 3.3 s
71.2 %        3.6e+00 s    Elapsed time so far: 3.3 s
71.4 %        3.6e+00 s    Elapsed time so far: 3.3 s
71.6 %        3.6e+00 s    Elapsed time so far: 3.3 s
71.8 %        3.6e+00 s    Elapsed time so far: 3.3 s
72.0 %        3.6e+00 s    Elapsed time so far: 3.3 s
72.2 %        3.6e+00 s    Elapsed time so far: 3.3 s
72.4 %        3.6e+00 s    Elapsed time so far: 3.3 s
72.6 %        3.6e+00 s    Elapsed time so far: 3.3 s
72.8 %        3.6e+00 s    Elapsed time so far: 3.3 s
73.0 %        3.7e+00 s    Elapsed time so far: 3.3 s
73.2 %        3.7e+00 s    Elapsed time so far: 3.4 s
73.4 %        3.7e+00 s    Elapsed time so far: 3.4 s
73.6 %        3.7e+00 s    Elapsed time so far: 3.4 s
73.8 %        3.7e+00 s    Elapsed time so far: 3.4 s
74.0 %        3.7e+00 s    Elapsed time so far: 3.4 s
74.2 %        3.7e+00 s    Elapsed time so far: 3.4 s
74.4 %        3.7e+00 s    Elapsed time so far: 3.4 s
74.6 %        3.7e+00 s    Elapsed time so far: 3.4 s
74.8 %        3.7e+00 s    Elapsed time so far: 3.4 s
75.0 %        3.8e+00 s    Elapsed time so far: 3.4 s
75.2 %        3.8e+00 s    Elapsed time so far: 3.4 s
75.4 %        3.8e+00 s    Elapsed time so far: 3.4 s
75.6 %        3.8e+00 s    Elapsed time so far: 3.4 s
75.8 %        3.8e+00 s    Elapsed time so far: 3.4 s
76.0 %        3.8e+00 s    Elapsed time so far: 3.4 s
76.2 %        3.8e+00 s    Elapsed time so far: 3.4 s
76.4 %        3.8e+00 s    Elapsed time so far: 3.5 s
76.6 %        3.8e+00 s    Elapsed time so far: 3.5 s
76.8 %        3.8e+00 s    Elapsed time so far: 3.5 s
77.0 %        3.9e+00 s    Elapsed time so far: 3.5 s
77.2 %        3.9e+00 s    Elapsed time so far: 3.5 s
77.4 %        3.9e+00 s    Elapsed time so far: 3.5 s
77.6 %        3.9e+00 s    Elapsed time so far: 3.5 s
77.8 %        3.9e+00 s    Elapsed time so far: 3.5 s
78.0 %        3.9e+00 s    Elapsed time so far: 3.5 s
78.2 %        3.9e+00 s    Elapsed time so far: 3.5 s
78.4 %        3.9e+00 s    Elapsed time so far: 3.5 s
78.6 %        3.9e+00 s    Elapsed time so far: 3.5 s
78.8 %        3.9e+00 s    Elapsed time so far: 3.5 s
79.0 %        4.0e+00 s    Elapsed time so far: 3.5 s
79.2 %        4.0e+00 s    Elapsed time so far: 3.5 s
79.4 %        4.0e+00 s    Elapsed time so far: 3.5 s
79.6 %        4.0e+00 s    Elapsed time so far: 3.5 s
79.8 %        4.0e+00 s    Elapsed time so far: 3.5 s
80.0 %        4.0e+00 s    Elapsed time so far: 3.5 s
80.2 %        4.0e+00 s    Elapsed time so far: 3.6 s
80.4 %        4.0e+00 s    Elapsed time so far: 3.6 s
80.6 %        4.0e+00 s    Elapsed time so far: 3.6 s
80.8 %        4.0e+00 s    Elapsed time so far: 3.6 s
81.0 %        4.1e+00 s    Elapsed time so far: 3.6 s
81.2 %        4.1e+00 s    Elapsed time so far: 3.6 s
81.4 %        4.1e+00 s    Elapsed time so far: 3.6 s
81.6 %        4.1e+00 s    Elapsed time so far: 3.6 s
81.8 %        4.1e+00 s    Elapsed time so far: 3.6 s
82.0 %        4.1e+00 s    Elapsed time so far: 3.6 s
82.2 %        4.1e+00 s    Elapsed time so far: 3.6 s
82.4 %        4.1e+00 s    Elapsed time so far: 3.6 s
82.6 %        4.1e+00 s    Elapsed time so far: 3.6 s
82.8 %        4.1e+00 s    Elapsed time so far: 3.6 s
83.0 %        4.2e+00 s    Elapsed time so far: 3.6 s
83.2 %        4.2e+00 s    Elapsed time so far: 3.6 s
83.4 %        4.2e+00 s    Elapsed time so far: 3.7 s
83.6 %        4.2e+00 s    Elapsed time so far: 3.7 s
83.8 %        4.2e+00 s    Elapsed time so far: 3.7 s
84.0 %        4.2e+00 s    Elapsed time so far: 3.7 s
84.2 %        4.2e+00 s    Elapsed time so far: 3.7 s
84.4 %        4.2e+00 s    Elapsed time so far: 3.7 s
84.6 %        4.2e+00 s    Elapsed time so far: 3.7 s
84.8 %        4.2e+00 s    Elapsed time so far: 3.7 s
85.0 %        4.3e+00 s    Elapsed time so far: 3.7 s
85.2 %        4.3e+00 s    Elapsed time so far: 3.7 s
85.4 %        4.3e+00 s    Elapsed time so far: 3.7 s
85.6 %        4.3e+00 s    Elapsed time so far: 3.7 s
85.8 %        4.3e+00 s    Elapsed time so far: 3.7 s
86.0 %        4.3e+00 s    Elapsed time so far: 3.7 s
86.2 %        4.3e+00 s    Elapsed time so far: 3.7 s
86.4 %        4.3e+00 s    Elapsed time so far: 3.7 s
86.6 %        4.3e+00 s    Elapsed time so far: 3.8 s
86.8 %        4.3e+00 s    Elapsed time so far: 3.8 s
87.0 %        4.4e+00 s    Elapsed time so far: 3.8 s
87.2 %        4.4e+00 s    Elapsed time so far: 3.8 s
87.4 %        4.4e+00 s    Elapsed time so far: 3.8 s
87.6 %        4.4e+00 s    Elapsed time so far: 3.8 s
87.8 %        4.4e+00 s    Elapsed time so far: 3.8 s
88.0 %        4.4e+00 s    Elapsed time so far: 3.8 s
88.2 %        4.4e+00 s    Elapsed time so far: 3.8 s
88.4 %        4.4e+00 s    Elapsed time so far: 3.8 s
88.6 %        4.4e+00 s    Elapsed time so far: 3.8 s
88.8 %        4.4e+00 s    Elapsed time so far: 3.8 s
89.0 %        4.5e+00 s    Elapsed time so far: 3.8 s
89.2 %        4.5e+00 s    Elapsed time so far: 3.8 s
89.4 %        4.5e+00 s    Elapsed time so far: 3.8 s
89.6 %        4.5e+00 s    Elapsed time so far: 3.8 s
89.8 %        4.5e+00 s    Elapsed time so far: 3.8 s
90.0 %        4.5e+00 s    Elapsed time so far: 3.9 s
90.2 %        4.5e+00 s    Elapsed time so far: 3.9 s
90.4 %        4.5e+00 s    Elapsed time so far: 3.9 s
90.6 %        4.5e+00 s    Elapsed time so far: 3.9 s
90.8 %        4.5e+00 s    Elapsed time so far: 3.9 s
91.0 %        4.6e+00 s    Elapsed time so far: 3.9 s
91.2 %        4.6e+00 s    Elapsed time so far: 3.9 s
91.4 %        4.6e+00 s    Elapsed time so far: 3.9 s
91.6 %        4.6e+00 s    Elapsed time so far: 3.9 s
91.8 %        4.6e+00 s    Elapsed time so far: 3.9 s
92.0 %        4.6e+00 s    Elapsed time so far: 3.9 s
92.2 %        4.6e+00 s    Elapsed time so far: 3.9 s
92.4 %        4.6e+00 s    Elapsed time so far: 3.9 s
92.6 %        4.6e+00 s    Elapsed time so far: 3.9 s
92.8 %        4.6e+00 s    Elapsed time so far: 3.9 s
93.0 %        4.7e+00 s    Elapsed time so far: 4.0 s
93.2 %        4.7e+00 s    Elapsed time so far: 4.0 s
93.4 %        4.7e+00 s    Elapsed time so far: 4.0 s
93.6 %        4.7e+00 s    Elapsed time so far: 4.0 s
93.8 %        4.7e+00 s    Elapsed time so far: 4.0 s
94.0 %        4.7e+00 s    Elapsed time so far: 4.0 s
94.2 %        4.7e+00 s    Elapsed time so far: 4.0 s
94.4 %        4.7e+00 s    Elapsed time so far: 4.0 s
94.6 %        4.7e+00 s    Elapsed time so far: 4.0 s
94.8 %        4.7e+00 s    Elapsed time so far: 4.0 s
95.0 %        4.8e+00 s    Elapsed time so far: 4.0 s
95.2 %        4.8e+00 s    Elapsed time so far: 4.0 s
95.4 %        4.8e+00 s    Elapsed time so far: 4.0 s
95.6 %        4.8e+00 s    Elapsed time so far: 4.0 s
95.8 %        4.8e+00 s    Elapsed time so far: 4.0 s
96.0 %        4.8e+00 s    Elapsed time so far: 4.0 s
96.2 %        4.8e+00 s    Elapsed time so far: 4.0 s
96.4 %        4.8e+00 s    Elapsed time so far: 4.1 s
96.6 %        4.8e+00 s    Elapsed time so far: 4.1 s
96.8 %        4.8e+00 s    Elapsed time so far: 4.1 s
97.0 %        4.9e+00 s    Elapsed time so far: 4.1 s
97.2 %        4.9e+00 s    Elapsed time so far: 4.1 s
97.4 %        4.9e+00 s    Elapsed time so far: 4.1 s
97.6 %        4.9e+00 s    Elapsed time so far: 4.1 s
97.8 %        4.9e+00 s    Elapsed time so far: 4.1 s
98.0 %        4.9e+00 s    Elapsed time so far: 4.1 s
98.2 %        4.9e+00 s    Elapsed time so far: 4.1 s
98.4 %        4.9e+00 s    Elapsed time so far: 4.1 s
98.6 %        4.9e+00 s    Elapsed time so far: 4.1 s
98.8 %        4.9e+00 s    Elapsed time so far: 4.1 s
99.0 %        5.0e+00 s    Elapsed time so far: 4.1 s
99.2 %        5.0e+00 s    Elapsed time so far: 4.1 s
99.4 %        5.0e+00 s    Elapsed time so far: 4.2 s
99.6 %        5.0e+00 s    Elapsed time so far: 4.2 s
99.8 %        5.0e+00 s    Elapsed time so far: 4.2 s
100.0 %        5.0e+00 s    Elapsed time so far: 4.2 s

We can see how this noisy temperature affects the desorption flux:

T_t = my_model.exports[0][0].t
T_values = my_model.exports[0][0].data

plt.plot(T_t, T_values)
plt.xlabel("Time (s)")
plt.ylabel("Temperature (K)")
plt.show()

plt.figure()
flux_t = my_model.exports[0][1].t
flux_values = my_model.exports[0][1].data

plt.fill_between(flux_t, np.abs(flux_values), alpha=0.5)
plt.plot(flux_t, np.abs(flux_values))
plt.ylim(bottom=0)
plt.xlabel("Time (s)")
plt.ylabel("Flux (H/m2/s)")
plt.show()
../_images/572f090965b7ff2eb2ce720dce80bb010d77e2a6f1e3e3b70352dc473201c123.png ../_images/b3f44df994fecc49ff72ba9eb36109e27d16385c0c2c53f1e6744e686564ad7e.png

Customise the Simulation class#

The same can be done to add some functionality to the Simulation class. Here, we want to print the number of iterations at the end of the run.

class CustomSimulation(F.Simulation):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.nb_iterations = 0

    def iterate(self):
        super().iterate()  # do the normal iterate
        self.nb_iterations += 1  # count the iterations

    def run(self):
        super().run()  # run the simulation
        print(f"Completed in {self.nb_iterations} iterations")
my_model = CustomSimulation()

my_model.mesh = F.MeshFromVertices(np.linspace(0, 3e-6))
my_model.materials = F.Material(id=1, D_0=1e-7, E_D=0.2)

my_model.T = 400

my_model.boundary_conditions = [F.DirichletBC(surfaces=[1], value=1e15, field=0)]

my_model.settings = F.Settings(
    absolute_tolerance=1e10, relative_tolerance=1e-10, transient=True, final_time=5
)

my_model.dt = F.Stepsize(1)

my_model.initialise()

my_model.run()
Defining initial values
Defining variational problem
Defining source terms
Defining boundary conditions
Time stepping...
20.0 %        1.0e+00 s    Elapsed time so far: 0.0 s
40.0 %        2.0e+00 s    Elapsed time so far: 0.0 s
60.0 %        3.0e+00 s    Elapsed time so far: 0.0 s
80.0 %        4.0e+00 s    Elapsed time so far: 0.0 s
100.0 %        5.0e+00 s    Elapsed time so far: 0.0 s
Completed in 5 iterations