Author: tlinnet Date: Mon May 19 03:20:53 2014 New Revision: 23227 URL: http://svn.gna.org/viewcvs/relax?rev=23227&view=rev Log: Speed-up of model IT99. task #7793: (https://gna.org/task/?7793) Speed-up of dispersion models. Change in speed is: test_hansen_cpmg_data_auto_analysis 9.74s -> 8.330s test_hansen_cpmg_data_to_it99 4.928s -> 3.138s Modified: branches/disp_speed/lib/dispersion/it99.py Modified: branches/disp_speed/lib/dispersion/it99.py URL: http://svn.gna.org/viewcvs/relax/branches/disp_speed/lib/dispersion/it99.py?rev=23227&r1=23226&r2=23227&view=diff ============================================================================== --- branches/disp_speed/lib/dispersion/it99.py (original) +++ branches/disp_speed/lib/dispersion/it99.py Mon May 19 03:20:53 2014 @@ -73,7 +73,7 @@ """ # Python module imports. -from math import sqrt +from numpy import array, isfinite, sqrt, sum def r2eff_IT99(r20=None, pA=None, pB=None, dw=None, tex=None, cpmg_frqs=None, back_calc=None, num_points=None): @@ -109,24 +109,21 @@ # The numerator. numer = padw2 * pB * tex - # Loop over the time points, back calculating the R2eff values. + # The effective rotating frame field. + omega_1eff4 = 2304.0 * cpmg_frqs**4 + + # Denominator. + omega_a2 = sqrt(omega_1eff4 + pa2dw4) + denom = 1.0 + omega_a2 * tex2 + + # R2eff calculation. + R2eff = r20 + 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(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 (to avoid pointless mathematical operations). - if numer == 0.0: - back_calc[i] = r20 - continue - - # The effective rotating frame field. - omega_1eff4 = 2304.0 * cpmg_frqs[i]**4 - - # Denominator. - omega_a2 = sqrt(omega_1eff4 + pa2dw4) - denom = 1.0 + omega_a2 * tex2 - - # Avoid divide by zero. - if denom == 0.0: - back_calc[i] = 1e100 - continue - - # R2eff calculation. - back_calc[i] = r20 + numer / denom + back_calc[i] = R2eff[i]