# Inhomogeneous Dirichlet BC from csv file

**URL:** <https://festim.discourse.group/t/inhomogeneous-dirichlet-bc-from-csv-file/60>\
**Category:** User Support\
**Created:** [July 22, 2024, 9:57am UTC](https://festim.discourse.group/t/inhomogeneous-dirichlet-bc-from-csv-file/60 "2024-07-22T09:57:36Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![remidm](https://yyz2.discourse-cdn.com/free1/user_avatar/festim.discourse.group/remidm/32/4_2.png) [@remidm](https://festim.discourse.group/u/remidm)\
**Post date:** [July 23, 2024, 7:19am UTC](https://festim.discourse.group/t/inhomogeneous-dirichlet-bc-from-csv-file/60/6 "2024-07-23T07:19:13Z")

</div>

@ehodille I also took the opportunity to adapt this example to a temperature field from a list of points.

```python
import festim as F
import fenics as f
import numpy as np

my_model = F.Simulation()

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

class InterpolatedExpression(f.UserExpression):
    def __init__ (self, f):
        super(). __init__ ()
        self.f = f
        self.t = 0

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

class TFromData(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)

from scipy.interpolate import interp1d
import numpy as np

# your data
t = np.linspace(0, 10, num=10000)
T = 300 + np.sin(2 * np.pi * t)
T_f = interp1d(t, T)

my_model.T = TFromData(T_f)

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

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

my_model.dt = F.Stepsize(0.01)
my_model.exports = [F.DerivedQuantities([F.AverageVolume("T", volume=1)])]

my_model.initialise()

my_model.run()

import matplotlib.pyplot as plt

T_t = my_model.exports[-1][0].t
T_values = my_model.exports[-1][0].data
plt.plot(T_t, T_values)
plt.xlabel("Time")
plt.ylabel("Temperature")
plt.show()

```

Which produces:

 ![image](https://global.discourse-cdn.com/free1/uploads/festim/original/1X/98b38f02466b28455b6f4e870fc0015485e2d943.png)

This way you could use the experimental T measurement in TDS simulations for instance.

```python
# your data
t = np.linspace(0, 100, num=10000)

T = np.zeros_like(t) # create array full of zeros

t_tds = 50
T[t < t_tds] = 300 # set values for t < t_tds
ramp = 2
T[t >= t_tds] = 300 + ramp * (t[t >= t_tds] - t_tds) # set values for t >= t_tds

# interpolate the data
T_f = interp1d(t, T)

my_model.T = TFromData(T_f)

```

 ![image](https://global.discourse-cdn.com/free1/uploads/festim/original/1X/8fdb19c4d360c880a42703b95f9c9aea0d7ecb79.png)

---

_[View the full topic](https://festim.discourse.group/t/inhomogeneous-dirichlet-bc-from-csv-file/60)._
