INTRODUCCIÓN A FreeFEM

 

Introducción al lenguaje de FreeFEM

 

FreeFem es un software y un lenguaje de programación orientados a la resolución de ecuaciones en derivadas parciales usando el método de los elementos finitos. FreeFem está escrito en C++ y ha sido desarrollado y mantenido por el Laboratoire Jacques-Louis Lions de la Universidad Pierre et Marie Curie (Paris VI; Sorbonne Université). Corre sobre Linux, Solaris, macOS y Microsoft Windows systems. FreeFem es software libre (LGPL, GNU Lesser General Public License)

Resumen: En estas notas se hace una introducción (no exhaustiva) a los elementos básicos del lenguaje de FreeFEM.

Instrucciones I/O elementales

Con objeto de poder observar los resultados de los ejemplos que se vayan viendo, presentamos en primer lugar instrucciones básicas de lectura y escritura.

 Instrucciones básicas de lectura/escritura
coutEscritura en el dispositivo de salida por defecto (normalmente es la consola)
cinLectura desde el dispositivo de entrada por defecto (normalmente es el teclado)
endlFin de línea

Ejemplo 1

 


Tipos de datos

Tipos de datos básicos

 Cómo se escribenCómo se almacenanDeclaración
EnterosNúmeros sin punto decimalSe almacenan en una palabraint
RealesCon punto decimal, en coma fija o en coma flotante (formato científico)Norma IEEE 74, doble precisiónreal
ComplejosCon el símbolo i (unidad imaginaria)Dos reales doble precisióncomplex
BooleanosDatos lógicos: true y falseEn un bitbool
String(Cadenas de caracteres) Entre comillas dobles.Código ASCIIstring

Las declaraciones se pueden hacer en cualquier lugar del programa y en ellas se puede inicializar el valor de la variable.

Ejemplos 2

Otros tipos de datos

 Para qué sirvenDeclaración
MatricesAlmacenar matrices huecas sparsematrix
ContornosDefinir la frontera del dominio a mallarborder
Mallados 2DAlmacenar el mallado de un dominio planomesh
Mallados 3DAlmacenar el mallado de un dominio tridimensionalmesh3
Espacio de elementos finitosDefinir el tipo de elemento finito que se va a utilizarfespace
FuncionesDefinir funciones. Para definirlas se pueden usar las variables reservadas x, y, z que representan las coordenadas del punto en que se evaluará la función (solo x e y en el caso 2D)func
ProblemaDefinir el problema variacional que se quiere resolverproblem

 

Algunas variables reservadas

Algunos nombres de variables están reservados, por ser variables globales del lenguaje. Se citan aquí los que pueden provocar más confusiones:

Variable reservada (global)Lo que representa
NVector normal exterior.
N.x , N.y , N.z son sus tres componentes
PPunto actual (cuando se hacen cálculos elementales).
P.x , P.y , P.z son sus tres coordenadas
piEl número π
x, y, zRepresentan las coordenadas de un punto en los cálculos elementales ( solo x e y en el caso 2D)
verbosityDetermina el nivel de verbosidad (RAE: Abundancia de palabras en la elocución) en la información que FreeFEM proporciona durante la ejecución de un programa.
Un valor entero entre 0 (ninguna información) y 10 (mucha información).
CG, Cholesky , Crout,
GMRES, LU, sparsesolver
Son nombres de solvers de sistemas lineales (algoritmos/rutinas para resover sistemas lineales de ecuaciones)

 

Formatos de escritura de números reales

En construcción ...

 


Operaciones entre números

Tipo de las operaciones

Las operaciones aritméticas entre datos de tipos distintos se hacen siempre en el tipo más "alto" de los que intervienen. La jerarquía es la siguiente: booleanos < enteros < reales < complejos.

Ejemplos 3

Operadores aritméticos compuestos

Los operadores compuestos += -= *= /= deben entenderse en el sentido siguiente: h *= a es lo mismo que h = h * a. Análogamente para los demás.

Ejemplo

Operadores de comparación

OperadorOperación
==igual a
!=no igual a
<menor estricto que
<=menor o igual que
>mayor estricto que
>=mayor o igual que

Resto de la división entera (módulo)

OperadorOperación
n % mSi n y m son enteros, es el resto de la división entera nm
a % bSi a y b son reales, es el resto de la división entera Parte entera(a)Parte entera(b)

Operadores incremento y decremento

OperadorOperación
**++i**, --iIncrementa (decrementa) en una unidad el valor de i
(es lo mismo que i=i+1 o i=i-1)
j = ++i,
j = --i
Incrementa (decrementa) en una unidad el valor de i y lo almacena en j
j = i++,
j = i--
Incrementa (decrementa) en una unidad el valor de i y almacena en j el valor de i antes del incremento (decremento )

 


Vectores y matrices

En FreeFEM existen dos tipos de vectores:

Declaración de vectores

Es preciso declarar el tipo y el tamaño de los vectores. Se pueden declarar vectores dobles (con dos subíndices), que no son lo mismo que una matriz (ver Declaración de matrices).

Ejemplos

Asignación de valores a un vector unidimensional

Se pueden asignar valores a los vectores (de una dimension) de varias formas:

Asignación de valores a un vector doble

 

Declaración de matrices

Como se ha indicado antes, hay que distinguir entre vectores dobles y matrices, ya que son objetos con distintas propiedades y métodos. Las matrices son matrices sparse, esto es, solo se almacenan los elementos que no son ceros y sus subíndices (fila y columna). Por ejemplo, la matriz

(1)A=(120010205)

se almacena utilizando dos vectores enteros y uno real: los dos primeros contienen los índices de las filas y columnas de las componentes no nulas, y el tercero contiene los valores de dichas componentes:

(2)IF=(00122),IC=(01102),A=(12125)

(Recuerda que los índices comienzan en cero). Esto es transparente para el usuario, y para acceder a un elemento de la matriz A pondremos A(i,j)

Las matrices se declaran con la instrucción matrix y son siempre matrices bidimensionales y, por defecto, reales.

Ejemplos

 

Tamaño dinámico de vectores y matrices

En realidad, en la declaración de vectores y matrices solo hay que indicar el tipo de datos y el número de dimensiones (en el caso de los vectores). El tamaño de ambos es dinámico: se "adapta" a lo que se le asigne.

Ejemplos

 

Asignación de valores a una matriz

Se pueden asignar valores a los vectores (de una dimension) de varias formas:

Longitud, máximos y mínimos de vectores y matrices

 Vector
real[int] v(n);
Vector doble
real[int] v(n,m);
Matriz
matrix v(n,m);
v.nLongitud de vNúmero de filas de vNúmero de filas de v
v.m Número de columnas de vNúmero de columnas de v
v.nnz  Número de elementos no nulos de v
v.minMínimo de vMínimo de v 
v.maxMáximo de vMáximo de v 
v' Traspuesta de vTraspuesta de v
v.sortOrdena v
(ver ejemplo)
  

Ejemplos

Explicación Si D es una matriz (no un vector doble), no se puede "imprimir" su traspuesta. Se puede asignar a otra matriz e imprimir ésta, como en el ejemplo siguiente

 

Operaciones con vectores y matrices

En construcción

 

 

Pasos en la resolución de un problema con FreeFEM

La resolución de un Problema de EDP's utilizando el software FreeFEM pasa por la realización de las siguientes etapas:

  1. Disponer de la formulación variacional del problema.
  2. Definir el dominio en el que se plantea el problema, a partir de su frontera.
  3. Contruir un mallado del dominio y su frontera (en realidad de una aproximación de ambos).
  4. Definir el espacio de elementos finitos en el que se plantea el problema aproximado.
  5. Definir el problema aproximado.
  6. Resolver el problema aproximado.
  7. Representar gráficamente la solución aproximada.

 

 

Anna Doubova - Rosa Echevarría - Dpto. EDAN - Universidad de Sevilla