Difference between revisions of "FreeFem++/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.