The sample datafiles `qcube.fe`

, `qmound.fe`

, and
`ringblob.fe`

contains some examples of named quantities and instances. The first two
are quantity versions of `cube.fe`

and `mound.fe`

. These
illustrate the most general and useful methods, namely
facet_vector_integral, facet_scalar_integral, and edge_vector_integral,
rather than the faster but more specialized methods such as facet_area.
My advice is that the user stick to the old implicit methods for
area, volume, and gravitational energy, and use named quantities only
for specialized circumstances.

See
Implemented methods for a list of available methods.
Adding a new method involves writing C routines to calculate the value
and the gradient (and maybe the Hessian)
as functions of vertex coordinates, adding the function declarations
to `quantity.h`

, and adding a
structure to the method declaration array in `quantity.c`

. All the
other syntax for invoking it from the datafile is already in place.

`moment`

, which applies to facets.
Then typical commands would be
print moment.value print facet[3].moment list facet where moment > 0.1

print moment.modulus moment.modulus := 1.3A method instance may be declared to use a different modulus for each element by specifying an element extra attribute to use for that purpose. The extra attribute has to have already been declared. Example:

define facet attribute mymod real quantity myquant energy method facet_area global element_modulus mymodOf course, it is up to the user to properly initialize the values of the extra attribute.

**Orientation.** Some methods, those that logically depend on the orientation
of the element, can be applied with a relative orientation.
When applied to individual elements in the datafile, a negative
orientation is indicated by a '-' after the instance name.
When applied at runtime with the `set`

command,
the orientation will be negative if the element is generated
with negative orientation,
i.e. `set body[1].facet method_instance qqq`

.
The methods currently implementing this feature are:
edge_vector_integral, string_gravity, facet_vector_integral,
facet_2form_integral, facet_volume, facet_torus_volume,
simplex_vector_integral, simplex_k_vector_integral,
edge_k_vector_integral, gravity_method, and full_gravity_method.

- "energy" quantities which are added to the total energy of the surface;
- "fixed" quantities that are constrained to a fixed target value (by Newton steps at each iteration); and
- "conserved" quantities are like fixed, but the value is irrelevant. The quantity gradient is used to eliminate a degree of freedom in motion. Rarely used, but useful to eliminate rotational degree of freedom, for example. Will not work with optimizing parameters, since they do gradients by differences.
- "info_only" quantities whose values are merely reported to the user.

`fix`

`unfix`

The value of a quantity may be displayed with the
A or v commands,
or as an expression "quantityname.value". Furthermore, using the
quantity name as an element attribute evaluates to the sum of all
the applicable component instance values on that element. For example,
supposing there is a quantity named `vol`

, one could do

print vol.value print facet[2].vol histogram(facet,vol)

**Modulus.**
Each quantity has a "modulus", which is just a scalar multiplier for
the sum of all instance values. A modulus of 0 will turn off calculation
of all the instances. The modulus can be set in the
datafile declaration, with the
A command, or by assignment:

quantityname.modulus := 1.2

**Target value.**
Each fixed quantity has a target value, to which the Evolver attempts to
constraint the quantity value. Each time an iteration is done
( g command or the various
Hessian commands), Newton's Method
is used to project the surface to the constrained values. The target
value can be displayed with the A or
v commands, or as "quantityname.target".
It can be changed with the A command or
by assignment. Example:

print qname.target qname.target := 3.12

**Volconst.**
A quantity can have a constant value added to it, similar to the
body attribute volconst.
This quantity attribute is also called `volconst`

. It is
useful for adding in known values of say integrals that are omitted
from the actual calculation. It can be set in the quantity's
datafile definition, or
by an assignment command.

**Pressure.**
Each fixed quantity has a Lagrange multiplier associated to it.
The Lagrange multiplier of a constraint is the rate of energy change
with respect to the constraint target value. For a volume constraint,
the Lagrange multiplier is just the pressure. Lagrange multipliers are
calculated whenever an iteration step is done. They may be displayed
with the v command in the "`pressure`

"
column, or as an expression "quantityname.pressure".

**Tolerance.** A fixed quantity can have a tolerance attribute, which
is used to judge convergence.
A surface is deemed converged when the sum of all ratios of quantity
discrepancies to tolerances is less than 1. This sum also includes
bodies of fixed volume. If the tolerance is not set or is negative,
the value of
the variable target_tolerance is used, which has a default value of 0.0001.

**Function quantities.** Instead of being a simple sum of methods,
a named quantity can be an arbitrary function of named method values.
The datafile syntax has "function expression" instead of a method list.
For example:

method_instance qwerty method facet_scalar_integral scalar_integrand: x^2 quantity foobar energy function qwerty.value^3Note the method name is used with a "value" suffix. Also note that the method values used are global values, not element-wise. Quantity functions can do Hessian operations, if the component methods have Hessians. Such hessians can become quite memory consuming in default dense matrix form; there is a toggle command

```
function_quantity_sparse
```

that will cause sparse matrices to be used.
** Example.** The sample datafile column.fe
contains some examples of named quantities and instances.

**Future.** It is planned that eventually all
energies and global constraints will be converted to named quantity system.
However, existing syntax will remain valid wherever possible.
Starting Evolver with the -q option will do this conversion now.

- circular_arc_length
- circular_arc_area
- density_edge_length
- dihedral_hooke
- edge_area
- edge_general_integral
- edge_length, edge_tension
- edge_scalar_integral
- edge_torus_area
- edge_vector_integral
- hooke_energy
- hooke2_energy
- hooke3_energy
- klein_length
- laplacian_mean_curvature
- local_hooke_energy
- metric_edge_length
- neo_hookean
- null_length
- spherical_arc_length
- spherical_arc_area_n
- spherical_arc_area_s
- sqcurve_string
- sqcurve2_string
- sqcurve3_string
- sqcurve_string_marked
- sq_gaussian_curv_cyl
- sq_mean_curv_cyl
- sq_torsion
- string_gravity

- circle_willmore
- dirichlet_area
- density_facet_area
- density_facet_area_u
- facet_2form_integral
- facet_2form_sq_integral
- facet_area, facet_tension
- facet_area_u
- facet_general_integral
- facet_general_hi_d_integral
- facet_scalar_integral
- facet_torus_volume
- facet_vector_integral
- facet_volume
- full_gravity_method
- gap_energy
- gravity_method
- klein_area
- laplacian_mean_curvature
- metric_facet_area
- null_area
- pos_area_hess
- sobolev_area
- spherical_area
- stokes2d
- stokes2d_laplacian

- mean_curvature_integral
- mean_curvature_integral_a
- sq_mean_curvature
- eff_area_sq_mean_curvature
- normal_sq_mean_curvature
- mix_sq_mean_curvature
- star_sq_mean_curvature
- star_eff_area_sq_mean_curvature
- star_normal_sq_mean_curvature
- star_perp_sq_mean_curvature
- gauss_curvature_integral
- star_gauss_curvature
- sq_gauss_curvature

- knot_energy
- uniform_knot_energy
- uniform_knot_energy_normalizer
- uniform_knot_normalizer1
- uniform_knot_normalizer2
- edge_edge_knot_energy, edge_knot_energy
- edge_knot_energy_normalizer
- simon_knot_energy_normalizer
- facet_knot_energy
- facet_knot_energy_fix
- bi_surface
- buck_knot_energy
- proj_knot_energy
- circle_knot_energy
- sphere_knot_energy
- sin_knot_energy
- curvature_binormal
- ddd_gamma_sq
- edge_min_knot_energy
- true_average_crossings
- true_writhe
- twist
- writhe
- curvature_function
- knot_thickness
- knot_thickness_0
- knot_thickness_p
- knot_thickness_p2
- knot_thickness2
- knot_local_thickness

- dirichlet_elastic
- linear_elastic
- general_linear_elastic
- linear_elastic_B
- relaxed_elastic_A
- relaxed_elastic1_A
- relaxed_elastic2_A
- relaxed_elastic
- relaxed_elastic1
- relaxed_elastic2
- SVK_elastic

Element: vertex.

Parameters: scalar_integrand.

Models: linear, quadratic, Lagrange, simplex.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity point_value energy method vertex_scalar_integral scalar_integrand: x^2 + y^2 - 2x + 3

Element: edge.

Parameters: none.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity len energy method edge_length global

Element: edge.

Parameters: none.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity len energy method density_edge_length global

Element: edge.

Parameters: scalar_integrand.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity edge_sint energy method edge_scalar_integral scalar_integrand: x^2 - 3*y + 4

Element: edge.

Parameters: vector_integrand.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes.

Orientable: yes.

Example datafile declaration:

quantity edge_vint energy method edge_vector_integral vector_integrand: q1: 0 q2: 0 q3: z^2/2

Element: edge.

Parameters: scalar_integrand.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration: the edge length in 3D could be calculated with this quantity:

quantity arclength energy method edge_general_integral scalar_integrand: sqrt(x4^2 + x5^2 + x6^2)

Element: edge.

Parameters: none.

Models: linear, quadratic, Lagrange.

Ambient dimension: 2.

Hessian: yes.

Example datafile declaration:

quantity cell1_area fixed = 1.3 method edge_area

Element: edge.

Parameters: none.

Models: torus; string; linear,quadratic,Lagrange.

Ambient dimension: 2.

Hessian: yes.

Example datafile declaration:

quantity cell_area fixed = 1.3 method edge_torus_area

Element: edge.

Parameters: none.

Models: string linear, quadratic, lagrange.

Ambient dimension: 2.

Hessian: yes.

Orientable: yes.

Example datafile declaration:

quantity cell_grav energy modulus 980*8.5 method string_gravity

E = | L - L_0| ^pwhere L is the edge length, L_0 is the equilibrium length, embodied as an adjustable parameter `hooke_length', and the power p is an adjustable parameter `hooke_power'. The default power is p = 2, and the default equilibrium length is the average edge length in the initial datafile. You will want to adjust this, especially if you have a total length constaint. A high modulus will decrease the hooke component of the total energy, since the restoring force is linear in displacement and the energy is quadratic (when p=2). As an extra added bonus, a `hooke_power' of 0 will give

E = -\log|L-L_0|.See hooke2_energy for individual edge equilibrium lengths.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

parameter hooke_length 0.3 // will apply to all edges parameter hooke_power 2 // the default quantity slinky energy method hooke_energy global

r :::= { 'r'; set vertex hooke_size hooke_size/2 }to take care of it automatically. The power of displacement used is given by the internal read-write variable hooke2_power, which has default value 2.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

parameter hooke2_power 2 // the default define edge attribute hooke_size real quantity slinky energy method hooke2_energy global ... read r;r;set edge hooke_size length

energy = 0.5*(length-hooke_size)^2/hooke_size.The exponent can be altered from 2 by setting the parameter hooke3_power. If the internal variable frickenhaus_flag is nonzero, then the energy is taken to be 0 if the length is less than the equilibrium length.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

parameter hooke3_power 2 // the default quantity slinky energy method hooke3_energy global ... read r;r;set edge hooke_size length

E = ({L_1 - L_2 \over L_1 + L_2})^2where L_1 and L_2 are the lengths of the edges adjacent to the vertex. Meant for loops of string. (by John Sullivan) If you set the variable local_hooke_flag} nonzero then local_hooke_energy will not be evaluated at vertices with valence not equal to 2.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity slinky energy method local_hooke_energy global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity bender energy method dihedral_hooke global

Element: vertex.

Parameters: parameter_1.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity sq energy method sqcurve_string global parameter_1 3

Element: vertex.

Models: linear.

Ambient dimension: 2

Hessian: no.

Example datafile declaration:

define vertex attribute intrinsic_curvature real quantity sq2 energy method sqcurve2_string global

Element: vertex.

Models: linear.

Ambient dimension: any

Hessian: yes.

Example datafile declaration:

quantity sq3 energy method sqcurve3_string global

`sqcurve_string_mark`

and setting it to some nonzero
value for those edges you want to be involved, usually two at each
vertex to which this method is applied.
Value zero at vertex with only one marked edge. Value is calculated as if
the exterior angle at the vertex is evenly spread over the adjacent
half-edges. More precisely, if s1 and s2 are the adjacent edge lengths
and t is the exterior angle, value = 4*(1 - cos(t))/(s1+s2).
Other powers of the curvature can be specified by using the
parameter parameter_1 in the instance definition.
Element: vertex.

Parameters: parameter_1.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

define edge attribute sqcurve_string_mark integer quantity sqmark energy method sqcurve_string_marked

Element: vertex.

Models: linear string.

Ambient dimension: 2

Hessian: yes.

Example datafile declaration:

quantity sqgausscyl energy method sq_gaussian_curv_cyl global

`h_zero`

or a real-valued
vertex attribute `h_zero`

.
Element: vertex.

Models: linear string.

Ambient dimension: 2

Hessian: yes.

Example datafile declaration:

define vertex attribute h_zero real quantity sqcyl energy method sq_mean_curv_cyl global

[A,B,C] |B| S = ----------- |AxB| |BxC|(This is analogous to t = [T,T',T'']/k^2 for tangent vector T and curvature k. I'm using [A,B,C] as notation for triple product.) Then the torsion is

t = arcsin(S)/|B|and the integral of the square of the torsion is

t^2 |B| = arcsin(S)^2/|B|This function assumes the edges in each component are consistently oriented. Since this method is meant to be used on boundary wires of surfaces, it uses a "sq_torsion_mark" attribute on edges to tell which edges are to be included. Example top of datafile declaration:

define edge attribute sq_torsion_mark integer quantity sqtor energy method sq_torsionThen mark the edges you want included, for example using quad.fe

edges 1 1 2 constraints 1,2 sq_torsion_mark 1 quantity sqtor 2 2 3 constraints 1,2 sq_torsion_mark 1 quantity sqtor 3 3 4 constraints 1,2 sq_torsion_mark 1 quantity sqtor 4 4 1 constraints 1,2 sq_torsion_mark 1 quantity sqtor

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Element: edge.

Parameters: none.

Models: linear,quadratic,simplex.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

string space_dimension 2 metric 1+x^2 y y 1+y^2 quantity mel energy method metric_edge_length global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 2.

Hessian: no.

Example datafile declaration:

quantity kleinlen energy method klein_length global

Element: edge.

Parameters: none.

Models: quadratic; string.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity arclen energy method circular_arc_length globalMore commonly used with the area_method_name declaration in the top of the datafile.

Element: edge.

Parameters: none.

Models: quadratic.

Ambient dimension: 2.

Orientable: yes.

Hessian: yes.

Example datafile declaration:

quantity arcarea energy method circular_arc_area globalMore commonly used with the area_method_name declaration in the top of the datafile.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

parameter rad = 2 constraint 1 formula: x^2 + y^2 + z^2 = rad^2 length_method_name "spherical_arc_length"

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Orientable: yes.

Hessian: yes.

Example datafile declaration:

parameter rad = 2 constraint 1 formula: x^2 + y^2 + z^2 = rad^2 area_method_name "spherical_arc_area_s"

Element: facet.

Parameters: none.

Models: linear, quadratic, Lagrange; soapfilm, simplex.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity farea energy method facet_area global

Element:

Parameters:

Models: linear, quadratic, Lagrange, simplex.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity farea energy method density_facet_area global

Element: facet.

Parameters: none.

Models: linear, quadratic, Lagrange.

Ambient dimension: 3.

Hessian: yes.

Orientable: yes.

Example datafile declaration:

quantity vol fixed = 1.3 method facet_volume

Element: facet.

Parameters: scalar_integrand.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity fint energy method facet_scalar_integral global scalar_integrand: x^2+y^2

Element: facet.

Parameters: vector_integrand.

Models: linear, quadratic, Lagrange, simplex.

Ambient dimension: any.

Hessian: yes.

Orientable: yes. Example datafile declaration, for volume equivalent:

quantity fvint energy method facet_vector_integrand vector_integrand: q1: 0 q2: 0 q3: z

Element: facet.

Parameters: form_integrand (components in lexicographic order).

Models: linear, Lagrange, simplex.

Ambient dimension: any.

Hessian: yes.

Orientable: yes. Example datafile declaration in 4D:

quantity formex energy method facet_2form_integral form_integrand: q1: x2 // 12 component q2: 0 // 13 component q3: x4 // 14 component q4: 0 // 23 component q5: 0 // 24 component q6: x3*x2 // 34 component

Element: facet.

Parameters: form_integrand (components in lexicographic order).

Models: linear.

Ambient dimension: any.

Hessian: no.

Orientable: no. Example datafile declaration in 4D:

space_dimension 4 // symplectic area // Correspondence: z1 = (x1,x2) z2 = (x3,x4) #define DENOM ((x1^2+x2^2+x3^2+x4^2)^2) quantity symplectic_sq energy method facet_2form_sq_integral global form_integrand: q1: -2*(x3^2 + x4^2)/DENOM // dx1 wedge dx2 term q2: 2*(x2*x3-x1*x4)/DENOM // dx1 wedge dx3 term q3: 2*(x1*x3+x2*x4)/DENOM // dx1 wedge dx4 term q4: -2*(x1*x3+x2*x4)/DENOM // dx2 wedge dx3 term q5: 2*(x2*x3-x1*x4)/DENOM // dx2 wedge dx4 term q6: -2*(x1^2 + x2^2)/DENOM // dx3 wedge dx4 term

Element: facet.

Parameters: scalar_integrand.

Models: linear, quadratic, Lagrange.

Ambient dimension: 3.

Hessian: yes. Example: The facet area could be calculated with this quantity:

quantity surfacearea energy method facet_general_integral scalar_integrand: sqrt(x4^2 + x5^2 + x6^2)

Element: facet.

Parameters: scalar_integrand.

Models: linear, quadratic, Lagrange.

Ambient dimension: any.

Hessian: yes. Example: The facet area could be calculated with this quantity:

space_dimension 4 quantity surfacearea energy method facet_general_hi_d_integral scalar_integrand: sqrt(x5^2 + x6^2 + x7^2 + x8^2 + x9^2 + x10^2) )

Element: facet.

Parameters: none.

Models: linear,quadratic,lagrange.

Ambient dimension: 3.

Hessian: yes.

Orientable: yes.

Example datafile declaration:

quantity body_vol energy method facet_torus_volume

Element: facet.

Parameters: none.

Models: linear, quadratic, Lagrange.

Ambient dimension: 3.

Hessian: yes.

Orientable: yes.

Example datafile declaration:

quantity grav energy modulus 980*8.5 method gravity_method

Element: facet.

Parameters: none.

Models: linear, quadratic.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity area_u energy method facet_area_u global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity gappy energy method gap_energy globalAs an alternative to gap_energy, you should consider a system of "guide lines", i.e. a plane level set constraint whose coefficients are extra attributes of vertices. This can keep the contact line vertices evenly spaced without adding extra energy, and permitting Hessian operations.

Element: edge.

Parameters: none.

Models: linear,quadratic,simplex.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

metric 1+x^2 0 z 0 1+y^2 0 z 0 1+z^2 quantity mfa energy method metric_facet_area global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity kleinarea energy method klein_area global

cos(beta) = (<a,c><b,c>-<a,b><c,d>-<b,c><d,a>)/|a|/|b|/|c|/|d|For now, assumes all vertices are faceted, and fully starred. Severe numerical difficulties: Not smooth when angle beta is zero, which is all too common. Set of zero angles should be codimension 2, which means generally avoided, but still crops up.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity bobenko energy method circle_willmore global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity dirarea energy method dirichlet_area global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity sobarea energy method sobolev_area global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity parea energy method pos_area_hess global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

constraint 1 formula: x^2 + y^2 + z^2 = 1 quantity spharea energy method spherical_area global

- 0 - vertex is not on a wall; treat as if on a mirror symmetry plane.
- 1 - vertex is on a slip wall.
- 2 = vertex is on a nonslip wall; normal derivative of potential is zero.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

quantity dissip energy method stokes2d globalNote: Evolver creates a vertex attribute stokes_velocity for internal use.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

quantity laplac info_only method stokes2d_laplacian global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity mci energy method mean_curvature_integralThe method

`mean_curvature_integral_a`

does the same thing,
but uses a numerical formulation which may be better behaved.
There is an obsolete use of mean_curvature_integral in the top of the datafile to indicate the integral of the mean curvature should be included as an energy, with syntax

mean_curvature_integral: moduluswhere modulus is the multiplier for the energy. The modulus winds up as the internal read-write variable mean_curvature_modulus.

The integral of squared mean curvature in the soapfilm model is calculated for this method as follows: Each vertex v has a star of facets around it of area A. The force F due to surface tension on the vertex is the gradient of area, Since each facet has 3 vertices, the area associated with v is A/3. Hence the average mean curvature at v is

` h = (1/2)(F/(A/3)), `

where the 1/2 factor comes from the "mean" part of "mean curvature".
This vertex's contribution to the total integral is then
` E = h`^{2}A/3 = (3/4)F^{2}/A.

Philosophical note: The squared mean curvature on a triangulated
surface is technically infinite, so some kind of approximation scheme
is needed. The alternative to locating curvature at vertices is to
locate it on the edges, where it really is, and average it over the
neighboring facets. But this has the problem that a least area
triangulated surface would have nonzero squared curvature, whereas
in the vertex formulation it would have zero squared curvature.
Practical note: The above definition of squared mean curvature
seems in practice to be subject to instablities. One is that
sharp corners grow sharper rather than smoothing out. Another is
that some facets want to get very large at the expense of their
neighbors. Hence a couple of alternate definitions have been added.

Curvature at boundary: If the edge of the surface is a free boundary
on a constraint, then the above calculation gives the proper curvature
under the assumption the surface is continued by reflection across
the constraint. This permits symmetric surfaces to be represented
by one fundamental region. If the edge of the surface is a fixed edge
or on a 1-dimensional boundary, then there is no way to calculate the
curvature on a boundary vertex from knowledge of neighboring facets.
For example, the rings of facets around the bases of a catenoid and
a spherical cap may be identical. Therefore curvature is calculated
only at interior vertices, and when the surface integral is done,
area along the boundary is assigned to the nearest interior vertex.
However, including IGNORE_FIXED or IGNORE_CONSTRAINTS in the method declaration
will force the calculation of energy even at fixed points or
ignoring constraints respectively.

If the parameter or vertex attribute `h_zero`

is defined,
then the value per vertex
is the same as for the following method,
eff_area_sq_mean_curvature.

Element: vertex.

Parameters: IGNORE_CONSTRAINTS, IGNORE_FIXED.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity sqc energy method sq_mean_curvature global

` h = (1/2)(F/N)), `

and
` E = h`^{2} A/3 = (3/4)(F·F/N·N)A.

The facets of the surface must be consistently oriented for this
to work, since the evolver needs an `inside' and `outside' of the
surface to calculate the volume gradient. There are still possible
instabilities where some facets grow at the expense of others.
If the parameter or vertex attribute

`h_zero`

is defined, then the value per vertex
is
` E = (h-h`_{0})^{2} A/3 = (3/4)(F·N/N·N-2h_{0})^{2}A.

This does not reduce to the non-`h_zero`

formula when `h_zero`

has the value zero, but is actually a pretty good formula in its own
right (see star_perp_sq_mean_curvature
.
If the vertex is on one or several constraints, the F and N are projected to the constraints, essentially making the constraints act as mirror symmetry planes. If a constraint should not be considered as a mirror plane, it should be given the attribute

`nonwall`

in
its declaration in the datafile.
WARNING: For some extreme shapes, Evolver may have problems detecting consistent local surface orientation. The assume_oriented toggle lets Evolver assume that the facets have been defined with consistent local orientation.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity effsq energy method eff_area_sq_mean_curvature global

` h = (1/2)(F·F/N·F) `

E = h^{2}A/3 = (3/4)(F·F/N·F)^{2} A.

This is still not perfect, but is a lot better.
WARNING: For some extreme shapes,
Evolver may have problems detecting consistent local surface orientation.
The assume_oriented toggle lets Evolver assume that the facets
have been defined with consistent local orientation.
If the parameter or vertex attribute

`h_zero`

is defined,
then the value per vertex is
` E = (h-h`_{0})^{2} A/3 = (3/4)(F·F/N·F - 2h_{0})^{2}A

If the vertex is on one or several constraints, the F and N are
projected to the constraints, essentially making the constraints act as
mirror symmetry planes.
Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity nsq energy method normal_sq_mean_curvature global

` h = ((F·F/N·F)*sq_mean_mix + (F·N/N·N))/2 `

E = h^{2}A/3.

where F is the force or area gradient at a vertex, N is the unit normal vector as
determined by the volume gradient, and A is the area of the facets adjacent to the vertex.
{\cf sq\_mean\_mix} is a user-defined variable that controls the combination; its
default version is 0.
WARNING: For some extreme shapes,
Evolver may have problems detecting consistent local surface orientation.
The assume_oriented toggle lets Evolver assume that the facets
have been defined with consistent local orientation.
If the parameter or vertex attribute

`h_zero`

is defined,
then the value per vertex is
` E = (h-h`_{0})^{2} A/3

If the vertex is on one or several constraints, the F and N are
projected to the constraints, essentially making the constraints act as
mirror symmetry planes.
Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter sq_mean_mix = 0.5 quantity mixsq energy method mix_sq_mean_curvature global

`h_zero`

parameter.
The curvature calculation works in any dimension space. If for some reason
the space has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the toggle
calculate_in_3d will do that.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity starsq energy method star_sq_mean_curvature global

`h_zero`

parameter.
The curvature calculation works in any dimension space. If for some reason
the space has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the toggle
calculate_in_3d will do that.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity seffsq energy method star_eff_area_sq_mean_curvature global

`h_zero`

parameter or vertex attribute
for prescribed mean curvature.
The curvature calculation works in any dimension space. If for some reason
the space has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the toggle
calculate_in_3d will do that.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity stnsq energy method star_normal_sq_mean_curvature globalWARNING: The division by F.N can cause problems sometimes. Usually F and N are close to parallel, but I have seen cases where they get close to parallel and things go awry. I recommend using star_perp_sq_mean_curvature instead.

`h_zero`

parameter or vertex attribute
for prescribed mean
curvature. The actual formula for the energy at a vertex is
` h = (1/2)(F·N/N·N) `

E = (h-h_{0})^{2} A/3 = (3/4)(F·N/N·N - 2h_{0})^{2}A

where F is the area gradient at the vertex, N is the volume gradient,
and A is the area of the adjacent facets.
If the vertex is on one or several constraints, the F and N are
projected to the constraints, essentially making the constraints act as
mirror symmetry planes.
The positive orientation of the surface is
determined by the positive orientation of the first facet of the vertex's
internal facet list.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity stnsq energy method star_perp_sq_mean_curvature global

E = (\sum_i \theta_i) - pi.For reasons due to the Evolver's internal architecture, the sum is actually broken up as a sum over facets, adding the vertex angle for each facet vertex on the boundary and subtracting pi for each boundary edge. The total over all boundary vertices is exactly equal to the total angle deficit of all interior vertices plus 2*pi*chi, where chi is the Euler characteristic of the surface. Boundary vertices are deemed to be those that are fixed or on a parametric boundary. Alternately, one may define a vertex extra attribute

`gauss_bdry_v`

and an edge extra attribute `gauss_bdry_e`

and set them nonzero on the relevant vertices and edges; this overrides
the fixed/boundary criterion.
Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity gint energy method gauss_curvature_integral global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity total_deficit energy method star_gauss_curvature global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity sqg energy method sq_gauss_curvature global

Element: facet.

Parameters: vector_integrand.

Models: simplex.

Ambient dimension: any.

Hessian: no.

Orientable: yes. Example datafile declaration, for 4-volume under a 3D surface in 4D:

quantity xvint energy method simplex_vector_integral vector_integrand: q1: 0 q2: 0 q3: 0 q4: x4

Element: facet.

Parameters: k_vector_order, vector_integrand.

Models: simplex.

Ambient dimension: any.

Hessian: yes.

Orientable: yes. Example datafile declaration, for 3D surface in 5D:

quantity kvec energy method simplex_k_vector_integral k_vector_order 3 vector_integrand: q1: 0 // first vector q2: 0 q3: 0 q4: 0 q5: x4 q6: 0 // second vector q7: 0 q8: 0 q9: x3 q10: 0

Element: edge.

Parameters: k_vector_order, vector_integrand.

Models: linear, quadratic, simplex.

Ambient dimension: any.

Hessian: yes.

Orientable: yes. Example datafile declaration, for 3D edges of a 4D surface in 5D:

quantity kvec energy method edge_k_vector_integral k_vector_order 3 vector_integrand: q1: 0 // first vector q2: 0 q3: 0 q4: 0 q5: x4 q6: 0 // second vector q7: 0 q8: 0 q9: x3 q10: 0

>

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method knot_energy global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method uniform_knot_energy global

Element: vertex.

Parameters:

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knottenorm energy method uniform_knot_energy global method uniform_knot_energy_normalizer global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knottenorm energy method uniform_knot_energy global method uniform_knot_energy_normalizer1 global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knottenorm energy method uniform_knot_energy global method uniform_knot_energy_normalizer2 global

>

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity knotten energy method edge_edge_knot_energy global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity knotten energy method edge_edge_knot_energy global method edge_knot_energy_normalizer global

Element: edge.

Parameters: none.

Models: string linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity kenergy energy method edge_knotenergy global method simon_knot_energy_normalizer global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method facet_knot_energy global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method facet_knot_energy global method facet_knot_energy_fix global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity qqqq energy method bi_surface scalar_integrand x^2 + y^2 + z^2

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method buck_knot_energy global

E_{e_1e_2} = {L_1L_2 \cos^p\theta\over |x_1 - x_2|^p}where x_1,x_2 are the midpoints of the edges and \theta is the angle between the normal plane of edge e_1 and the vector x_1 - x_2. The default power is 2. Power law of potential is adjustable via the global parameter `knot_power'.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method proj_knot_energy global

E_{e_1e_2} = {L_1L_2 (1 - \cos\alpha)^2 \over |x_1 - x_2|^2},where x_1,x_2 are the midpoints of the edges and \alpha is the angle between edge 1 and the circle through x_1 tangent to edge 2 at x_2. Only power 2 is implemented.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity knotten energy method circle_knot_energy global

E_{f_1f_2} = { A_1A_2(1 - \cos\alpha)^p \over |x_1 - x_2|^q},where A_1,A_2 are the facet areas, x_1,x_2 are the barycenters of the facets, and \alpha is the angle between f_1 and the sphere through x_1 tangent to f2 at x_2. The energy is conformally invariant for p = 1 and q = 4. For p=0 and q=1, one gets electrostatic energy for a uniform charge density. Note that facet self-energies are not included. For electrostatic energy, this is approximately 2.8A^{3/2} per facet. The powers p and q are Evolver variables surface_knot_power and surface_cos_power respectively. The defaults are p=1 and q=4.

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter surface_knot_power 1 // the default parameter surface_cos_power 4 // the default quantity knotten energy method sphere_knot_energy global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity knotten energy method sin_knot_energy global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity curbi energy method curvature_binormal global

Element: vertex.

Parameters: none.

Models: string, linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity ddd energy method ddd_gamma_sq global

Energy = 1/d^2 * |e1||e2|This should be roughly the same as edge_edge_knot_energy, but distances are calculated from edge midpoints there. This is not a smooth function, so we don't try to compute a gradient. DO NOT use as an energy; use just for info_only quantities.

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity eminknot info_only method edge_min_knot_energy global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity true_cross info_only method true_average_crossings global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity twrithe info_only method true_average_crossings global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity twister info_only method twist global

E = 1/d^3 * (e1,e2,d)

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity writhy energy method writhe global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity curfun energy method curvature_function global

Element: edge.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity across energy method average_crossings global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3. Gradient: no.

Hessian: no.

Example datafile declaration:

quantity kthick info_only method knot_thickness global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity kthick info_only method knot_thickness_0 global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity kthick info_only method knot_thickness_p global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity kthick info_only method knot_thickness_p2 global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3. Gradient: no.

Hessian: no.

Example datafile declaration:

quantity kthick info_only method knot_thickness2 global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: 3. Gradient: no.

Hessian: no.

Example datafile declaration:

quantity klocalthick info_only method knot_local_thickness global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

wulff "crystal.wlf" quantity wolf energy method wulff_energy global

```
(1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))
```

Each facet has extra attribute poisson_ratio and
extra attribute array form_factors[3] = {s11,s12,s22}, which
are the entries in S. That is, s11 = dot(v2-v1,v2-v1),
s12 = dot(v2-v1,v3-v1), and s22 = dot(v3-v1,v3-v1).
If form_factor is not defined by the user, it will be created by Evolver,
and the initial facet shape will be assumed to be unstrained.
For a version of this method that gives compression zero energy, see
relaxed_elastic_A.
Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

quantity lastic energy method linear_elastic global

S = [ SThen_{1}S_{2}], Q = S^{-1}

W = [ W_{1}W_{2}] = AS

F = W^{T}W = S^{T}A^{T}AS

AThe energy density is^{T}A = Q^{T}FQ

C = (Q^{T}FQ - I)/2

` (1/2)C`_{ij} K_{ijkl} C_{kl}

where KEach facet has extra attribute elastic_coeff of size 6 containing { E

(1/2) [ C _{11}C_{22}C_{12}][ E _{1}E_{3}E_{4}] [ C_{11}][ E _{3}E_{2}E_{5}] [ C_{22}][ E _{4}E_{5}E_{6}] [ C_{12}]

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

define facet attribute elastic_basis real[2][2] define facet attribute elastic_coeff real[6] quantity genlastic energy method general_linear_elastic global

(1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))Each facet has extra attribute poisson_ratio and each vertex has two extra coordinates, the coordinates of the unstrained surface in a plane. Hence the surface must be set up as five dimensional. There can also be a real-valued facet extra attribute LEBweight, which can be used to give a per-facet weighting of the energy. For a version of this method that gives compression zero energy, see relaxed_elastic.

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 5.

Hessian: yes.

Example datafile declaration:

space_dimension 5 quantity lastic energy method linear_elastic_B globalrelaxed_elastic_A,

(1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))Each facet has extra attribute poisson_ratio and extra attribute array form_factors[3] = {s11,s12,s22}, which are the entries in S. That is, s11 = dot(v2-v1,v2-v1), s12 = dot(v2-v1,v3-v1), and s22 = dot(v3-v1,v3-v1). If form_factor is not defined by the user, it will be created by Evolver, and the initial facet shape will be assumed to be unstrained. The compression is detected by doing an eigenvalue analysis of the strain tensor, and discarding any negative eigenvalues. Facets which are stressed in one or two dimensions can be separately counted by the relaxed_elastic1_A (one stress direction, and one wrinkle direction) and relaxed_elastic2_A (two stressed directions) methods, which are meant to be used in info_only mode. There can also be a real-valued facet extra attribute LEBweight, which can be used to give a per-facet weighting of the energy. For a sample datafile, see mylarcube.fe. For a version of this method that gives compression positive energy, see linear_elastic.

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

quantity lastic energy method relaxed_elastic_A global

(1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))Each facet has extra attribute poisson_ratio and each vertex has two extra coordinates, the coordinates of the unstrained surface in a plane. Hence the surface must be set up as five dimensional. The compression is detected by doing an eigenvalue analysis of the strain tensor, and discarding any negative eigenvalues. The eigenvalues may be separately accessed by the relaxed_elastic1_A (lower eigenvalue) and relaxed_elastic2_A (higher eigenvalue) methods, which are meant to be used in info_only mode. There can also be a real-valued facet extra attribute LEBweight, which can be used to give a per-facet weighting of the energy. For a sample datafile, see mylarcube.fe. For a version of this method that gives compression zero energy, see linear_elastic_B.

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 5.

Hessian: yes.

Example datafile declaration:

space_dimension 5 quantity lastic energy method relaxed_elastic global

` Tr(CC`^{T})

Each facet has an extra attribute array form_factors[3] = {s11,s12,s22},
which are the entries in S. That is, s11 = dot(v2-v1,v2-v1),
s12 = dot(v2-v1,v3-v1), and s22 = dot(v3-v1,v3-v1).
If form_factor is not defined by the user, it will be created by Evolver,
and the initial facet shape will be assumed to be unstrained.
Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

quantity dirich energy method dirichlet_elastic global

lambda/2*(tr(E))^2+mu*(E:E) - (3 lambda + 2 mu) * alpha*theta*tr(E)where E=(C-I)/2 is the Green-Lagrange Strain tensor, theta = T-T0 is the temperature deviation, and alpha is the thermal dilation coefficient. Needs real-valued facet attributes SVK_alpha, SVK_mu, SVK_lambda, and SVK_theta. Also needs the facet attribute form_factors, decribed in linear_elastic. Written by Dr. Rabah Bouzidi.

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: yes.

Example datafile declaration:

define facet attribute SVK_alpha real define facet attribute SVK_lambda real define facet attribute SVK_mu real define facet attribute SVK_theta real define facet attribute form_factors real[3] quantity svk energy method SVK_elastic global

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

quantity bender energy method neo_hookean global

Element: edge.

Parameters: none.

Models: any.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

length_method_name "null_length"

Element: edge.

Parameters: none.

Models: any.

Ambient dimension: any.

Hessian: yes.

Example datafile declaration:

area_method_name "null_area"

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity asquare energy method area_square global

Given bodies $B_1$ and $B_2$ in $R^3$, define the energy E = \int_{B_1}\int_{B_2} {1 \over |z_1 - z_2|^{p} } d^3 z_2 d^3 z_1 This reduces to E = {1\over (3-p)(2-p)}\sum_{F_2\in\partial B_2}\sum_{F_1\in\partial B_1} N_1 \cdot N_2 \int_{F_2}\int_{F_1}{1\over |z_1 - z_2|^{p-2}} d^2 z_1 d^2 z_2. And if we crudely approximate with centroids $\bar z_1$ and $\bar z_2$, E = {1\over (3-p)(2-p)}\sum_{F_2\in\partial B_2}\sum_{F_1\in\partial B_1} {A_1 \cdot A_2 \over |\bar z_1 - \bar z_2|^{p-2}}, where $A_1$ and $A_2$ are unnormalized area vectors for the facets. The power p is set by the variable carter_power (default 6).

Element: facet.

Parameters: none.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

parameter carter_power 6 // the default quantity craig energy method carter_energy global

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

parameter knot_power 2 // the default quantity knotten energy method knot_energy global

E = (pi - asin(d/2))/d,where d is chord distance. For point packing problems on the sphere.

Element: vertex.

Parameters: none.

Models: linear.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

constraint 1 formula: x^2+y^2+z^2 = 1 quantity jms energy method johndust global

Element: facet.

Parameters: scalar_integrand.

Models: linear.

Ambient dimension: 3.

Hessian: no.

Example datafile declaration:

quantity stressy info_only method stress_integral global scalar_integrand: 3

Element: vertex.

Parameters: none.

Models: any.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

quantity jeremy energy method ackerman global

The relative speed of vertices can be controlled by the vertex attribute lmc_mobility, which the user should declare if wanted. If the user wants to access the values of mean curvature the method finds, the user should define the vertex scalar attribute lmc_mean_curvature. This method conserves volume ideally, but you might want to put on volume constraints anyway due to numerical inaccuracies.

Warning: This method should only be used with a fixed 'g' scale factor. And for stability, the factor should be proportional to the fourth power of the shortest edge, since Laplacian of mean curvature is a fourth-derivative operator, something like 0.001*length^4. This can make for very slow evolution for highly refined surfaces.

Element: vertex.

Parameters: none.

Models: linear string and linear
soapfilm.

Ambient dimension: any.

Hessian: no.

Example datafile declaration:

area_method_name "null_area" define facet attribute lmc_mobility real define facet attribute lmc_mean_curvature real quantity lmc energy method laplacian_mean_curvature global

Back to top of Surface Evolver documentation. Index.