mailRe: r23226 - /branches/disp_speed/lib/dispersion/lm63.py


Others Months | Index by Date | Thread Index
>>   [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Header


Content

Posted by Edward d'Auvergne on May 19, 2014 - 10:36:
Hi Troels,

In this case, do we even need the isfinite() check?  Can this equation
ever calculate R2eff to be Inf?  The only case I can think of is when
kex is 0.0, as rex = phi_ex/kex.  Therefore you could replace this
check with:

if kex == 0.0:
    back_calc[:] = array([1e100]*num_points)
    return

This can go at the very start of the function too.  This was the
reason for the original kex check deleted in this commit.

Regards,

Edward




On 19 May 2014 03:20,  <tlinnet@xxxxxxxxxxxxx> wrote:
Author: tlinnet
Date: Mon May 19 03:20:51 2014
New Revision: 23226

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

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

Change in systemtest was:
test_hansen_cpmg_data_auto_analysis
13.731s -> 9.971s

test_hansen_cpmg_data_auto_analysis_r2eff
13.370s -> 9.510s

test_hansen_cpmg_data_to_lm63
3.254s -> 2.080s

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

Modified: branches/disp_speed/lib/dispersion/lm63.py
URL: 
http://svn.gna.org/viewcvs/relax/branches/disp_speed/lib/dispersion/lm63.py?rev=23226&r1=23225&r2=23226&view=diff
==============================================================================
--- branches/disp_speed/lib/dispersion/lm63.py  (original)
+++ branches/disp_speed/lib/dispersion/lm63.py  Mon May 19 03:20:51 2014
@@ -64,7 +64,7 @@
 """

 # Python module imports.
-from math import tanh
+from numpy import isfinite, sum, tanh


 def r2eff_LM63(r20=None, phi_ex=None, kex=None, cpmg_frqs=None, 
back_calc=None, num_points=None):
@@ -91,16 +91,14 @@
     rex = phi_ex / kex
     kex_4 = 4.0 / kex

-    # Loop over the time points, back calculating the R2eff values.
+    # Calculate R2eff.
+    R2eff = r20 + rex * (1.0 - kex_4 * cpmg_frqs * tanh(kex / (4.0 * 
cpmg_frqs)))
+
+    # 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(R2eff)):
+        R2eff = array([1e100]*num_points)
+
+    # Parse back the value to update the back_calc class object.
     for i in range(num_points):
-        # Catch zeros.
-        if phi_ex == 0.0:
-            back_calc[i] = r20
-
-        # Avoid divide by zero.
-        elif kex == 0.0:
-            back_calc[i] = 1e100
-
-        # The full formula.
-        else:
-            back_calc[i] = r20 + rex * (1.0 - kex_4 * cpmg_frqs[i] * 
tanh(kex / (4.0 * cpmg_frqs[i])))
+        back_calc[i] = R2eff[i]


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

This is the relax-commits mailing list
relax-commits@xxxxxxx

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



Related Messages


Powered by MHonArc, Updated Mon May 19 10:40:14 2014