Author: tlinnet Date: Wed Jun 25 02:14:42 2014 New Revision: 24297 URL: http://svn.gna.org/viewcvs/relax?rev=24297&view=rev Log: For model NS CPMG 2site 3d, the M0 matrix was preformed for higher dimensionality in init of target function. The transposes/rolled axis versions was also initiated. 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_cpmg_2site_3d.py branches/disp_spin_speed/target_functions/relax_disp.py Modified: branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py URL: http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py?rev=24297&r1=24296&r2=24297&view=diff ============================================================================== --- branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py (original) +++ branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_3d.py Wed Jun 25 02:14:42 2014 @@ -224,7 +224,7 @@ return c_mat -def r2eff_ns_cpmg_2site_3D(r180x=None, M0=None, r10a=0.0, r10b=0.0, r20a=None, r20b=None, pA=None, dw=None, dw_orig=None, kex=None, inv_tcpmg=None, tcp=None, back_calc=None, num_points=None, power=None): +def r2eff_ns_cpmg_2site_3D(r180x=None, M0=None, M0_T=None, r10a=0.0, r10b=0.0, r20a=None, r20b=None, pA=None, dw=None, dw_orig=None, kex=None, inv_tcpmg=None, tcp=None, back_calc=None, num_points=None, power=None): """The 2-site numerical solution to the Bloch-McConnell equation. This function calculates and stores the R2eff values. @@ -233,7 +233,9 @@ @keyword r180x: The X-axis pi-pulse propagator. @type r180x: numpy float64, rank-2, 7D array @keyword M0: This is a vector that contains the initial magnetizations corresponding to the A and B state transverse magnetizations. - @type M0: numpy float64, rank-1, 7D array + @type M0: numpy float array of rank [NE][NS][NM][NO][ND][7][1] + @keyword M0_T: This is a vector that contains the initial magnetizations corresponding to the A and B state transverse magnetizations, where the outer two axis has been swapped for efficient dot operations. + @type M0_T: numpy float array of rank [NE][NS][NM][NO][ND][1][7] @keyword r10a: The R1 value for state A. @type r10a: float @keyword r10b: The R1 value for state B. @@ -281,8 +283,10 @@ k_AB = pB * kex # This is a vector that contains the initial magnetizations corresponding to the A and B state transverse magnetizations. - M0[1] = pA - M0[4] = pB + M0_T[:, :, :, :, :, 0, 1] = pA + M0_T[:, :, :, :, :, 0, 4] = pB + M0[:, :, :, :, :, 1, 0] = pA + M0[:, :, :, :, :, 4, 0] = pB # Extract the total numbers of experiments, number of spins, number of magnetic field strength, number of offsets, maximum number of dispersion point. NE, NS, NM, NO, ND = back_calc.shape @@ -316,7 +320,7 @@ r20a_si_mi_di = r20a[0, si, mi, 0, di] # Initial magnetisation. - Mint_i = M0 + Mint_i = M0[0, si, mi, 0, di] # This matrix is a propagator that will evolve the magnetization with the matrix R for a delay tcp. evolution_matrix_i = evolution_matrix_mat[0, si, mi, 0, di] @@ -326,7 +330,7 @@ Mint_i = dot(evolution_matrix_i, Mint_i) # The next lines calculate the R2eff using a two-point approximation, i.e. assuming that the decay is mono-exponential. - Mx = Mint_i[1] / pA + Mx = Mint_i[1][0] / pA if Mx <= 0.0 or isNaN(Mx): back_calc[0, si, mi, 0, di] = r20a_si_mi_di else: Modified: branches/disp_spin_speed/target_functions/relax_disp.py URL: http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/target_functions/relax_disp.py?rev=24297&r1=24296&r2=24297&view=diff ============================================================================== --- branches/disp_spin_speed/target_functions/relax_disp.py (original) +++ branches/disp_spin_speed/target_functions/relax_disp.py Wed Jun 25 02:14:42 2014 @@ -400,8 +400,11 @@ if model in [MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR]: self.M0 = zeros(3, float64) if model in [MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_3D_FULL]: - self.M0 = zeros(7, float64) - self.M0[0] = 0.5 + M0_0 = zeros( [self.NE, self.NS, self.NM, self.NO, self.ND,7, 1], float64) + M0_0[:, :, :, :, :, 0, 0] = 0.5 + self.M0 = M0_0 + # Transpose M0, to prepare for dot operation. Roll the last axis one back, corresponds to a transpose for the outer two axis. + self.M0_T = rollaxis(self.M0, 6, 5) if model in [MODEL_NS_R1RHO_2SITE]: # Offset of spin-lock from A. da_mat = self.chemical_shifts - self.offset @@ -596,7 +599,7 @@ self.r20b_struct[:] = multiply.outer( R20B.reshape(self.NE, self.NS, self.NM), self.no_nd_ones ) # Back calculate the R2eff values. - r2eff_ns_cpmg_2site_3D(r180x=self.r180x, M0=self.M0, r20a=self.r20a_struct, r20b=self.r20b_struct, pA=pA, dw=self.dw_struct, dw_orig=dw, kex=kex, inv_tcpmg=self.inv_relax_times, tcp=self.tau_cpmg, back_calc=self.back_calc, num_points=self.num_disp_points, power=self.power) + r2eff_ns_cpmg_2site_3D(r180x=self.r180x, M0=self.M0, M0_T=self.M0_T, r20a=self.r20a_struct, r20b=self.r20b_struct, pA=pA, dw=self.dw_struct, dw_orig=dw, kex=kex, inv_tcpmg=self.inv_relax_times, tcp=self.tau_cpmg, back_calc=self.back_calc, num_points=self.num_disp_points, power=self.power) # Clean the data for all values, which is left over at the end of arrays. self.back_calc = self.back_calc*self.disp_struct