Formas y curvatura: Surface Evolver

Posgrado Oficial Matemáticas - Universidad de Granada

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.

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:

diseño de cubo

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:

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.

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:

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:

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).

Ejercicio 2.1

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.

Joaquín Pérez © 2011
Inicio  |   Arriba