Además del área (o tensión superficial) para superficies y la longitud para curvas, existen otras cantidades importantes a la hora de modelar diversos procesos geométricos y físicos de optimización. Por ejemplo, en Geometría podemos citar las "energías de curvatura" (bending energies), cuyos puntos críticos son las curvas elásticas en el caso 1D y las superficies de Willmore en el caso 2D. También tienen cabidas otras energías más útiles en Física, como la gravitatoria. Las cantidades definidas por el usuario a las que intentaremos aplicar Evolver deberán cumplir una serie de requisitos:
La sintaxis general para implementar una cantidad en Evolver es:
quantity "nombre" [tipo de cantidad] method [método] [opción global]
Vamos a explicar cada elemento de la línea anterior.
quantity cell1_area fixed = 1.3 method edge_area
quantity xcenter conserved method facet_vector_integralentonces, para aplicar xcenter a aquellas caras coloreadas en rojo tecleareamos
vector_integrand:
q1: x^2/2
q2: 0
q3: 0
set facet xcenter where color == red
Vamos a pasar ahora a listar una serie de métodos usuales. Pueden implementarse nuevos métodos, pero esto requiere escribir rutinas en lenguaje C.
Nombre y descripción del método | Ejemplo |
---|---|
vertex_scalar_integral Integral de una función valuada escalar sobre un punto (i.e. evaluar la función en un vértice). La función se define mediante scalar_integrand. |
quantity point_value energy method vertex_scalar_integral scalar_integrand: x^2 + y^2 - 2x + 3 |
Nombre y descripción del método | Ejemplo |
---|---|
edge_tension o edge_length Longitud de una curva. |
quantity len energy method edge_length global |
density_edge_length Longitud de un lado, multiplicado por su densidad. |
quantity len energy method density_edge_length glob |
edge_scalar_integral Integral de una función valuada escalar sobre una curva p.p.a. (p.e. la longitud de una curva). La función se define mediante scalar_integrand. En el ejemplo, se estudia la integral de la función x^2-3y+4 sobre un lado, vista como energía. |
quantity edge_sint energy method edge_scalar_integral scalar_integrand: x^2 - 3*y + 4 |
edge_vector_integral Integral del producto escalar de un campo sobre una curva con el normal unitario a lo largo de ésta (p.e. el área en el string model o al prescribir un ángulo en problemas de capilaridad). El campo se define por sus coordenadas (q1,q2,q3). |
quantity edge_vint energy method edge_vector_integral vector_integrand: q1: 0 q2: 0 q3: z^2/2 |
edge_general_integral Integral sobre una curva de una función escalar que depende de la posición (x1,x2,x3) y de un vector tangente (x4,x5,x6) en ese punto. El integrando debe ser homogéneo de grado 1 en las variables x4,x5,x6. |
quantity arclength energy method edge_general_integral scalar_integrand: sqrt(x4^2 + x5^2 + x6^2) |
edge_area Area de un recinto 2D en el string mode. Sobre un lado orientado L, es igual a la integral de -y dx a lo largo de L (o sea, mide el opuesto del área del recinto encerrado por L y el eje x junto con los lados paralelos al eje y que pasan por los extremos de L). Si esto se repite para cada lado del borde de un recinto, se consigue el área encerrada por éste. |
quantity cell1_area fixed = 1.3 method edge_area |
edge_torus_area Lo mismo del anterior, pero cuando se trabaja en un toro 2D.Hay que asignar un valor numérico a la cantidad volconst, ya que el cálculo del área de un recinto sólo está definido módulo el área total del toro. |
quantity cell_area fixed = 1.3 method edge_torus_area |
string_gravity Calcula la energía potencial (gravitacional) de un recinto bidimensional $\Omega$ en el string model, dada por \[\int_\Omega G\rho y\ dA=\frac{G\rho}{2}\int_{\partial\Omega}\langle(0,y^2),N\rangle ds,\] donde $G$ es la constante gravitatoria, $\rho$ es la densidad del recinto y $N$ el campo normal unitario exterior a $\partial\Omega$. |
quantity cell_grav energy modulus 980*8.5 method string_gravity |
sqcurve_string Integral de la curvatura al cuadrado a lo largo de una curva (sus puntos críticos son las curvas elásticas). Asume que en cada vértice sólo concurren dos lados, y da el valor cero a los extremos de una curva si es abierta. Para especificar otras potencias de la curvatura, usar el parámetro parameter_1. |
quantity sq energy method sqcurve_string global parameter_1 3 |
metric_edge_length Longitud de una curva en el string model, respecto a una métrica Riemanniana dada, que se dará usando el comando metric. |
string space_dimension 2 metric 1+x^2 y y 1+y^2 quantity mel energy method metric_edge_length global |
Nombre y descripción del método | Ejemplo |
---|---|
facet_tension o facet_area Area de una superficie o de una cara. No multiplica por la densidad de la cara (para ello usar density_facet_area). |
quantity farea energy method facet_area global |
density_facet_area Area de una cara multiplicada por su densidad. |
quantity farea energy method density_facet_area global |
facet_volume Volumen de un recinto 3D en el soapfilm mode. Sobre una cara orientada $C$, es igual a la integral de $z\ dx\ dy$ a lo largo de $C$ (osea, mide el volumen del recinto encerrado por $C$, el plano $\{z=0\}$ junto con los planos verticales que pasan por los segmentos en el borde de $C$). Si esto se repite para cada cara del borde de un recinto, se consigue el volumen encerrado por éste. |
quantity vol fixed = 1.3 method facet_volume |
facet_torus_volume Lo mismo del anterior, pero cuando se trabaja en un toro 3D. Hay que asignar un valor numérico a la cantidad volconst, ya que el cálculo del área de un recinto sólo está definido módulo el volumen total del toro. |
quantity body_vol energy method facet_torus_volume |
facet_scalar_integral Integral de una función valuada escalar sobre una superficie (p.e. el área de una superficie en el soapfilm model). La función se define mediante scalar_integrand. |
quantity fint energy method facet_scalar_integral global scalar_integrand: x^2+y^2 |
facet_vector_integral Integral a lo largo de una cara, del producto escalar de un campo con el normal unitario a una superficie. El normal se elige por la regla de la mano derecha. El campo se define usando vector_integrand. El ejemplo define el volumen multiplicado por 3 del recinto "entre" una cara y el plano $\{z=0\}$: |
quantity fvint energy method facet_vector_integrand vector_integrand: q1: 0 q2: 0 q3: z |
facet_general_integral Integral sobre una cara de una función escalar que depende de la posición (x1,x2,x3) y del vector normal a la cara (x4,x5,x6). El integrando debe ser homogéneo de grado 1 en las variables x4,x5,x6. La función se define mediante scalar_integrand. |
quantity surfacearea energy method facet_general_integral scalar_integrand: sqrt(x4^2 + x5^2 + x6^2) |
gravity_method o full_gravity_method Calcula la energía potencial (gravitacional) de un recinto 3D $\Omega$ en el soapfilm model, dada por\[\int_\Omega G\rho z\ dV=\frac{G\rho}{2}\int_{\partial\Omega}\langle(0,0,z^2),N\rangle dA,\] donde $G$ es la constante gravitatoria, $\rho$ es la densidad del recinto y $N$ el campo normal unitario exterior a $\partial\Omega$. |
quantity grav energy modulus 980*8.5 method gravity_method |
metric_facet_area Area de una cara en el soapfilm model, respecto a una métrica Riemanniana dada, que se dará usando el comando metric. |
metric 1+x^2 0 z 0 1+y^2 0 z 0 1+z^2 quantity mfa energy method metric_facet_area globa |
mean_curvature_integral Integral de la curvatura media de una superficie. |
quantity mci energy method mean_curvature_integral |
sq_mean_curvature Integral del cuadrado de la curvatura media sobre una superficie (funcional de Willmore). Sus puntos críticos son las superficies de Willmore. Hay variantes de este método, que incluso permiten aplicarlo a superficies con borde o configuraciones más generales (como eff_area_sq_mean_curvature, normal_sq_mean_curvature, star_sq_mean_curvature, star_eff_area_sq_mean_curvature, star_normal_sq_mean_curvature, star_perp_sq_mean_curvature) |
quantity sqc energy method sq_mean_curvature global |
gauss_curvature_integral Integral de la curvatura de Gauss de una superficie con borde (el caso sin borde está dado por la fórmula de Gauss-Bonnet). |
quantity gint energy method gauss_curvature_integral global |
spherical_area Area de la proyección de una cara sobre la esfera unidad. Se supone que los vértices de la cara pertenecen a la esfera unidad. Suele estar acompañado por la ligadura de que los vértices se muevan en la esfera unidad. |
constraint 1 formula: x^2 + y^2 + z^2 = 1 quantity spharea energy method spherical_area global |
A continuación veremos tres ejemplos para explicar el uso de cantidades definidas por el usuario.
Imaginemos un cable inextensible que cuelga entre dos soportes, bajo la acción de la gravedad. En esta situación, la naturaleza minimiza la energía gravitacional del cable. El mínimo para este problema es un trozo de catenaria, es decir, la gráfica de la función
($a$, $b$ son parámetros reales, e $y$ mide la altura). Se trata de un problema 1D (string model) en un espacio 2D (el plano $(x,y)$ que contiene a los soportes y al cable), donde minimizaremos la energía gravitacional. Como el cable es inextensible, debemos fijar la longitud de la curva como cantidad tipo fixed. Podríamos hacer esto usando el método genérico edge_scalar_integral con la función sqrt(x^2+y^2), pero usaremos el método edge_length, que hace lo mismo y es más rápido (por tener implementado un código específico). El fichero de datos es catenary.fe, cuya configuración inicial es la siguiente:
// catenary.fe
// String of fixed length hanging between supports,
// minimizing gravitational energy.
space_dimension 2
string
quantity grav energy method edge_scalar_integral global Aquí se define la energía a minimizar. scalar_integrand: y quantity arclength fixed = 3 method edge_length global vertices 1 -1 1 fixed Los soportes del cable están fijos 2 0 0 3 1 1 fixed edges 1 1 2 tension 0 Los soportes no producen tensión sobre el cable, sólo la gravedad. 2 2 3 tension 0
Si ejecutamos catenary.fe y lo evolucionamos con
r; g 5; r; g5; r; g 5
tendremos una buena aproximación de una catenaria. Para ver los valores de las cantidades usadas, teclearemos v, obteniendo
Quantity | target value | actual value | pressure |
grav | --------- | 1.18616662825846 | |
arclength | 3 | 3.00000000006522 | -0.619645... |
La interpretación del campo pressure anterior es el cambio del valor de la energía.
Las curvas elásticas en $\mathbb{R}^3$ son puntos críticos del funcional bending energy en dimensión 1, que es
\[F_\lambda(\gamma)=\int_\gamma(\kappa^2+\lambda)ds\]donde $\gamma$ es una curva cerrada en $\mathbb{R}^3$, $\kappa$ es su curvatura y $\lambda$ un parámetro real. Los puntos críticos del funcional anterior son las soluciones de la EDO de segundo orden
\[2\kappa''+\kappa^3-\lambda\kappa=0\]Implementaremos con Evolver una curva elástica plana, para el funcional con $\lambda=0$ y con la topología de un ocho. El fichero de datos es elastic8.fe, y la configuración inicial
// elastic8.fe
// Elastic string in the shape of a figure 8.
string
space_dimension 2
scale_limit 0.1 // else blows up on first iteration El comando scale_limit da una cota superior de la magnitud de la evolución permitida desde una configuración a la siguiente. En este caso, si no pusiéramos esta limitación la evolución se dispararía. quantity bending_energy energy method sqcurve_string global Definimos la energía a minimizar, con el método sqcurve_string quantity arclength fixed = 14 method edge_length global Prescribimos la longitud de la curva con el valor 14 y e método edge_length vertices 1 2 0 2 1 1 3 0 0 4 -1 -1 5 -2 0 6 -1 1 7 0 0 8 1 -1 edges 1 1 2 tension 0 2 2 3 tension 0 3 3 4 tension 0 4 4 5 tension 0 5 5 6 tension 0 6 6 7 tension 0 7 7 8 tension 0 8 8 1 tension 0
El funcional de Willmore es el funcional bending energy en dimensión 2, definido por
\[F(M)=\int_M H^2\ dA\]donde $M$ es una superficie compacta en $\mathbb{R}^3$ y $H$ es su curvatura media. Las superficies de Willmore son los puntos críticos de este funcional. El mínimo absoluto del funcional de Willmore es $4\pi$ y se alcanza únicamente en la esfera redonda (no importa el radio, puesto que el funcional de Willmore es invariante al reescalar):
Los puntos
críticos del funcional de Willmore se llaman superficies de Willmore.
Puede comprobarse que la ecuación de Euler-Lagrange asociada a este
funcional es la EDP no lineal
\[
\Delta H+2H(H^2-K)=0.
\]
El funcional de Willmore es invariante por cambios conformes, y con
métodos variacionales puede probarse que para cada género g existe una
superficie de Willmore compacta y embebida en $\mathbb{R}^3$ con género
$g$. La famosa conjetura de Willmore establece que para toros en
$\mathbb{R}^3$, el funcional de Willmore es siempre mayor o igual
que $2\pi^2$ (la igualdad se alcanza en un toro de revolución cuyas
circurferencias generatrices tienen los radios en la relación
$1:\sqrt{2}$). Una forma de obtener superficies de Willmore en
$\mathbb{R}^3$ es proyectar estereográficamente superficies mínimas de
$\mathbb{S}^3$.
El funcional de Willmore puede ser usado para representar con Evolver superficies mínimas no necesariamente estables, ya que la condición H = 0 minimiza trivialmente el funcional de Willmore, considerado ahora sobre superficies con borde. En el fichero pcellbox.fe se usa el funcional de Willmore para producir la superficie P-Schwarz, pero donde ahora no estamos considerando la superficie dentro de un toro llano tridimensional sino dentro de una caja $[0,1]^3$. Cada una de las 6 caras de la caja es una ligadura, donde se moverá una curva borde de la superficie.
// pcellbox.fe
// Evolver data for cubic unit cell of the P surface.
// For demonstrating squared mean curvature
quantity sqmean energy modulus 0 method star_perp_sq_mean_curvature global Definimos la energía a minimizar, mediante el método sq_mean_curvature implementado originalmente para el funcional de Willmore) constraint 1 /* the left side */ Definimos las 6 ligaduras correspondientes a las caras de la caja. function: y = 0 constraint 2 /* the right side */ function: y = 1 constraint 3 /* the front side */ function: x = 1 constraint 4 /* the back side */ function: x = 0 constraint 5 /*the bottom*/ function: z = 0 constraint 6 /*the top*/ function: z = 1 vertices 9 .25 .25 0.0 constraint 5 Vértices en la base de la caja 10 .75 .25 0.0 constraint 5 11 .75 .75 0.0 constraint 5 12 .25 .75 0.0 constraint 5 13 .25 .25 1.0 constraint 6 Vértices en la cara superior de la caja 14 .75 .25 1.0 constraint 6 15 .75 .75 1.0 constraint 6 16 .25 .75 1.0 constraint 6 33 .25 .25 0.25 Vértices interiores a la caja (8) 34 .75 .25 0.25 35 .75 .75 0.25 36 .25 .75 0.25 37 .25 .25 0.75 38 .75 .25 0.75 39 .75 .75 0.75 40 .25 .75 0.75 17 .25 0.0 0.75 constraint 1 Vértices en la cara de la izquierda de la caja 18 .75 0.0 0.75 constraint 1 19 .75 0.0 0.25 constraint 1 20 .25 0.0 0.25 constraint 1 21 .25 1.0 0.75 constraint 2 Vértices en la cara de la derecha de la caja 22 .75 1.0 0.75 constraint 2 23 .75 1.0 0.25 constraint 2 24 .25 1.0 0.25 constraint 2 25 1.0 .25 0.75 constraint 3 Vértices en la cara frontal de la caja 26 1.0 .25 0.25 constraint 3 27 1.0 .75 0.25 constraint 3 28 1.0 .75 0.75 constraint 3 29 0.0 .25 0.75 constraint 4 Vértices en la cara posterior de la caja 30 0.0 .25 0.25 constraint 4 31 0.0 .75 0.25 constraint 4 32 0.0 .75 0.75 constraint 4 edges /* given by endpoints and attribute */ 13 9 10 constraint 5 Lados en la base de la caja 14 10 11 constraint 5 15 11 12 constraint 5 16 12 9 constraint 5 17 13 14 constraint 6 Lados en la cara superior 18 14 15 constraint 6 19 15 16 constraint 6 20 16 13 constraint 6 21 17 18 constraint 1 Lados en la cara izquierda 22 18 19 constraint 1 23 19 20 constraint 1 24 20 17 constraint 1 25 21 22 constraint 2 Lados en la cara derecha 26 22 23 constraint 2 27 23 24 constraint 2 28 24 21 constraint 2 29 25 26 constraint 3 Lados en la cara frontal 30 26 27 constraint 3 31 27 28 constraint 3 32 28 25 constraint 3 33 29 30 constraint 4 Lados en la cara posterior 34 30 31 constraint 4 35 31 32 constraint 4 36 32 29 constraint 4 37 33 34 Lados interirores 38 34 35 39 35 36 40 36 33 41 37 38 42 38 39 43 39 40 44 40 37 45 33 37 46 34 38 47 35 39 48 36 40 49 9 33 50 10 34 51 11 35 52 12 36 53 13 37 54 14 38 55 15 39 56 16 40 57 17 37 58 18 38 59 19 34 60 20 33 61 21 40 62 22 39 63 23 35 64 24 36 65 25 38 66 26 34 67 27 35 68 28 39 69 29 37 70 30 33 71 31 36 72 32 40 faces /* given by oriented edge loop */ 1 49 37 -50 -13 2 50 38 -51 -14 3 51 39 -52 -15 4 -16 52 40 -49 5 17 54 -41 -53 6 18 55 -42 -54 7 19 56 -43 -55 8 20 53 -44 -56 9 57 41 -58 -21 10 58 -46 -59 -22 11 59 -37 -60 -23 12 60 45 -57 -24 13 25 62 43 -61 14 26 63 47 -62 15 27 64 -39 -63 16 28 61 -48 -64 17 29 66 46 -65 18 30 67 -38 -66 19 31 68 -47 -67 20 32 65 42 -68 21 72 44 -69 -36 22 69 -45 -70 -33 23 70 -40 -71 -34 24 71 48 -72 -35 bodies /*defined by its oriented faces */ 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 \ -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 read
Una buena secuencia para evolucionar lo anterior es:
r; u; g10; r; u; g10