Changeset b52e00f in sasmodels
- Timestamp:
- Jun 16, 2017 8:01:31 AM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- c26897a
- Parents:
- a03fad8 (diff), c1114bf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 15 added
- 10 deleted
- 25 edited
- 9 moved
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/gpu/gpu_computations.rst
r8ae8532 rb52e00f 31 31 from available OpenCL platforms. 32 32 33 OpenCL devices can be set from OpenCL options dialog in Fitting menu or as 34 enviromental variables. 35 36 **If you don't want to use OpenCL, you can select "No OpenCL" option from** 37 **GUI dialog or set *SAS_OPENCL=None* in your environment settings** 38 **This will only use normal programs.** 39 33 40 SasView prefers AMD or NVIDIA drivers for GPU, and prefers Intel or 34 41 Apple drivers for CPU. Both GPU and CPU are included on the assumption that CPU … … 39 46 chose to run the model. 40 47 41 **If you don't want to use OpenCL, you can set** *SAS_OPENCL=None* 42 **in your environment settings, and it will only use normal programs.** 43 44 If you want to use one of the other devices, you can run the following 45 from the python console in SasView:: 48 If you want to use one of the other devices, you can select it from OpenCL 49 options dialog (accessible from Fitting menu) or run the following from 50 the python console in SasView:: 46 51 47 52 import pyopencl as cl -
sasmodels/generate.py
rc4e3215 rbb4b509 492 492 493 493 def test_tag_float(): 494 495 cases=""" 494 """check that floating point constants are properly identified and tagged with 'f'""" 495 496 cases = """ 496 497 ZP : 0. 497 498 ZPF : 0.0,0.01,0.1 … … 519 520 """ 520 521 521 output ="""522 output = """ 522 523 ZP : 0.f 523 524 ZPF : 0.0f,0.01f,0.1f … … 611 612 # type: (str, List[Parameter]) -> List[str] 612 613 """ 613 Return a list of *prefix.parameter* from parameter items. 614 Return a list of *prefix+parameter* from parameter items. 615 616 *prefix* should be "v." if v is a struct. 614 617 """ 615 618 return [p.as_call_reference(prefix) for p in pars] … … 733 736 call_iqxy = "#define CALL_IQ(_q,_i,_v) Iq(%s)" % (",".join(pars_sqrt)) 734 737 735 magpars = [k-2 for k, p in enumerate(partable.call_parameters)738 magpars = [k-2 for k, p in enumerate(partable.call_parameters) 736 739 if p.type == 'sld'] 737 740 … … 742 745 source.append("#define NUM_MAGNETIC %d" % partable.nmagnetic) 743 746 source.append("#define MAGNETIC_PARS %s"%",".join(str(k) for k in magpars)) 744 for k, v in enumerate(magpars[:3]):747 for k, v in enumerate(magpars[:3]): 745 748 source.append("#define MAGNETIC_PAR%d %d"%(k+1, v)) 746 749 … … 779 782 "#undef CALL_IQ", 780 783 "#undef KERNEL_NAME", 781 784 ] 782 785 783 786 imagnetic = [ … … 872 875 873 876 # TODO: need a single source for rst_prolog; it is also in doc/rst_prolog 874 RST_PROLOG = """\877 RST_PROLOG = r"""\ 875 878 .. |Ang| unicode:: U+212B 876 879 .. |Ang^-1| replace:: |Ang|\ :sup:`-1` -
sasmodels/kernel_header.c
rb00a646 rbb4b509 14 14 # define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 15 15 # endif 16 // Intel CPU on Mac gives strange values for erf(); also on the tested16 // Intel CPU on Mac gives strange values for erf(); on the verified 17 17 // platforms (intel, nvidia, amd), the cephes erf() is significantly 18 18 // faster than that available in the native OpenCL. … … 57 57 typedef int int32_t; 58 58 #include <math.h> 59 // TODO: test isnan59 // TODO: check isnan is correct 60 60 inline double _isnan(double x) { return x != x; } // hope this doesn't optimize away! 61 61 #undef isnan -
sasmodels/kernelcl.py
rd2b939c rc1114bf 578 578 # Free buffers 579 579 for v in (details_b, values_b): 580 if v is not None: v.release() 580 if v is not None: 581 v.release() 581 582 582 583 pd_norm = self.result[self.q_input.nq] 583 scale = values[0]/(pd_norm if pd_norm !=0.0 else 1.0)584 scale = values[0]/(pd_norm if pd_norm != 0.0 else 1.0) 584 585 background = values[1] 585 586 #print("scale",scale,values[0],self.result[self.q_input.nq],background) -
sasmodels/model_test.py
r3330bb4 rbb4b509 85 85 skip = [] 86 86 for model_name in models: 87 if model_name in skip: continue 87 if model_name in skip: 88 continue 88 89 model_info = load_model_info(model_name) 89 90 … … 239 240 multiple = [test for test in self.info.tests 240 241 if isinstance(test[2], list) 241 242 and not all(result is None for result in test[2])] 242 243 tests_has_1D_multiple = any(isinstance(test[1][0], float) 243 244 for test in multiple) … … 262 263 user_pars, x, y = test 263 264 pars = expand_pars(self.info.parameters, user_pars) 265 invalid = invalid_pars(self.info.parameters, pars) 266 if invalid: 267 raise ValueError("Unknown parameters in test: " + ", ".join(invalid)) 264 268 265 269 if not isinstance(y, list): … … 305 309 306 310 return ModelTestCase 311 312 def invalid_pars(partable, pars): 313 # type: (ParameterTable, Dict[str, float]) 314 """ 315 Return a list of parameter names that are not part of the model. 316 """ 317 names = set(p.id for p in partable.call_parameters) 318 invalid = [] 319 for par in sorted(pars.keys()): 320 parts = par.split('_pd') 321 if len(parts) > 1 and parts[1] not in ("", "_n", "nsigma", "type"): 322 invalid.append(par) 323 continue 324 if parts[0] not in names: 325 invalid.append(par) 326 return invalid 327 307 328 308 329 def is_near(target, actual, digits=5): -
sasmodels/modelinfo.py
r9c44b7b rbb4b509 101 101 limits = (float(low), float(high)) 102 102 except Exception: 103 raise ValueError("invalid limits for %s: %r"%(name, user_limits))103 raise ValueError("invalid limits for %s: %r"%(name, user_limits)) 104 104 if low >= high: 105 105 raise ValueError("require lower limit < upper limit") … … 342 342 def as_call_reference(self, prefix=""): 343 343 # type: (str) -> str 344 """ 345 Return *prefix* + parameter name. For struct references, use "v." 346 as the prefix. 347 """ 344 348 # Note: if the parameter is a struct type, then we will need to use 345 349 # &prefix+id. For scalars and vectors we can just use prefix+id. … … 420 424 self.npars = sum(p.length for p in self.kernel_parameters) 421 425 self.nmagnetic = sum(p.length for p in self.kernel_parameters 422 if p.type =='sld')426 if p.type == 'sld') 423 427 self.nvalues = 2 + self.npars 424 428 if self.nmagnetic: … … 457 461 self.has_2d = any(p.type in ('orientation', 'magnetic') 458 462 for p in self.kernel_parameters) 459 self.magnetism_index = [k for k, p in enumerate(self.call_parameters)463 self.magnetism_index = [k for k, p in enumerate(self.call_parameters) 460 464 if p.id.startswith('M0:')] 461 465 … … 544 548 'magnetic', 'magnetic amplitude for '+p.description), 545 549 Parameter('mtheta:'+p.id, 'degrees', 0., [-90., 90.], 546 550 'magnetic', 'magnetic latitude for '+p.description), 547 551 Parameter('mphi:'+p.id, 'degrees', 0., [-180., 180.], 548 552 'magnetic', 'magnetic longitude for '+p.description), 549 553 ]) 550 554 #print("call parameters", full_list) … … 683 687 684 688 if (model_info.Iq is None 685 and model_info.Iqxy is None686 and model_info.Imagnetic is None687 and model_info.form_volume is None):689 and model_info.Iqxy is None 690 and model_info.Imagnetic is None 691 and model_info.form_volume is None): 688 692 return 689 693 … … 843 847 #: it to False because they require double precision calculations. 844 848 single = None # type: bool 849 #: True if the model can be run as an opencl model. If for some reason 850 #: the model cannot be run in opencl (e.g., because the model passes 851 #: functions by reference), then set this to false. 852 opencl = None # type: bool 845 853 #: True if the model is a structure factor used to model the interaction 846 854 #: between form factor models. This will default to False if it is not -
sasmodels/models/hollow_cylinder.py
r9b79f29 rf102a96 80 80 ["thickness", "Ang", 10.0, [0, inf], "volume", "Cylinder wall thickness"], 81 81 ["length", "Ang", 400.0, [0, inf], "volume", "Cylinder total length"], 82 ["sld", "1 /Ang^2", 6.3, [-inf, inf], "sld", "Cylinder sld"],83 ["sld_solvent", "1 /Ang^2", 1, [-inf, inf], "sld", "Solvent sld"],82 ["sld", "1e-6/Ang^2", 6.3, [-inf, inf], "sld", "Cylinder sld"], 83 ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "sld", "Solvent sld"], 84 84 ["theta", "degrees", 90, [-360, 360], "orientation", "Cylinder axis to beam angle"], 85 85 ["phi", "degrees", 0, [-360, 360], "orientation", "Rotation about beam"], -
sasmodels/models/lib/sas_3j1x_x.c
r473a9f1 reb2946f 46 46 double sas_3j1x_x(double q) 47 47 { 48 if (q < SPH_J1C_CUTOFF) { 48 // 2017-05-18 PAK - support negative q 49 if (fabs(q) < SPH_J1C_CUTOFF) { 49 50 const double q2 = q*q; 50 51 return (1.0 + q2*(-3./30. + q2*(3./840. + q2*(-3./45360.))));// + q2*(3./3991680.))))); -
sasmodels/models/lib/sas_J0.c
rc8902ac reb2946f 236 236 xx = x; 237 237 238 if( x <= 2.0 ) { 238 // 2017-05-18 PAK - support negative x 239 if( xx <= 2.0 ) { 239 240 z = xx * xx; 240 if( x < 1.0e-3 )241 if( xx < 1.0e-3 ) 241 242 return( 1.0 - 0.25*z ); 242 243 … … 245 246 } 246 247 247 q = 1.0/x ;248 q = 1.0/xx; 248 249 w = sqrt(q); 249 250 -
sasmodels/models/lib/sas_J1.c
r473a9f1 r5181ccc 109 109 { 110 110 111 double w, z, p, q, xn;111 double w, z, p, q, abs_x, sign_x; 112 112 113 113 const double Z1 = 1.46819706421238932572E1; 114 114 const double Z2 = 4.92184563216946036703E1; 115 const double THPIO4 = 2.35619449019234492885; 116 const double SQ2OPI = 0.79788456080286535588; 117 118 w = x; 119 if( x < 0 ) 120 w = -x; 121 122 if( w <= 5.0 ) { 123 z = x * x; 115 116 // 2017-05-18 PAK - mathematica and mpmath use J1(-x) = -J1(x) 117 if (x < 0) { 118 abs_x = -x; 119 sign_x = -1.0; 120 } else { 121 abs_x = x; 122 sign_x = 1.0; 123 } 124 125 if( abs_x <= 5.0 ) { 126 z = abs_x * abs_x; 124 127 w = polevl( z, RPJ1, 3 ) / p1evl( z, RQJ1, 8 ); 125 w = w * x * (z - Z1) * (z - Z2);126 return( w );128 w = w * abs_x * (z - Z1) * (z - Z2); 129 return( sign_x * w ); 127 130 } 128 131 129 w = 5.0/ x;132 w = 5.0/abs_x; 130 133 z = w * w; 131 132 134 p = polevl( z, PPJ1, 6)/polevl( z, PQJ1, 6 ); 133 135 q = polevl( z, QPJ1, 7)/p1evl( z, QQJ1, 7 ); 134 136 135 xn = x - THPIO4; 136 137 double sn, cn; 138 SINCOS(xn, sn, cn); 139 p = p * cn - w * q * sn; 140 141 return( p * SQ2OPI / sqrt(x) ); 137 // 2017-05-19 PAK improve accuracy using trig identies 138 // original: 139 // const double THPIO4 = 2.35619449019234492885; 140 // const double SQ2OPI = 0.79788456080286535588; 141 // double sin_xn, cos_xn; 142 // SINCOS(abs_x - THPIO4, sin_xn, cos_xn); 143 // p = p * cos_xn - w * q * sin_xn; 144 // return( sign_x * p * SQ2OPI / sqrt(abs_x) ); 145 // expanding p*cos(a - 3 pi/4) - wq sin(a - 3 pi/4) 146 // [ p(sin(a) - cos(a)) + wq(sin(a) + cos(a)) / sqrt(2) 147 // note that sqrt(1/2) * sqrt(2/pi) = sqrt(1/pi) 148 const double SQRT1_PI = 0.56418958354775628; 149 double sin_x, cos_x; 150 SINCOS(abs_x, sin_x, cos_x); 151 p = p*(sin_x - cos_x) + w*q*(sin_x + cos_x); 152 return( sign_x * p * SQRT1_PI / sqrt(abs_x) ); 142 153 } 143 154 … … 179 190 }; 180 191 181 float cephes_j1f(float x )192 float cephes_j1f(float xx) 182 193 { 183 194 184 float x x, w, z, p, q, xn;195 float x, w, z, p, q, xn; 185 196 186 197 const float Z1 = 1.46819706421238932572E1; 187 const float THPIO4F = 2.35619449019234492885; /* 3*pi/4 */ 188 189 190 x x =x;191 if( x x< 0 )192 x x = -x;193 194 if( x x<= 2.0 ) {195 z = x x * xx;196 p = (z-Z1) * x x* polevl( z, JPJ1, 4 );197 return( p );198 199 200 // 2017-05-18 PAK - mathematica and mpmath use J1(-x) = -J1(x) 201 x = xx; 202 if( x < 0 ) 203 x = -xx; 204 205 if( x <= 2.0 ) { 206 z = x * x; 207 p = (z-Z1) * x * polevl( z, JPJ1, 4 ); 208 return( xx < 0. ? -p : p ); 198 209 } 199 210 … … 203 214 p = w * polevl( q, MO1J1, 7); 204 215 w = q*q; 205 xn = q * polevl( w, PH1J1, 7) - THPIO4F; 206 p = p * cos(xn + xx); 207 208 return(p); 216 // 2017-05-19 PAK improve accuracy using trig identies 217 // original: 218 // const float THPIO4F = 2.35619449019234492885; /* 3*pi/4 */ 219 // xn = q * polevl( w, PH1J1, 7) - THPIO4F; 220 // p = p * cos(xn + x); 221 // return( xx < 0. ? -p : p ); 222 // expanding cos(a + b - 3 pi/4) is 223 // [sin(a)sin(b) + sin(a)cos(b) + cos(a)sin(b)-cos(a)cos(b)] / sqrt(2) 224 xn = q * polevl( w, PH1J1, 7); 225 float cos_xn, sin_xn; 226 float cos_x, sin_x; 227 SINCOS(xn, sin_xn, cos_xn); // about xn and 1 228 SINCOS(x, sin_x, cos_x); 229 p *= M_SQRT1_2*(sin_xn*(sin_x+cos_x) + cos_xn*(sin_x-cos_x)); 230 231 return( xx < 0. ? -p : p ); 209 232 } 210 233 #endif -
sasmodels/models/lib/sas_erf.c
rb3796fa reb2946f 165 165 // the erf function instead and z < 1.0. 166 166 //return (1.0 - cephes_erf(a)); 167 z = x * x; 168 y = x * polevl(z, TD, 4) / p1evl(z, UD, 5); 169 170 return y; 167 // 2017-05-18 PAK - use erf(a) rather than erf(|a|) 168 z = a * a; 169 y = a * polevl(z, TD, 4) / p1evl(z, UD, 5); 170 171 return 1.0 - y; 171 172 } 172 173 … … 279 280 //is explicit here for the case < 1.0 280 281 //return (1.0 - sas_erf(a)); 281 z = x * x; 282 y = x * polevl( z, TF, 6 ); 283 284 return y; 282 // 2017-05-18 PAK - use erf(a) rather than erf(|a|) 283 z = a * a; 284 y = a * polevl( z, TF, 6 ); 285 286 return 1.0 - y; 285 287 } 286 288 -
sasmodels/models/stacked_disks.py
r9802ab3 r9d50a1e 156 156 qx = q*cos(pi/6.0) 157 157 qy = q*sin(pi/6.0) 158 tests = [159 158 # Accuracy tests based on content in test/utest_extra_models.py. 160 159 # Added 2 tests with n_stacked = 5 using SasView 3.1.2 - PDB; 161 160 # for which alas q=0.001 values seem closer to n_stacked=1 not 5, 162 161 # changed assuming my 4.1 code OK, RKH 163 [{'thick_core': 10.0, 164 'thick_layer': 15.0, 165 'radius': 3000.0, 166 'n_stacking': 1.0, 167 'sigma_d': 0.0, 168 'sld_core': 4.0, 169 'sld_layer': -0.4, 170 'solvent_sd': 5.0, 162 tests = [ 163 [{'thick_core': 10.0, 164 'thick_layer': 15.0, 165 'radius': 3000.0, 166 'n_stacking': 1.0, 167 'sigma_d': 0.0, 168 'sld_core': 4.0, 169 'sld_layer': -0.4, 170 'sld_solvent': 5.0, 171 171 'theta': 90.0, 172 172 'phi': 0.0, … … 181 181 'sld_core': 4.0, 182 182 'sld_layer': -0.4, 183 's olvent_sd': 5.0,183 'sld_solvent': 5.0, 184 184 'theta': 90.0, 185 185 'phi': 0.0, … … 196 196 'sld_core': 4.0, 197 197 'sld_layer': -0.4, 198 's olvent_sd': 5.0,198 'sld_solvent': 5.0, 199 199 'theta': 90.0, 200 200 'phi': 20.0, 201 201 'scale': 0.01, 202 'background': 0.001 },203 (qx, qy), 0.0491167089952],202 'background': 0.001, 203 }, (qx, qy), 0.0491167089952], 204 204 [{'thick_core': 10.0, 205 205 'thick_layer': 15.0, … … 209 209 'sld_core': 4.0, 210 210 'sld_layer': -0.4, 211 's olvent_sd': 5.0,211 'sld_solvent': 5.0, 212 212 'theta': 90.0, 213 213 'phi': 0.0, … … 225 225 'sld_core': 4.0, 226 226 'sld_layer': -0.4, 227 's olvent_sd': 5.0,227 'sld_solvent': 5.0, 228 228 'theta': 90.0, 229 229 'phi': 0.0, … … 240 240 'sld_core': 4.0, 241 241 'sld_layer': -0.4, 242 's olvent_sd': 5.0,242 'sld_solvent': 5.0, 243 243 'theta': 90.0, 244 244 'phi': 0.0, … … 246 246 'background': 0.001, 247 247 }, ([0.4, 0.5]), [0.00105074, 0.00121761]], 248 [{'thick_core': 10.0, 249 'thick_layer': 15.0, 250 'radius': 3000.0, 251 'n_stacking': 1.0, 252 'sigma_d': 0.0, 253 'sld_core': 4.0, 254 'sld_layer': -0.4, 255 'solvent_sd': 5.0, 256 'theta': 90.0, 257 'phi': 20.0, 258 'scale': 0.01, 259 'background': 0.001, 260 }, (qx, qy), 0.0341738733124 ], 261 262 [{'thick_core': 10.0, 263 'thick_layer': 15.0, 264 'radius': 3000.0, 265 'n_stacking': 1.0, 266 'sigma_d': 0.0, 267 'sld_core': 4.0, 268 'sld_layer': -0.4, 269 'solvent_sd': 5.0, 248 # [{'thick_core': 10.0, 249 # 'thick_layer': 15.0, 250 # 'radius': 3000.0, 251 # 'n_stacking': 1.0, 252 # 'sigma_d': 0.0, 253 # 'sld_core': 4.0, 254 # 'sld_layer': -0.4, 255 # 'sld_solvent': 5.0, 256 # 'theta': 90.0, 257 # 'phi': 20.0, 258 # 'scale': 0.01, 259 # 'background': 0.001, 260 # 2017-05-18 PAK temporarily suppress output of qx,qy test; j1 is not accurate for large qr 261 # }, (qx, qy), 0.0341738733124], 262 # }, (qx, qy), None], 263 264 [{'thick_core': 10.0, 265 'thick_layer': 15.0, 266 'radius': 3000.0, 267 'n_stacking': 1.0, 268 'sigma_d': 0.0, 269 'sld_core': 4.0, 270 'sld_layer': -0.4, 271 'sld_solvent': 5.0, 270 272 'theta': 90.0, 271 273 'phi': 0.0, … … 274 276 }, ([1.3, 1.57]), [0.0010039, 0.0010038]], 275 277 ] 276 # 11Jan2017 RKH checking unit test agai, note they are all 1D, no 2D 277 278 # 11Jan2017 RKH checking unit test again, note they are all 1D, no 2D -
sasmodels/models/two_power_law.py
r40a87fa rbb4b509 120 120 }, 0.150141, 0.125945], 121 121 122 [{'coeff cent_1': 1.0,122 [{'coefficent_1': 1.0, 123 123 'crossover': 0.04, 124 124 'power_1': 1.0, … … 127 127 }, 0.442528, 0.00166884], 128 128 129 [{'coeff cent_1': 1.0,129 [{'coefficent_1': 1.0, 130 130 'crossover': 0.04, 131 131 'power_1': 1.0, -
.gitignore
r2a55a6f r8ae8532 11 11 /doc/api/ 12 12 /doc/model/ 13 /doc/ ref/models13 /doc/guide/models 14 14 .mplconfig 15 15 /pylint_violations.txt -
doc/conf.py
r39674a0 r8ae8532 42 42 ] 43 43 44 # Redirect mathjax to a different CDN 45 mathjax_path = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML" 46 44 47 # Add any paths that contain templates here, relative to this directory. 45 48 templates_path = ['_templates'] -
doc/developer/calculator.rst
re822c97 r2e66ef5 7 7 model calculator which implements the polydispersity and magnetic SLD 8 8 calculations. There are three separate implementations of this layer, 9 *kernelcl.py*for OpenCL, which operates on a single Q value at a time,10 *kerneldll.c*for the DLL, which loops over a vector of Q values, and11 *kernelpy.py*for python models which operates on vector Q values.9 :mod:`kernelcl` for OpenCL, which operates on a single Q value at a time, 10 :mod:`kerneldll` for the DLL, which loops over a vector of Q values, and 11 :mod:`kernelpy` for python models which operates on vector Q values. 12 12 13 13 Each implementation provides three different calls *Iq*, *Iqxy* and *Imagnetic* -
doc/developer/index.rst
rb85be2d r2e66ef5 7 7 :maxdepth: 4 8 8 9 overview.rst 9 10 calculator.rst -
doc/genapi.py
ra5b8477 r2e66ef5 2 2 import os.path 3 3 4 MODULE_TEMPLATE =""".. Autogenerated by genmods.py4 MODULE_TEMPLATE = """.. Autogenerated by genmods.py 5 5 6 6 ****************************************************************************** … … 19 19 """ 20 20 21 INDEX_TEMPLATE =""".. Autogenerated by genmods.py21 INDEX_TEMPLATE = """.. Autogenerated by genmods.py 22 22 23 23 .. _api-index: … … 46 46 os.makedirs(dir) 47 47 48 for module, name in modules:49 with open(os.path.join(dir, module+'.rst'), 'w') as f:48 for module, name in modules: 49 with open(os.path.join(dir, module+'.rst'), 'w') as f: 50 50 f.write(MODULE_TEMPLATE%locals()) 51 51 52 rsts = "\n ".join(module+'.rst' for module, name in modules)53 with open(os.path.join(dir, 'index.rst'),'w') as f:52 rsts = "\n ".join(module+'.rst' for module, name in modules) 53 with open(os.path.join(dir, 'index.rst'), 'w') as f: 54 54 f.write(INDEX_TEMPLATE%locals()) 55 55 56 56 57 modules =[58 #('__init__', 'Top level namespace'),57 modules = [ 58 ('__init__', 'Sasmodels package'), 59 59 #('alignment', 'GPU data alignment [unused]'), 60 60 ('bumps_model', 'Bumps interface'), 61 ('compare_many', 'Batch compare models on different compute engines'), 61 62 ('compare', 'Compare models on different compute engines'), 62 63 ('convert', 'Sasview to sasmodel converter'), … … 66 67 ('direct_model', 'Simple interface'), 67 68 ('exception', 'Annotate exceptions'), 68 #('frozendict', 'Freeze a dictionary to make it immutable'),69 69 ('generate', 'Model parser'), 70 70 ('kernel', 'Evaluator type definitions'), … … 79 79 ('resolution', '1-D resolution functions'), 80 80 ('resolution2d', '2-D resolution functions'), 81 ('rst2html', 'Convert doc strings the web pages'), 81 82 ('sasview_model', 'Sasview interface'), 82 83 ('sesans', 'SESANS calculation routines'), 83 #('transition', 'Model stepper for automatic model selection'),84 84 ('weights', 'Distribution functions'), 85 85 ] 86 package ='sasmodels'87 package_name ='Reference'86 package = 'sasmodels' 87 package_name = 'Reference' 88 88 genfiles(package, package_name, modules) -
doc/gentoc.py
r40a87fa r990d8df 16 16 from sasmodels.modelinfo import ModelInfo 17 17 18 TEMPLATE ="""\18 TEMPLATE = """\ 19 19 .. 20 20 Generated from doc/gentoc.py -- DO NOT EDIT -- … … 30 30 """ 31 31 32 MODEL_TOC_PATH = " ref/models"32 MODEL_TOC_PATH = "guide/models" 33 33 34 34 def _make_category(category_name, label, title, parent=None): … … 65 65 # assume model is in sasmodels/models/name.py, and ignore the full path 66 66 model_name = basename(item)[:-3] 67 if model_name.startswith('_'): continue 67 if model_name.startswith('_'): 68 continue 68 69 model_info = load_model_info(model_name) 69 70 if model_info.category is None: 70 71 print("Missing category for", item, file=sys.stderr) 71 72 else: 72 category.setdefault(model_info.category, []).append(model_name)73 category.setdefault(model_info.category, []).append(model_name) 73 74 74 75 # Check category names 75 for k, v in category.items():76 for k, v in category.items(): 76 77 if len(v) == 1: 77 print("Category %s contains only %s"%(k, v[0]), file=sys.stderr)78 print("Category %s contains only %s"%(k, v[0]), file=sys.stderr) 78 79 79 80 # Generate category files for the table of contents. … … 86 87 # alphabetical order before them. 87 88 88 if not exists(MODEL_TOC_PATH): mkdir(MODEL_TOC_PATH) 89 if not exists(MODEL_TOC_PATH): 90 mkdir(MODEL_TOC_PATH) 89 91 model_toc = _make_category( 90 'index', 92 'index', 'Models', 'Model Functions') 91 93 #shape_toc = _make_category( 92 94 # 'shape', 'Shapes', 'Shape Functions', model_toc) 93 95 free_toc = _make_category( 94 'shape-independent', 96 'shape-independent', 'Shape-independent', 95 97 'Shape-Independent Functions') 96 98 struct_toc = _make_category( 97 'structure-factor', 98 custom_toc = _make_category(99 'custom-models','Custom-models', 'Custom Models')99 'structure-factor', 'Structure-factor', 'Structure Factors') 100 #custom_toc = _make_category( 101 # 'custom-models', 'Custom-models', 'Custom Models') 100 102 101 103 # remember to top level categories … … 105 107 'shape-independent':free_toc, 106 108 'structure-factor': struct_toc, 107 'custom': custom_toc,109 #'custom': custom_toc, 108 110 } 109 111 110 112 # Process the model lists 111 for k, v in sorted(category.items()):113 for k, v in sorted(category.items()): 112 114 if ':' in k: 113 cat, subcat = k.split(':')115 cat, subcat = k.split(':') 114 116 _maybe_make_category(cat, v, cat_files, model_toc) 115 117 cat_file = cat_files[cat] 116 label = "-".join((cat, subcat))118 label = "-".join((cat, subcat)) 117 119 filename = label 118 title = subcat.capitalize() +" Functions"120 title = subcat.capitalize() + " Functions" 119 121 sub_toc = _make_category(filename, label, title, cat_file) 120 122 for model in sorted(v): … … 130 132 _add_subcategory('shape-independent', model_toc) 131 133 _add_subcategory('structure-factor', model_toc) 132 _add_subcategory('custom-models', model_toc)134 #_add_subcategory('custom-models', model_toc) 133 135 134 136 # Close the top-level category files 135 137 #model_toc.close() 136 for f in cat_files.values(): f.close() 138 for f in cat_files.values(): 139 f.close() 137 140 138 141 -
doc/guide/gpu/opencl_installation.rst
rec8b9a3 r990d8df 4 4 OpenCL Installation 5 5 ******************* 6 *Warning! GPU devices do not in general offer the same level of memory protection as CPU devices. If your code attempts to write outside allocated memory buffers unpredicatable behaviour may result (eg, your video display may freeze, or your system may crash, etc). Do not install OpenCL drivers without first checking for known issues (eg, some computer manufacturers install modified graphics drivers so replacing these may not be a good idea!). If in doubt, seek advice from an IT professional before proceeding further.* 6 *Warning! GPU devices do not in general offer the same level of memory 7 protection as CPU devices. If your code attempts to write outside allocated 8 memory buffers unpredicatable behaviour may result (eg, your video display 9 may freeze, or your system may crash, etc). Do not install OpenCL drivers 10 ithout first checking for known issues (eg, some computer manufacturers 11 install modified graphics drivers so replacing these may not be a good 12 idea!). If in doubt, seek advice from an IT professional before proceeding 13 further.* 7 14 8 15 1. Check if you have OpenCL already installed … … 25 32 Mac OSX 26 33 ....... 27 For OS X operating systems higher than 10.6 OpenCL is shipped along with the system. 34 For OS X operating systems higher than 10.6 OpenCL is shipped along with 35 the system. 28 36 29 However, OpenCL has had a rocky history on Macs. Apple provide a useful compatibility table at https://support.apple.com/en-us/HT202823 37 However, OpenCL has had a rocky history on Macs. Apple provide a useful 38 compatibility table at https://support.apple.com/en-us/HT202823 30 39 31 40 … … 44 53 ....... 45 54 N/A 46 47 You cannot download OpenCL driver updates for your Mac. They are packaged with the normal quarterly OS X updates from Apple. 55 56 You cannot download OpenCL driver updates for your Mac. They are packaged 57 with the normal quarterly OS X updates from Apple. 48 58 49 59 50 60 .. note:: 51 Intel provides OpenCL drivers for Intel processors at https://software.intel.com/en-us/articles/opencl-drivers 61 Intel provides OpenCL drivers for Intel processors at 62 https://software.intel.com/en-us/articles/opencl-drivers 52 63 These can sometimes make use of special vector instructions across multiple 53 64 processors, so it is worth installing if the GPU does not support double … … 55 66 or AMD. 56 67 57 68 58 69 .. note:: 59 70 This help document was last changed by Steve King, 08Oct2016 -
doc/guide/index.rst
rbb6f0f3 r2e66ef5 1 ********** 2 SAS Models 3 ********** 1 **************** 2 SAS Models Guide 3 **************** 4 4 5 Small angle X-ray and Neutron (SAXS and SANS) scattering examines the 6 scattering patterns produced by a beam travelling through the sample 7 and scattering at low angles. The scattering is computed as a function 8 of $q_x$ and $q_y$, which for a given beam wavelength corresponds to 9 particular scattering angles. Each pixel on the detector corresponds to 10 a different scattering angle. If the sample is unoriented, the scattering 11 pattern will appear as rings on the detector. In this case, a circular 12 average can be taken with 1-dimension data at $q = \surd (q_x^2 + q_y^2)$ 13 compared to the orientationally averaged SAS scattering pattern. 5 .. toctree:: 6 :numbered: 4 7 :maxdepth: 4 14 8 15 Models have certain features in common. 16 17 Every model has a *scale* and a *background*. 18 19 Talk about orientation, with diagrams for orientation so that we don't need 20 a link on every model page? 21 22 .. _orientation: 23 24 .. figure: img/orientation1.jpg 25 26 Orientation in 3D 27 28 .. figure: img/orientation2.jpg 29 30 Orientation cross sections 31 32 Talk about polydispersity. 33 34 Talk about magnetism, converting the magnetism help file to inline text here, 35 with links so that models can point back to it. 36 37 Need to talk about structure factors even though we don't have any 38 implemented yet. 9 intro.rst 10 install.rst 11 pd/polydispersity.rst 12 resolution.rst 13 magnetism/magnetism.rst 14 sesans/sans_to_sesans.rst 15 sesans/sesans_fitting.rst 16 plugin.rst 17 scripting.rst 18 refs.rst -
doc/guide/magnetism/magnetism.rst
rdeb854f r990d8df 2 2 3 3 Polarisation/Magnetic Scattering 4 ================================ =======================4 ================================ 5 5 6 In earlier versions of SasView magnetic scattering was implemented in just five 7 (2D) models 8 9 * :ref:`sphere` 10 * :ref:`core-shell-sphere` 11 * :ref:`core-multi-shell` 12 * :ref:`cylinder` 13 * :ref:`parallelepiped` 14 15 From SasView 4.x it is implemented on most models in the 'shape' category. 16 17 In general, the scattering length density (SLD = $\beta$) in each region where the 18 SLD is uniform, is a combination of the nuclear and magnetic SLDs and, for polarised 19 neutrons, also depends on the spin states of the neutrons. 6 Models which define a scattering length density parameter can be evaluated 7 as magnetic models. In general, the scattering length density (SLD = 8 $\beta$) in each region where the SLD is uniform, is a combination of the 9 nuclear and magnetic SLDs and, for polarised neutrons, also depends on the 10 spin states of the neutrons. 20 11 21 12 For magnetic scattering, only the magnetization component $\mathbf{M_\perp}$ … … 98 89 .. note:: 99 90 This help document was last changed by Steve King, 02May2015 91 92 * Document History * 93 94 | 2017-05-08 Paul Kienzle -
doc/guide/sesans/sesans_fitting.rst
r3330bb4 r8ae8532 7 7 =================== 8 8 9 .. note:: A proper installation of the developers setup of SasView (http://trac.sasview.org/wiki/AnacondaSetup) is a prerequisite for using these instructions. 9 .. note:: 10 11 A proper installation of the developers setup of SasView 12 (http://trac.sasview.org/wiki/AnacondaSetup) is a prerequisite for 13 using these instructions. 10 14 11 15 It is possible to fit SESANS measurements from the command line in Python. … … 13 17 Simple Fits 14 18 ........... 15 In the folder sasmodels/example the file sesans_sphere_2micron.py gives an example of how to fit a shape to a measurement. 19 In the folder sasmodels/example the file sesans_sphere_2micron.py gives 20 an example of how to fit a shape to a measurement. 16 21 17 22 The command:: … … 23 28 .. image:: sesans_img/SphereLineFitSasView.png 24 29 25 All the parameters and names in sesans_sphere_2micron.py (shown below) can be adjusted to fit your own problem:: 30 All the parameters and names in sesans_sphere_2micron.py (shown below) can 31 be adjusted to fit your own problem:: 26 32 27 33 """ … … 64 70 # Constraints 65 71 # model.param_name = f(other params) 66 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius and scale are model functions and phi is67 # a custom parameter72 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius 73 # and scale are model functions and phi is a custom parameter 68 74 model.scale = phi*(1-phi) 69 75 … … 74 80 Incorporating a Structure Factor 75 81 ................................ 76 An example of how to also include a structure factor can be seen in the following example taken from Washington et al., 77 *Soft Matter*\, (2014), 10, 3016 (dx.doi.org/10.1039/C3SM53027B). These are time-of-flight measurements, which is the 78 reason that not the polarisation is plotted, but the :math:`\frac{log(P/P_0)}{\lambda^2}` . The sample is a dispersion 79 of core-shell colloids at a high volume fraction with hard sphere interactions. 82 An example of how to also include a structure factor can be seen in the 83 following example taken from Washington et al., *Soft Matter*\, (2014), 10, 3016 84 (dx.doi.org/10.1039/C3SM53027B). These are time-of-flight measurements, which 85 is the reason that not the polarisation is plotted, but the 86 :math:`\frac{log(P/P_0)}{\lambda^2}` . The sample is a dispersion of 87 core-shell colloids at a high volume fraction with hard sphere interactions. 80 88 81 89 The fit can be started by:: … … 87 95 .. image:: sesans_img/HardSphereLineFitSasView.png 88 96 89 The code sesans_parameters_css-hs.py can then be used as a template for a fitting problem with a structure factor:: 97 The code sesans_parameters_css-hs.py can then be used as a template for a 98 fitting problem with a structure factor:: 90 99 91 100 """ … … 131 140 # Constraints 132 141 # model.param_name = f(other params) 133 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius and scale are model functions and phi is134 # a custom parameter142 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius 143 # and scale are model functions and phi is a custom parameter 135 144 model.scale = phi*(1-phi) 136 145 model.volfraction = phi -
doc/index.rst
r7bb290c r8ae8532 1 Introduction 2 ============ 1 sasmodels 2 ========= 3 Small angle X-ray and Neutron scattering (SAXS and SANS) examines the 4 scattering patterns produced by a beam travelling through the sample 5 and scattering at low angles. The scattering is computed as a function 6 of reciprocal space $q$, which arises from a combination of beam wavelength 7 and scattering angles. Each pixel on the detector corresponds to 8 a different scattering angle, and has a distinct $q_x$ and $q_y$. If the 9 sample is unoriented, the scattering pattern will appear as rings on the 10 detector. In this case, a circular average can be taken with 1-dimension 11 data at $q = \surd (q_x^2 + q_y^2)$ compared to the orientationally 12 averaged SAS scattering pattern. 13 3 14 The sasmodels package provides theory functions for small angle scattering 4 calculations. 15 calculations for different shapes, including the effects of resolution, 16 polydispersity and orientational dispersion. 5 17 6 18 .. htmlonly:: … … 15 27 16 28 guide/index.rst 29 guide/models/index.rst 17 30 developer/index.rst 18 ref/index.rst19 ref/models/index.rst20 31 api/index.rst 21 32 … … 28 39 .. htmlonly:: 29 40 * :ref:`search` 30 31 32 33 34 35 -
example/model.py
r1182da5 r2e66ef5 17 17 model = Model(kernel, 18 18 scale=0.08, 19 r _polar=15, r_equatorial=800,19 radius_polar=15, radius_equatorial=800, 20 20 sld=.291, sld_solvent=7.105, 21 21 background=0, 22 22 theta=90, phi=0, 23 23 theta_pd=15, theta_pd_n=40, theta_pd_nsigma=3, 24 r _polar_pd=0.222296, r_polar_pd_n=1, r_polar_pd_nsigma=0,25 r _equatorial_pd=.000128, r_equatorial_pd_n=1, r_equatorial_pd_nsigma=0,24 radius_polar_pd=0.222296, radius_polar_pd_n=1, radius_polar_pd_nsigma=0, 25 radius_equatorial_pd=.000128, radius_equatorial_pd_n=1, radius_equatorial_pd_nsigma=0, 26 26 phi_pd=0, phi_pd_n=20, phi_pd_nsigma=3, 27 27 ) 28 28 29 29 # SET THE FITTING PARAMETERS 30 model.r _polar.range(15, 1000)31 model.r _equatorial.range(15, 1000)30 model.radius_polar.range(15, 1000) 31 model.radius_equatorial.range(15, 1000) 32 32 model.theta_pd.range(0, 360) 33 33 model.background.range(0,1000) -
sasmodels/core.py
r650c6d2 r2e66ef5 117 117 Load model info and build model. 118 118 119 *model_name* is the name of the model as used by :func:`load_model_info`. 120 Additional keyword arguments are passed directly to :func:`build_model`. 119 *model_name* is the name of the model, or perhaps a model expression 120 such as sphere*hardsphere or sphere+cylinder. 121 122 *dtype* and *platform* are given by :func:`build_model`. 121 123 """ 122 124 return build_model(load_model_info(model_name), … … 128 130 """ 129 131 Load a model definition given the model name. 132 133 *model_name* is the name of the model, or perhaps a model expression 134 such as sphere*hardsphere or sphere+cylinder. 130 135 131 136 This returns a handle to the module defining the model. This can be … … 227 232 228 233 Possible types include 'half', 'single', 'double' and 'quad'. If the 229 type is 'fast', then this is equivalent to dtype 'single' with the 230 fast flag set to True. 234 type is 'fast', then this is equivalent to dtype 'single' but using 235 fast native functions rather than those with the precision level guaranteed 236 by the OpenCL standard. 237 238 Platform preference can be specfied ("ocl" vs "dll"), with the default 239 being OpenCL if it is availabe. If the dtype name ends with '!' then 240 platform is forced to be DLL rather than OpenCL. 241 242 This routine ignores the preferences within the model definition. This 243 is by design. It allows us to test models in single precision even when 244 we have flagged them as requiring double precision so we can easily check 245 the performance on different platforms without having to change the model 246 definition. 231 247 """ 232 248 # Assign default platform, overriding ocl with dll if OpenCL is unavailable -
sasmodels/resolution.py
rb32caab r990d8df 437 437 .. math:: 438 438 439 \log \Delta q = (\log q_n - log q_1) / (n - 1)439 \log \Delta q = (\log q_n - \log q_1) / (n - 1) 440 440 441 441 From this we can compute the number of steps required to extend $q$ … … 451 451 452 452 n_\text{extend} = (n-1) (\log q_\text{max} - \log q_n) 453 / (\log q_n - log q_1)453 / (\log q_n - \log q_1) 454 454 """ 455 455 q = np.sort(q) … … 459 459 log_delta_q = log(10.) / points_per_decade 460 460 if q_min < q[0]: 461 if q_min < 0: q_min = q[0]*MINIMUM_ABSOLUTE_Q 461 if q_min < 0: 462 q_min = q[0]*MINIMUM_ABSOLUTE_Q 462 463 n_low = log_delta_q * (log(q[0])-log(q_min)) 463 464 q_low = np.logspace(log10(q_min), log10(q[0]), np.ceil(n_low)+1)[:-1] -
sasmodels/rst2html.py
rf2f5413 r990d8df 38 38 - mathml 39 39 - mathjax 40 See ` http://docutils.sourceforge.net/docs/user/config.html#math-output`_40 See `<http://docutils.sourceforge.net/docs/user/config.html#math-output>`_ 41 41 for details. 42 42 … … 211 211 sys.exit(app.exec_()) 212 212 213 def can_use_qt(): 214 """ 215 Return True if QWebView exists. 216 217 Checks first in PyQt5 then in PyQt4 218 """ 219 try: 220 from PyQt5.QtWebKitWidgets import QWebView 221 return True 222 except ImportError: 223 try: 224 from PyQt4.QtWebkit import QWebView 225 return True 226 except ImportError: 227 return False 228 213 229 def view_help(filename, qt=False): 214 230 import os 215 url="file:///"+os.path.abspath(filename).replace("\\","/") 231 232 if qt: 233 qt = can_use_qt() 234 235 url = "file:///"+os.path.abspath(filename).replace("\\", "/") 216 236 if filename.endswith('.rst'): 217 237 html = load_rst_as_html(filename)
Note: See TracChangeset
for help on using the changeset viewer.