Author: tlinnet
Date: Mon May 19 03:20:56 2014
New Revision: 23229

URL: http://svn.gna.org/viewcvs/relax?rev=23229&view=rev
Log:
Speed-up of model DPL94.

task #7793: (https://gna.org/task/?7793) Speed-up of dispersion models.

Change in speed is:

test_dpl94_data_to_dpl94
19.412s -> 4.427s

Modified:
    branches/disp_speed/lib/dispersion/dpl94.py

Modified: branches/disp_speed/lib/dispersion/dpl94.py
URL: 
http://svn.gna.org/viewcvs/relax/branches/disp_speed/lib/dispersion/dpl94.py?rev=23229&r1=23228&r2=23229&view=diff
==============================================================================
--- branches/disp_speed/lib/dispersion/dpl94.py (original)
+++ branches/disp_speed/lib/dispersion/dpl94.py Mon May 19 03:20:56 2014
@@ -63,7 +63,7 @@
 """
 
 # Python module imports.
-from math import cos, sin
+from numpy import array, cos, isfinite, sin, sum
 
 
 def r1rho_DPL94(r1rho_prime=None, phi_ex=None, kex=None, theta=None, R1=0.0, 
spin_lock_fields2=None, back_calc=None, num_points=None):
@@ -93,27 +93,24 @@
     # Repetitive calculations (to speed up calculations).
     kex2 = kex**2
 
-    # Loop over the dispersion points, back calculating the R1rho values.
+    # The non-Rex factors.
+    sin_theta2 = sin(theta)**2
+    R1_R2 = R1 * cos(theta)**2  +  r1rho_prime * sin_theta2
+
+    # The numerator.
+    numer = sin_theta2 * phi_ex * kex
+
+    # Denominator.
+    denom = kex2 + spin_lock_fields2
+
+    # R1rho calculation.
+    R1rho = R1_R2 + numer / denom
+
+    # 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 non-Rex factors.
-        sin_theta2 = sin(theta[i])**2
-        R1_R2 = R1 * cos(theta[i])**2  +  r1rho_prime * sin_theta2
-
-        # The numerator.
-        numer = sin_theta2 * phi_ex * kex
-
-        # Catch zeros (to avoid pointless mathematical operations).
-        if numer == 0.0:
-            back_calc[i] = R1_R2
-            continue
-
-        # Denominator.
-        denom = kex2 + spin_lock_fields2[i]
-
-        # Avoid divide by zero.
-        if denom == 0.0:
-            back_calc[i] = 1e100
-            continue
-
-        # R1rho calculation.
-        back_calc[i] = R1_R2 + numer / denom
+        back_calc[i] = R1rho[i]


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

This is the relax-commits mailing list
relax-commits@gna.org

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

Reply via email to