Tutorial 2
La superficie inicial. Minimización de área a volumen prescrito
La superficie inicial se introduce mediante un fichero de texto (en lo que sigue, fichero de datos)
que puede ser creado con cualquier editor de textos (lo más sencillo
posible, ASCII y no WYSIWYG; por ejemplo, el bloc de notas de Windows).
Habitualmente, se guarda con la extensión .fe (facet-edge), aunque ésta
no es obligatoria.
La superficie (complejo simplicial) se
define a partir de sus datos geométricos de cada dimensión (vértices,
lados, caras y cuerpos), opcionalmente con atributos.
- VÉRTICES (vertices): Un vértice es un punto del espacio, dado por sus tres coordenadas.
- LADOS (edges): Cada lado es un objeto 1D, un segmento orientado por sus vértices extremos.
- CARAS (faces):
Una cara es un polígono orientado, definido por un ciclo de 3 o más
lados. El normal asociado a una cara vendrá dado por la orientación en
su borde, según la regla de la mano derecha. Hay que cuidar las
orientaciones de caras adyacentes, para que sean compatibles.
- CUERPOS (bodies):
Un cuerpo es una región 3D del espacio, determinada por su frontera,
que son caras. Las caras se usan para calcular o prescribir el volumen,
la energía gravitacional, etc. Para definir un cuerpo, las caras que lo
delimitan han de estar orientadas compatiblemente (todas con el normal
exterior al cuerpo).
No hay restricciones sobre
cuántos lados pueden concurrir en un vértice, o en cuántas caras pueden
compartir un lado. De esta forma, se puede modelar cualquier topología
en la superficie inicial, incluso topologías no orientables. Es
interesante resaltar que los cálculos internos se hacen siempre
suponiendo que las caras son triángulos. Esto es virtual (es decir, si
una cara tiene más de tres lados, Evolver creará internamente un
vértice en el interior de la cara y trazará lados desde ese nuevo
vértice a los que ya tenía la cara originalmente) y es lo que justifica
que en el programa se distingan las palabras faces (caras en general) y facets
(caras triangulares). Una cara tampoco tiene porqué ser plana: puede
estar bordeada por un polígono de al menos 4 vértices no coplanares.
Cada
uno de los elementos que constituyen la configuración inicial se da en
una línea del fichero de datos, con una numeración previa. Evolver
usará este dígito para referirse a ese elemento. Las numeraciones son
independientes para cada una de las cuatro secciones de la
configuración inicial, que van precedidas cada una de una palabra
claves (vertices, edges, faces ó bodies).
Tras definir cada elemento, en la misma línea se consignarán
opcionalmente sus atributos (ser fijo, estar sometido a alguna
restricción, etc).
A continuación estudiaremos el archivo cube.fe
(además de en este hipervínculo, podemos encontrarlo en el paquete de
instalación). En él, la superficie inicial es un cubo que encierra un
cuerpo de volumen prescrito igual a 1. No hay acción de gravedad, ni
otras fuerzas actuando que no sean la tensión superficial, por lo que
la energía a minimizar es el área por unidad de volumen, lo que quiere
decir que buscamos un mínimo relativo del funcional área para
variaciones que preservan el volumen (funciones de media nula). Veamos
algo más teórico sobre esto:
Sea $M\subset\mathbb{R}^3$ una superficie compacta, conexa, embebida y sin borde, y $\{\psi_t\}_t$ una
deformación normal de $\psi_0=1_M$ por superfices del mismo tipo, con campo variacional
$\left.\frac{d}{dt}\right|_0\psi=uN$, donde $u\in C^\infty(M)$ y $N$ es la aplicación de Gauss de $M$.
Entonces, la primera fórmula de variación de área es
\[
\left.\frac{d}{dt}\right|_0\text{Area}(\psi_t)=
\left.\frac{d}{dt}\right|_0\int_{\psi_t(M)}dA_t=
-2\int_MuH\ dA=
-2(u,H)_{L^2(M)},
\]
donde $H$ es la curvatura media de $M$ respecto de $N$. La supeficie $M$ encierra un dominio acotado
$\Omega$, cuyo volumen vale (tomamos $N$ como el normal exterior a $\Omega$)
\[
\text{Vol}(\Omega)=\frac{1}{3}\int_M\langle p,M\rangle dA
\]
(aplicar el teorema de la divergencia al campo 'vector de posición' en $\mathbb{R}^3$).
Llamamos $\Omega_t$ al dominio acotado encerrado por $\psi_t(M)$. Entonces, la
primera fórmula de variación del volumen es
\[
\left.\frac{d}{dt}\right|_0\text{Vol}(\Omega_t)
=\int_M u\ dA,
\]
luego las variaciones que conservan el volumen son aquéllas en que $\int_M u\ dA=0$ (es decir, $u$ tiene
media nula). Usando la primera fórmula de variación del área, tenemos que $M$ es un punto crítico del
funcional área para todas estas variaciones que preservan el volumen si, y sólo si, $H$ es constante.
En nuestro caso, eso sólo puede ocurrir si $M$ es una esfera.
El desarrollo teórico anterior nos dice que no sólo los únicos mínimos de nuestro problema son esferas
(soluciones del problema isoperimétrico), sino también que los únicos puntos críticos son esferas.
Por tanto, Evolver evolucionará la superficie inicial a una esfera (siempre que ésta sea la topología de partida).
A continuación diseñamos la superficie inicial:
Como hemos dicho arriba, el fichero de datos está organizado en líneas, con un elemento geométrico por cada línea.
Primero se definen vértices, luego lados, caras y cuerpos. Cada elemento se numera para su posterior referencia.
Insertaremos comentarios invisibles para Evolver mediante /* ....... */ (los puntos suspensivos
representan el comentario). También pueden incluirse comentarios con // y en este caso Evolver
no leerá nada hasta el final de la línea correspondiente. Podemos usar mayúsculas o minúsculas indistintamente.
// cube.fe Las líneas que empezan con // no son leídas por Evolver.
// Evolver data for cube of prescribed volume.
vertices Esta es una PALABRA CLAVE (key word), que indica a Evolver que empieza una sección.
1 0.0 0.0 0.0 coordenadas del vértice 1: (0,0,0)
2 1.0 0.0 0.0
3 1.0 1.0 0.0
4 0.0 1.0 0.0
5 0.0 0.0 1.0
6 1.0 0.0 1.0
7 1.0 1.0 1.0
8 0.0 1.0 1.0
edges /* given by endpoints and attribute */ Comienza la sección donde se definen los lados.
1 1 2 El primer lado tiene origen en el vértice 1 y final en el vértice 2.
2 2 3
3 3 4
4 4 1
5 5 6
6 6 7
7 7 8
8 8 5
9 1 5
10 2 6
11 3 7
12 4 8
faces /* given by oriented edge loop */
1 1 10 -5 -9 La
primera cara tiene 4 lados, que son los indicados en la sección
anterior con los dígitos 1, 10, 5, 9. Los signos "-" indican que la
orientación de un lado como borde de una cara será la opuesta de la
orientación definida en la lista de lados. Nótese que una cara no tiene
porqué tener 3 lados. Cada cara adquiere automáticamente una
orientación (=vector normal), dada por la regla de la mano derecha. En
este caso, todas las caras estarán orientadas con el normal exterior.
OJO:
si un lado es interior a una superficie, aparecerá dos veces (una por
cada cara que lo contenga en su borde), con orientaciones OPUESTAS.
2 2 11 -6 -10
3 3 12 -7 -11
4 4 9 -8 -12
5 5 6 7 8
6 -4 -3 -2 -1
bodies /* one body, defined by its oriented faces */
1 1 2 3 4 5 6 volume 1 Sólo
hay un cuerpo, delimitado por 6 caras. Imponemos que su volumen sea
1(esto es un atributo para el cuerpo 1). Lo que sigue son
configuraciones de iteraciones para converger rápidamente a una esfera.
Pueden omitirse en una primera lectura.
read
// Typical evolution to sphere
gogo := { g 5; r; g 5; hessian; r; g 5; hessian; }
// Evolution to very high accuracy, using higher-order Lagrange elements.
// To be run on original datafile.
gogo2 := { g 5; r; g 5; hessian; r; g 5; hessian;
lagrange 2; g 5; hessian;
lagrange 4; g 5; hessian;
lagrange 6; g 5; hessian;
ideal_rad := (3*body[1].volume/4/pi)^(1/3);
printf "Area error: %g\n",total_area - 4*pi*ideal_rad^2;
printf "Vertex radius spread: %g\n",
max(vertex,sqrt((x-.5)^2+(y-.5)^2+(z-.5)^2))
- min(vertex,sqrt((x-.5)^2+(y-.5)^2+(z-.5)^2));
}
Lo
mejor es copiar la estructura de este fichero y modificarlo para crear
nuestros propios ficheros de datos, al menos hasta acostumbrarse a la
sintaxis del programa.
Para hacer que Evolver actúe sobre
cube.fe, haremos doble click sobre él (si hemos asociado previamente el
programa a la extensión). Una vez Evolver ha leído el fichero de datos,
está listo para recibir comandos por el usuario (modo de comandos).
Esto lo hace mostrando la línea 'Enter command:'.
Veamos algunos comandos y características interesantes:
- Por ejemplo, tecleando s (show) saldremos del modo de comandos para entrar en el modo gráfico,
donde veremos (en una ventana distinta) el estado actual de la
evolución, en este caso el cubo inicial. Nótese que las caras del cubo
se han dividido en dos triángulos mediante las diagonales. El punto de vista por defecto es desde el eje x, con el eje z en vertical y el eje y positivo a la derecha.
- El ratón (mouse) rotará la figura en tiempo real. Ya en modo gráfico, si a la vez pulsamos z + ratón entonces entramos hacemos zoom sobre la figura.
- Análogamente, pulsando t + ratón se traslada la figura.
- Otro comando gráfico interesante es f (facets), con el que podremos volver transparentes las caras (volviendo a pulsar f se volverán de nuevo opacas).
- Parecido a este último, pero para hacer transparentes los lados, es e (edges). Este comando simplifica el rendering de la figura, por lo que es útil si el ordenador tarda mucho en iterar.
- Otro comando gráfico es +, -, con el que cambiaremos el grosor de los lados.
- Podemos abrir el número de ventanas auxiliares que queramos, tecleando G.
Las nueva ventanas que abramos serán independientes de la que ya
tenemos abierta, con lo que podemos tener varias vistas simultáneas.
- Si queremos volver al punto de vista inicial, teclearemos R (reset).
Si
hacemos click con el botón derecho del ratón sobre una porción de la
superficie en la ventana gráfica, elegiremos el vértice, lado o cara
sobre el que esté situada la punta del cursor. En la ventana de
comandos, Evolver devolverá el número correspondiente al elemento que
hemos señalado.
- Una vez elegido un vértice, podemos
girar la figura (con el ratón) con ese punto como centro del giro
mediante el comando gráfico F.
- Para ver otras opciones gráficas, teclear h (help) cuando el ratón esté sobre la ventana gráfica.
- Para salir del modo gráfico y volver al modo de comandos, teclear q (quit) sólo una vez. Si se teclea 2 veces, cerraremos Evolver.
Ya
en modo de comandos, los comandos más comunes de Evolver se reducen a
una letra (se distinguen mayúsculas-minúsculas), a veces seguida de un
parámetro numérico. Por ejemplo:
- g n hace n iteraciones (go).
- r refina (refine) la triangulación de la superficie.
- s muestra (show) la superficie en la pantalla (con un subprograma propio de Evolver)
- u (equiangulation) modifica una configuración por otra con la misma combinatoria pero con caras más "regulares". El comando V hace algo parecido. Es conveniente usar estos dos comandos tras refinar.
- P exporta un gráfico (opción 8 para geomview, opción 3 para PostScript). Hablaremos de cómo exportar gráficos en el tutorial 4.
- q cierra el programa (quit), o bien sale de modo gráfico.
Ahora se trata de hacer evolucionar la superficie inicial, minimizando la energía (en este caso, el área). Si tecleamos
g 5
obtendremos (esto depende de la versión instalada)
5. area: 5.13907252918614 energy: 5.13907252918614 scale: 0.185675
4. area: 5.11245608431459 energy: 5.11245608431459 scale: 0.219672
3. area: 5.11249312554369 energy: 5.11249312554369 scale: 0.204230
2. area: 5.11249312772740 energy: 5.11249312772740 scale: 0.204389
1. area: 5.11249312772740 energy: 5.11249312772740 scale: 0.000000
Cada línea (comenzando por 5, i.e. se escriben en orden inverso) corresponde a una iteración (g 1 puede simplificarse por g).
Nótese que el área va decreciendo salvo pequeñas fluctuaciones que
proceden de errores numéricos, lo mismo que la energía. Ambas coinciden
en este caso.
La escala (scale) mide la magnitud del
movimiento en cada iteración; aproximadamente, esto es la norma $L_2$
del gradiente de la energía. Al principio los movimientos son mayores,
para ir estabilizándose. El valor de escala 0 en la 5ª iteración indica
que la triangulación no ha mejorado la energía respecto de la última
configuración, y por tanto ya no mejoraremos la evolución aunque
hagamos más iteraciones (deberemos refinar). Aunque el volumen se ha
prescrito como 1, puede haber variaciones pequeñas. Para saber el valor
final del volumen tras las 5 iteraciones, teclearemos
v
y obtenemos
Body |
target volume |
actual volume |
pressure |
1 |
1 |
1 |
3.40832875202913 |
Como no podemos mejorar la evolución con esta triangulación, la refinamos. Esto se hace tecleando
r
con lo que cada cara se subdivide poniendo un nuevo vértice en el
centro, y trazando desde allí lados nuevos hacia todos los vértices
antiguos de la cara. Evolver responde con el total de elementos
geométricos de que disponemos ahora, junto con la memoria que consumen:
Vertices: 50
Edges: 144
Facets: 96
Bodies: 1
Facetedges: 288
Element Memory: 40280
Total data memory: 298173 bytes
Si ahora iteramos de nuevo, la aproximación a una esfera será mejor
(verlo en modo gráfico). El proceso "refinar-iterar" puede repetirse
siempre que tengamos memoria
También podemos usar secuencias predefinidas de comandos para hacer evolucionar de forma predeterminada a Evolver. Por ejemplo, gogo ó bien gogo2 en el fichero cube.fe anterior.
Cuando queramos salir, teclearemos q (1 vez para empezar con un nuevo fichero de datos, 2 veces para salir de Evolver).
Comentarios:
- En el archivo index.htm del paquete de instalación tenemos una ayuda muy completa sobre los comandos disponibles en Evolver.
- Podemos teclear en la línea de comandos la palabra help seguida del comando del que queremos información. Por ejemplo, comprobar qué información obtenemos tecleando help fixed.
Ejercicios
1. Elaborar un archivo toro.fe, en el que se defina como
configuración inicial un toro sólido (es decir, un dominio
tridimensional cuyo borde es topológicamente un toro) como en la figura
siguiente (comprobar con Evolver que la configuración inicial es
coherente).
2. Ejecutar el fichero quad.fe,
para producir una superficie mínima cuyo borde es un cuadrilátero que
no está contenido en un plano. Editar el fichero de datos y analizarlo.
¿Cuántos vértices pueden moverse en la evolución sin refinar?
3. Construir con Surface Evolver una pompa doble en el espacio.