Automated Mirror Cell Optimization

This page describes the design optimization of mirror cells using a CAD tool
called Plop. It shows how to build mirror cells that outperform the
conventional ones, by using CAD to optimize the cell design. As a result, it is
possible to reduce the wavefront error by as much as 50% compared to a
conventional design, or to support a mirror up to about 20% larger than
typically thought possible. While the techniques described in this page have
been previously published in technical journals, this page provides a more
detailed summary of designs for ATMs. Click here
to see a quick example of why optimizing can reduce error, if refocusing of the
mirror is considered.

Acknowledgements: This would not be
possible without Toshimi Taki's code for FEM. His contribution is greatly
appreciated. Richard Schwartz has also been helpful in pointing out sources of
techincal information, and comments on this page.

This work is similar to that performed by Luc Arnold, but is
designed to make it more accessible to ATMs. [reference]
Luc uses analytical models of the mirror deformation . Plop, in contrast, uses
finite element method, which can include the effects of shear. The most recent
version of plop uses a technique inspired by Luc Arnold, that of calculating a
basis set of deformations using a single FEM, and calculating the surface for
any cell by decomposing it into the basis set.

Click here for the Plop user Manual in
html here for MS
word here
for PDF.

Download Plop

Plop Version 2 has a GUI interface to make most cell designs a matter of
pressing a few buttons. Simple designs can be done
in a few seconds. Click here to download
Graphical Plop. This includes the command line version of Plop.

The current release is 2.1.4. This is much faster than the previous version.

Plop Features

This rest of this page is an introduction to the features of Plop.

The CAD tool used to analyze and optimize cells called Plop. Plop stands for
PLate OPtimizer, and is based on Plate, a FEM program written by Toshimi Taki.
Toshimi's work is key to Plop; the rest of it is an enhancement to increase the
speed of Plate, and its ease of use. Plop builds on Plate by adding the
following features:

Plop is built as a set of three separate components that can be used
independently, or together for maximum ease of use. It contains about
4400 lines of 'C' code.

This page is an introduction to the features of Plop.

Simple input language

Plop is controlled by an input file describing the mirror
cell using a set of fairly straightforward keywords and associated values.
Let's say you want to analyze a mirror cell for a f/5 317.5mm (12.5 inch)
mirror, 44.5 mm (1.75 inch) thick, using a 9 point cell with supports at
radii 55.4 mm (2.2 inch) and 114.3mm (4.5 inch). Here is the Plop input file
for this:

Note that all dimensions are in mm. Diameter, focal-length, and thickness
are obvious. N-mesh-rings tells plop how large a mesh to generate for FEM.
Support-radii gives the radii of the support, and num-support tells how many
supports are located at that radius, and finally support-angle gives the angle
of the first support in each ring of supports. Supports are located at equally
spaced angles around the ring.

Automatic Mesh Generation

Plop will automatically generate a mesh for the mirror. Here
is a picture of the mesh generated for the example above:

Error Calculation

Running Plop by default will generate the mesh, solve for
deformation using Plate, and analyze the error. The error is analyzed using two
metrics: RMS and peak-valley. It is also analyzed using the error both before
and after considering refocusing of the telescope to the best-fit parabola.
This can have very significant effects on the design of mirror cells. Finally,
the error is analyzed across the entire mirror surface, and also only that part
of the surface that is not obscured by the secondary. In this simple example,
we ignore the effect of the secondary. Here are the results of running Plop on
the above example:

Running Plop in its simplest mode, telling it to consider refocusing,
produces the above output.

A reasonable goal is 1/32 wave P-V, or 1/16 wavefront P-V. This is about
1.7e-05.(remember all dimensions are in mm.) Thus, we conclude that the above
cell will have more than adequate performance. RMS error may be as much
as 1/2 P-V error, but will typically be about 1/4. We will use 4.3e-06 as
maximum RMS error. We can conclude that the cell above will perform more
than adequately.

Graphic Output

Both for fun, and for a visual check that the results actually
make sense, it is nice to have graphical output. Plop provided both color and
contour plots of the results. Links to the .gif's of the mirror before and
after refocusing are shown before. Click on the link to get the plot you
want to see. Note that the images below are just icons, not
realistic representations of the images.

Images
before refocusing:

Images
after refocusing:

Automated Cell Optimization

Plop can optimize a cell design with the addition of a few
simple lines in the mirror description file. The example above happens to be
very close to optimal, because it is close to a design optimized by Plop.
Suppose that you didn't know where the supports should be, but could take a
reasonable guess, say 50mm and 110 mm for the supports. Here is a file that
gives Plop a reasonable starting guess and tells it to find the best answer:

The line "optimize support-radii 0 1" means to optimize the
variable support-radii[0], with an initial step size of 1. The step size will
be adjusted as Plop runs. After grinding for a few minutes, Plop will produce:

This shows you the best values it can find for the parameters you want to
optimize.

There are some subtle issues in error calculation that are necessary to
address in order to make the optimizer work. The optimizer follows the gradient
of the error function, so it is essential that the error function be
continuous. This is a real pain to figure out which parts of the mesh to
include when there is an obstruction. Moving a triangle across the obstruction
willl cause a discontinuity if we simply include stuff outside the obstruction.
To get an accurate error estimate, and to maintain continuity, Plop divides
each mesh triangle into 25 smaller triangles, and measures the error in each.
For triangles that straddle the obstruction radius, it weights each triangle
according to how much of it is outside the obstruction. This takes some CPU
time, but it is the only way to get good results that I have found so far.

Luc Arnold uses a more clever technique. He realizes that deformation is
linear in the support forces, so he generates a set of deformations for a set
of support locations, then decomposes a given configuration into a weighting of
these deformations, and calculates the RMS error from this. It is also noteworthy
that it is possible to solve for a number of different configurations together,
with little more time than a single one, since the basic operation is a linear
solution. Using these two facts means you only need to perform a single matrix
solution to perform the hundreds of solutions that are necessary for a big
optimization.

Scanning Parameters

Plop can scan one or more parameters across either a range
of values, or across a discrete set. In the former, you might want to
find the error as the support radius is varied from 100 to 150 mm in 10mm
steps. In the latter, you might want to find the best cell design for mirrors
of diameters 114,152,203,250, and 317mm.

We'll use this to show the advantage of refocusing. Consider the following
input to Plop:

This is for a 254mm (10 inch) mirror with a 3 point support, scanning the
support radius from 20 to 120mm in steps that are 1/20th of the interval. Here
are a few lines of the output, without refocusing:

The upper plot shows error after refocusing; the lower shows
error before refocusing as a function of the radius of the supports in a 3
point cell. Note that error before refocusing is minimized with the
classic support at 70% radius, and is 4.7e-06, barely over our tolerance.
However, when refocusing is considered, the best radius is about 40%, and the
error is about half. at 2.1e-06 This confirms results previously reported in:

Thanks to Richard Schwartz for this reference; the result is so unexpected
that I wouldn't have believed ithe output from Plop easily unless I had read
this paper! This result points to larger mirrors on three point supports, and
is discussed further in the experiment section.

Better Matrix Solving Code

Toshimi's code uses a banded matrix formulation. This worked
well for the meshes he was using as input, because he takes advantage of
symmetry. I was too lazy to do this in Plop, and the band size blew up. I
took a sparse matrix solver I had lying around and plugged it into Plate.
I also changed Plop to order the nodes in a different manner, to reduce
fill ins. This sped up Plate by about 10X. This speedup is necessary if you
want to do optimization of large cells.

Basis Generation

FEM solves the deformation of the mirror by constructing a
set of linear equations that approximate the deformation of the mirror at each
corner of each triangle using the stiffness and forces on each of the
triangles. This is a set of linear equations of the form A x = b, where the
matrix A is determined by the mirror properties and the set of triangles, the
right hand side b is given by the forces applied to the mirror, and the vector
x is the deformation of each of the corners of each of the triangles. FEM sets
up and solves this set of equations once for each problem.

Inspired by Luc Arnold's paper, we noticed that it was possible to do
multiple FEMs for the price of one. Since A is a constant given the mirror and
the triangulation, we can solve for many different values of b, corrsponding to
multtiple different supports, and producing multiple solutions, for roughly the
same cost as a single matrix solution. Furthermore, suppose that we generate a
set of forces b0, b1, ..., bn, and set of solutions x0,x1,...,xn. Any new
problem that can be broken up into a set of weighted problems a0*b0 + a1*b1 +
... an * bn can be solved without a matrix solution by forming a0 * x0 + a1 *
x1 + ... + an * xn. There is a subtle proviso that a0 + a1 + ... + an = 1. We
use this to presolve for a basis set of problems, and then just do a vector sum
to solve for each new problem. This is about 30 times faster than performing a
full FEM each time. Combined with the previous speedup of over 10X, we can do
optimization about 300X faster than if we used the original banded matrix
solver every time.

There is, however, a subtle issue lurking. The basis relies on the A being
constant, which means the triangulation has to be fixed for all solutions. This
means that supports that are not on a mesh point must be approximated by a set
of forces on nearby points. This introduces a small error compared to a single
point, but it is around 1%. Acutally, this is a more realistic model since you
don't have an infinitely small support. However, the magnitude of this
spreading varies in a manner which is essentially invisible to the user. I
don't beleive that this will affect actual error more than 1% though, so
overall it is a useful technique. It is also a little trickier for the user to
specify how to do this.