Hi Troels, I have been looking at profiling the 'NS R1rho 2-site' model as I would like to see what happens with the change: Index: lib/dispersion/ns_r1rho_2site.py =================================================================== --- lib/dispersion/ns_r1rho_2site.py (revision 25225) +++ lib/dispersion/ns_r1rho_2site.py (working copy) @@ -233,11 +233,8 @@ Rexpo_mat = matrix_exponential(R_mat) # Magnetization evolution. - Rexpo_M0_mat = einsum('...ij, ...jk', Rexpo_mat, M0) + MA_mat = einsum('...ij, ...jk, ...kl', M0_T, Rexpo_mat, M0)[:, :, :, :, :, 0, 0] - # Magnetization evolution, which include all dimensions. - MA_mat = einsum('...ij, ...jk', M0_T, Rexpo_M0_mat)[:, :, :, :, :, 0, 0] - # Insert safe checks. if min(MA_mat) < 0.0: mask_min_MA_mat = masked_less(MA_mat, 0.0) This change appears to work and might make things faster, but the profiling scripts no longer work due to the relax_times data structure changes. I don't know how we would fix this so that it continues to run on older relax versions as well as the current version with the relax_times structure updated. Maybe we could create 2 relax_times data structures, and then decide which is best based on the Dispersion.__init__.__doc__ contents. What do you think? I will probably rerun the full profiling disp_profile_all.py script before releasing relax 3.3.0, as the timings are now out of date. Cheers, Edward P. S. I thought of this change while trying to work out why different T_relax values cause this module to return different R1rho values! Strange.