To download Plop, click here

This page is quite out of date, and I'll update it..... someday.

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.

Follow this link to experiments using Plop and design information for standard mirror cells.

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

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.

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:

· simple input language to describe the cell configuration

· error calculation of mirror deformation

· graphical output of mirror deformation

· automatic optimization of mirror cells

· automatic scanning of parameters across a range of values

· generate basis
set using FEM

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.

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:

diameter 317.5

focal-length 1587

thickness 44.45

n-mesh-rings 8

support-radii 55.4 114.3

num-support 3 6

support-angle 0 30

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.

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

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:

raw rms error = 7.41081e-06 visible rms = 7.41081e-06

raw p-v error = 2.69445e-05, visible p-v = 2.69445e-05

refocused rms error = 1.1419e-06 visible rms = 1.1419e-06

refocused p-v error = 5.99954e-06, visible p-v = 5.99954e-06

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.

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.

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:

diameter 317.5

focal-length 1587

thickness 44.45

n-mesh-rings 8

support-radii 50 110

num-support 3 6

support-angle 0 30

optimize support-radii 0 1

optimize support-radii 1 1

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:

results: support-radii[0]: 53.6339 support-radii[1]: 113.98 err: 1.13631e-06

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.

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:

diameter 254

focal-length 1270

thickness 44.45

n-mesh-rings 8

support-radii 50

num-support 3

support-angle 0

scan-var support-radii 0 20 120 20

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:

results: support-radii[0]: 20 err: 1.67014e-05

results: support-radii[0]: 25 err: 1.5997e-05

results: support-radii[0]: 30 err: 1.52198e-05

results: support-radii[0]: 35 err: 1.42882e-05

results: support-radii[0]: 40 err: 1.32406e-05

A better method to look at this is a plot:

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:

Arnold, Luc, "Optimized axial support topologies for thin telescope mirrors", Optical Engineering v.34 n.2 p.567 (February 1995)

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.

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.

A couple of wierd examples suggested by Richard Schwartz: Click here to see a 254 mm (10 inch) diam 254mm (10 inch) thick mirror. Click here to see deformation as thickness varies from 50.8 mm (2 inch) to 508mm (20 inch).

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.