Hi Julia,
The flame speed is the eigenvalue solution to the free flame problem, it corresponds to the velocity at the inlet (cold) boundary. E.g. if your flame object is 'f' then f.u[0] will return the inlet velocity which is also the flame speed (since the convective velocity is matching the deflagration speed and the flame is stationary in the frame of reference moving with flame).
Others here know much more about the implementation details, but Cantera uses mesh refinement based on user specified criteria to add more grid points where the solution changes rapidly (like across the flame front). You don't know ahead of time how many grid points will be in the solution, it will depend on how stringent your refinement criteria are, and also on the error tolerances that you specify.
The "free flame" class inherits the following method:
set_refine_criteria(self, domain, ratio=10.0, slope=0.8, curve=0.8, prune=0.05)
Which would be invoked before solving the free flame problem like:
f.set_refine_criteria(ratio=3, slope=0.06, curve=0.12)
The documentation explains the meaning of these arguments and suggests a range of reasonable values. You can also control the steady state and transient errors, and I believe that this is demonstrated in the example python script for the free flame problem.
The number of grid points in the solution doesn't really give you much information about the flame thickness. I suppose you could expect that for a given error tolerance and grid refinement criteria that thinner flames will require more grid points to resolve, but why use such an indirect measure when you can just calculate the flame thickness using the solution (see e.g.
this recent discussion).
Hope that's of help,
Alex