rates[k] += (tmp_rates0[k] + tmp_rates1[k])*(t1 - t0)/2Michael,
the advance() function the solver uses several internal substeps and when I call getNetProductionRates I get just the instantaneous rates
This is precisely what is happening, and I think this is the most straightforward meaning of the functions that Cantera provides. A Phase / Solution / IdealGasMix object represents a single thermodynamic state and has no notion of time, so the only meaning that “net production rates” can have is the instantaneous one, which is reinforced by the term rates and the units associated with this value (kmol/m^3/s). A difference between two discrete states would only have dimensions of kmol/m^3.
For your CFD application, if the intent is to use the ReactorNet model to integrate the chemical source term as part of an operator split integration, then the finite difference approach that your code was using is the correct one. If you are implementing your own integration of the chemical source term, then you would want to use the netProductionRates function (which is what the ReactorNet model uses when it is integrating the equations).
Regards,
Ray