# Periodic boundary condition not giving periodic solution

**URL:** <https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359>\
**Category:** General\
**Created:** [May 31, 2023, 5:32pm UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359 "2023-05-31T17:32:07Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Angry\_FEniCS](https://avatars.discourse-cdn.com/v4/letter/a/8dc957/32.png) [@Angry\_FEniCS](https://fenicsproject.discourse.group/u/Angry_FEniCS)\
**Post date:** [May 31, 2023, 5:32pm UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359/1 "2023-05-31T17:32:07Z")

</div>

Hello All,  
I am trying to solve the following non linear equation with Periodic boundary condition.

u" = u + 25/(1+exp(u)) on x ∈ [0, 2\*pi].

I want the solution to be periodic with periodicity pi. Here is the code for the same

```auto
from fenics import *
import matplotlib.pyplot as plt
import numpy as np

L = 2*np.pi
c0 = 1
Pe = 25
D = 1
gamma = 1

l = L/(2*np.pi)
n = (l**2)*gamma
U = 25/l
stress_const = U*np.sqrt(gamma*n)

mesh_size = 1000
mesh = IntervalMesh(mesh_size, 0, L)
plot(mesh)

class PeriodicBoundary(SubDomain):
    def inside(self, x, on_boundary):
        return bool(x[0] > -DOLFIN_EPS and x[0] <= L+DOLFIN_EPS)
    def map(self, x, y):
        y[0] = x[0] - L/2

pbc = PeriodicBoundary()

V = FunctionSpace(mesh, "CG", 1, constrained_domain=pbc)

u = project(Constant(2), V)
v = TestFunction(V)

F = dot(grad(u), grad(v))*dx - (1/l**2)*u*v*dx - (1/(D*n))*stress_const*(1 - ((exp(u)/(1+exp(u)))))*v*dx 
J = derivative(F,u)

problem = NonlinearVariationalProblem(F, u, J=J)

solver = NonlinearVariationalSolver(problem)
stype = 'newton'
solver.parameters['nonlinear_solver']=stype
sprms = solver.parameters[stype+'_solver']

sprms['maximum_iterations'] = 10000

solver.solve()

```

Please help me figure out the issue

---

<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:** [June 2, 2023, 1:50pm UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359/2 "2023-06-02T13:50:03Z")

</div>

You should just solve your problem in the domain [0,\pi] if your problem is periodic, i.e.

```python
from fenics import *
import numpy as np

L = 2*np.pi
c0 = 1
Pe = 25
D = 1
gamma = 1
l = L/(2*np.pi)
n = (l**2)*gamma
U = 25/l
stress_const = U*np.sqrt(gamma*n)

mesh_size = 1000
mesh = IntervalMesh(mesh_size, 0, np.pi)

class PeriodicBoundary(SubDomain):
    def inside(self, x, on_boundary):
        """Left boundary"""
        return near(x[0], 0)
    def map(self, x, y):
        """ map from right to left boundary"""
        y[0] = x[0] - np.pi

pbc = PeriodicBoundary()

V = FunctionSpace(mesh, "CG", 1, constrained_domain=pbc)

u = project(Constant(2), V)
v = TestFunction(V)

F = dot(grad(u), grad(v))*dx - (1/l**2)*u*v*dx - (1/(D*n))*stress_const*(1 - ((exp(u)/(1+exp(u)))))*v*dx 
J = derivative(F,u)

problem = NonlinearVariationalProblem(F, u, J=J)

solver = NonlinearVariationalSolver(problem)
stype = 'newton'
solver.parameters['nonlinear_solver']=stype
sprms = solver.parameters[stype+'_solver']

sprms['maximum_iterations'] = 10000

solver.solve()
File("u.pvd") << u

```

You should just solve on the half interval, as `dolfin` relies on the mesh spacing macthing your mapping perfectly, which is really hard when you use numbers such as `pi` to describe its length.

---

<div class="post-metadata">

**Author:** ![dparsons](https://avatars.discourse-cdn.com/v4/letter/d/5e9695/32.png) [@dparsons](https://fenicsproject.discourse.group/u/dparsons)\
**Post date:** [June 2, 2023, 2:04pm UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359/3 "2023-06-02T14:04:58Z")

</div>

I don’t think the domain necessarily needs to be [0,\pi] explicitly. I think the problem is more that

```auto
y[0] = x[0] - L/2

```

was being used instead of

```auto
y[0] = x[0] - L

```

when the domain was defined as [0,L]. Perhaps the domain should be [0,L/2].  
(of course, L/2=\pi so it’s an equivalent resolution)

---

<div class="post-metadata">

**Author:** ![Angry\_FEniCS](https://avatars.discourse-cdn.com/v4/letter/a/8dc957/32.png) [@Angry\_FEniCS](https://fenicsproject.discourse.group/u/Angry_FEniCS)\
**Post date:** [June 4, 2023, 4:41am UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359/4 "2023-06-04T04:41:23Z")

</div>

Thank you for your valuable input @dokken and @dparsons. I just have one question.

In the code you have mapped left boundary to the right boundary. Shouldn’t we map the a period of the function to the domain?

I mean something like this

```auto
class PeriodicBoundary(SubDomain):
    def inside(self, x, on_boundary):
        return bool(x[0] > -DOLFIN_EPS and x[0] <= L+DOLFIN_EPS)
    def map(self, x, y):
        y[0] = x[0] - L/2

```

Where L is the domain.

---

<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:** [June 4, 2023, 5:51am UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359/5 "2023-06-04T05:51:36Z")

</div>

I dont understand why you would do that. You are saying that your solution is periodic, that means that any point x\in[0,\pi] maps to y=x+pi\in[\pi,2\pi]. This means that you only need to solve an equation on [0,\pi] but that u(0)=u(\pi)

---

<div class="post-metadata">

**Author:** ![Angry\_FEniCS](https://avatars.discourse-cdn.com/v4/letter/a/8dc957/32.png) [@Angry\_FEniCS](https://fenicsproject.discourse.group/u/Angry_FEniCS)\
**Post date:** [June 4, 2023, 6:13am UTC](https://fenicsproject.discourse.group/t/periodic-boundary-condition-not-giving-periodic-solution/11359/6 "2023-06-04T06:13:59Z")

</div>

Thanks a lot for the clarification. I misunderstood the implementation of PBC in fenics which led to this confusion.
