Adjusting Concave Mirror Surface Flatness in Zemax Non-Sequential Mode

  • 12 April 2024
  • 1 reply

Dear experts,
I'm working on a project in Non-Sequential Mode (NSM), involving a multiple pass optical cell with concave mirrors coated in gold. Can I adjust the surface flatness of these mirrors to values like λ/8 or λ/2 in NSM? If so, how? And if not, what is the default surface flatness in Zemax NSM? Any insights would be greatly appreciated. Thanks!
Best regards

1 reply

Userlevel 7
Badge +2



Generally speaking, there is no surface flatness with native objects. The objects are geometrically perfect by definition. I don’t know how you model your concave mirror, but if you take a Standard Surface object, and apply a Radius of curvature, then the sag is given by:

where c is the reciprocal of your radius of curvature (1 / R), and k is the Conic. You find the equation of the sag for most surfaces and their object counterpart generally use the same equation.

If you want to investigate surface flatness, there are more resources in sequential mode, such as:

also note that the recently released Composite Surface for sequential mode can help modelling surface imperfections:

If you want to stick with non-sequential mode for whatever reason. It would be good to know what sort of surface defects you are dealing with. In a general case of random surface defects, you could use the Grid Sag Lens object. This is a standard lens object where one of its surface can be augmented with a series of user-defined sag values. The syntax of the Grid Sag is described in the Help File under The Setup Tab » Editors Group (Setup Tab) » Lens Data Editor » Sequential Surfaces (lens data editor) » Grid Sag. I have made a dummy Python example how to generate a random uniform distribution of sag within the interval 0 to 0.2mm over a square of 2 by 2 mm^2:

import numpy as np

### Header data ###

nx = 100
ny = 100

delx = .02
dely = .02

unitflag = 0 # 0 for mm, 1 for cm, 2 for in, and 3 for meters

xdec = 0
ydec = 0

### Grid data ###

grid_data = 0.2 * np.random.rand(nx, ny)

### Wrtie to file ###

filename = ".../Zemax/Objects/Grid Files/random_grid_sag.grd"

with open(filename, "w") as f:
f.write(f"{nx} {ny} ")
f.write(f"{delx} {dely} ")
f.write(f"{unitflag} ")
f.write(f"{xdec} {ydec}\n")

for i in range(nx):
for j in range(ny):
f.write(f"{grid_data[i, j]} 0 0 0 0\n")

Note that you need to replace … with your path to the Zemax folder. This is how the Grid Sag Lens object looks like:

Then, you can of course apply a curvature to this surface and it will be added to the “roughness” that was generated with the grid sag:

I’m attaching this file for your reference. Note that while this approach can be quite general, it is relatively slow in terms of ray tracing due to the complexity of the surface. Which is why it would be good to know what kind of defects you want to simulate.

I hope this helps.

Take care,