The usual mode of operation of the Surface Evolver is to minimize energy
subject to constraints. There are two broad categories of constraints:
- Pointwise constraints:
- Global constraints:
Level set constraints
A level-set constraint is a restriction of vertices to lie on the zero
level-set of a function.
The formula may include any expressions whose values
are known to the Evolver, given the particular vertex.
Most commonly one just uses the coordinates (x,y,z) of the
vertex, but one can use variables, quantity values,
or vertex extra attributes. Using a vertex extra
attribute is a good way to customize one formula to
individual vertices. For example, if there were a
vertex extra attribute called zfix, one could force
vertices to individual z values with one constraint
with the formula z = zfix, after of course assigning
proper values to zfix for each vertex.
A level set constraint may have several roles:
- Vertices may be required to lie on a constraint (equality constraint)
or on one side (inequality constraint).
A constraint may be declared
in which case it applies to all vertices.
See mound.fe for an example.
- A constraint may have an
associated with it that is integrated
over edges lying in the constraint to give an
This is useful for
specifying wall contact angles and for calculating gravitational energy.
Integrals are not evaluated over edges that are FIXED. See
In the string model,
the energy integrand is a single component evaluated on vertices
on the constraint.
- A constraint may have a
associated with it that is integrated
over edges lying in the constraint to give a
volume contribution to a body
whose boundary facets contain the edges. This is useful for getting correct
volumes for bodies without completely surrounding them with otherwise useless
facets. It is important to understand how the content is added to the body
in order to get the signs right. The integral is evaluated along the positive
direction of the edge. If the edge is positively oriented on a facet, and
the facet is positively oriented on a body, then the integral is added
to the body. This may wind up giving the opposite sign to the integrand
from what you think may be natural. Integrals are not evaluated over edges
that are FIXED. See tankex.fe for an example.
In the string model,
the content integrand is a single component evaluated on vertices
on the constraint.
- A constraint may be declared
in which case edges in the
constraint have an energy associated with them that is proportional to
the area between the straight edge and the curved wall. This energy (referred
to as "gap energy")
is meant to compensate for the tendency for flat
facets meeting a curved wall to minimize their area by lengthening some
edges on the wall and shortening others, with the net effect of increasing
the net gap between the edges and the wall. See tankex.fe for an example.
Level set constraints are declared in the top section of the datafile.
They may be applied to vertices,
edges, or facets.
Constraints are usually applied to vertices and edges, as in
mound.fe. Remember that you need to apply a constraint
to an edge to get that constraint to apply to vertices created on that edge
by refining. Sometimes one applies constraints to facets, usually to get
the facet to conform to a predetermined shape. Be sure that the constraints
applied to a vertex are linearly independent at the vertex.
Constraints are usually applied in the datafile
faces sections, but they
may also be set or removed with the set
or unset commands. Example:
set vertex constraint 4
unset edge constraint 1 where id < 10
It does not hurt to unset an element that isn't on the constraint.
When a vertex is set to a constraint, the vertex coordinates are
immediately projected to the constraint. Setting an edge on a
constraint does not set its vertices. Likewise for facets.
If a level set constraint is declared
NONNEGATIVE or NONPOSITIVE in the datafile,
the vertices subject to the constraint must stay in that part of the domain
of the level set function. It is usually unwise to give edge integrals
to edges on one-sided constraints, or to declare them CONVEX.
Whether a vertex exactly satisfies the constraint may be queried with the
vertex hit_constraint attribute.
Example: Suppose one wanted to keep a bubble inside a spherical tank
of radius 5. Then one would define the constraint in the datafile
constraint 1 nonpositive
formula: x^2 + y^2 + z^2 = 25
For purposes of evaluating nonnegativity or nonpositivity, all terms are
shifted to the left side of the formula. One would then apply this
constraint to all vertices, edges, and facets of the bubble surface.
Parametric curves and surfaces
Vertex locations may be given in terms of parameters on a parameterized
curve or surface. Such curves or surfaces are called "boundaries"
in Evolver terminology, since they are usually used as boundary curves
of surfaces, for example a soap film on a wire loop could have the wire
implemented as a boundary. Vertices, edges, and facets may be deemed to
lie in a boundary. For a vertex, this means that the fundamental parameters
of the vertex are the parameters of the boundary, and its coordinates are
calculated from these. Vertices on boundaries may move during iteration,
unless declared fixed. See cat.fe for an example.
Putting an edge on a boundary means that vertices created on that edge
will be on the boundary. An edge on a boundary must have at least one
endpoint on the boundary, for use in extrapolating the boundary parameters
of any created vertices. Extrapolating instead of interpolating
midpoint parameters solves the problem of wrap-arounds on a boundary such as
a circle or cylinder. However if you do want interpolation, you can use
the keyword INTERP_BDRY_PARAM
in the top of the datafile, or use the
toggle command interp_bdry_param.
Putting a face on a boundary means that all edges and vertices created
from refining the face will be on the boundary. In this case, the boundary
should have two parameters (or whatever the dimension of the surface is).
This is good for getting a surface to conform to a known parametric
Boundaries are defined in the top section of the
datafile. Vertices on boundaries
are listed in the datafile with their parameter values instead of their
coordinates, with "boundary n" appended to each such
Edges and faces on boundaries are defined as usual, but with
"boundary n" appended to each definition.
Edges on boundaries have energy and content integrals like level-set
constraints edges, but they are internally implemented as.
Whether an element is on a particular boundary can be queried with
the on_boundary Boolean attribute.
Elements can be removed from boundaries with the
unset command, but they cannot be
set on boundaries. A typical use
of unset is to define an initial surface using a 2-parameter
boundary, refine a couple of times, then unset. Examples:
list vertex where on_boundary 2
unset vertex boundary 1 where on_boundary 1
unset edge boundary 1
unset facet boundary 1
It does not hurt to unset an element not on the boundary.
Vertex parameters can be accessed in expressions as the attribute
p1 (and p2,... for further parameters).
Vertex parameters can be changed with the set
set vertex p1 p1+.1 where id < 4
vertex.p1 := 3
It is not an error to access the parameters of a vertex not on a boundary
as long as some vertex is on a boundary (so that space is allocated in
the vertex structure for parameters).
A general guideline is to use constraints for two-dimensional walls
and boundaries for one-dimensional wires. If you are using a boundary wire,
you can probably declare the vertices and edges on the boundary to be FIXED.
Then the boundary becomes just a guide for refining the boundary edges.
NOTE: A vertex on a boundary cannot also have constraints.
Named quantity constraints
See fixed named quantities.
Back to top of Surface Evolver documentation.