Reflfit and its polarized neutron sister reflpol are two of our reflectometery analysis program. They let you fit your reduced reflectivity data to a layer model.
You can directly manipulate the layer profile by dragging the depths and control points around the graph.
You can encode arbitrary constraints among the parameters.
You can fit to any of the layer parameters using a Levenburg-Marquardt non-linear fitting algorithm. You can also fit to artificial parameters which encode the constraints, such as the total depth of a set of equally thick layers.
Online help is available within the program.