On this page you find an easy example of an elliptic partial differential equation (PDE) solved with Concepts using Python bindings. Starting with this PDE, we derive its associated variational formulation and solve it numerically. Using the example of the standard concepts setting howToGetStarted.cc in the Concepts tutorials we show the usage of Concepts Python bindings.
We want to solve the following elliptic PDE with homogeneous Dirichlet boundary conditions

with the right hand side 


To solve this problem with Concepts, we first need its variational formulation. Let 


![\[
- \int_{\Omega} \Delta u v \, {\rm d}\mathbf{x} + \int_\Omega u v \, {\rm d}\mathbf{x} = \int_\Omega f v \, {\rm d}\mathbf{x} \qquad \forall v \in H_0^1(\Omega).
\]](form_113.png)
Using integration by parts (Gauss theorem), this is equivalent to
![\[
\int_{\Omega} \nabla u \cdot \nabla v \, {\rm d}\mathbf{x} - \int_{\partial \Omega} \underline{n} \cdot \nabla u \, v
\, {\rm d}s(\mathbf{x})+ \int_\Omega u v \, {\rm d}\mathbf{x} = \int_\Omega f v \, {\rm d}\mathbf{x} \qquad \forall v \in H_0^1(\Omega),
\]](form_114.png)
where 


![\[
\int_{\Omega} \nabla u \cdot \nabla v \, {\rm d}\mathbf{x} + \int_\Omega u v \, {\rm d}\mathbf{x} = \int_\Omega f v \, {\rm d}\mathbf{x} \qquad
\forall v \in H_0^1(\Omega).
\]](form_118.png)
This is the variational formulation of our problem. Let now 




![\[
\int_{\Omega} \nabla u_h \cdot \nabla v_h \, {\rm d}\mathbf{x} + \int_\Omega u_h v_h \, {\rm d}\mathbf{x}
= \int_\Omega f v_h {\rm d}\mathbf{x} \qquad \forall v_h \in V_h.
\]](form_124.png)
Let 



![\[
\sum_k \alpha_k \left( \int_\Omega \nabla \phi_k \cdot \nabla \phi_j \, {\rm d}\mathbf{x} + \int_\Omega \phi_k \phi_j \, {\rm d}\mathbf{x} \right)
= \int_\Omega f \phi_j \, {\rm d}\mathbf{x} \qquad \forall j \in \{ 1, ..., N\}.
\]](form_129.png)
For 





![\[
(S + M) \alpha = b
\]](form_136.png)
with the stiffness matrix 


Concepts uses the hp-finite element method to approximate the solution of a PDE, which means it calculates the Galerkin approximation of the solution in the finite dimensional subspace
![\[
V_{M_h, p} := \left\{ u \in H^1_0 \textrm{ such that } u\mid_\tau \textrm{ is a polynomial of degree } \leq p
\quad \forall \tau \in M_h \right\}
\]](form_140.png)
where 



Now let us see how to calculate the FEM-approximation of the solution of the PDE with Concepts.
First, we have to import certain modules from the libconceptspy package.
The module concepts contains essential functionalities and must be loaded at first. The module hp2D includes all functions that are needed to build a representation of the hp-finite element space in two dimensions. The module graphics is used for the graphical output of the mesh and the solution.
Next we start with the actual code, consisting of a main function.
First we build the geometry, a square with one vertex in the origin, and another one in the point 

Now we prescribe homogeneous Dirichlet boundary conditions to all edges of attribute 
With the mesh and the boundary conditions at hand we can build the hp-finite element space.
This is a finite element space on the square, with a twice refined mesh (a single refinement of a two dimensional mesh divides an element in the mesh into four elements, so in our case we have 16 subelements in our square) and polynomial degree six on every element.
Now we define the linear form on the right hand side of the variational formulation.
In the first line we define a representation of 

In the next line we calculate the vector of the right hand side using the space space and the linear form lform.
We compute the stiffness and mass matrices in a similar way. We first initialize the bilinear forms.
The first one represents the bilinear form 

Now we build the matrices using a concepts.SparseMatrix_r class that computes the matrix belonging the space space and the bilinear forms la and id, respectively.
Before we solve the linear equation, we add the mass matrix into the stiffness matrix.
We solve the linear equation using a conjugate gradient (CG) solver which is appropriate as the the system matrix 
Now, we want to save the information about the mesh and the values of the solution on the integration points in a MAT-file that can be read by Matlab or gnu Octave.
First, we set the integration rule to the trapezoidal rule and recompute the shape functions on this points.
Then we save the information about the mesh in a MAT-file named "matlabSolution.mat" and add the values of the solution on the integration points as a vector named "u".
Finally we save the information also in a .vtk-file.
By running the program you compute a FE-approximation of the solution of the PDE. In the directory where you run the program you will find a MAT-file named "matlabSolution.mat" and a .vtk file named "vtkSolution.vtk". If you use Matlab you can load MAT-file and plot the solution entering the following instructions in your Matlab command line
This gives you the following visualization of the solution 
