Author: tlinnet Date: Fri Jun 20 17:42:58 2014 New Revision: 24213 URL: http://svn.gna.org/viewcvs/relax?rev=24213&view=rev Log: Converted ns mmq 3site/sq/dq/zq to calculte the matrix exponential out of the for loops. Task #7807 (https://gna.org/task/index.php?7807): Speed-up of dispersion models for Clustered analysis. Modified: branches/disp_spin_speed/lib/dispersion/ns_mmq_3site.py Modified: branches/disp_spin_speed/lib/dispersion/ns_mmq_3site.py URL: http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/lib/dispersion/ns_mmq_3site.py?rev=24213&r1=24212&r2=24213&view=diff ============================================================================== --- branches/disp_spin_speed/lib/dispersion/ns_mmq_3site.py (original) +++ branches/disp_spin_speed/lib/dispersion/ns_mmq_3site.py Fri Jun 20 17:42:58 2014 @@ -330,32 +330,30 @@ # Extract shape of experiment. NS, NM, NO = num_points.shape + # Populate the m1 and m2 matrices (only once per function call for speed). + # D+ matrix component. + m1_mat = rmmq_3site_rankN(R20A=R20A, R20B=R20B, R20C=R20C, dw_AB=dw_AB, dw_AC=dw_AC, k_AB=k_AB, k_BA=k_BA, k_BC=k_BC, k_CB=k_CB, k_AC=k_AC, k_CA=k_CA, tcp=tcp) + # Z- matrix component. + m2_mat = rmmq_3site_rankN(R20A=R20A, R20B=R20B, R20C=R20C, dw_AB=-dw_AB, dw_AC=-dw_AC, k_AB=k_AB, k_BA=k_BA, k_BC=k_BC, k_CB=k_CB, k_AC=k_AC, k_CA=k_CA, tcp=tcp) + + # The A+/- matrices. + A_pos_mat = matrix_exponential_rankN(m1_mat, dtype=complex64) + A_neg_mat = matrix_exponential_rankN(m2_mat, dtype=complex64) + # Loop over spins. for si in range(NS): # Loop over the spectrometer frequencies. for mi in range(NM): # Loop over offsets: for oi in range(NO): - - r20a_i = R20A[si, mi, oi, 0] - r20b_i = R20B[si, mi, oi, 0] - r20c_i = R20C[si, mi, oi, 0] - - dw_AB_i = dw_AB[si, mi, oi, 0] - dw_AC_i = dw_AC[si, mi, oi, 0] - dwH_AB_i = dwH_AB[si, mi, oi, 0] - dwH_AC_i = dwH_AC[si, mi, oi, 0] + # Extract parameters from array. num_points_i = num_points[si, mi, oi] - - # Populate the m1 and m2 matrices (only once per function call for speed). - rmmq_3site(matrix=m1, R20A=r20a_i, R20B=r20b_i, R20C=r20c_i, dw_AB=dw_AB_i, dw_AC=dw_AC_i, k_AB=k_AB, k_BA=k_BA, k_BC=k_BC, k_CB=k_CB, k_AC=k_AC, k_CA=k_CA) - rmmq_3site(matrix=m2, R20A=r20a_i, R20B=r20b_i, R20C=r20c_i, dw_AB=-dw_AB_i, dw_AC=-dw_AC_i, k_AB=k_AB, k_BA=k_BA, k_BC=k_BC, k_CB=k_CB, k_AC=k_AC, k_CA=k_CA) # Loop over the time points, back calculating the R2eff values. for i in range(num_points_i): # The A+/- matrices. - A_pos = matrix_exponential(m1*tcp[si, mi, oi, i]) - A_neg = matrix_exponential(m2*tcp[si, mi, oi, i]) + A_pos_i = A_pos_mat[si, mi, oi, i] + A_neg_i = A_neg_mat[si, mi, oi, i] # The evolution for one n. evol_block = dot(A_pos, dot(A_neg, dot(A_neg, A_pos)))