|
|
-
- # Introduction
- The Poisson's equation is a second-order partial differential equation that stats the negative Laplacian $-\Delta u$ of an unknown field $u=u(x)$ is equal to a given function $f=f(x)$ on a domain $\Omega \subset \mathbb{R}^d$, most probably defined by a set of boundary conditions for the solution $u$ on the boundary $\partial \Omega$ of $\Omega$:
-
- $$-\Delta u =f \quad \text{in } \Omega\text{,}$$
- $$u=u_0 \quad \text{on } \Gamma_D \subset \partial\Omega \text{,}$$
-
- here the Dirichlet's boundary condition $u=u_0$ signifies a prescribed values for the unknown $u$ on the boundary.
-
- The Poisson's equation is the simplest model for gravity, electromagnetism, heat transfer, among others.
-
- The specific case of $f=0$ and a negative $k$ value, leaves to the Fourier's Law.
-
- ## Comparative analysis
- Along this example, the fenics platfomr is used to compare results obtained by solving the heat equation (Laplace equation) in 2-D:
-
- $$\frac{\partial^2 T}{\partial x^2}+ \frac{\partial^2 T}{\partial y^2}=0$$
-
- the problem is defined by the next geometry considerations:
-
- ![](physicalproblem.png)
-
- The resulting contour of temperature, solving using finite diferences, is shown next:
-
- ![](resulteq.png)
-
- # Solving by Finite Element Method with Varational Problem formulation
-
-
- ```python
- #1 Loading functions and modules
- from fenics import *
- import matplotlib.pyplot as plt
- ```
-
-
- ```python
- #2 Create mesh and define function space
- mesh = RectangleMesh(Point(0,0),Point(20,20),10, 10,'left')
- V = FunctionSpace(mesh, 'Lagrange', 1) #Lagrange are triangular elements
- plot(mesh)
- plt.show()
- ```
-
-
- ![png](output_6_0.png)
-
-
-
- ```python
- #3 Defining boundary conditions (Dirichlet)
- tol = 1E-14 # tolerance for coordinate comparisons
- #at y=20
- def Dirichlet_boundary1(x, on_boundary):
- return on_boundary and abs(x[1] - 20) < tol
- #at y=0
- def Dirichlet_boundary0(x, on_boundary):
- return on_boundary and abs(x[1] - 0) < tol
- #at x=0
- def Dirichlet_boundarx0(x, on_boundary):
- return on_boundary and abs(x[0] - 0) < tol
- #at x=20
- def Dirichlet_boundarx1(x, on_boundary):
- return on_boundary and abs(x[0] - 20) < tol
-
- bc0 = DirichletBC(V, Constant(0), Dirichlet_boundary0)
- bc1 = DirichletBC(V, Constant(100), Dirichlet_boundary1) #100C
- bc2 = DirichletBC(V, Constant(0), Dirichlet_boundarx0)
- bc3 = DirichletBC(V, Constant(0), Dirichlet_boundarx1)
- bcs = [bc0,bc1, bc2,bc3]
- ```
-
-
- ```python
- #4 Defining variational problem and its solution
- k =1
- u = TrialFunction(V)
- v = TestFunction(V)
- f = Constant(0)
- a = dot(k*grad(u), grad(v))*dx
- L = f*v*dx
-
- # Compute solution
- u = Function(V)
- solve(a == L, u, bcs)
-
- # Plot solution and mesh
- plot(u)
- plot(mesh)
-
- # Save solution to file in VTK format
- vtkfile = File('solution.pvd')
- vtkfile << u
- ```
-
-
- ![png](output_8_0.png)
-
-
- # Results after editing color-map on paraview
- ![](paraview-results.png)
|