Changes in / [646eeaa:765d025] in sasmodels
- Files:
-
- 1 deleted
- 44 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/scripting.rst
r23df833 rbd7630d 188 188 python kernel. Once the kernel is in hand, we can then marshal a set of 189 189 parameters into a :class:`sasmodels.details.CallDetails` object and ship it to 190 the kernel using the :func:`sansmodels.direct_model.call_kernel` function. To 191 accesses the underlying $<F(q)>$ and $<F^2(q)>$, use 192 :func:`sasmodels.direct_model.call_Fq` instead. 193 194 The following example should 195 help, *example/cylinder_eval.py*:: 196 197 from numpy import logspace, sqrt 190 the kernel using the :func:`sansmodels.direct_model.call_kernel` function. An 191 example should help, *example/cylinder_eval.py*:: 192 193 from numpy import logspace 198 194 from matplotlib import pyplot as plt 199 195 from sasmodels.core import load_model 200 from sasmodels.direct_model import call_kernel , call_Fq196 from sasmodels.direct_model import call_kernel 201 197 202 198 model = load_model('cylinder') 203 199 q = logspace(-3, -1, 200) 204 200 kernel = model.make_kernel([q]) 205 pars = {'radius': 200, 'radius_pd': 0.1, 'scale': 2} 206 Iq = call_kernel(kernel, pars) 207 F, Fsq, Reff, V, Vratio = call_Fq(kernel, pars) 208 209 plt.loglog(q, Iq, label='2 I(q)') 210 plt.loglog(q, F**2/V, label='<F(q)>^2/V') 211 plt.loglog(q, Fsq/V, label='<F^2(q)>/V') 212 plt.xlabel('q (1/A)') 213 plt.ylabel('I(q) (1/cm)') 214 plt.title('Cylinder with radius 200.') 215 plt.legend() 201 Iq = call_kernel(kernel, dict(radius=200.)) 202 plt.loglog(q, Iq) 216 203 plt.show() 217 204 218 .. figure:: direct_call.png 219 220 Comparison between $I(q)$, $<F(q)>$ and $<F^2(q)>$ for cylinder model. 221 222 This compares $I(q)$ with $<F(q)>$ and $<F^2(q)>$ for a cylinder 223 with *radius=200 +/- 20* and *scale=2*. Note that *call_Fq* does not 224 include scale and background, nor does it normalize by the average volume. 225 The definition of $F = \rho V \hat F$ scaled by the contrast and 226 volume, compared to the canonical cylinder $\hat F$, with $\hat F(0) = 1$. 227 Integrating over polydispersity and orientation, the returned values are 228 $\sum_{r,w\in N(r_o, r_o/10)} \sum_\theta w F(q,r_o,\theta)\sin\theta$ and 229 $\sum_{r,w\in N(r_o, r_o/10)} \sum_\theta w F^2(q,r_o,\theta)\sin\theta$. 230 231 On windows, this example can be called from the cmd prompt using sasview as 232 as the python interpreter:: 205 On windows, this can be called from the cmd prompt using sasview as:: 233 206 234 207 SasViewCom example/cylinder_eval.py -
example/cylinder_eval.py
r23df833 r2e66ef5 3 3 """ 4 4 5 from numpy import logspace , sqrt5 from numpy import logspace 6 6 from matplotlib import pyplot as plt 7 7 from sasmodels.core import load_model 8 from sasmodels.direct_model import call_kernel , call_Fq8 from sasmodels.direct_model import call_kernel 9 9 10 10 model = load_model('cylinder') 11 11 q = logspace(-3, -1, 200) 12 12 kernel = model.make_kernel([q]) 13 pars = {'radius': 200, 'radius_pd': 0.1, 'scale': 2} 14 Iq = call_kernel(kernel, pars) 15 F, Fsq, Reff, V, Vratio = call_Fq(kernel, pars) 16 plt.loglog(q, Iq, label='2 I(q)') 17 plt.loglog(q, F**2/V, label='<F(q)>^2/V') 18 plt.loglog(q, Fsq/V, label='<F^2(q)>/V') 13 Iq = call_kernel(kernel, dict(radius=200.)) 14 plt.loglog(q, Iq) 19 15 plt.xlabel('q (1/A)') 20 plt.ylabel('I(q) (1/cm)')16 plt.ylabel('I(q)') 21 17 plt.title('Cylinder with radius 200.') 22 plt.legend()23 18 plt.show() -
sasmodels/direct_model.py
r5024a56 r304c775 32 32 from .details import make_kernel_args, dispersion_mesh 33 33 from .modelinfo import DEFAULT_BACKGROUND 34 from .product import RADIUS_MODE_ID35 34 36 35 # pylint: disable=unused-import … … 68 67 # type: (Kernel, ParameterSet, float, bool) -> np.ndarray 69 68 """ 70 Like :func:`call_kernel`, but returning F, F^2, R_eff, V_shell, V_form/V_shell. 71 72 For solid objects V_shell is equal to V_form and the volume ratio is 1. 73 74 Use parameter *radius_effective_mode* to select the effective radius 75 calculation. 76 """ 77 R_eff_type = int(pars.pop(RADIUS_MODE_ID, 1.0)) 69 Like :func:`call_kernel`, but returning F, F^2, R_eff, V, V_form/V_shell. 70 """ 71 R_eff_type = int(pars.pop('radius_effective_type', 1.0)) 78 72 mesh = get_mesh(calculator.info, pars, dim=calculator.dim, mono=mono) 79 73 #print("pars", list(zip(*mesh))[0]) … … 82 76 return calculator.Fq(call_details, values, cutoff, is_magnetic, R_eff_type) 83 77 84 def call_profile(model_info, pars=None):85 # type: (ModelInfo, ParameterSet) -> Tuple[np.ndarray, np.ndarray, Tuple[str, str]]78 def call_profile(model_info, **pars): 79 # type: (ModelInfo, ...) -> Tuple[np.ndarray, np.ndarray, Tuple[str, str]] 86 80 """ 87 81 Returns the profile *x, y, (xlabel, ylabel)* representing the model. 88 82 """ 89 if pars is None:90 pars = {}91 83 args = {} 92 84 for p in model_info.parameters.kernel_parameters: … … 385 377 Generate a plottable profile. 386 378 """ 387 return call_profile(self.model.info, pars)379 return call_profile(self.model.info, **pars) 388 380 389 381 def main(): -
sasmodels/model_test.py
r5024a56 r81751c2 386 386 for par in sorted(pars.keys()): 387 387 # special handling of R_eff mode, which is not a usual parameter 388 if par == product.RADIUS_MODE_ID:388 if par == 'radius_effective_type': 389 389 continue 390 390 parts = par.split('_pd') -
sasmodels/models/barbell.c
r99658f6 rd42dd4a 63 63 64 64 static double 65 radius_from_excluded_volume(double radius_bell, double radius, double length)66 {67 const double hdist = sqrt(square(radius_bell) - square(radius));68 const double length_tot = length + 2.0*(hdist+ radius);69 return 0.5*cbrt(0.75*radius_bell*(2.0*radius_bell*length_tot + (radius_bell + length_tot)*(M_PI*radius_bell + length_tot)));70 }71 72 static double73 65 radius_from_volume(double radius_bell, double radius, double length) 74 66 { … … 89 81 switch (mode) { 90 82 default: 91 case 1: // equivalent cylinder excluded volume 92 return radius_from_excluded_volume(radius_bell, radius , length); 93 case 2: // equivalent volume sphere 83 case 1: // equivalent sphere 94 84 return radius_from_volume(radius_bell, radius , length); 95 case 3: // radius85 case 2: // radius 96 86 return radius; 97 case 4: // half length87 case 3: // half length 98 88 return 0.5*length; 99 case 5: // half total length89 case 4: // half total length 100 90 return radius_from_totallength(radius_bell,radius,length); 101 91 } -
sasmodels/models/barbell.py
r99658f6 ree60aa7 79 79 .. [#] H Kaya and N R deSouza, *J. Appl. Cryst.*, 37 (2004) 508-509 (addenda 80 80 and errata) 81 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).82 81 83 82 Authorship and Verification … … 117 116 118 117 source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "barbell.c"] 119 have_Fq = True 118 have_Fq = True 120 119 effective_radius_type = [ 121 "equivalent cylinder excluded volume","equivalent volumesphere", "radius", "half length", "half total length",120 "equivalent sphere", "radius", "half length", "half total length", 122 121 ] 123 122 -
sasmodels/models/capped_cylinder.c
r99658f6 rd42dd4a 85 85 86 86 static double 87 radius_from_excluded_volume(double radius, double radius_cap, double length)88 {89 const double hc = radius_cap - sqrt(radius_cap*radius_cap - radius*radius);90 const double length_tot = length + 2.0*hc;91 return 0.5*cbrt(0.75*radius*(2.0*radius*length_tot + (radius + length_tot)*(M_PI*radius + length_tot)));92 }93 94 static double95 87 radius_from_volume(double radius, double radius_cap, double length) 96 88 { … … 111 103 switch (mode) { 112 104 default: 113 case 1: // equivalent cylinder excluded volume 114 return radius_from_excluded_volume(radius, radius_cap, length); 115 case 2: // equivalent volume sphere 105 case 1: // equivalent sphere 116 106 return radius_from_volume(radius, radius_cap, length); 117 case 3: // radius107 case 2: // radius 118 108 return radius; 119 case 4: // half length109 case 3: // half length 120 110 return 0.5*length; 121 case 5: // half total length111 case 4: // half total length 122 112 return radius_from_totallength(radius, radius_cap,length); 123 113 } -
sasmodels/models/capped_cylinder.py
r99658f6 ree60aa7 82 82 .. [#] H Kaya and N-R deSouza, *J. Appl. Cryst.*, 37 (2004) 508-509 (addenda 83 83 and errata) 84 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).85 84 86 85 Authorship and Verification … … 139 138 have_Fq = True 140 139 effective_radius_type = [ 141 "equivalent cylinder excluded volume", "equivalent volumesphere", "radius", "half length", "half total length",140 "equivalent sphere", "radius", "half length", "half total length", 142 141 ] 143 142 -
sasmodels/models/core_shell_bicelle.c
r99658f6 rd42dd4a 37 37 38 38 static double 39 radius_from_excluded_volume(double radius, double thick_rim, double thick_face, double length)40 {41 const double radius_tot = radius + thick_rim;42 const double length_tot = length + 2.0*thick_face;43 return 0.5*cbrt(0.75*radius_tot*(2.0*radius_tot*length_tot + (radius_tot + length_tot)*(M_PI*radius_tot + length_tot)));44 }45 46 static double47 39 radius_from_volume(double radius, double thick_rim, double thick_face, double length) 48 40 { … … 64 56 switch (mode) { 65 57 default: 66 case 1: // equivalent cylinder excluded volume 67 return radius_from_excluded_volume(radius, thick_rim, thick_face, length); 68 case 2: // equivalent sphere 58 case 1: // equivalent sphere 69 59 return radius_from_volume(radius, thick_rim, thick_face, length); 70 case 3: // outer rim radius60 case 2: // outer rim radius 71 61 return radius + thick_rim; 72 case 4: // half outer thickness62 case 3: // half outer thickness 73 63 return 0.5*length + thick_face; 74 case 5: // half diagonal64 case 4: // half diagonal 75 65 return radius_from_diagonal(radius,thick_rim,thick_face,length); 76 66 } -
sasmodels/models/core_shell_bicelle.py
r99658f6 ree60aa7 89 89 from Proquest <http://search.proquest.com/docview/304915826?accountid 90 90 =26379>`_ 91 92 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).93 91 94 92 Authorship and Verification … … 158 156 have_Fq = True 159 157 effective_radius_type = [ 160 "e xcluded volume","equivalent volumesphere", "outer rim radius",158 "equivalent sphere", "outer rim radius", 161 159 "half outer thickness", "half diagonal", 162 160 ] -
sasmodels/models/core_shell_bicelle_elliptical.c
r99658f6 rd42dd4a 8 8 { 9 9 return M_PI*(r_minor+thick_rim)*(r_minor*x_core+thick_rim)*(length+2.0*thick_face); 10 }11 12 static double13 radius_from_excluded_volume(double r_minor, double x_core, double thick_rim, double thick_face, double length)14 {15 const double r_equiv = sqrt((r_minor + thick_rim)*(r_minor*x_core + thick_rim));16 const double length_tot = length + 2.0*thick_face;17 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length_tot + (r_equiv + length_tot)*(M_PI*r_equiv + length_tot)));18 10 } 19 11 … … 39 31 switch (mode) { 40 32 default: 41 case 1: // equivalent cylinder excluded volume 42 return radius_from_excluded_volume(r_minor, x_core, thick_rim, thick_face, length); 43 case 2: // equivalent volume sphere 33 case 1: // equivalent sphere 44 34 return radius_from_volume(r_minor, x_core, thick_rim, thick_face, length); 45 case 3: // outer rim average radius35 case 2: // outer rim average radius 46 36 return 0.5*r_minor*(1.0 + x_core) + thick_rim; 47 case 4: // outer rim min radius37 case 3: // outer rim min radius 48 38 return (x_core < 1.0 ? x_core*r_minor+thick_rim : r_minor+thick_rim); 49 case 5: // outer max radius39 case 4: // outer max radius 50 40 return (x_core > 1.0 ? x_core*r_minor+thick_rim : r_minor+thick_rim); 51 case 6: // half outer thickness41 case 5: // half outer thickness 52 42 return 0.5*length + thick_face; 53 case 7: // half diagonal43 case 6: // half diagonal 54 44 return radius_from_diagonal(r_minor,x_core,thick_rim,thick_face,length); 55 45 } -
sasmodels/models/core_shell_bicelle_elliptical.py
r99658f6 r304c775 100 100 101 101 .. [#] 102 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).103 102 104 103 Authorship and Verification … … 149 148 have_Fq = True 150 149 effective_radius_type = [ 151 "equivalent cylinder excluded volume", "equivalent volumesphere", "outer rim average radius", "outer rim min radius",150 "equivalent sphere", "outer rim average radius", "outer rim min radius", 152 151 "outer max radius", "half outer thickness", "half diagonal", 153 152 ] -
sasmodels/models/core_shell_bicelle_elliptical_belt_rough.c
r99658f6 rd42dd4a 9 9 return M_PI*( (r_minor + thick_rim)*(r_minor*x_core + thick_rim)* length + 10 10 square(r_minor)*x_core*2.0*thick_face ); 11 }12 13 static double14 radius_from_excluded_volume(double r_minor, double x_core, double thick_rim, double thick_face, double length)15 {16 const double r_equiv = sqrt((r_minor + thick_rim)*(r_minor*x_core + thick_rim));17 const double length_tot = length + 2.0*thick_face;18 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length_tot + (r_equiv + length_tot)*(M_PI*r_equiv + length_tot)));19 11 } 20 12 … … 40 32 switch (mode) { 41 33 default: 42 case 1: // equivalent cylinder excluded volume 43 return radius_from_excluded_volume(r_minor, x_core, thick_rim, thick_face, length); 44 case 2: // equivalent sphere 34 case 1: // equivalent sphere 45 35 return radius_from_volume(r_minor, x_core, thick_rim, thick_face, length); 46 case 3: // outer rim average radius36 case 2: // outer rim average radius 47 37 return 0.5*r_minor*(1.0 + x_core) + thick_rim; 48 case 4: // outer rim min radius38 case 3: // outer rim min radius 49 39 return (x_core < 1.0 ? x_core*r_minor+thick_rim : r_minor+thick_rim); 50 case 5: // outer max radius40 case 4: // outer max radius 51 41 return (x_core > 1.0 ? x_core*r_minor+thick_rim : r_minor+thick_rim); 52 case 6: // half outer thickness42 case 5: // half outer thickness 53 43 return 0.5*length + thick_face; 54 case 7: // half diagonal (this ignores the missing "corners", so may give unexpected answer if thick_face44 case 6: // half diagonal (this ignores the missing "corners", so may give unexpected answer if thick_face 55 45 // or thick_rim is extremely large) 56 46 return radius_from_diagonal(r_minor,x_core,thick_rim,thick_face,length); -
sasmodels/models/core_shell_bicelle_elliptical_belt_rough.py
r99658f6 r304c775 112 112 113 113 .. [#] 114 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).115 114 116 115 Authorship and Verification … … 162 161 have_Fq = True 163 162 effective_radius_type = [ 164 "equivalent cylinder excluded volume", "equivalent volumesphere", "outer rim average radius", "outer rim min radius",163 "equivalent sphere", "outer rim average radius", "outer rim min radius", 165 164 "outer max radius", "half outer thickness", "half diagonal", 166 165 ] -
sasmodels/models/core_shell_cylinder.c
r99658f6 rd42dd4a 11 11 { 12 12 return M_PI*square(radius+thickness)*(length+2.0*thickness); 13 }14 15 static double16 radius_from_excluded_volume(double radius, double thickness, double length)17 {18 const double radius_tot = radius + thickness;19 const double length_tot = length + 2.0*thickness;20 return 0.5*cbrt(0.75*radius_tot*(2.0*radius_tot*length_tot + (radius_tot + length_tot)*(M_PI*radius_tot + length_tot)));21 13 } 22 14 … … 41 33 switch (mode) { 42 34 default: 43 case 1: //cylinder excluded volume 44 return radius_from_excluded_volume(radius, thickness, length); 45 case 2: // equivalent volume sphere 35 case 1: // equivalent sphere 46 36 return radius_from_volume(radius, thickness, length); 47 case 3: // outer radius37 case 2: // outer radius 48 38 return radius + thickness; 49 case 4: // half outer length39 case 3: // half outer length 50 40 return 0.5*length + thickness; 51 case 5: // half min outer length41 case 4: // half min outer length 52 42 return (radius < 0.5*length ? radius + thickness : 0.5*length + thickness); 53 case 6: // half max outer length43 case 5: // half max outer length 54 44 return (radius > 0.5*length ? radius + thickness : 0.5*length + thickness); 55 case 7: // half outer diagonal45 case 6: // half outer diagonal 56 46 return radius_from_diagonal(radius,thickness,length); 57 47 } -
sasmodels/models/core_shell_cylinder.py
r99658f6 ree60aa7 70 70 1445-1452 71 71 .. [#kline] S R Kline, *J Appl. Cryst.*, 39 (2006) 895 72 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).73 72 74 73 Authorship and Verification … … 134 133 have_Fq = True 135 134 effective_radius_type = [ 136 "excluded volume", "equivalent volume sphere", "outer radius", "half outer length", 137 "half min outer dimension", "half max outer dimension", "half outer diagonal", 135 "equivalent sphere", "outer radius", "half outer length", 136 "half min outer dimension", "half max outer dimension", 137 "half outer diagonal", 138 138 ] 139 139 -
sasmodels/models/core_shell_ellipsoid.c
r99658f6 rd42dd4a 75 75 switch (mode) { 76 76 default: 77 case 1: // average outer curvature 77 case 1: // equivalent sphere 78 return radius_from_volume(radius_equat_core, x_core, thick_shell, x_polar_shell); 79 case 2: // average outer curvature 78 80 return radius_from_curvature(radius_equat_core, x_core, thick_shell, x_polar_shell); 79 case 2: // equivalent volume sphere80 return radius_from_volume(radius_equat_core, x_core, thick_shell, x_polar_shell);81 81 case 3: // min outer radius 82 82 return (radius_polar_tot < radius_equat_tot ? radius_polar_tot : radius_equat_tot); -
sasmodels/models/core_shell_ellipsoid.py
r99658f6 ree60aa7 147 147 have_Fq = True 148 148 effective_radius_type = [ 149 " average outer curvature", "equivalent volume sphere",149 "equivalent sphere", "average outer curvature", 150 150 "min outer radius", "max outer radius", 151 151 ] -
sasmodels/models/core_shell_parallelepiped.c
r99658f6 rd42dd4a 28 28 29 29 static double 30 radius_from_excluded_volume(double length_a, double length_b, double length_c,31 double thick_rim_a, double thick_rim_b, double thick_rim_c)32 {33 double r_equiv, length;34 double lengths[3] = {length_a+thick_rim_a, length_b+thick_rim_b, length_c+thick_rim_c};35 double lengthmax = fmax(lengths[0],fmax(lengths[1],lengths[2]));36 double length_1 = lengthmax;37 double length_2 = lengthmax;38 double length_3 = lengthmax;39 40 for(int ilen=0; ilen<3; ilen++) {41 if (lengths[ilen] < length_1) {42 length_2 = length_1;43 length_1 = lengths[ilen];44 } else {45 if (lengths[ilen] < length_2) {46 length_2 = lengths[ilen];47 }48 }49 }50 if(length_2-length_1 > length_3-length_2) {51 r_equiv = sqrt(length_2*length_3/M_PI);52 length = length_1;53 } else {54 r_equiv = sqrt(length_1*length_2/M_PI);55 length = length_3;56 }57 58 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length + (r_equiv + length)*(M_PI*r_equiv + length)));59 }60 61 static double62 30 radius_from_volume(double length_a, double length_b, double length_c, 63 31 double thick_rim_a, double thick_rim_b, double thick_rim_c) … … 80 48 switch (mode) { 81 49 default: 82 case 1: // equivalent cylinder excluded volume 83 return radius_from_excluded_volume(length_a, length_b, length_c, thick_rim_a, thick_rim_b, thick_rim_c); 84 case 2: // equivalent volume sphere 50 case 1: // equivalent sphere 85 51 return radius_from_volume(length_a, length_b, length_c, thick_rim_a, thick_rim_b, thick_rim_c); 86 case 3: // half outer length a52 case 2: // half outer length a 87 53 return 0.5 * length_a + thick_rim_a; 88 case 4: // half outer length b54 case 3: // half outer length b 89 55 return 0.5 * length_b + thick_rim_b; 90 case 5: // half outer length c56 case 4: // half outer length c 91 57 return 0.5 * length_c + thick_rim_c; 92 case 6: // equivalent circular cross-section58 case 5: // equivalent circular cross-section 93 59 return radius_from_crosssection(length_a, length_b, thick_rim_a, thick_rim_b); 94 case 7: // half outer ab diagonal60 case 6: // half outer ab diagonal 95 61 return 0.5*sqrt(square(length_a+ 2.0*thick_rim_a) + square(length_b+ 2.0*thick_rim_b)); 96 case 8: // half outer diagonal62 case 7: // half outer diagonal 97 63 return 0.5*sqrt(square(length_a+ 2.0*thick_rim_a) + square(length_b+ 2.0*thick_rim_b) + square(length_c+ 2.0*thick_rim_c)); 98 64 } -
sasmodels/models/core_shell_parallelepiped.py
r99658f6 ree60aa7 173 173 from Proquest <http://search.proquest.com/docview/304915826?accountid 174 174 =26379>`_ 175 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).176 175 177 176 Authorship and Verification … … 229 228 have_Fq = True 230 229 effective_radius_type = [ 231 "equivalent cylinder excluded volume", 232 "equivalent volume sphere", 230 "equivalent sphere", 233 231 "half outer length_a", "half outer length_b", "half outer length_c", 234 232 "equivalent circular cross-section", -
sasmodels/models/cylinder.c
r99658f6 rd42dd4a 11 11 { 12 12 return sas_2J1x_x(qab*radius) * sas_sinx_x(qc*0.5*length); 13 }14 15 static double16 radius_from_excluded_volume(double radius, double length)17 {18 return 0.5*cbrt(0.75*radius*(2.0*radius*length + (radius + length)*(M_PI*radius + length)));19 13 } 20 14 … … 37 31 default: 38 32 case 1: 39 return radius_from_ excluded_volume(radius, length);33 return radius_from_volume(radius, length); 40 34 case 2: 41 return radius _from_volume(radius, length);35 return radius; 42 36 case 3: 43 return radius;37 return 0.5*length; 44 38 case 4: 45 return 0.5*length;39 return (radius < 0.5*length ? radius : 0.5*length); 46 40 case 5: 47 return (radius <0.5*length ? radius : 0.5*length);41 return (radius > 0.5*length ? radius : 0.5*length); 48 42 case 6: 49 return (radius > 0.5*length ? radius : 0.5*length);50 case 7:51 43 return radius_from_diagonal(radius,length); 52 44 } -
sasmodels/models/cylinder.py
r99658f6 r304c775 98 98 J. S. Pedersen, Adv. Colloid Interface Sci. 70, 171-210 (1997). 99 99 G. Fournet, Bull. Soc. Fr. Mineral. Cristallogr. 74, 39-113 (1951). 100 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).101 100 """ 102 101 … … 141 140 have_Fq = True 142 141 effective_radius_type = [ 143 "e xcluded volume", "equivalent volumesphere", "radius",142 "equivalent sphere", "radius", 144 143 "half length", "half min dimension", "half max dimension", "half diagonal", 145 144 ] … … 186 185 radius, length = parameters[2][2], parameters[3][2] 187 186 tests.extend([ 188 ({'radius_effective_mode': 0}, 0.1, None, None, 0., pi*radius**2*length, 1.0), 189 ({'radius_effective_mode': 1}, 0.1, None, None, 0.5*(0.75*radius*(2.0*radius*length + (radius + length)*(pi*radius + length)))**(1./3.), None, None), 190 ({'radius_effective_mode': 2}, 0.1, None, None, (0.75*radius**2*length)**(1./3.), None, None), 191 ({'radius_effective_mode': 3}, 0.1, None, None, radius, None, None), 192 ({'radius_effective_mode': 4}, 0.1, None, None, length/2., None, None), 193 ({'radius_effective_mode': 5}, 0.1, None, None, min(radius, length/2.), None, None), 194 ({'radius_effective_mode': 6}, 0.1, None, None, max(radius, length/2.), None, None), 195 ({'radius_effective_mode': 7}, 0.1, None, None, np.sqrt(4*radius**2 + length**2)/2., None, None), 187 ({'radius_effective_type': 0}, 0.1, None, None, 0., pi*radius**2*length, 1.0), 188 ({'radius_effective_type': 1}, 0.1, None, None, (0.75*radius**2*length)**(1./3.), None, None), 189 ({'radius_effective_type': 2}, 0.1, None, None, radius, None, None), 190 ({'radius_effective_type': 3}, 0.1, None, None, length/2., None, None), 191 ({'radius_effective_type': 4}, 0.1, None, None, min(radius, length/2.), None, None), 192 ({'radius_effective_type': 5}, 0.1, None, None, max(radius, length/2.), None, None), 193 ({'radius_effective_type': 6}, 0.1, None, None, np.sqrt(4*radius**2 + length**2)/2., None, None), 196 194 ]) 197 195 del radius, length -
sasmodels/models/ellipsoid.c
r99658f6 rd42dd4a 36 36 switch (mode) { 37 37 default: 38 case 1: // average curvature 38 case 1: // equivalent sphere 39 return radius_from_volume(radius_polar, radius_equatorial); 40 case 2: // average curvature 39 41 return radius_from_curvature(radius_polar, radius_equatorial); 40 case 2: // equivalent volume sphere41 return radius_from_volume(radius_polar, radius_equatorial);42 42 case 3: // min radius 43 43 return (radius_polar < radius_equatorial ? radius_polar : radius_equatorial); -
sasmodels/models/ellipsoid.py
r99658f6 ree60aa7 170 170 have_Fq = True 171 171 effective_radius_type = [ 172 " average curvature", "equivalent volume sphere", "min radius", "max radius",172 "equivalent sphere", "average curvature", "min radius", "max radius", 173 173 ] 174 174 -
sasmodels/models/elliptical_cylinder.c
r99658f6 rd42dd4a 3 3 { 4 4 return M_PI * radius_minor * radius_minor * r_ratio * length; 5 }6 7 static double8 radius_from_excluded_volume(double radius_minor, double r_ratio, double length)9 {10 const double r_equiv = sqrt(radius_minor*radius_minor*r_ratio);11 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length + (r_equiv + length)*(M_PI*r_equiv + length)));12 5 } 13 6 … … 45 38 switch (mode) { 46 39 default: 47 case 1: // equivalent cylinder excluded volume 48 return radius_from_excluded_volume(radius_minor, r_ratio, length); 49 case 2: // equivalent volume sphere 40 case 1: // equivalent sphere 50 41 return radius_from_volume(radius_minor, r_ratio, length); 51 case 3: // average radius42 case 2: // average radius 52 43 return 0.5*radius_minor*(1.0 + r_ratio); 53 case 4: // min radius44 case 3: // min radius 54 45 return (r_ratio > 1.0 ? radius_minor : r_ratio*radius_minor); 55 case 5: // max radius46 case 4: // max radius 56 47 return (r_ratio < 1.0 ? radius_minor : r_ratio*radius_minor); 57 case 6: // equivalent circular cross-section48 case 5: // equivalent circular cross-section 58 49 return sqrt(radius_minor*radius_minor*r_ratio); 59 case 7: // half length50 case 6: // half length 60 51 return 0.5*length; 61 case 8: // half min dimension52 case 7: // half min dimension 62 53 return radius_from_min_dimension(radius_minor,r_ratio,0.5*length); 63 case 9: // half max dimension54 case 8: // half max dimension 64 55 return radius_from_max_dimension(radius_minor,r_ratio,0.5*length); 65 case 10: // half diagonal56 case 9: // half diagonal 66 57 return radius_from_diagonal(radius_minor,r_ratio,length); 67 58 } -
sasmodels/models/elliptical_cylinder.py
r99658f6 ree60aa7 88 88 L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and 89 89 Neutron Scattering*, Plenum, New York, (1987) [see table 3.4] 90 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).91 90 92 91 Authorship and Verification … … 125 124 have_Fq = True 126 125 effective_radius_type = [ 127 "equivalent cylinder excluded volume", "equivalent volumesphere", "average radius", "min radius", "max radius",126 "equivalent sphere", "average radius", "min radius", "max radius", 128 127 "equivalent circular cross-section", 129 128 "half length", "half min dimension", "half max dimension", "half diagonal", -
sasmodels/models/hollow_cylinder.c
r99658f6 rd42dd4a 11 11 { 12 12 return M_PI*length*square(radius+thickness); 13 }14 15 static double16 radius_from_excluded_volume(double radius, double thickness, double length)17 {18 const double radius_tot = radius + thickness;19 return 0.5*cbrt(0.75*radius_tot*(2.0*radius_tot*length + (radius_tot + length)*(M_PI*radius_tot + length)));20 13 } 21 14 … … 38 31 switch (mode) { 39 32 default: 40 case 1: // excluded volume 41 return radius_from_excluded_volume(radius, thickness, length); 42 case 2: // equivalent volume sphere 33 case 1: // equivalent sphere 43 34 return radius_from_volume(radius, thickness, length); 44 case 3: // outer radius35 case 2: // outer radius 45 36 return radius + thickness; 46 case 4: // half length37 case 3: // half length 47 38 return 0.5*length; 48 case 5: // half outer min dimension39 case 4: // half outer min dimension 49 40 return (radius + thickness < 0.5*length ? radius + thickness : 0.5*length); 50 case 6: // half outer max dimension41 case 5: // half outer max dimension 51 42 return (radius + thickness > 0.5*length ? radius + thickness : 0.5*length); 52 case 7: // half outer diagonal43 case 6: // half outer diagonal 53 44 return radius_from_diagonal(radius,thickness,length); 54 45 } -
sasmodels/models/hollow_cylinder.py
r99658f6 r304c775 60 60 .. [#] L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and 61 61 Neutron Scattering*, Plenum Press, New York, (1987) 62 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).63 62 64 63 Authorship and Verification … … 103 102 have_Fq = True 104 103 effective_radius_type = [ 105 "e xcluded volume", "equivalent outer volumesphere", "outer radius", "half length",104 "equivalent sphere", "outer radius", "half length", 106 105 "half outer min dimension", "half outer max dimension", 107 106 "half outer diagonal", … … 141 140 [{}, 0.00005, 1764.926], 142 141 [{}, 0.1, None, None, 143 0.5*(0.75*(radius+thickness)*(2.0*(radius+thickness)*length + ((radius+thickness) + length)*(pi*(radius+thickness) + length)))**(1./3.), # R_eff from excludedvolume142 (3./4*(radius+thickness)**2*length)**(1./3), # R_eff from volume 144 143 pi*((radius+thickness)**2-radius**2)*length, # shell volume 145 144 (radius+thickness)**2/((radius+thickness)**2 - radius**2), # form:shell ratio -
sasmodels/models/hollow_rectangular_prism.c
r99658f6 rd42dd4a 22 22 23 23 static double 24 radius_from_excluded_volume(double length_a, double b2a_ratio, double c2a_ratio)25 {26 const double r_equiv = sqrt(length_a*length_a*b2a_ratio/M_PI);27 const double length_c = length_a*c2a_ratio;28 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length_c + (r_equiv + length_c)*(M_PI*r_equiv + length_c)));29 }30 31 static double32 24 effective_radius(int mode, double length_a, double b2a_ratio, double c2a_ratio, double thickness) 33 25 // NOTE length_a is external dimension! … … 35 27 switch (mode) { 36 28 default: 37 case 1: // equivalent cylinder excluded volume 38 return radius_from_excluded_volume(length_a, b2a_ratio, c2a_ratio); 39 case 2: // equivalent outer volume sphere 29 case 1: // equivalent sphere 40 30 return cbrt(cube(length_a)*b2a_ratio*c2a_ratio/M_4PI_3); 41 case 3: // half length_a31 case 2: // half length_a 42 32 return 0.5 * length_a; 43 case 4: // half length_b33 case 3: // half length_b 44 34 return 0.5 * length_a*b2a_ratio; 45 case 5: // half length_c35 case 4: // half length_c 46 36 return 0.5 * length_a*c2a_ratio; 47 case 6: // equivalent outer circular cross-section37 case 5: // equivalent outer circular cross-section 48 38 return length_a*sqrt(b2a_ratio/M_PI); 49 case 7: // half ab diagonal39 case 6: // half ab diagonal 50 40 return 0.5*sqrt(square(length_a) * (1.0 + square(b2a_ratio))); 51 case 8: // half diagonal41 case 7: // half diagonal 52 42 return 0.5*sqrt(square(length_a) * (1.0 + square(b2a_ratio) + square(c2a_ratio))); 53 43 } -
sasmodels/models/hollow_rectangular_prism.py
r99658f6 ree60aa7 98 98 99 99 .. [#Nayuk2012] R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854 100 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).101 100 102 101 … … 151 150 have_Fq = True 152 151 effective_radius_type = [ 153 "equivalent cylinder excluded volume", "equivalent outer volume sphere", 154 "half length_a", "half length_b", "half length_c", 152 "equivalent sphere", "half length_a", "half length_b", "half length_c", 155 153 "equivalent outer circular cross-section", 156 154 "half ab diagonal", "half diagonal", -
sasmodels/models/hollow_rectangular_prism_thin_walls.c
r99658f6 rd42dd4a 18 18 19 19 static double 20 radius_from_excluded_volume(double length_a, double b2a_ratio, double c2a_ratio)21 {22 const double r_equiv = sqrt(length_a*length_a*b2a_ratio/M_PI);23 const double length_c = length_a*c2a_ratio;24 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length_c + (r_equiv + length_c)*(M_PI*r_equiv + length_c)));25 }26 27 static double28 20 effective_radius(int mode, double length_a, double b2a_ratio, double c2a_ratio) 29 21 { 30 22 switch (mode) { 31 23 default: 32 case 1: // equivalent cylinder excluded volume 33 return radius_from_excluded_volume(length_a, b2a_ratio, c2a_ratio); 34 case 2: // equivalent outer volume sphere 24 case 1: // equivalent sphere 35 25 return cbrt(cube(length_a)*b2a_ratio*c2a_ratio/M_4PI_3); 36 case 3: // half length_a26 case 2: // half length_a 37 27 return 0.5 * length_a; 38 case 4: // half length_b28 case 3: // half length_b 39 29 return 0.5 * length_a*b2a_ratio; 40 case 5: // half length_c30 case 4: // half length_c 41 31 return 0.5 * length_a*c2a_ratio; 42 case 6: // equivalent outer circular cross-section32 case 5: // equivalent outer circular cross-section 43 33 return length_a*sqrt(b2a_ratio/M_PI); 44 case 7: // half ab diagonal34 case 6: // half ab diagonal 45 35 return 0.5*sqrt(square(length_a) * (1.0 + square(b2a_ratio))); 46 case 8: // half diagonal36 case 7: // half diagonal 47 37 return 0.5*sqrt(square(length_a) * (1.0 + square(b2a_ratio) + square(c2a_ratio))); 48 38 } -
sasmodels/models/hollow_rectangular_prism_thin_walls.py
r99658f6 ree60aa7 72 72 73 73 .. [#Nayuk2012] R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854 74 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).75 74 76 75 … … 111 110 have_Fq = True 112 111 effective_radius_type = [ 113 "equivalent cylinder excluded volume", "equivalent outer volume sphere", 114 "half length_a", "half length_b", "half length_c", 112 "equivalent sphere", "half length_a", "half length_b", "half length_c", 115 113 "equivalent outer circular cross-section", 116 114 "half ab diagonal", "half diagonal", -
sasmodels/models/parallelepiped.c
r99658f6 rd42dd4a 6 6 7 7 static double 8 radius_from_excluded_volume(double length_a, double length_b, double length_c)9 {10 double r_equiv, length;11 double lengths[3] = {length_a, length_b, length_c};12 double lengthmax = fmax(lengths[0],fmax(lengths[1],lengths[2]));13 double length_1 = lengthmax;14 double length_2 = lengthmax;15 double length_3 = lengthmax;16 17 for(int ilen=0; ilen<3; ilen++) {18 if (lengths[ilen] < length_1) {19 length_2 = length_1;20 length_1 = lengths[ilen];21 } else {22 if (lengths[ilen] < length_2) {23 length_2 = lengths[ilen];24 }25 }26 }27 if(length_2-length_1 > length_3-length_2) {28 r_equiv = sqrt(length_2*length_3/M_PI);29 length = length_1;30 } else {31 r_equiv = sqrt(length_1*length_2/M_PI);32 length = length_3;33 }34 35 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length + (r_equiv + length)*(M_PI*r_equiv + length)));36 }37 38 static double39 8 effective_radius(int mode, double length_a, double length_b, double length_c) 40 9 { 41 10 switch (mode) { 42 11 default: 43 case 1: // equivalent cylinder excluded volume 44 return radius_from_excluded_volume(length_a,length_b,length_c); 45 case 2: // equivalent volume sphere 12 case 1: // equivalent sphere 46 13 return cbrt(length_a*length_b*length_c/M_4PI_3); 47 case 3: // half length_a14 case 2: // half length_a 48 15 return 0.5 * length_a; 49 case 4: // half length_b16 case 3: // half length_b 50 17 return 0.5 * length_b; 51 case 5: // half length_c18 case 4: // half length_c 52 19 return 0.5 * length_c; 53 case 6: // equivalent circular cross-section20 case 5: // equivalent circular cross-section 54 21 return sqrt(length_a*length_b/M_PI); 55 case 7: // half ab diagonal22 case 6: // half ab diagonal 56 23 return 0.5*sqrt(length_a*length_a + length_b*length_b); 57 case 8: // half diagonal24 case 7: // half diagonal 58 25 return 0.5*sqrt(length_a*length_a + length_b*length_b + length_c*length_c); 59 26 } -
sasmodels/models/parallelepiped.py
r99658f6 ree60aa7 180 180 14 (1961) 185-211 181 181 .. [#] R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854 182 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).183 182 184 183 Authorship and Verification … … 233 232 have_Fq = True 234 233 effective_radius_type = [ 235 "equivalent cylinder excluded volume", "equivalent volume sphere", 236 "half length_a", "half length_b", "half length_c", 234 "equivalent sphere", "half length_a", "half length_b", "half length_c", 237 235 "equivalent circular cross-section", "half ab diagonal", "half diagonal", 238 236 ] -
sasmodels/models/pearl_necklace.c
r99658f6 r3f853beb 67 67 } 68 68 69 double form_volume(double radius, double edge_sep, double thick_string, double fp_num_pearls) 69 double form_volume(double radius, double edge_sep, 70 double thick_string, double fp_num_pearls) 70 71 { 71 72 const int num_pearls = (int)(fp_num_pearls + 0.5); //Force integer number of pearls … … 76 77 77 78 return volume; 78 }79 80 static double81 radius_from_volume(double radius, double edge_sep, double thick_string, double fp_num_pearls)82 {83 const int num_pearls = (int) fp_num_pearls +0.5;84 const double vol_tot = form_volume(radius, edge_sep, thick_string, fp_num_pearls);85 return cbrt(vol_tot/M_4PI_3);86 }87 88 static double89 effective_radius(int mode, double radius, double edge_sep, double thick_string, double fp_num_pearls)90 {91 switch (mode) {92 default:93 case 1:94 return radius_from_volume(radius, edge_sep, thick_string, fp_num_pearls);95 }96 79 } 97 80 -
sasmodels/models/pearl_necklace.py
rcf3d0ce r2cc8aa2 53 53 R Schweins and K Huber, *Particle Scattering Factor of Pearl Necklace Chains*, 54 54 *Macromol. Symp.* 211 (2004) 25-42 2004 55 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).56 55 """ 57 56 … … 96 95 source = ["lib/sas_Si.c", "lib/sas_3j1x_x.c", "pearl_necklace.c"] 97 96 single = False # use double precision unless told otherwise 98 effective_radius_type = [ 99 "equivalent volume sphere", 100 ] 101 97 98 def volume(radius, edge_sep, thick_string, num_pearls): 99 """ 100 Calculates the total particle volume of the necklace. 101 Redundant with form_volume. 102 """ 103 num_pearls = int(num_pearls + 0.5) 104 number_of_strings = num_pearls - 1.0 105 string_vol = edge_sep * pi * pow((thick_string / 2.0), 2.0) 106 pearl_vol = 4.0 /3.0 * pi * pow(radius, 3.0) 107 total_vol = number_of_strings * string_vol 108 total_vol += num_pearls * pearl_vol 109 return total_vol 110 111 def ER(radius, edge_sep, thick_string, num_pearls): 112 """ 113 Calculation for effective radius. 114 """ 115 num_pearls = int(num_pearls + 0.5) 116 tot_vol = volume(radius, edge_sep, thick_string, num_pearls) 117 rad_out = (tot_vol/(4.0/3.0*pi)) ** (1./3.) 118 return rad_out 119 102 120 def random(): 103 121 radius = 10**np.random.uniform(1, 3) # 1 - 1000 -
sasmodels/models/pringle.c
r99658f6 rd42dd4a 105 105 106 106 static double 107 radius_from_excluded_volume(double radius, double thickness)108 {109 return 0.5*cbrt(0.75*radius*(2.0*radius*thickness + (radius + thickness)*(M_PI*radius + thickness)));110 }111 112 static double113 107 effective_radius(int mode, double radius, double thickness, double alpha, double beta) 114 108 { 115 109 switch (mode) { 116 110 default: 117 case 1: // equivalent cylinder excluded volume 118 return radius_from_excluded_volume(radius, thickness); 119 case 2: // equivalent volume sphere 111 case 1: // equivalent sphere 120 112 return cbrt(M_PI*radius*radius*thickness/M_4PI_3); 121 case 3: // radius113 case 2: // radius 122 114 return radius; 123 115 } -
sasmodels/models/pringle.py
r99658f6 ree60aa7 42 42 Karen Edler, Universtiy of Bath, Private Communication. 2012. 43 43 Derivation by Stefan Alexandru Rautu. 44 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).45 44 46 45 * **Author:** Andrew Jackson **Date:** 2008 … … 75 74 source = ["lib/polevl.c", "lib/sas_J0.c", "lib/sas_J1.c", 76 75 "lib/sas_JN.c", "lib/gauss76.c", "pringle.c"] 77 effective_radius_type = ["equivalent cylinder excluded volume", "equivalent volumesphere", "radius"]76 effective_radius_type = ["equivalent sphere", "radius"] 78 77 79 78 def random(): -
sasmodels/models/rectangular_prism.c
r99658f6 rd42dd4a 6 6 7 7 static double 8 radius_from_excluded_volume(double length_a, double b2a_ratio, double c2a_ratio)9 {10 double const r_equiv = sqrt(length_a*length_a*b2a_ratio/M_PI);11 double const length_c = c2a_ratio*length_a;12 return 0.5*cbrt(0.75*r_equiv*(2.0*r_equiv*length_c + (r_equiv + length_c)*(M_PI*r_equiv + length_c)));13 }14 15 static double16 8 effective_radius(int mode, double length_a, double b2a_ratio, double c2a_ratio) 17 9 { 18 10 switch (mode) { 19 11 default: 20 case 1: // equivalent cylinder excluded volume 21 return radius_from_excluded_volume(length_a,b2a_ratio,c2a_ratio); 22 case 2: // equivalent volume sphere 12 case 1: // equivalent sphere 23 13 return cbrt(cube(length_a)*b2a_ratio*c2a_ratio/M_4PI_3); 24 case 3: // half length_a14 case 2: // half length_a 25 15 return 0.5 * length_a; 26 case 4: // half length_b16 case 3: // half length_b 27 17 return 0.5 * length_a*b2a_ratio; 28 case 5: // half length_c18 case 4: // half length_c 29 19 return 0.5 * length_a*c2a_ratio; 30 case 6: // equivalent circular cross-section20 case 5: // equivalent circular cross-section 31 21 return length_a*sqrt(b2a_ratio/M_PI); 32 case 7: // half ab diagonal22 case 6: // half ab diagonal 33 23 return 0.5*sqrt(square(length_a) * (1.0 + square(b2a_ratio))); 34 case 8: // half diagonal24 case 7: // half diagonal 35 25 return 0.5*sqrt(square(length_a) * (1.0 + square(b2a_ratio) + square(c2a_ratio))); 36 26 } -
sasmodels/models/rectangular_prism.py
r99658f6 ree60aa7 99 99 100 100 R Nayuk and K Huber, *Z. Phys. Chem.*, 226 (2012) 837-854 101 102 L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).103 104 101 """ 105 102 … … 140 137 have_Fq = True 141 138 effective_radius_type = [ 142 "equivalent cylinder excluded volume", "equivalent volume sphere", 143 "half length_a", "half length_b", "half length_c", 139 "equivalent sphere", "half length_a", "half length_b", "half length_c", 144 140 "equivalent circular cross-section", "half ab diagonal", "half diagonal", 145 141 ] -
sasmodels/models/triaxial_ellipsoid.c
r99658f6 rd42dd4a 5 5 { 6 6 return M_4PI_3*radius_equat_minor*radius_equat_major*radius_polar; 7 }8 9 static double10 radius_from_curvature(double radius_equat_minor, double radius_equat_major, double radius_polar)11 {12 // Trivial cases13 if (radius_equat_minor == radius_equat_major == radius_polar) return radius_polar;14 if (radius_equat_minor * radius_equat_major * radius_polar == 0.) return 0.;15 16 17 double r_equat_equiv, r_polar_equiv;18 double radii[3] = {radius_equat_minor, radius_equat_major, radius_polar};19 double radmax = fmax(radii[0],fmax(radii[1],radii[2]));20 21 double radius_1 = radmax;22 double radius_2 = radmax;23 double radius_3 = radmax;24 25 for(int irad=0; irad<3; irad++) {26 if (radii[irad] < radius_1) {27 radius_3 = radius_2;28 radius_2 = radius_1;29 radius_1 = radii[irad];30 } else {31 if (radii[irad] < radius_2) {32 radius_2 = radii[irad];33 }34 }35 }36 if(radius_2-radius_1 > radius_3-radius_2) {37 r_equat_equiv = sqrt(radius_2*radius_3);38 r_polar_equiv = radius_1;39 } else {40 r_equat_equiv = sqrt(radius_1*radius_2);41 r_polar_equiv = radius_3;42 }43 44 // see equation (26) in A.Isihara, J.Chem.Phys. 18(1950)1446-144945 const double ratio = (r_polar_equiv < r_equat_equiv46 ? r_polar_equiv / r_equat_equiv47 : r_equat_equiv / r_polar_equiv);48 const double e1 = sqrt(1.0 - ratio*ratio);49 const double b1 = 1.0 + asin(e1) / (e1 * ratio);50 const double bL = (1.0 + e1) / (1.0 - e1);51 const double b2 = 1.0 + 0.5 * ratio * ratio / e1 * log(bL);52 const double delta = 0.75 * b1 * b2;53 const double ddd = 2.0 * (delta + 1.0) * r_polar_equiv * r_equat_equiv * r_equat_equiv;54 return 0.5 * cbrt(ddd);55 7 } 56 8 … … 80 32 switch (mode) { 81 33 default: 82 case 1: // equivalent biaxial ellipsoid average curvature 83 return radius_from_curvature(radius_equat_minor,radius_equat_major, radius_polar); 84 case 2: // equivalent volume sphere 34 case 1: // equivalent sphere 85 35 return radius_from_volume(radius_equat_minor,radius_equat_major, radius_polar); 86 case 3: // min radius36 case 2: // min radius 87 37 return radius_from_min_dimension(radius_equat_minor,radius_equat_major, radius_polar); 88 case 4: // max radius38 case 3: // max radius 89 39 return radius_from_max_dimension(radius_equat_minor,radius_equat_major, radius_polar); 90 40 } -
sasmodels/models/triaxial_ellipsoid.py
r99658f6 ree60aa7 158 158 source = ["lib/sas_3j1x_x.c", "lib/gauss76.c", "triaxial_ellipsoid.c"] 159 159 have_Fq = True 160 effective_radius_type = ["equivalent biaxial ellipsoid average curvature", "equivalent volumesphere", "min radius", "max radius"]160 effective_radius_type = ["equivalent sphere", "min radius", "max radius"] 161 161 162 162 def random(): -
sasmodels/product.py
r99658f6 r39a06c9 37 37 #] 38 38 39 STRUCTURE_MODE_ID = "structure_factor_mode"40 RADIUS_MODE_ID = "radius_effective_mode"41 39 RADIUS_ID = "radius_effective" 42 40 VOLFRAC_ID = "volfraction" … … 45 43 if p_info.have_Fq: 46 44 par = parse_parameter( 47 STRUCTURE_MODE_ID,45 "structure_factor_mode", 48 46 "", 49 47 0, … … 54 52 if p_info.effective_radius_type is not None: 55 53 par = parse_parameter( 56 RADIUS_MODE_ID,54 "radius_effective_mode", 57 55 "", 58 1,56 0, 59 57 [["unconstrained"] + p_info.effective_radius_type], 60 58 "", -
sasmodels/sasview_model.py
r5024a56 r39a06c9 859 859 P = _make_standard_model('cylinder')() 860 860 model = MultiplicationModel(P, S) 861 model.setParam( product.RADIUS_MODE_ID, 1.0)861 model.setParam('radius_effective_mode', 1.0) 862 862 value = model.evalDistribution([0.1, 0.1]) 863 863 if np.isnan(value):
Note: See TracChangeset
for help on using the changeset viewer.