FreeFem++

From ScientificComputing
Jump to: navigation, search

Category

Mathematics, Physics

Description

FreeFem++ is a partial differential equation solver. It has its own language. freefem scripts can solve multiphysics non linear systems in 2D and 3D. Problems involving PDE (2d, 3d) from several branches of physics such as fluid-structure interactions require interpolations of data on several meshes and their manipulation within one program. FreeFem++ includes a fast 2^d-tree-based interpolation algorithm and a language for the manipulation of data on multiple meshes (as a follow up of bamg (now a part of FreeFem++ ).

Available versions (Euler, old software stack)

Legacy versions Supported versions New versions
3.34

Please note that this page refers to installations from the old software stack. There are two software stacks on Euler. Newer versions of software are found in the new software stack.

Environment modules (Euler, old software stack)

Version Module load command Additional modules loaded automatically
3.34 module load new gcc/4.8.2 hdf5/1.8.12 open_mpi/1.6.5 fftw/3.3.3 openblas/0.2.8_seq gsl/1.16 scalapack/2.0.2 freefem/3.34 szip/2.1 legacy centos_cruft/6

Please note that this page refers to installations from the old software stack. There are two software stacks on Euler. Newer versions of software are found in the new software stack.

How to submit a job

You can submit a FreeFem++ job (using the input file test.epd) in batch mode with the following command:
sbatch [Slurm options] --wrap="FreeFem++ test.epd"
Here you need to replace [Slurm options] with Slurm parameters for the resource requirements of the job. Please find a documentation about the parameters of sbatch on the wiki page about the batch system.

Example

As an example for using FreeFem++, we are going to solve a Poisson equation. For a given function f(x, y), find a function u(x, y) satisfying


\begin{align}
-\Delta u(x,y)  & = & f(x,y) & \quad\forall & (x,y) & \in \Omega \\
u(x,y)          & = & 0      & \quad\forall & (x,y) & \,\text{on}\, \partial\Omega \\
\end{align}

Here \partial\Omega is the boundary of the bounded open set

\Omega \subset R^2 \text{and} \Delta u = \tfrac{\partial^2u}{\partial x^2} + \tfrac{\partial^2u}{\partial y^2}

The following is a FreeFem++ program which computes u when f(x, y) = xy and \Omega is the unit disk. The boundary C = \partial\Omega is

C = {(x, y)| x = \cos(t)\,, y = \sin(t), 0 \le t \le 2\Pi}

[leonhard@euler06 ~]$ ls -ltr test.edp 
-rw-r--r-- 1 leonhard T0000 283 Dec  6 12:56 test.edp
[leonhard@euler06 ~]$ cat test.edp
border C(t=0,2*pi){x=cos(t); y=sin(t);}
mesh Th = buildmesh (C(50));
fespace Vh(Th,P1);
Vh u,v;
func f= x*y;
real cpu=clock();
solve Poisson(u,v,solver=LU) = int2d(Th)(dx(u)*dx(v) + dy(u)*dy(v)) - int2d(Th)( f*v) + on(C,u=0) ;
cout << " CPU time = " << clock()-cpu << endl;
[leonhard@euler06 ~]$ module load new gcc/4.8.2 hdf5/1.8.12 open_mpi/1.6.5 fftw/3.3.3 openblas/0.2.8_seq gsl/1.16 scalapack/2.0.2 freefem/3.34
[leonhard@euler06 ~]$ bsub -n 1 -W 1:00 -R "rusage[mem=2048]" "FreeFem++ test.edp"
Generic job.
Job <33651159> is submitted to queue <normal.4h>.
[leonhard@euler06 ~]$ bjobs
JOBID      USER        STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
33651159   leonhard    PEND  normal.4h  euler06                 * test.edp Dec  6 13:17
[leonhard@euler06 ~]$ bjobs
JOBID      USER        STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
33651159   leonhard    RUN   normal.4h  euler06     e3011       * test.edp Dec  6 13:17
[leonhard@euler06 ~]$ bjobs
No unfinished job found
[leonhard@euler06 ~]$ grep -A1 Solve lsf.o33651159 
  -- Solve : 
          min -0.0103244  max 0.0102905
[leonhard@euler06 ~]$
You can find the resource usage summary in the LSF log file.

License information

LGPLv2.1

Links

http://www.freefem.org

https://en.wikipedia.org/wiki/FreeFem%2B%2B