Hi Troels,

Again for this dispersion function, you can use the zero 'denom' check
to avoid all numpy warnings
(http://thread.gmane.org/gmane.science.nmr.relax.scm/20966).

Regards,

Edward



On 19 May 2014 03:20,  <[email protected]> wrote:
> Author: tlinnet
> Date: Mon May 19 03:20:43 2014
> New Revision: 23222
>
> URL: http://svn.gna.org/viewcvs/relax?rev=23222&view=rev
> Log:
> Huge speed-up for model TAP03.
>
> task #7793: (https://gna.org/task/?7793) Speed-up of dispersion models.
>
> The change for running systemtest is:
> test_tp02_data_to_tap03
> 13.869s -> 7.263s
>
> This is won by not checking single values in the R1rho array for math domain
> errors, but calculating all steps, and in one single round check for finite 
> values.
> If just one non-finite value is found, the whole array is returned with a 
> large
> penalty of 1e100.
>
> This makes all calculations be the fastest numpy array way.
>
> Modified:
>     branches/disp_speed/lib/dispersion/tap03.py
>
> Modified: branches/disp_speed/lib/dispersion/tap03.py
> URL: 
> http://svn.gna.org/viewcvs/relax/branches/disp_speed/lib/dispersion/tap03.py?rev=23222&r1=23221&r2=23222&view=diff
> ==============================================================================
> --- branches/disp_speed/lib/dispersion/tap03.py (original)
> +++ branches/disp_speed/lib/dispersion/tap03.py Mon May 19 03:20:43 2014
> @@ -60,7 +60,7 @@
>  """
>
>  # Python module imports.
> -from math import atan2, sin, sqrt
> +from numpy import arctan2, isfinite, sin, sqrt, sum
>
>
>  def r1rho_TAP03(r1rho_prime=None, omega=None, offset=None, pA=None, pB=None, 
> dw=None, kex=None, R1=0.0, spin_lock_fields=None, spin_lock_fields2=None, 
> back_calc=None, num_points=None):
> @@ -105,50 +105,42 @@
>      phi_ex = pA * pB * dw**2
>      numer = phi_ex * kex
>
> -    # Loop over the dispersion points, back calculating the R1rho values.
> +    # The factors.
> +    da = Wa - offset    # Offset of spin-lock from A.
> +    db = Wb - offset    # Offset of spin-lock from B.
> +    d = W - offset      # Offset of spin-lock from pop-average.
> +
> +    # The gamma factor.
> +    sigma = pB*da + pA*db
> +    sigma2 = sigma**2
> +    gamma = 1.0 + phi_ex*(sigma2 - kex2 + spin_lock_fields2) / (sigma2 + 
> kex2 + spin_lock_fields2)**2
> +
> +    # Special omega values.
> +    waeff2 = gamma*spin_lock_fields2 + da**2     # Effective field at A.
> +    wbeff2 = gamma*spin_lock_fields2 + db**2     # Effective field at B.
> +    weff2 = gamma*spin_lock_fields2 + d**2       # Effective field at 
> pop-average.
> +
> +    # The rotating frame flip angle.
> +    theta = arctan2(spin_lock_fields, d)
> +    hat_theta = arctan2(sqrt(gamma)*spin_lock_fields, d)
> +
> +    # Repetitive calculations (to speed up calculations).
> +    sin_theta2 = sin(theta)**2
> +    hat_sin_theta2 = sin(hat_theta)**2
> +    R1_cos_theta2 = R1 * (1.0 - sin_theta2)
> +    R1rho_prime_sin_theta2 = r1rho_prime * sin_theta2
> +
> +    # Denominator.
> +    denom = waeff2*wbeff2/weff2 + kex2 - 2.0*hat_sin_theta2*phi_ex + (1.0 - 
> gamma)*spin_lock_fields2
> +
> +    # R1rho calculation.
> +    R1rho = R1_cos_theta2 + R1rho_prime_sin_theta2 + hat_sin_theta2 * numer 
> / denom / gamma
> +
> +    # Catch errors, taking a sum over array is the fastest way to check for
> +    # +/- inf (infinity) and nan (not a number).
> +    if not isfinite(sum(R1rho)):
> +        R1rho = array([1e100]*num_points)
> +
> +    # Parse back the value to update the back_calc class object.
>      for i in range(num_points):
> -        # The factors.
> -        da = Wa - offset    # Offset of spin-lock from A.
> -        db = Wb - offset    # Offset of spin-lock from B.
> -        d = W - offset      # Offset of spin-lock from pop-average.
> -
> -        # The gamma factor.
> -        sigma = pB*da + pA*db
> -        sigma2 = sigma**2
> -        gamma = 1.0 + phi_ex*(sigma2 - kex2 + spin_lock_fields2[i]) / 
> (sigma2 + kex2 + spin_lock_fields2[i])**2
> -
> -        # Bad gamma.
> -        if gamma < 0.0:
> -            back_calc[i] = 1e100
> -            continue
> -
> -        # Special omega values.
> -        waeff2 = gamma*spin_lock_fields2[i] + da**2     # Effective field at 
> A.
> -        wbeff2 = gamma*spin_lock_fields2[i] + db**2     # Effective field at 
> B.
> -        weff2 = gamma*spin_lock_fields2[i] + d**2       # Effective field at 
> pop-average.
> -
> -        # The rotating frame flip angle.
> -        theta = atan2(spin_lock_fields[i], d)
> -        hat_theta = atan2(sqrt(gamma)*spin_lock_fields[i], d)
> -
> -        # Repetitive calculations (to speed up calculations).
> -        sin_theta2 = sin(theta)**2
> -        hat_sin_theta2 = sin(hat_theta)**2
> -        R1_cos_theta2 = R1 * (1.0 - sin_theta2)
> -        R1rho_prime_sin_theta2 = r1rho_prime * sin_theta2
> -
> -        # Catch zeros (to avoid pointless mathematical operations).
> -        if numer == 0.0:
> -            back_calc[i] = R1_cos_theta2 + R1rho_prime_sin_theta2
> -            continue
> -
> -        # Denominator.
> -        denom = waeff2*wbeff2/weff2 + kex2 - 2.0*hat_sin_theta2*phi_ex + 
> (1.0 - gamma)*spin_lock_fields2[i]
> -
> -        # Avoid divide by zero.
> -        if denom == 0.0:
> -            back_calc[i] = 1e100
> -            continue
> -
> -        # R1rho calculation.
> -        back_calc[i] = R1_cos_theta2 + R1rho_prime_sin_theta2 + 
> hat_sin_theta2 * numer / denom / gamma
> +        back_calc[i] = R1rho[i]
>
>
> _______________________________________________
> 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