 
 
 
 
 
   | Superior: Hispalinux 2000 | 
 
 es  el dominio 2D ocupado por el fluido (figura reffig:dominio),
siendo omegasubsetR un
intervalo abierto y 
D: overlineomegalongrightarrowR la función
profundidad.
Los siguientes parámetros se suponen conocidos, y en función de
sus valores obtendremos diferentes comportamientos de las soluciones:
nuh y nuv son los coeficientes de viscosidad horizontal y
vertical, f son  fuerzas externas (dependientes por ejemplo, de la
salinidad y temperatura) y en gs se encierran los efectos de fricción
del viento sobre la superficie.
Las incógnitas del problema son las funciones
u, v: Omega×(0,T) longrightarrow R (velocidad horizontal
y vertical del flujo, respectivamente) y 
ps :omega×(0,T) longrightarrow R (presión superficial).
par
beginfigure
  begincenter
    epsfigfile=dominio.eps, width=.7textwidth
  endcenter
  captionEl dominio, Omega
  labelfig:dominio
endfigure
par
Las ecuaciones anteriores presentan serias dificultades
desde el punto de vista numérico: no linealidad, evolución con el
tiempo, acoplamiento de las incógnitas,...
El método que estamos empleando para su resolución se basa en
un esquema fraccionario de proyección en tiempo citevicky junto 
con una discretización espacial usando productos de elementos finitos.
A continuación, comentaremos este método de forma muy breve;
para más detalles, ver citekisko-rafa
par
Para la discretización en la variable temporal, t, de las ecuaciones,
fijamos un paso de tiempo, Delta t, y construimos la sucesión
de instantes 
t0=0, t1=Delta t, t2=2Delta t,dots,
tk=kDelta t,dots
Tratamos de calcular, para cada etapa de tiempo k>0, 
funciones uk,  vk y psk que
aproximen, en el instante tk, a las velocidades u,  v y
a la presión superficial, ps, respectivamente.  
Para ello, y con el fin de separar las dificultades, se ha empleado un
esquema fraccionario en tiempo, de proyección lineal (o semi-implícito)
en tres pasos. 
par
El primer paso y el más complejo, consiste en
hallar una primera predicción de la velocidad horizontal, como
solución de un sistema lineal más sencillo que em(EP-2D).
En un segundo paso, corregimos la predicción realizada para hallar
la aproximación definitiva de la velocidad horizontal y calculamos
una estimación de la presión superficial. En el tercer y último
paso, obtenemos la velocidad vertical. 
par
beginfigure
  begincenter
    epsfigfile=mallado.eps, width=.7textwidth
  endcenter
  captionDiscretización del dominio
  labelfig:malla
endfigure
  
Para la discretización en espacio, aproximamos
el dominio, Omega, que ocupa el fluido de la siguiente forma
(figura reffig:malla):
fijamos una partición
cal Px={a=x0<x1<dots <xN=b} de la
superficie omega=[a,b]. Por otra parte, consideramos M capas de
profundidad, definidas a través de una partición
cal Pz={0=z0>z1>dots >zM=-Dmax}, siendo
Dmax=displaystylemax xinomegaD(x). De esta forma,
cada zn representa la profundidad del nivel horizontal n
(n=0,dots , M). El producto cartesiano de ambos mallados define,
como se aprecia en la figura reffig:malla, una discretización
del dominio. Se ha utilizado el Método de los Elementos
Finitos definido mediante el producto de funciones base polinómicas
en la variable x (definidas en el mallado de la superficie del dominio)
por funciones base sobre polinómicas en z (definidas en
el mallado en profundidad). Utilizando este método calculamos,
en cada etapa de tiempo, las soluciones aproximadas.
par
El esquema empleado es generalizable al caso 3-dimensional, sin más
que sustituir las funciones polinomicas en x, definidas sobre la superficie
unidimensional del fluido, por funciones en x,y,
definidas sobre la superficie bidimensional.
par
sectionProgramación en GNU/Linux del código de simulación numérica
par
Una vez discretizadas las ecuaciones en derivadas parciales,
debemos pasar a su resolución efectiva.
Para ello, elaboramos un programa de ordenador que, 
a partir de los datos iniciales
(en el instante t=0) y conociendo los datos de contorno (en nuestro caso,
los valores que toman las incógnitas en las
paredes y en el fondo del recinto), genere, en cada instante de tiempo
tk=kcdotDelta t, 
los vectores mbf uk, mbf vk y mbf psk que
representen respectivamente, el campo de velocidades horizontal y vertical
y la presión superficial en el instante tk.
par
En el caso 2-dimensional, hemos hallado algunas propiedades que simplificarán
algo el trabajo. Por un lado, podemos evitar el cálculo de la presión
superficial, variable que, en principio, no es de interés físico.
Por otra parte, es posible calcular de forma explícita
las velocidades verticales. 
De esta forma, en cada iteración de tiempo se trata, básicamente,
de resolver un sistema lineal de ecuaciones 
Ambf uk=mbf b, 
proveniente
del método de elementos finitos. El formato que se escogió para
los elementos finitos hace que la matriz A sea tridiagonal por
bloques, los cuales son, a su vez, matrices tridiagonales.
En el segundo miembro, mbf b, se encierran datos conocidos, 
como el efecto de fricción del viento sobre la superficie del fluido.
par
Para elaborar el programa, se ha elegido el em
lenguaje de programación C++, utilizando em egcs citeegcs,
compilador libre 
(bajo licencia GNU-GPL) con soporte de ANSI C++, cuyas características
lo hacen estar al nivel de los más potentes compiladores comerciales.
Por supuesto, si lo hubiésemos considerado adecuado, también
podríamos haber utilizado compiladores comerciales bajo GNU/Linux,
como em KAI C++.
par
A pesar de seguir siendo Fortran el lenguaje más extendido en el campo
de la simulación numérica, nosotros decidimos optar por el uso del
lenguaje de programación C++ aprovechando sus características de
orientación a objetos para representar matrices, mallados de elementos
finitos, etc. El uso de este lenguaje, que poco a poco parece empezar
a abrirse un hueco en la programación de métodos numéricos,
nos confiere mayor flexibilidad tanto en el momento de la elaboración del  
programa como en la reutilización del código para proyectos posteriores.
par
Entre las ventajas de GNU/Linux se encuentra el poder contar con
compiladores de prácticamente cualquier lenguaje. Por ejemplo, la
programación en Fortran es perfectamente factible, sin más que emplear
el compilador GNU de Fortran 77. Desgraciadamente, este compilador no cuenta
aún con soporte para Fortran 90, especificación que posee características
más avanzadas que la anterior: tipos de datos compuestos, asignación
dinámica de memoria, sobrecarga de operadores, etc.
Existe un proyecto para crear un compilador de Fortran 95 con licencia 
libre (http://g95.sourceforge.net/) que todavía está en estado embrionario.
par
En est ámbito, una posibilidad interesante puede ser el utilizar 
em  adaptor citeadaptor.
Adaptor (Automatic DAta Parallelism TranslaTOR)
es un sistema de compilación para HPF (High Performance Fortran) con
licencia no comercial. HPF es una extensión de Fortran con la que se
pueden escribir de forma sencilla programas paralelos, con
paralelización orientada a datos. Estos programas podrán ejecutarse
en ordenadores con varios procesadores
(por ejemplo, un ordenador dual ejecutando Linux en
modo SMP) o bien en em clusters de varios ordenadores
conectados en red (utilizando una librería de paso de mensajes, como
PVM o MPI). Por ejemplo, en el curso de doctorado ``Análisis Numérico de
EDP no Lineales'' que organizó en el año 1999/2000 el Departamento de 
Ecuaciones Diferenciales y Análisis Numérico de la Universidad de
Sevilla junto con el Departamento de Informática y Análisis Numérico de la 
Universidad de Córdoba,
se utilizó em adaptor para realizar ejercicios de programación
numérica en un cluster formado por los ordenadores de un aula de
informática, los cuales se encontraban ejecutando PVM bajo Linux.
par
Volviendo a la resolución práctica del problema en oceanografía que
estamos estudiando, el utilizar el método de los elementos finitos
significa que nos encontraremos finalmente con la necesidad de
resolver sistemas de ecuaciones. Estos sistemas suelen ser de grandes
dimensiones (miles de ecuaciones), especialente si tratamos de
estudiar casos algo 
realistas, en los cuales la discretización del dominio ha de ser muy fina.
Para implementarlos resolverlos en la práctica, podríamos haber
usado alguna de las excelentes bibliotecas matriciales que existen
para  C++, como em Blitz++ citeblitz,
em MTL citemtl o em SparseLib++ citesparselib,
las dos últimas acompañadas de bibliotecas de métodos iterativos para la
resolución de sistemas de ecuaciones lineales.
Todas estas bibliotecas tienen licencias no comerciales, y han sido
verificadas con em egcs (entre otros compiladores de C++).
No obstante, con el fin de aprovechar la 
estructura tridiagonal de las matrices asociadas,
siempre pensando en el ahorro de memoria, pues la matriz del sistema
tendrá una gran dimensión, optamos por desarrollar nuestra
propia bibliotecafootnote
Probablemente, la biblioteca em MTL también podría haber sido
utilizada con este fin. de clases C++. 
En ella, definimos las matrices tridiagonales mediante un clase patrón:
begintex2html_preform
template <class T> MatrizTridiag<T>;
endtex2html_preform
en la que, para ahorar memoria, se almacenan exclusivamente los elementos
diagonales, super-diagonales y sub-diagonales de la matriz.
Así, podemos implementar la matriz por bloques del sistema, A,
como un objeto del tipo
begintex2html_preform
MatrizTridiag< MatrizTridiag<double> > A;
endtex2html_preform
y, sin más que sobrecargar el operador
es  el dominio 2D ocupado por el fluido (figura reffig:dominio),
siendo omegasubsetR un
intervalo abierto y 
D: overlineomegalongrightarrowR la función
profundidad.
Los siguientes parámetros se suponen conocidos, y en función de
sus valores obtendremos diferentes comportamientos de las soluciones:
nuh y nuv son los coeficientes de viscosidad horizontal y
vertical, f son  fuerzas externas (dependientes por ejemplo, de la
salinidad y temperatura) y en gs se encierran los efectos de fricción
del viento sobre la superficie.
Las incógnitas del problema son las funciones
u, v: Omega×(0,T) longrightarrow R (velocidad horizontal
y vertical del flujo, respectivamente) y 
ps :omega×(0,T) longrightarrow R (presión superficial).
par
beginfigure
  begincenter
    epsfigfile=dominio.eps, width=.7textwidth
  endcenter
  captionEl dominio, Omega
  labelfig:dominio
endfigure
par
Las ecuaciones anteriores presentan serias dificultades
desde el punto de vista numérico: no linealidad, evolución con el
tiempo, acoplamiento de las incógnitas,...
El método que estamos empleando para su resolución se basa en
un esquema fraccionario de proyección en tiempo citevicky junto 
con una discretización espacial usando productos de elementos finitos.
A continuación, comentaremos este método de forma muy breve;
para más detalles, ver citekisko-rafa
par
Para la discretización en la variable temporal, t, de las ecuaciones,
fijamos un paso de tiempo, Delta t, y construimos la sucesión
de instantes 
t0=0, t1=Delta t, t2=2Delta t,dots,
tk=kDelta t,dots
Tratamos de calcular, para cada etapa de tiempo k>0, 
funciones uk,  vk y psk que
aproximen, en el instante tk, a las velocidades u,  v y
a la presión superficial, ps, respectivamente.  
Para ello, y con el fin de separar las dificultades, se ha empleado un
esquema fraccionario en tiempo, de proyección lineal (o semi-implícito)
en tres pasos. 
par
El primer paso y el más complejo, consiste en
hallar una primera predicción de la velocidad horizontal, como
solución de un sistema lineal más sencillo que em(EP-2D).
En un segundo paso, corregimos la predicción realizada para hallar
la aproximación definitiva de la velocidad horizontal y calculamos
una estimación de la presión superficial. En el tercer y último
paso, obtenemos la velocidad vertical. 
par
beginfigure
  begincenter
    epsfigfile=mallado.eps, width=.7textwidth
  endcenter
  captionDiscretización del dominio
  labelfig:malla
endfigure
  
Para la discretización en espacio, aproximamos
el dominio, Omega, que ocupa el fluido de la siguiente forma
(figura reffig:malla):
fijamos una partición
cal Px={a=x0<x1<dots <xN=b} de la
superficie omega=[a,b]. Por otra parte, consideramos M capas de
profundidad, definidas a través de una partición
cal Pz={0=z0>z1>dots >zM=-Dmax}, siendo
Dmax=displaystylemax xinomegaD(x). De esta forma,
cada zn representa la profundidad del nivel horizontal n
(n=0,dots , M). El producto cartesiano de ambos mallados define,
como se aprecia en la figura reffig:malla, una discretización
del dominio. Se ha utilizado el Método de los Elementos
Finitos definido mediante el producto de funciones base polinómicas
en la variable x (definidas en el mallado de la superficie del dominio)
por funciones base sobre polinómicas en z (definidas en
el mallado en profundidad). Utilizando este método calculamos,
en cada etapa de tiempo, las soluciones aproximadas.
par
El esquema empleado es generalizable al caso 3-dimensional, sin más
que sustituir las funciones polinomicas en x, definidas sobre la superficie
unidimensional del fluido, por funciones en x,y,
definidas sobre la superficie bidimensional.
par
sectionProgramación en GNU/Linux del código de simulación numérica
par
Una vez discretizadas las ecuaciones en derivadas parciales,
debemos pasar a su resolución efectiva.
Para ello, elaboramos un programa de ordenador que, 
a partir de los datos iniciales
(en el instante t=0) y conociendo los datos de contorno (en nuestro caso,
los valores que toman las incógnitas en las
paredes y en el fondo del recinto), genere, en cada instante de tiempo
tk=kcdotDelta t, 
los vectores mbf uk, mbf vk y mbf psk que
representen respectivamente, el campo de velocidades horizontal y vertical
y la presión superficial en el instante tk.
par
En el caso 2-dimensional, hemos hallado algunas propiedades que simplificarán
algo el trabajo. Por un lado, podemos evitar el cálculo de la presión
superficial, variable que, en principio, no es de interés físico.
Por otra parte, es posible calcular de forma explícita
las velocidades verticales. 
De esta forma, en cada iteración de tiempo se trata, básicamente,
de resolver un sistema lineal de ecuaciones 
Ambf uk=mbf b, 
proveniente
del método de elementos finitos. El formato que se escogió para
los elementos finitos hace que la matriz A sea tridiagonal por
bloques, los cuales son, a su vez, matrices tridiagonales.
En el segundo miembro, mbf b, se encierran datos conocidos, 
como el efecto de fricción del viento sobre la superficie del fluido.
par
Para elaborar el programa, se ha elegido el em
lenguaje de programación C++, utilizando em egcs citeegcs,
compilador libre 
(bajo licencia GNU-GPL) con soporte de ANSI C++, cuyas características
lo hacen estar al nivel de los más potentes compiladores comerciales.
Por supuesto, si lo hubiésemos considerado adecuado, también
podríamos haber utilizado compiladores comerciales bajo GNU/Linux,
como em KAI C++.
par
A pesar de seguir siendo Fortran el lenguaje más extendido en el campo
de la simulación numérica, nosotros decidimos optar por el uso del
lenguaje de programación C++ aprovechando sus características de
orientación a objetos para representar matrices, mallados de elementos
finitos, etc. El uso de este lenguaje, que poco a poco parece empezar
a abrirse un hueco en la programación de métodos numéricos,
nos confiere mayor flexibilidad tanto en el momento de la elaboración del  
programa como en la reutilización del código para proyectos posteriores.
par
Entre las ventajas de GNU/Linux se encuentra el poder contar con
compiladores de prácticamente cualquier lenguaje. Por ejemplo, la
programación en Fortran es perfectamente factible, sin más que emplear
el compilador GNU de Fortran 77. Desgraciadamente, este compilador no cuenta
aún con soporte para Fortran 90, especificación que posee características
más avanzadas que la anterior: tipos de datos compuestos, asignación
dinámica de memoria, sobrecarga de operadores, etc.
Existe un proyecto para crear un compilador de Fortran 95 con licencia 
libre (http://g95.sourceforge.net/) que todavía está en estado embrionario.
par
En est ámbito, una posibilidad interesante puede ser el utilizar 
em  adaptor citeadaptor.
Adaptor (Automatic DAta Parallelism TranslaTOR)
es un sistema de compilación para HPF (High Performance Fortran) con
licencia no comercial. HPF es una extensión de Fortran con la que se
pueden escribir de forma sencilla programas paralelos, con
paralelización orientada a datos. Estos programas podrán ejecutarse
en ordenadores con varios procesadores
(por ejemplo, un ordenador dual ejecutando Linux en
modo SMP) o bien en em clusters de varios ordenadores
conectados en red (utilizando una librería de paso de mensajes, como
PVM o MPI). Por ejemplo, en el curso de doctorado ``Análisis Numérico de
EDP no Lineales'' que organizó en el año 1999/2000 el Departamento de 
Ecuaciones Diferenciales y Análisis Numérico de la Universidad de
Sevilla junto con el Departamento de Informática y Análisis Numérico de la 
Universidad de Córdoba,
se utilizó em adaptor para realizar ejercicios de programación
numérica en un cluster formado por los ordenadores de un aula de
informática, los cuales se encontraban ejecutando PVM bajo Linux.
par
Volviendo a la resolución práctica del problema en oceanografía que
estamos estudiando, el utilizar el método de los elementos finitos
significa que nos encontraremos finalmente con la necesidad de
resolver sistemas de ecuaciones. Estos sistemas suelen ser de grandes
dimensiones (miles de ecuaciones), especialente si tratamos de
estudiar casos algo 
realistas, en los cuales la discretización del dominio ha de ser muy fina.
Para implementarlos resolverlos en la práctica, podríamos haber
usado alguna de las excelentes bibliotecas matriciales que existen
para  C++, como em Blitz++ citeblitz,
em MTL citemtl o em SparseLib++ citesparselib,
las dos últimas acompañadas de bibliotecas de métodos iterativos para la
resolución de sistemas de ecuaciones lineales.
Todas estas bibliotecas tienen licencias no comerciales, y han sido
verificadas con em egcs (entre otros compiladores de C++).
No obstante, con el fin de aprovechar la 
estructura tridiagonal de las matrices asociadas,
siempre pensando en el ahorro de memoria, pues la matriz del sistema
tendrá una gran dimensión, optamos por desarrollar nuestra
propia bibliotecafootnote
Probablemente, la biblioteca em MTL también podría haber sido
utilizada con este fin. de clases C++. 
En ella, definimos las matrices tridiagonales mediante un clase patrón:
begintex2html_preform
template <class T> MatrizTridiag<T>;
endtex2html_preform
en la que, para ahorar memoria, se almacenan exclusivamente los elementos
diagonales, super-diagonales y sub-diagonales de la matriz.
Así, podemos implementar la matriz por bloques del sistema, A,
como un objeto del tipo
begintex2html_preform
MatrizTridiag< MatrizTridiag<double> > A;
endtex2html_preform
y, sin más que sobrecargar el operador ( ), podemos acceder al
elemento (k,l) del bloque (i,j) mediante la expresión:
begintex2html_preform
A(i,j)(k,l);
endtex2html_preform
par
Para resolver los sistemas
lineales, se utiliza un método clásico de relajación por bloques, en el
que los sistemas asociados a los bloques tridiagonales se resuelven de forma
explícita mediante un algoritmo de tipo em Thomas.
Para la representación de los mallados de elementos finitos, 
se han contruido las clases C++ adecuadas.
par
Como editor de texto y entorno de programación, utilizamos em emacs
citeemacs,
junto con una herramienta gráfica, em Code Crusader
citecrusader, que facilita el acceso
a los ficheros fuente de la biblioteca de clases C++, lo cual resulta
muy útil a medida que el numero de clases que contiene ésta comienza a
ser grande.
par
Por otra parte, en un programa de simulación numérica es interesante contar
con una interfaz de usuario adecuada pues, una vez desarrollado, es necesario
realizar numerosas pruebas que lo validen, introduciendo variaciones
en los parámetros del programa o en los datos iniciales y
comparando los resultados con aquellos observables en el ``mundo real''.
En nuestro caso, se utilizó el lenguaje de programación
em Python citepython, desarrollando un módulo que interactúa con
el programa C++. Mediante este módulo, podemos acceder
interactivamente a las funciones
de bajo nivel, escritas en C++, para calcular las soluciones
en etapas de tiempo sucesivas, acceder a las variables más
importantes, modificar sus valores, observar los resultados, etc.
par
Se eligió el lenguaje em Python para la interfaz de usuario de nuestro
programa por tratarse de un lenguaje interpretado con
características avanzadas y fácil de enlazar con C/C++. Además,
em Python cuenta con módulos especializados para el cálculo numérico,
para la representación gráfica de datos, etc. 
Por supuesto, existen otras muchas posiblidades, la más extendida de
las cuales puede que sea el uso del programa em Matlab
citematlab, lenguaje orientado al análisis matricial y que puede
ser utilizado además para la representación gráfica de resultados. En
nuestro caso, lo descartamos por no considerar rentable la inversión
en un programa comercial, existiendo otras alternativas libres que
resultaban tanto o más válidas para nuestros propósitos.
Por otro lado, una posibilidad, que no descartamos usar en un futuro
próximo, es usar em octave citeoctave, lenguaje GNU
interpretado, orientado al análisis numérico y matricial, similar a
em Matlab, que puede también enlazarse con código C. Por último, se
utilizó em Phyton en vez de otro lenguaje de interpertado de
características similares como em perl simplemente por una cuestión
de preferencias personales, pues este último podría haber resultado
igualmente válido.
par
sectionPost-Proceso y Representación Gráfica de los Resultados
par
Para la visualización gráfica de los resultados, contamos en GNU/Linux con
bastantes herramientas de licencia libre. Por ejemplo,
en los experimentos que presentamos aquí, hemos empleado
el programa em plotmtv citeplotmtv. Existen también otras
aplicaciones, como em grace citegrace, o em gnuplot
citegnuplot, que 
creemos nos serán de utilidad para ser empleadas en próximas etapas.
Todos estos programas tienen características similares, puedendo tomar sus
datos de un fichero que ha sido escrito en un formato adecuado por el
programa C++ o por su interfaz em Python, para representarlos
gráficamente. Las gráficas resultantes pueden ser visualizadas
en pantalla o bien exportadas hacia un fichero postscript, que posteriormente
podremos mandar a la impresora o incluir en un documento LaTeX, por
ejemplo.
Los tipos de gráficas que pueden generar (funciones de una o dos variables,
campos de velocidades, curvas de nivel, etc.) son en todos los casos
muy similares, si bien existen ciertas diferencias que hacen que, a la
hora de utilizarlos en un caso concreto, sea conveniente decantarse por uno
de ellos. Así, los campos de velocidades que aparecen en
las figuras refejemplo1, refejemplo2 y refejemplo3, han sido
generados por em plotmtv, con el que resulta sencillo hacer este
tipo de gráficas de vectores. Sin embargo, este programa no cuenta con
algunas características interesantes, como la posibilidad de generar
animaciones, para lo cual podremos recurrir, por ejemplo, a 
em gnuplot. 
par
Existen muchas más posibilidades para la representación de datos,
como el empleo de bibliotecas de funciones gráficas, 
como em plplot citeplplot, o el uso de paquetes como em octave 
(que emplea, a su vez, em gnuplot o, en las últimas versiones, la
biblioteca em plplot). Asimismo, podemos contar con
em R citeR, lenguaje de tratamiento estadístico y
representación de datos, o emplear lenguajes interpretados
como em Python o em perl citeperl, que cuentan con módulos
adaptados a la manipulación numérica de datos y a su 
representación gráfica. Por supuesto, siempre es posible usar
aplicaciones comerciales, la más usada de las cuales puede que sea
em Matlab. Algunas de ellas, como em gid citegid
(desarrollada por profesores de la Universidad Politécnica de
Cataluña), integra heramientas de pre-proceso y de post-proceso de
datos a través de una interfaz gráfica (disponible tanto para sitemas
UNIX como para Windows).
 
Siguiendo con el programa de aproximación numérica de las
Ecuaciones Primitivas del océano que estamos empleando como
referencia, presentaremos aquí algunos de los experimentos numéricos
que hemos realizado para validar el esquema, obteniendo resultados
satisfactorios. En concreto, se muestran los resultados de la
aproximación del problema lineal 
estacionario, en el cual realizamos iteraciones en tiempo, analizando
si existe algún estado final hacia el cual converjan las soluciones
(velocidades y presión) a medida que el tiempo avanza.
par
beginfigure
centering
epsfigfile=planoEstacio.eps, width=.75textwidth
captionsmall Solución estacionaria, ejemplo 1
labelejemplo1
endfigure
par
beginfigure
centering
epsfigfile=valleEstacio.eps, width=.75textwidth
captionsmall Solución estacionaria, ejemplo 1
labelejemplo2
endfigure
par
Mostraremos aquí los resultados obtenidos en tres dominios distintos.
Todos ellos tienen 30.000
metros de longitud superficial por 150 de profundidad máxima.
El viento es constante hacia la derecha
con velocidad máxima de 7.5 m/s y se utiliza un paso de tiempo
Delta t=60 segundos.
par
En el primer ejemplo (figura refejemplo1) se alcanza la
solución exacta (con tolerancia  
varepsilon=10-6) después de 1579
iteraciones de tiempo (algo más de 26 horas). La velocidad
horizontal máxima del fluido, alcanzada en
el punto medio de la superficie, es de 0.695894 m/s.
En el segundo (figura refejemplo2), se llega a la
solución estacionaria tras 2589 iteraciones de tiempo (algo más de
43 horas) con velocidad horizontal máxima de 0.787584 m/s.
En el tercero (figura refejemplo3), han de transcurrir 3032
iteraciones (50 horas y media) y se obtiene una  velocidad
horizontal máxima  de 0.352651 m/s.
par
beginfigure
centering
epsfigfile=monteEstacio.eps, width=.75textwidth
captionsmall Solución estacionaria, ejemplo 3
labelejemplo3
endfigure
par
sectionGeneración de Documentos y Presentaciones
Si, después de muchos días de esfuerzos delante
del ordenador, los resultados obtenidos de la simulación numérica son
satisfactorios, será gratificante el presentarlos públicamente,
ya sea con fines educativos, en congresos de investigación, etc.
De nuevo, podemos contar con el sistema operativo GNU/Linux y con numerosas
herramientas que nos ayudarán a realizar la presentación de
resultados. Obviamente, lo que sigue es de interés en un ámbito mucho
más amplio que el de la simulación numérica, resultando válido para la
generación de todo tipo de documentos científicos.
par
La clave será el uso de  LaTeX, lenguaje para la generación de
documentos de alta calidad y muy adecuado para trabajos matemáticos y
científicos. Si bien es necesario superar la dificultad inicial
del aprendizaje del lenguaje, sus características (calidad de los
documentos, composición lógica, adaptación a estructuras matemáticas
complejas, independencia de la plataforma, dots) hacen de él un
potente instrumento. En GNU/Linux podemos contar con LaTeX,
concretamente la distribución em teTeX, desarrollada para sistemas
UNIX. Además disponemos de numerosas utilidades asociadas.
Por ejemplo, contaremos con un modo para emacs, 
em auctex, que nos facilitará el uso de este editor de textos para
la creación de documentos LaTeX. Una herramienta, em xfig
citexfig, para dibujar objetos gráficos de forma interactiva y
exportar los resultados, usualmente a formato postscript, con el fin
de ser incorporados por LaTeX (por ejemplo, las figuras reffig:dominio y
reffig:malla han sido generadas mediante em xfig).
Un entorno visual, em LyX citelyx, que podremos utilizar 
como un procesador de texto ``conveccional'', pero que utiliza
LaTeX  para la generación final de documentos.
Conversores a lenguaje HTML, herramientas para convertir
el documento a formatos postscript o pdf y para post-procesar los
resultados, etc
par
En principio, si pretendemos usar LaTeX para realizar un documento
impreso, como una ponencia para un congreso, deberemos escoger para nuestro
documento un estilo estándar, como em article. 
Sin embargo, si necesitamos realizar transparencias para presentar
los resultados, podremos elegir entre los estilos ``no estándar'' 
em foiltex y em seminar, ambos presentes en teTeX (la licencia
del primero no es completamente libre).
Si pretendemos elaborar un póster (en formato A3, A2, A1 o A0),
podemos emplear el estilo em a0poster. Este paquete no se encuentra
en la distribución teTeX, pero es accesible desde internet, por ejemplo
en hturlhttp://www.ucc.ie/cgi-bin/ctan.
par
Por otra parte, si queremos publicar un artículo en internet, podemos
contar con el programa em latex2html citelatex2html,
que convierte documentos LaTeX  en formato HTML, traduciendo
fórmulas y ecuaciones 
en gráficos de poco tamaño que pueden ser mostrados con facilidad por
los navegadores de internet. Por último, si nuestra intención es generar
una presentación usando el ordenador junto con un cañón proyector de
vídeo, podremos usar el programa em pdflatex para generar, a partir
del fichero LaTeX, un documento em pdf, que podremos mostrar a
pantalla completa (bajo Linux o bajo cualquier otra plataforma)
usando, por ejemplo, em acrobat reader,
em gv, em xpdf (el primero de ellos no con licencia totalmente libre).
Se están desarrollando programas, como em ppower4 citeppower4,
para postprocesar los ficheros em pdf de tal modo que se puedan
incluir efectos (cortinillas, etc) a nuestro antojo en la forma de
órdenes LaTeX  especiales. 
par
Con alguna frecuencia, puede ser necesario elaborar versiones del
trabajo realizado en varios de los formatos que se han comentado. 
Por ejemplo, podemos necesitar enviar un artículo para ser publicado en las
actas de a unas jornadas cientificas, a la vez que realizar una
presentación del mismo, en forma de transparencias o mediante
proyector de vídeo. Posteriormente, quizás nos
resulte atractivo el convertirlo en formato HTML para depositarlo
en en nuestra página web. El realizar por separado cada una de estas
tareas conllevaría bastante esfuerzo; sin embargo, el trabajo se reduce
considerablemente si creamos un artículo principal en LaTeX, quizás listo
para ser publicado, a partir del cual, introduciendo posiblemente algunas
modificaciones para adecuarlo al nuevo formato, crear
una presentación o (usando em latex2html) o generar un documento en
formato HTML.
par
Por último, señalar que el lenguaje de composición de documentos
LaTeX es, de hecho, un estándar para el intercambio de documentos
matemáticos o científicos complejos, no existiendo, prácticamente,
alternativas a su uso. Por ejemplo, el emplear editores de texto
``conveccionales'' como  em Microsoft Word o em Sun StarOffice,
para la generación de este tipo de documentos no solamente resulta
tedioso, sino que los resultados obtenidos no alcanzan la calidad de
los documentos escritos con LaTeX. 
Algo similar ocurre con las transparencias o, quizás, con
las presentaciones mediante cañón proyector de vídeo: la utilización
programas como em Microsoft PowerPoint, bajo sistemas operativos de
tipo em Windows, es desaconsejable frente a la potencia de LaTeX 
 para la generación de documentos matemáticos.
par
sectionConclusiones
Tomando como hilo conductor la experiencia del autor en la
implementación de un modelo numérico en oceanografía, se han abordado
diferentes cuestiones relacionadas con el uso del sistema sistema
operativo GNU/Linux como entorno para la simulación numérica:
programación del código,
post-proceso y representación gráfica de resultados y, por último,
generación de documentos y presentaciones. Para cada uno
de estos pasos, se han subrayado tanto las distintas aplicaciones que
hemos empleado en nuestro trabajo, como las diferentes alternativas,
en muchas ocasiones igualmente válidas, con las que podemos contar,
siempre haciendo énfasis en aquellas que cuentan con licencia libre.
par
El sistema GNU/Linux constituye una plataforma estable y potente que
cuenta con herramientas muy adecuadas para la realización de proyectos
relacionados con la simulación numérica de ecuaciones en derivadas
parciales.
par
sectionAgradecimientos
A Virgilio Gómez Rubio que, por convencerme de que podía ser
interesante contar mi experiencia en la utilización de GNU/Linux para
la simulación numérica, es el resposable último de este trabajo. Y a
todos aquellos que, de forma desinteresada, se encuentran implicados
en el desarrollo de Linux y de em software libre.
par
Este trabajo ha sido parcialmente financiado por el proyecto
PB98-0583 del Ministerio de Eduación y Cultura.
par
beginthebibliography99
footnotesize
par
bibitemadaptor
em adaptor, 
hturlftp://ftp.gmd.de/gmd/adaptor
par
bibitemblitz
em Blitz++,
hturlhttp://www.nobjects.com
par
bibitemcrusader
em Code Crusader,
hturlhttp://www.cco.caltech.edu/ jafl/jcc
par
bibitememacs
em emacs,
hturlhttp://www.gnu.org/software/emacs
par
bibitemegcs
em egcs (GNU C++),
hturlhttp://gcc.gnu.org
par
bibitemgid
em gid,
hturlhttp://gid.cimne.upc.es
par
bibitemgnuplot
em gnuplot,
hturlhttp://www.cs.dartmouth.edu/gnuplot_info.html
par
bibitemgrace
em grace,
hturlhttp://plasma-gate.weizmann.ac.il/Grace
par
bibitemvicky
  sc F. Guillén González, M.V. Redondo Neble
  sl Convergencia de algunos esquemas numéricos hacia el
    modelo evolutivo de Ecuaciones Primitivas. 
  Actas XVI CEDYA, VI CMA, University of Las Palmas de
  Gran Canaria, 1999, 1165-1172.
par
bibitemkisko-rafa
  sc F. Guillén González, R. Rodríguez Galván
  sl Aproximación Numérica Mediante un Esquema  de Proyección
  de las Ecuaciones Primitivas 2D
  Actas II Jornadas de Análisis de Variables y Simulación Numérica del
  Intercambio de Masas de Agua a través del Estrecho de Gibraltar,
  University of Cádiz, 2000.
par
bibitemkai
em KAI C++,
hturlhttp://www.kai.com/C_plus_plus/
par
bibitemlatex2html
em LaTeX2html,
hturlhttp://www-texdev.mpce.mq.edu.au/l2h/docs/manual
par
bibitemltw
  sc J.L. Lions, R. Teman, S. Wang. 
  it New formulations of the primitives equations of the
    atmosphere and applications.
  Nonlinearity, 5 (1992), 237-288.
par
bibitemlyx
em LyX,
hturlhttp://www.lyx.org
par
bibitemmtl
em MTL,
hturlhttp://www.lsc.nd.edu/research/mtl/
par
bibitemmatlab
em Matlab,
hturlhttp://www.mathworks.com/products/matlab/index.shtml
par
bibitemoctave
em octave,
hturlhttp://www.che.wisc.edu/octave
par
bibitemperl
em perl,
hturlhttp://www.perl.com
par
bibitemplotmtv
em plotmtv,
hturlftp://ftp.x.org/contrib/applications
par
bibitemplplot
em plplot,
hturlhttp://www.plplot.org)
par
bibitemppower4
em ppower4,
hturlftp://ftp.dante.de/tex-archive/help/Catalogue/entries/ppower4.html
par
bibitempython
em Python,
hturlhttp://www.python.org
par
bibitemR
em R,
hturlhttp://www.r-project.org
par
bibitemsparselib
em SparseLib++,
hturlhttp://math.nist.gov/sparselib++/
par
bibitemxfig
em xfig,
hturlhttp://www.xfig.org/
par
endthebibliography       
enddocument
 
 
 
 
