The checking code should have been in a different commit - or even
better a different commit adding this as a unit test.  Also, shift the
fixed matrices out of the function for speed.

Cheers,

Edward



On 20 June 2014 09:18,  <[email protected]> wrote:
> Author: tlinnet
> Date: Fri Jun 20 09:18:00 2014
> New Revision: 24189
>
> URL: http://svn.gna.org/viewcvs/relax?rev=24189&view=rev
> Log:
> Implemented the collection of the multidimensional matrix m1 and m2 in model 
> ns mmq 2site.
>
> Inserted also a check, that the newly computed matrix is equal.
> They are, to the 6 digit.
>
> 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_2site.py
>
> Modified: branches/disp_spin_speed/lib/dispersion/ns_mmq_2site.py
> URL: 
> http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/lib/dispersion/ns_mmq_2site.py?rev=24189&r1=24188&r2=24189&view=diff
> ==============================================================================
> --- branches/disp_spin_speed/lib/dispersion/ns_mmq_2site.py     (original)
> +++ branches/disp_spin_speed/lib/dispersion/ns_mmq_2site.py     Fri Jun 20 
> 09:18:00 2014
> @@ -51,7 +51,7 @@
>
>  # Python module imports.
>  from math import floor
> -from numpy import array, conj, dot, float64, log
> +from numpy import array, conj, complex64, dot, float64, log, multiply, sum
>
>  # relax module imports.
>  from lib.float import isNaN
> @@ -81,6 +81,76 @@
>      matrix[0, 1] = k_BA
>      matrix[1, 0] = k_AB
>      matrix[1, 1] = -k_BA + 1.j*dw - R20B
> +
> +
> +def populate_matrix_rankN(R20A=None, R20B=None, dw=None, k_AB=None, 
> k_BA=None, tcp=None):
> +    """The Bloch-McConnell matrix for 2-site exchange, for rank 
> [NE][NS][NM][NO][ND][2][2].
> +
> +    @keyword R20A:          The transverse, spin-spin relaxation rate for 
> state A.
> +    @type R20A:             numpy float array of rank [NE][NS][NM][NO][ND]
> +    @keyword R20B:          The transverse, spin-spin relaxation rate for 
> state B.
> +    @type R20B:             numpy float array of rank [NE][NS][NM][NO][ND]
> +    @keyword dw:            The combined chemical exchange difference 
> parameters between states A and B in rad/s.  This can be any combination of 
> dw and dwH.
> +    @type dw:               numpy float array of rank [NE][NS][NM][NO][ND]
> +    @keyword k_AB:          The rate of exchange from site A to B (rad/s).
> +    @type k_AB:             float
> +    @keyword k_BA:          The rate of exchange from site B to A (rad/s).
> +    @type k_BA:             float
> +    @keyword tcp:           The tau_CPMG times (1 / 4.nu1).
> +    @type tcp:              numpy float array of rank [NE][NS][NM][NO][ND]
> +    @return:                The relaxation matrix.
> +    @rtype:                 numpy float array of rank 
> [NE][NS][NM][NO][ND][2][2]
> +    """
> +
> +    # Pre-multiply with tcp.
> +    r20a_tcp = R20A * tcp
> +    r20b_tcp = R20B * tcp
> +    k_AB_tcp = k_AB * tcp
> +    k_BA_tcp = k_BA * tcp
> +    # Complex dw.
> +    dw_tcp_C = dw * tcp * 1j
> +
> +    # Fill in the elements.
> +    #matrix[0, 0] = -k_AB - R20A
> +    #matrix[0, 1] = k_BA
> +    #matrix[1, 0] = k_AB
> +    #matrix[1, 1] = -k_BA + 1.j*dw - R20B
> +
> +    m_r20a = array([
> +        [-1.0, 0.0],
> +        [0.0, 0.0],], complex64)
> +
> +    m_r20b = array([
> +        [0.0, 0.0],
> +        [0.0, -1.0],], complex64)
> +
> +    m_k_AB = array([
> +        [-1.0, 0.0],
> +        [1.0, 0.0],], complex64)
> +
> +    m_k_BA = array([
> +        [0.0, 1.0],
> +        [0.0, -1.0],], complex64)
> +
> +    m_dw = array([
> +        [0.0, 0.0],
> +        [0.0, 1.0],], complex64)
> +
> +    # Multiply and expand.
> +    m_r20a_tcp = multiply.outer( r20a_tcp, m_r20a )
> +    m_r20b_tcp = multiply.outer( r20b_tcp, m_r20b )
> +
> +    # Multiply and expand.
> +    m_k_AB_tcp = multiply.outer( k_AB_tcp, m_k_AB )
> +    m_k_BA_tcp = multiply.outer( k_BA_tcp, m_k_BA )
> +
> +    # Multiply and expand.
> +    m_dw_tcp_C = multiply.outer( dw_tcp_C, m_dw )
> +
> +    # Collect matrix.
> +    matrix = (m_r20a_tcp + m_r20b_tcp + m_k_AB_tcp + m_k_BA_tcp + m_dw_tcp_C)
> +
> +    return matrix
>
>
>  def r2eff_ns_mmq_2site_mq(M0=None, F_vector=array([1, 0], float64), m1=None, 
> m2=None, R20A=None, R20B=None, pA=None, dw=None, dwH=None, kex=None, 
> inv_tcpmg=None, tcp=None, back_calc=None, num_points=None, power=None):
> @@ -141,6 +211,10 @@
>      # Extract shape of experiment.
>      NS, NM, NO = num_points.shape
>
> +    # Populate the m1 and m2 matrices (only once per function call for 
> speed).
> +    m1_mat = populate_matrix_rankN(R20A=R20A, R20B=R20B, dw=-dw - dwH, 
> k_AB=k_AB, k_BA=k_BA, tcp=tcp)
> +    m2_mat = populate_matrix_rankN(R20A=R20A, R20B=R20B, dw=dw - dwH, 
> k_AB=k_AB, k_BA=k_BA, tcp=tcp)
> +
>      # Loop over spins.
>      for si in range(NS):
>          # Loop over the spectrometer frequencies.
> @@ -160,6 +234,23 @@
>
>                  # Loop over the time points, back calculating the R2eff 
> values.
>                  for i in range(num_points_i):
> +                    m1_mat_i = m1_mat[si, mi, oi, i]
> +                    m2_mat_i = m2_mat[si, mi, oi, i]
> +
> +                    diff_m1 = abs(sum(m1*tcp[si, mi, oi, i] - m1_mat_i))
> +                    if diff_m1 > 1.0e-06:
> +                        print diff_m1
> +                        print m1*tcp[si, mi, oi, i]
> +                        print m1_mat_i
> +                        print asd
> +
> +                    diff_m2 = abs(sum(m2*tcp[si, mi, oi, i] - m2_mat_i))
> +                    if diff_m2 > 1.0e-06:
> +                        print diff_m2
> +                        print m2*tcp[si, mi, oi, i]
> +                        print m2_mat_i
> +                        print asd
> +
>                      # The M1 and M2 matrices.
>                      M1 = matrix_exponential(m1*tcp[si, mi, oi, i])    # 
> Equivalent to D+.
>                      M2 = matrix_exponential(m2*tcp[si, mi, oi, i])    # 
> Equivalent to Z-.
>
>
> _______________________________________________
> 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