Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
F. Nobile, S. Perotto
1 Sintassi di base
FreeFem++ e un linguaggio di programmazione con una sintassi di base simile
al C++. E pertanto possibile dichiarare variabili e funzioni allinterno di uno
script FreeFem++, eseguire operazioni aritmetiche, utilizzare cicli o istruzioni
condizionali. Per la sintassi corretta riferirsi al Capitolo 4 del manuale di uti-
lizzazione di FreeFem++.
// dichiarazione di un array
real[int] a(i);
1
int r=10;
while ( r>4 )
{
cout << "r= "<< r <<"\n";
r--;
}
// esempio di funzione
func real inverso(real x)
{
real ans;
ans=1./x;
return ans;
}
2 Generazione di griglia
Per una descrizione completa si veda il Capitolo 5 del manuale. Il primo passo
per generare un dominio e definirne il bordo. Cio puo essere fatto tramite il
comando border che permette di introdurre la parametrizzazione di una curva
in 2D:
border gamma(t=a,b) { x=f(t); y=g(t); label=1;}
In questo esempio la curva gamma e definita in funzione del parametro t che varia
tra gli estremi a e b. Label permette di associare un identificatore alla curva
(utile nellassegnazione delle condizioni al bordo). Una volta definita lentita
gamma, con listruzione gamma(m) si genera poi una struttura dati associata a m
sotto-intervalli di egual ampiezza sulla curva gamma. La curva puo essere visu-
alizzata utilizzando il comando plot (in FreeFem++ il comando plot permette
di visualizzare vari oggetti come curve, mesh, soluzioni elementi finiti, ecc.).
2
Esempio 2.1
// linea retta
real[int] v(2);
v[0]=.5; v[1]=sqrt(3.)/2;
border a(t=0,5) {x=t*v[0]; y=t*v[1]; label=1;}
plot(a(20), wait=1);
// cerchio
border b(s=0,2*pi) { x=cos(s); y=sin(s); label=2;}
plot(b(100), wait=1);
Una volta descritto il bordo del dominio (curva chiusa orientata), listruzione
buildmesh permette di generare una triangolazione del dominio contenuto alla
sinistra del bordo. La griglia risultante e un oggeto di tipo mesh.
Esempio 2.2
// rettangolo [0 2]x[-1 0]
border a(t=0,2) {x=t; y=-1; label=1;}
border b(t=-1,0) {x=2; y=t; label=2;}
border c(t=0,2) {x=2-t; y=0; label=3;}
border d(t=0,1) {x=0; y=-t; label=4;}
plot(a(10)+b(5)+c(10)+d(5),wait=1);
// ellisse
border gamma(t=0,2*pi) {x=1+.5*cos(t); y=sin(t); label=5;}
mesh Th2 = buildmesh(gamma(20));
plot(Th2,fill=1,wait=1);
Una mesh puo essere salvata su un file con listruzione savemesh e riletta da file
con listruzione readmesh
mesh th=buildmesh(....);
savemesh(th,"nomefile.msh");
mesh th1=readmesh("nomefile.msh");
3
Esempio 2.3
// scrittura su file mesh di output
savemesh(Th1,"rettangolo.msh");
savemesh(Th2,"ellisse.msh");
mesh th=readmesh("ellisse.msh");
plot(th);
Esercizio 2.2 Si generi una triangolazione del dominio compreso tra il cer-
chio di raggio r1 = .5 centrato in (0, .5) e il cerchio di raggio r2 = 2 centrato
nellorigine.
4
Xh uh,vh;
E particolarmente facile interpolare, su uno spazio elementi finiti, funzioni def-
inite analiticamente, nonche interpolare una funzione ad elementi finiti su uno
spazio ad elementi finiti differente:
Esempio 3.1
mesh Th1=square(4,4);
mesh Th2=square(3,2);
plot(Th1,wait=1);
plot(Th2,wait=1);
fespace Xh(Th1,P2);
fespace Yh(Th1,P1);
fespace Vh(Th2,P1);
// interpolazione di u1 su Yh:
Yh u2;
u2 = u1;
plot(Th1,u2,nbiso=30,value=1,wait=1);
// interpolazione di u1 su Vh:
Vh u3;
u3 = u1;
plot(Th2,u3,nbiso=30,value=1,wait=1);
5
mesh Th=buildmesh(a(20)+b(20)+c(20)+d(20));
plot(Th,wait=1);
fespace Xh(Th,P1);
Xh uh,vh;
func f = 1; // definisco analiticamente il termine forzante
Le scelte possibili per il risolutore sono: solver = LU, CG, Crout, Cholesky,
GMRES, UMFPACK.
6
Esempio 3.3 LEsempio 3.2 puo essere risolto alternativamente nel modo seguente:
border a(t=0,1){x=t;y=0;label=1;}
border b(t=0,1){x=1;y=t;label=2;}
border c(t=0,1){x=1-t;y=1;label=3;}
border d(t=0,1){x=0;y=1-t;label=4;}
mesh Th=buildmesh(a(20)+b(20)+c(20)+d(20));
fespace Xh(Th,P1);
Xh uh,vh;
// matrice di stiffness
matrix K=B(Xh,Xh);