Jump to content

Freefem

0% developed
From Wikibooks, open books for an open world

FREEFEM: a PDE solver

[edit | edit source]

Summary

[edit | edit source]

The project freefem has two branches: the 2D solver (freefem++) is mature and well documented and used by many while the 3D solver (freefem3D) is still under construction but one is welcome to use it.

The code is open source and can be downloaded from the freefem web site

To solve a Partial Differential Equation (PDE) or set of equations with freefem one must first write an algorithm which uses only linear systems (one or more) of PDE as intermediate steps.

Then each system must be well posed, i.e. provided with admissible boundary conditions and written in variational form. For instance Dirichlet's problem

defines in an open set D of the plane a scalar function v(x,y) at every point (x,y) of D; v would be the electrostatic potential in the vacuum with charge density f(x,y) around objects of boundary əD at potential g(x,y).

The automatic triangulation, the finite element solver and the graphics are integrated in freefem and driven by a freefem script.

A snapshot of a PC screen executing freefem++
A snapshot of a PC screen executing freefem++

Example

[edit | edit source]

The Dirichlet problem above can be solved with freefem++ by the following script

border C(t=0,2*pi){x=5*cos(t); y=5*sin(t);}
mesh Th = buildmesh (C(50)); 
fespace Vh(Th,P1);     // says that we will use linear triangular elements
Vh u,v;                // defines u and v as piecewise-P1 continuous functions 
func f= x*y;           // definition of a function called f

real cpu=clock();      // optional

solve Poisson(u,v) 
      =  int2d(Th)(dx(u)*dx(v) + dy(u)*dy(v)) // bilinear part 
         - int2d(Th)( f*v)   // right hand side of the variational form
         + on(C,u=0) ;       // Dirichlet boundary condition (g=0)

plot(u); 
cout << " CPU time = " << clock()-cpu << endl; 

User Example 1

[edit | edit source]

Analytical Description

[edit | edit source]

freefem script

[edit | edit source]