Wow, this is impressive!  And if you come up with a multi-rank
replacement for the square_matrix_power() function, you'll be able to
finally eliminate all the looping and make this numeric model hugely
faster.  Although we can't test it directly, I would not be surprised
if this would then be by far the fastest implementation in the field.
Though we don't have all of the tricks implemented for the numeric
models - off-resonance effects, the correction factor Andy talked
about, etc. - this will still be huge.

Regards,

Edward



On 24 June 2014 14:58,  <[email protected]> wrote:
> Author: tlinnet
> Date: Tue Jun 24 14:58:07 2014
> New Revision: 24280
>
> URL: http://svn.gna.org/viewcvs/relax?rev=24280&view=rev
> Log:
> Speeded up model NS CPMG 2site star, by moving the forming of the propagator 
> matrix out of the for loops, and preform it.
>
> 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_star.py
>
> Modified: branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_star.py
> URL: 
> http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_star.py?rev=24280&r1=24279&r2=24280&view=diff
> ==============================================================================
> --- branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_star.py       
> (original)
> +++ branches/disp_spin_speed/lib/dispersion/ns_cpmg_2site_star.py       Tue 
> Jun 24 14:58:07 2014
> @@ -57,7 +57,7 @@
>  """
>
>  # Python module imports.
> -from numpy import add, array, conj, dot, fabs, float64, isfinite, log, min, 
> multiply, sum
> +from numpy import add, array, conj, dot, einsum, fabs, float64, isfinite, 
> log, min, multiply, sum
>  from numpy.ma import fix_invalid, masked_where
>
>  # relax module imports.
> @@ -221,8 +221,15 @@
>      # The matrix R that contains all the contributions to the evolution, 
> i.e. relaxation, exchange and chemical shift evolution.
>      R_mat, cR2_mat, Rr_mat, Rex_mat, RCS_mat = rcpmg_star_rankN(R2A=r20a, 
> R2B=r20b, dw=dw, k_AB=k_AB, k_BA=k_BA, tcp=tcp)
>
> +    # The the essential evolution matrix.
> +    # This matrix is a propagator that will evolve the magnetization with 
> the matrix R for a delay tcp.
>      eR_mat = matrix_exponential_rank_NE_NS_NM_NO_ND_x_x(R_mat)
>      ecR2_mat = matrix_exponential_rank_NE_NS_NM_NO_ND_x_x(cR2_mat)
> +
> +    # Preform the matrix.
> +    # This is the propagator for an element of [delay tcp; 180 deg pulse; 2 
> times delay tcp; 180 deg pulse; delay tau], i.e. for 2 times tau-180-tau.
> +    prop_2_mat = evolution_matrix_mat = einsum('...ij,...jk', eR_mat, 
> ecR2_mat)
> +    prop_2_mat = evolution_matrix_mat = einsum('...ij,...jk', prop_2_mat, 
> eR_mat)
>
>      # Loop over the spins
>      for si in range(NS):
> @@ -236,16 +243,11 @@
>                  # Extract the values from the higher dimensional arrays.
>                  power_si_mi_di = int(power[0, si, mi, 0, di])
>
> -                # This matrix is a propagator that will evolve the 
> magnetization with the matrix R for a delay tcp.
> -                eR_tcp = eR_mat[0, si, mi, 0, di]
> -                ecR2_tcp = ecR2_mat[0, si, mi, 0, di]
> -
>                  # This is the propagator for an element of [delay tcp; 180 
> deg pulse; 2 times delay tcp; 180 deg pulse; delay tau], i.e. for 2 times 
> tau-180-tau.
> -                prop_2 = dot(eR_tcp, ecR2_tcp)
> -                prop_2 = dot(prop_2, eR_tcp)
> +                prop_2_i = prop_2_mat[0, si, mi, 0, di]
>
>                  # Now create the total propagator that will evolve the 
> magnetization under the CPMG train, i.e. it applies the above 
> tau-180-tau-tau-180-tau so many times as required for the CPMG frequency 
> under consideration.
> -                prop_total = square_matrix_power(prop_2, power_si_mi_di)
> +                prop_total = square_matrix_power(prop_2_i, power_si_mi_di)
>
>                  # Now we apply the above propagator to the initial 
> magnetization vector - resulting in the magnetization that remains after the 
> full CPMG pulse train.  It is called M of t (t is the time after the CPMG 
> train).
>                  Moft = dot(prop_total, M0)
>
>
> _______________________________________________
> relax (http://www.nmr-relax.com)
>
> This is the relax-commits mailing list
> [email protected]
>
> To unsubscribe from this list, get a password
> reminder, or change your subscription options,
> visit the list information page at
> https://mail.gna.org/listinfo/relax-commits

_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-devel mailing list
[email protected]

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-devel

Reply via email to