# Issue for assigning initial condition in Fenicsx

**URL:** <https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755>\
**Category:** General\
**Created:** [November 16, 2022, 6:47am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755 "2022-11-16T06:47:45Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Heng\_Yuan](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/heng_yuan/32/4274_2.png) [@Heng\_Yuan](https://fenicsproject.discourse.group/u/Heng_Yuan)\
**Post date:** [November 16, 2022, 6:47am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/1 "2022-11-16T06:47:45Z")

</div>

Hey. I have a really simple question. I am trying to convert my code from fenics to fenicsx but I am not very familiar with the new syntax even after reading the tutorial.

I am trying to assign an initial value to u\_old, which has two elements, but I got error from this

```auto
import ufl
import random
from dolfinx.mesh import CellType, create_interval
from dolfinx.fem import Function, FunctionSpace
from ufl import dx
from mpi4py import MPI

mesh = create_interval(MPI.COMM_WORLD, 1000, [0, 1])
P1 = ufl.FiniteElement("CG", mesh.ufl_cell(), 1)
ME = FunctionSpace(mesh, P1 * P1)
q, v = ufl.TestFunctions(ME)
u_old = Function(ME)
u_new = Function(ME)
theta_old, vy_old = ufl.split(u_old)
theta_new, vy_new = ufl.split(u_new)

# Interpolate initial condition
u_old.sub(0).interpolate(1.57+0.01*random.gauss(0, 1))
u_old.sub(1).interpolate(0)

```

And the error is

```auto
IndexError: invalid axis: 0 (ndim = 0)

```

How could I fix this? Any help and suggestions are appreciated.

---

<div class="post-metadata">

**Author:** ![CastriMik](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/castrimik/32/2069_2.png) [@CastriMik](https://fenicsproject.discourse.group/u/CastriMik)\
**Post date:** [November 16, 2022, 7:25am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/2 "2022-11-16T07:25:37Z")

</div>

You need to provide a function within `interpolate`. Try this:

```python
u_old.sub(0).interpolate(lambda x: numpy.full((x.shape[1],), 1.57+0.01*random.gauss(0,1)))
u_old.sub(1).interpolate(lambda x: numpy.full((x.shape[1],), 0))

```

---

<div class="post-metadata">

**Author:** ![Heng\_Yuan](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/heng_yuan/32/4274_2.png) [@Heng\_Yuan](https://fenicsproject.discourse.group/u/Heng_Yuan)\
**Post date:** [November 16, 2022, 7:46am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/3 "2022-11-16T07:46:07Z")

</div>

> [@CastriMik](#):
>
> ```auto
> u_old.sub(0).interpolate(lambda x: numpy.full((x.shape[1],), 1.57+0.01*random.gauss(0,1)))
> u_old.sub(1).interpolate(lambda x: numpy.full((x.shape[1],), 0))
> 
> ```

Thank you very much! Can I ask you one more about the boundary condition? Is there a quick way to set the end point a constant instead of using the topology part from tutorial? Here I only need u\_old.sub(0)= 1.57 and u\_old.sub(1) = 0 at two end points.

---

<div class="post-metadata">

**Author:** ![dokken](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/dokken/32/1560_2.png) [@dokken](https://fenicsproject.discourse.group/u/dokken)\
**Post date:** [November 16, 2022, 8:01am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/4 "2022-11-16T08:01:01Z")

</div>

You can use `dolfinx.fem.locate_dofs_topological` or `dolfinx.fem.locate_dofs_geometrical` on a collapsed subspace to get the dofs in question, and use the map from the collapsed sub-space to assign the value directly.

```python
from dolfinx.mesh import create_interval
from dolfinx.fem import Function, FunctionSpace, locate_dofs_geometrical
from dolfinx.io import XDMFFile
import ufl
import numpy as np
from mpi4py import MPI

mesh = create_interval(MPI.COMM_WORLD, 1000, [0, 1])
P1 = ufl.FiniteElement("CG", mesh.ufl_cell(), 1)
ME = FunctionSpace(mesh, P1 * P1)
u_old = Function(ME)

M0, map0 = ME.sub(0).collapse()
M1, map1 = ME.sub(1).collapse()

dof_left = locate_dofs_geometrical(M0, lambda x: np.isclose(x[0], 1))
val_left = 1
assert len(dof_left == 1)
u_old.x.array[map0[dof_left[0]]] = 3

with XDMFFile(MPI.COMM_WORLD, "u0.xdmf", "w") as xdmf:
    xdmf.write_mesh(mesh)
    xdmf.write_function(u_old.sub(0).collapse())

```

---

<div class="post-metadata">

**Author:** ![Heng\_Yuan](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/heng_yuan/32/4274_2.png) [@Heng\_Yuan](https://fenicsproject.discourse.group/u/Heng_Yuan)\
**Post date:** [November 16, 2022, 7:17pm UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/5 "2022-11-16T19:17:01Z")

</div>

Thank you very much for your reply. but I still have some stupid questions. Sorry about this but I really want to figure out what is going on here.

My idea is since u-old is p1\*p1 function and it has two parts, one is theta\_old and the other is vy-old. For theta\_old I try to assign 1.57 at x=0 and x=1. For vy\_old I try to assign 0 at x=0 and x=1.

In your code, I am not sure how to distinguish which value is assigned to which function. Or are you just treating u\_old as a whole?

Thanks again for your help!

---

<div class="post-metadata">

**Author:** ![dokken](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/dokken/32/1560_2.png) [@dokken](https://fenicsproject.discourse.group/u/dokken)\
**Post date:** [November 16, 2022, 7:30pm UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/6 "2022-11-16T19:30:19Z")

</div>

There was a typo in my initial code that Ive corrected now. It should have been

> [@dokken](#):
>
> ```auto
> M0, map0 = ME.sub(0).collapse()
> M1, map1 = ME.sub(1).collapse()
> 
> ```

You find dofs of theta-old with M0 and map0, while dofs from vy-old with M1 and map1

---

<div class="post-metadata">

**Author:** ![Heng\_Yuan](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/heng_yuan/32/4274_2.png) [@Heng\_Yuan](https://fenicsproject.discourse.group/u/Heng_Yuan)\
**Post date:** [November 16, 2022, 11:14pm UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/7 "2022-11-16T23:14:31Z")

</div>

Aha. That makes sense. I have one more question. In your code you define

```auto
val_left = 1

```

but later you don’t use it. Would you explain a little more on this one? Thank you very much.

---

<div class="post-metadata">

**Author:** ![dokken](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/dokken/32/1560_2.png) [@dokken](https://fenicsproject.discourse.group/u/dokken)\
**Post date:** [November 17, 2022, 5:34am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/8 "2022-11-17T05:34:55Z")

</div>

Just ignore it. The value set is 3

---

<div class="post-metadata">

**Author:** ![Heng\_Yuan](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/heng_yuan/32/4274_2.png) [@Heng\_Yuan](https://fenicsproject.discourse.group/u/Heng_Yuan)\
**Post date:** [November 17, 2022, 5:43am UTC](https://fenicsproject.discourse.group/t/issue-for-assigning-initial-condition-in-fenicsx/9755/9 "2022-11-17T05:43:20Z")

</div>

I see. Thank you very much! Have a good day!
