Changeset 43ff77c in sasmodels
- Timestamp:
- Apr 7, 2017 10:47:50 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:
- 3a45c2c
- Parents:
- e2d6e3b (diff), b2f1d2f (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:
-
- 3 added
- 31 edited
Legend:
- Unmodified
- Added
- Removed
-
.travis.yml
rbec0e75 r01e551a 1 # Test Travis CL2 3 1 language: python 4 2 python: 5 - "2.7" 6 # whitelist 3 - '2.7' 7 4 branches: 8 5 only: 9 - master 10 # command to install dependencies 6 - master 11 7 virtualenv: 12 8 system_site_packages: true 13 9 before_install: 14 - sudo apt-get update; 15 - sudo apt-get install python-numpy python-scipy 16 # - sudo apt-get install opencl-headers 17 10 - sudo apt-get update; 11 - sudo apt-get install python-numpy python-scipy 18 12 install: 19 # - pip install pyopencl 20 - pip install bumps 21 - pip install unittest-xml-reporting 13 - pip install bumps 14 - pip install unittest-xml-reporting 22 15 script: 23 - export WORKSPACE=/home/travis/build/SasView/sasmodels/ 24 - python -m sasmodels.model_test dll all 16 - export WORKSPACE=/home/travis/build/SasView/sasmodels/ 17 - python -m sasmodels.model_test dll all 18 notifications: 19 slack: 20 secure: xNAUeSu1/it/x9Q2CSg79aw1LLc7d6mLpcqSCTeKROp71RhkFf8VjJnJm/lEbKHNC8yj5H9UHrz5DmzwJzI+6oMt4NdEeS6WvGhwGY/wCt2IcJKxw0vj1DAU04qFMS041Khwclo6jIqm76DloinXvmvsS+K/nSyQkF7q4egSlwA= -
sasmodels/compare.py
r6e5c0b7 r43ff77c 546 546 'f32': '32', 547 547 'f64': '64', 548 'float16': '16', 549 'float32': '32', 550 'float64': '64', 551 'float128': '128', 548 552 'longdouble': '128', 549 553 } -
sasmodels/core.py
r5124c969 r650c6d2 250 250 dtype = "longdouble" 251 251 elif dtype == "half": 252 dtype = "f 16"252 dtype = "float16" 253 253 254 254 # Convert dtype string to numpy dtype. -
sasmodels/kerneldll.py
r886fa25 rb2f1d2f 97 97 98 98 if "SAS_COMPILER" in os.environ: 99 compiler= os.environ["SAS_COMPILER"]99 COMPILER = os.environ["SAS_COMPILER"] 100 100 elif os.name == 'nt': 101 # If vcvarsall.bat has been called, then VCINSTALLDIR is in the environment102 # and we can use the MSVC compiler. Otherwise, if tinycc is available103 # the use it. Otherwise, hope that mingw is available.104 if "VCINSTALLDIR" in os.environ:105 compiler = "msvc"106 elif tinycc:107 compiler = "tinycc"101 if tinycc is not None: 102 COMPILER = "tinycc" 103 elif "VCINSTALLDIR" in os.environ: 104 # If vcvarsall.bat has been called, then VCINSTALLDIR is in the environment 105 # and we can use the MSVC compiler. Otherwise, if tinycc is available 106 # the use it. Otherwise, hope that mingw is available. 107 COMPILER = "msvc" 108 108 else: 109 compiler= "mingw"109 COMPILER = "mingw" 110 110 else: 111 compiler= "unix"111 COMPILER = "unix" 112 112 113 113 ARCH = "" if ct.sizeof(ct.c_void_p) > 4 else "x86" # 4 byte pointers on x86 114 if compiler== "unix":114 if COMPILER == "unix": 115 115 # Generic unix compile 116 116 # On mac users will need the X code command line tools installed … … 123 123 """unix compiler command""" 124 124 return CC + [source, "-o", output, "-lm"] 125 elif compiler== "msvc":125 elif COMPILER == "msvc": 126 126 # Call vcvarsall.bat before compiling to set path, headers, libs, etc. 127 127 # MSVC compiler is available, so use it. OpenMP requires a copy of … … 139 139 """MSVC compiler command""" 140 140 return CC + ["/Tp%s"%source] + LN + ["/OUT:%s"%output] 141 elif compiler== "tinycc":141 elif COMPILER == "tinycc": 142 142 # TinyCC compiler. 143 143 CC = [tinycc.TCC] + "-shared -rdynamic -Wall".split() … … 145 145 """tinycc compiler command""" 146 146 return CC + [source, "-o", output] 147 elif compiler== "mingw":147 elif COMPILER == "mingw": 148 148 # MinGW compiler. 149 149 CC = "gcc -shared -std=c99 -O2 -Wall".split() -
sasmodels/kernelpy.py
rb397165 rdbfd471 235 235 # exclude all q for that NaN. Even better would be to have an 236 236 # INVALID expression like the C models, but that is too expensive. 237 Iq = form()237 Iq = np.asarray(form(), 'd') 238 238 if np.isnan(Iq).any(): continue 239 239 -
sasmodels/models/hayter_msa.py
ra807206 r5702f52 74 74 ["radius_effective", "Ang", 20.75, [0, inf], "volume", "effective radius of charged sphere"], 75 75 ["volfraction", "None", 0.0192, [0, 0.74], "", "volume fraction of spheres"], 76 ["charge", "e", 19.0, [0, inf], "", "charge on sphere (in electrons)"],77 ["temperature", "K", 318.16, [0, inf], "", "temperature, in Kelvin, for Debye length calculation"],78 ["concentration_salt", "M", 0.0, [ -inf, inf], "", "conc of salt, moles/litre, 1:1 electolyte, for Debye length"],76 ["charge", "e", 19.0, [0, 200], "", "charge on sphere (in electrons)"], 77 ["temperature", "K", 318.16, [0, 450], "", "temperature, in Kelvin, for Debye length calculation"], 78 ["concentration_salt", "M", 0.0, [0, inf], "", "conc of salt, moles/litre, 1:1 electolyte, for Debye length"], 79 79 ["dielectconst", "None", 71.08, [-inf, inf], "", "dielectric constant (relative permittivity) of solvent, default water, for Debye length"] 80 80 ] -
explore/angular_pd.py
r12eb36b r8267e0b 47 47 48 48 def draw_mesh_new(ax, theta, dtheta, phi, dphi, flow, radius=10., dist='gauss'): 49 theta_center = radians( theta)49 theta_center = radians(90-theta) 50 50 phi_center = radians(phi) 51 51 flow_center = radians(flow) … … 137 137 radius=11., dist=dist) 138 138 if not axis.startswith('d'): 139 ax.view_init(elev= theta, azim=phi)139 ax.view_init(elev=90-theta if use_new else theta, azim=phi) 140 140 plt.gcf().canvas.draw() 141 141 -
sasmodels/kernel_header.c
rdaeef4c rb00a646 148 148 inline double sas_sinx_x(double x) { return x==0 ? 1.0 : sin(x)/x; } 149 149 150 // To rotate from the canonical position to theta, phi, psi, first rotate by 151 // psi about the major axis, oriented along z, which is a rotation in the 152 // detector plane xy. Next rotate by theta about the y axis, aligning the major 153 // axis in the xz plane. Finally, rotate by phi in the detector plane xy. 154 // To compute the scattering, undo these rotations in reverse order: 155 // rotate in xy by -phi, rotate in xz by -theta, rotate in xy by -psi 156 // The returned q is the length of the q vector and (xhat, yhat, zhat) is a unit 157 // vector in the q direction. 158 // To change between counterclockwise and clockwise rotation, change the 159 // sign of phi and psi. 160 150 161 #if 1 151 162 //think cos(theta) should be sin(theta) in new coords, RKH 11Jan2017 … … 166 177 #endif 167 178 179 #if 1 180 #define ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat) do { \ 181 q = sqrt(qx*qx + qy*qy); \ 182 const double qxhat = qx/q; \ 183 const double qyhat = qy/q; \ 184 double sin_theta, cos_theta; \ 185 double sin_phi, cos_phi; \ 186 double sin_psi, cos_psi; \ 187 SINCOS(theta*M_PI_180, sin_theta, cos_theta); \ 188 SINCOS(phi*M_PI_180, sin_phi, cos_phi); \ 189 SINCOS(psi*M_PI_180, sin_psi, cos_psi); \ 190 xhat = qxhat*(-sin_phi*sin_psi + cos_theta*cos_phi*cos_psi) \ 191 + qyhat*( cos_phi*sin_psi + cos_theta*sin_phi*cos_psi); \ 192 yhat = qxhat*(-sin_phi*cos_psi - cos_theta*cos_phi*sin_psi) \ 193 + qyhat*( cos_phi*cos_psi - cos_theta*sin_phi*sin_psi); \ 194 zhat = qxhat*(-sin_theta*cos_phi) \ 195 + qyhat*(-sin_theta*sin_phi); \ 196 } while (0) 197 #else 198 // SasView 3.x definition of orientation 168 199 #define ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_alpha, cos_mu, cos_nu) do { \ 169 200 q = sqrt(qx*qx + qy*qy); \ … … 180 211 cos_nu = (-cos_phi*sin_psi*sin_theta + sin_phi*cos_psi)*qxhat + sin_psi*cos_theta*qyhat; \ 181 212 } while (0) 213 #endif -
sasmodels/models/barbell.py
rfcb33e4 r0b56f38 87 87 * **Last Reviewed by:** Richard Heenan **Date:** January 4, 2017 88 88 """ 89 from numpy import inf 89 from numpy import inf, sin, cos, pi 90 90 91 91 name = "barbell" … … 125 125 phi_pd=15, phi_pd_n=0, 126 126 ) 127 q = 0.1 128 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 129 qx = q*cos(pi/6.0) 130 qy = q*sin(pi/6.0) 131 tests = [[{}, 0.075, 25.5691260532], 132 [{'theta':80., 'phi':10.}, (qx, qy), 3.04233067789], 133 ] 134 del qx, qy # not necessary to delete, but cleaner -
sasmodels/models/bcc_paracrystal.c
r4962519 r50beefe 90 90 double theta, double phi, double psi) 91 91 { 92 double q, cos_a1, cos_a2, cos_a3;93 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_a3, cos_a2, cos_a1);92 double q, zhat, yhat, xhat; 93 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 94 94 95 const double a1 = + cos_a3 - cos_a1 + cos_a2;96 const double a2 = + cos_a3 + cos_a1 - cos_a2;97 const double a3 = - cos_a3 + cos_a1 + cos_a2;95 const double a1 = +xhat - zhat + yhat; 96 const double a2 = +xhat + zhat - yhat; 97 const double a3 = -xhat + zhat + yhat; 98 98 99 99 const double qd = 0.5*q*dnn; -
sasmodels/models/bcc_paracrystal.py
r925ad6e re2d6e3b 99 99 """ 100 100 101 from numpy import inf 101 from numpy import inf, pi 102 102 103 103 name = "bcc_paracrystal" … … 141 141 psi_pd=15, psi_pd_n=0, 142 142 ) 143 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 144 # add 2d test later 145 q =4.*pi/220. 146 tests = [ 147 [{ }, 148 [0.001, q, 0.215268], [1.46601394721, 2.85851284174, 0.00866710287078]], 149 ] -
sasmodels/models/capped_cylinder.py
rfcb33e4 r0b56f38 91 91 92 92 """ 93 from numpy import inf 93 from numpy import inf, sin, cos, pi 94 94 95 95 name = "capped_cylinder" … … 145 145 theta_pd=15, theta_pd_n=45, 146 146 phi_pd=15, phi_pd_n=1) 147 q = 0.1 148 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 149 qx = q*cos(pi/6.0) 150 qy = q*sin(pi/6.0) 151 tests = [[{}, 0.075, 26.0698570695], 152 [{'theta':80., 'phi':10.}, (qx, qy), 0.561811990502], 153 ] 154 del qx, qy # not necessary to delete, but cleaner -
sasmodels/models/core_shell_bicelle.c
r592343f rb260926 30 30 31 31 static double 32 bicelle_kernel(double q q,32 bicelle_kernel(double q, 33 33 double rad, 34 34 double radthick, 35 35 double facthick, 36 double length,36 double halflength, 37 37 double rhoc, 38 38 double rhoh, … … 42 42 double cos_alpha) 43 43 { 44 double si1,si2,be1,be2;45 46 44 const double dr1 = rhoc-rhoh; 47 45 const double dr2 = rhor-rhosolv; 48 46 const double dr3 = rhoh-rhor; 49 const double vol1 = M_PI*rad*rad*(2.0*length); 50 const double vol2 = M_PI*(rad+radthick)*(rad+radthick)*2.0*(length+facthick); 51 const double vol3 = M_PI*rad*rad*2.0*(length+facthick); 52 double besarg1 = qq*rad*sin_alpha; 53 double besarg2 = qq*(rad+radthick)*sin_alpha; 54 double sinarg1 = qq*length*cos_alpha; 55 double sinarg2 = qq*(length+facthick)*cos_alpha; 47 const double vol1 = M_PI*square(rad)*2.0*(halflength); 48 const double vol2 = M_PI*square(rad+radthick)*2.0*(halflength+facthick); 49 const double vol3 = M_PI*square(rad)*2.0*(halflength+facthick); 56 50 57 be1 = sas_2J1x_x(besarg1);58 be2 = sas_2J1x_x(besarg2);59 si1 = sas_sinx_x(sinarg1);60 si2 = sas_sinx_x(sinarg2);51 const double be1 = sas_2J1x_x(q*(rad)*sin_alpha); 52 const double be2 = sas_2J1x_x(q*(rad+radthick)*sin_alpha); 53 const double si1 = sas_sinx_x(q*(halflength)*cos_alpha); 54 const double si2 = sas_sinx_x(q*(halflength+facthick)*cos_alpha); 61 55 62 56 const double t = vol1*dr1*si1*be1 + … … 64 58 vol3*dr3*si2*be1; 65 59 66 const double retval = t*t *sin_alpha;60 const double retval = t*t; 67 61 68 62 return retval; … … 71 65 72 66 static double 73 bicelle_integration(double q q,67 bicelle_integration(double q, 74 68 double rad, 75 69 double radthick, … … 83 77 // set up the integration end points 84 78 const double uplim = M_PI_4; 85 const double half height= 0.5*length;79 const double halflength = 0.5*length; 86 80 87 81 double summ = 0.0; … … 90 84 double sin_alpha, cos_alpha; // slots to hold sincos function output 91 85 SINCOS(alpha, sin_alpha, cos_alpha); 92 double yyy = Gauss76Wt[i] * bicelle_kernel(q q, rad, radthick, facthick,93 half height, rhoc, rhoh, rhor, rhosolv,86 double yyy = Gauss76Wt[i] * bicelle_kernel(q, rad, radthick, facthick, 87 halflength, rhoc, rhoh, rhor, rhosolv, 94 88 sin_alpha, cos_alpha); 95 summ += yyy ;89 summ += yyy*sin_alpha; 96 90 } 97 91 … … 119 113 double answer = bicelle_kernel(q, radius, thick_rim, thick_face, 120 114 0.5*length, core_sld, face_sld, rim_sld, 121 solvent_sld, sin_alpha, cos_alpha) / fabs(sin_alpha); 122 123 answer *= 1.0e-4; 124 125 return answer; 115 solvent_sld, sin_alpha, cos_alpha); 116 return 1.0e-4*answer; 126 117 } 127 118 -
sasmodels/models/core_shell_bicelle.py
r3b9a526 r0b56f38 88 88 """ 89 89 90 from numpy import inf, sin, cos 90 from numpy import inf, sin, cos, pi 91 91 92 92 name = "core_shell_bicelle" … … 155 155 theta=90, 156 156 phi=0) 157 q = 0.1 158 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 159 qx = q*cos(pi/6.0) 160 qy = q*sin(pi/6.0) 161 tests = [[{}, 0.05, 7.4883545957], 162 [{'theta':80., 'phi':10.}, (qx, qy), 2.81048892474 ], 163 ] 164 del qx, qy # not necessary to delete, but cleaner 157 165 158 #qx, qy = 0.4 * cos(pi/2.0), 0.5 * sin(0) -
sasmodels/models/core_shell_bicelle_elliptical.c
r592343f rf4f85b3 32 32 } 33 33 34 double 35 Iq(double qq, 36 double rad, 37 double x_core, 38 double radthick, 39 double facthick, 40 double length, 41 double rhoc, 42 double rhoh, 43 double rhor, 44 double rhosolv) 34 double Iq(double q, 35 double rad, 36 double x_core, 37 double radthick, 38 double facthick, 39 double length, 40 double rhoc, 41 double rhoh, 42 double rhor, 43 double rhosolv) 45 44 { 46 45 double si1,si2,be1,be2; … … 74 73 const double sin_alpha = sqrt(1.0 - cos_alpha*cos_alpha); 75 74 double inner_sum=0; 76 double sinarg1 = q q*halfheight*cos_alpha;77 double sinarg2 = q q*(halfheight+facthick)*cos_alpha;75 double sinarg1 = q*halfheight*cos_alpha; 76 double sinarg2 = q*(halfheight+facthick)*cos_alpha; 78 77 si1 = sas_sinx_x(sinarg1); 79 78 si2 = sas_sinx_x(sinarg2); … … 83 82 const double beta = ( Gauss76Z[j] +1.0)*M_PI_2; 84 83 const double rr = sqrt(rA - rB*cos(beta)); 85 double besarg1 = q q*rr*sin_alpha;86 double besarg2 = q q*(rr+radthick)*sin_alpha;84 double besarg1 = q*rr*sin_alpha; 85 double besarg2 = q*(rr+radthick)*sin_alpha; 87 86 be1 = sas_2J1x_x(besarg1); 88 87 be2 = sas_2J1x_x(besarg2); … … 114 113 { 115 114 // THIS NEEDS TESTING 116 double q q, cos_val, cos_mu, cos_nu;117 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q q, cos_val, cos_mu, cos_nu);115 double q, xhat, yhat, zhat; 116 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 118 117 const double dr1 = rhoc-rhoh; 119 118 const double dr2 = rhor-rhosolv; … … 125 124 const double vol3 = M_PI*rad*radius_major*2.0*(halfheight+facthick); 126 125 127 // Compute: r = sqrt((radius_major* cos_nu)^2 + (radius_minor*cos_mu)^2)126 // Compute: r = sqrt((radius_major*zhat)^2 + (radius_minor*yhat)^2) 128 127 // Given: radius_major = r_ratio * radius_minor 129 128 // ASSUME the sin_alpha is included in the separate integration over orientation of rod angle 130 const double r = rad*sqrt(square(x_core*cos_nu) + cos_mu*cos_mu); 131 const double be1 = sas_2J1x_x( qq*r ); 132 const double be2 = sas_2J1x_x( qq*(r + radthick ) ); 133 const double si1 = sas_sinx_x( qq*halfheight*cos_val ); 134 const double si2 = sas_sinx_x( qq*(halfheight + facthick)*cos_val ); 129 const double rad_minor = rad; 130 const double rad_major = rad*x_core; 131 const double r_hat = sqrt(square(rad_major*xhat) + square(rad_minor*yhat)); 132 const double rshell_hat = sqrt(square((rad_major+radthick)*xhat) 133 + square((rad_minor+radthick)*yhat)); 134 const double be1 = sas_2J1x_x( q*r_hat ); 135 const double be2 = sas_2J1x_x( q*rshell_hat ); 136 const double si1 = sas_sinx_x( q*halfheight*zhat ); 137 const double si2 = sas_sinx_x( q*(halfheight + facthick)*zhat ); 135 138 const double Aq = square( vol1*dr1*si1*be1 + vol2*dr2*si2*be2 + vol3*dr3*si2*be1); 136 139 //const double vol = form_volume(radius_minor, r_ratio, length); -
sasmodels/models/core_shell_bicelle_elliptical.py
r3b9a526 r0b56f38 99 99 """ 100 100 101 from numpy import inf, sin, cos 101 from numpy import inf, sin, cos, pi 102 102 103 103 name = "core_shell_bicelle_elliptical" … … 150 150 psi=0) 151 151 152 #qx, qy = 0.4 * cos(pi/2.0), 0.5 * sin(0) 152 q = 0.1 153 # april 6 2017, rkh added a 2d unit test, NOT READY YET pull #890 branch assume correct! 154 qx = q*cos(pi/6.0) 155 qy = q*sin(pi/6.0) 153 156 154 157 tests = [ … … 159 162 'sld_core':4.0, 'sld_face':7.0, 'sld_rim':1.0, 'sld_solvent':6.0, 'background':0.0}, 160 163 0.015, 286.540286], 161 ] 164 # [{'theta':80., 'phi':10.}, (qx, qy), 7.88866563001 ], 165 ] 166 167 del qx, qy # not necessary to delete, but cleaner -
sasmodels/models/core_shell_cylinder.py
rfcb33e4 r0b56f38 73 73 """ 74 74 75 from numpy import pi, inf 75 from numpy import pi, inf, sin, cos 76 76 77 77 name = "core_shell_cylinder" … … 151 151 theta_pd=15, theta_pd_n=45, 152 152 phi_pd=15, phi_pd_n=1) 153 153 q = 0.1 154 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 155 qx = q*cos(pi/6.0) 156 qy = q*sin(pi/6.0) 157 tests = [[{}, 0.075, 10.8552692237], 158 [{}, (qx, qy), 0.444618752741 ], 159 ] 160 del qx, qy # not necessary to delete, but cleaner -
sasmodels/models/core_shell_parallelepiped.c
r1e7b0db0 r92dfe0c 134 134 double psi) 135 135 { 136 double q, cos_val_a, cos_val_b, cos_val_c;137 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_val_c, cos_val_b, cos_val_a);136 double q, zhat, yhat, xhat; 137 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 138 138 139 139 // cspkernel in csparallelepiped recoded here … … 160 160 double tc = length_a + 2.0*thick_rim_c; 161 161 //handle arg=0 separately, as sin(t)/t -> 1 as t->0 162 double siA = sas_sinx_x(0.5*q*length_a* cos_val_a);163 double siB = sas_sinx_x(0.5*q*length_b* cos_val_b);164 double siC = sas_sinx_x(0.5*q*length_c* cos_val_c);165 double siAt = sas_sinx_x(0.5*q*ta* cos_val_a);166 double siBt = sas_sinx_x(0.5*q*tb* cos_val_b);167 double siCt = sas_sinx_x(0.5*q*tc* cos_val_c);162 double siA = sas_sinx_x(0.5*q*length_a*xhat); 163 double siB = sas_sinx_x(0.5*q*length_b*yhat); 164 double siC = sas_sinx_x(0.5*q*length_c*zhat); 165 double siAt = sas_sinx_x(0.5*q*ta*xhat); 166 double siBt = sas_sinx_x(0.5*q*tb*yhat); 167 double siCt = sas_sinx_x(0.5*q*tc*zhat); 168 168 169 169 -
sasmodels/models/core_shell_parallelepiped.py
rcb0dc22 r933af72 48 48 amplitudes of the core and shell, in the same manner as a core-shell model. 49 49 50 .. math:: 51 52 F_{a}(Q,\alpha,\beta)= 53 \left[\frac{\sin(Q(L_A+2t_A)/2\sin\alpha \sin\beta)}{Q(L_A+2t_A)/2\sin\alpha\sin\beta} 54 - \frac{\sin(QL_A/2\sin\alpha \sin\beta)}{QL_A/2\sin\alpha \sin\beta} \right] 55 \left[\frac{\sin(QL_B/2\sin\alpha \sin\beta)}{QL_B/2\sin\alpha \sin\beta} \right] 56 \left[\frac{\sin(QL_C/2\sin\alpha \sin\beta)}{QL_C/2\sin\alpha \sin\beta} \right] 50 57 51 58 .. note:: … … 57 64 58 65 FITTING NOTES 59 If the scale is set equal to the particle volume fraction, |phi|, the returned66 If the scale is set equal to the particle volume fraction, $\phi$, the returned 60 67 value is the scattered intensity per unit volume, $I(q) = \phi P(q)$. 61 68 However, **no interparticle interference effects are included in this -
sasmodels/models/ellipsoid.c
r130d4c7 r3b571ae 3 3 double Iqxy(double qx, double qy, double sld, double sld_solvent, 4 4 double radius_polar, double radius_equatorial, double theta, double phi); 5 6 static double7 _ellipsoid_kernel(double q, double radius_polar, double radius_equatorial, double cos_alpha)8 {9 double ratio = radius_polar/radius_equatorial;10 // Using ratio v = Rp/Re, we can expand the following to match the11 // form given in Guinier (1955)12 // r = Re * sqrt(1 + cos^2(T) (v^2 - 1))13 // = Re * sqrt( (1 - cos^2(T)) + v^2 cos^2(T) )14 // = Re * sqrt( sin^2(T) + v^2 cos^2(T) )15 // = sqrt( Re^2 sin^2(T) + Rp^2 cos^2(T) )16 //17 // Instead of using pythagoras we could pass in sin and cos; this may be18 // slightly better for 2D which has already computed it, but it introduces19 // an extra sqrt and square for 1-D not required by the current form, so20 // leave it as is.21 const double r = radius_equatorial22 * sqrt(1.0 + cos_alpha*cos_alpha*(ratio*ratio - 1.0));23 const double f = sas_3j1x_x(q*r);24 25 return f*f;26 }27 5 28 6 double form_volume(double radius_polar, double radius_equatorial) … … 37 15 double radius_equatorial) 38 16 { 17 // Using ratio v = Rp/Re, we can implement the form given in Guinier (1955) 18 // i(h) = int_0^pi/2 Phi^2(h a sqrt(cos^2 + v^2 sin^2) cos dT 19 // = int_0^pi/2 Phi^2(h a sqrt((1-sin^2) + v^2 sin^2) cos dT 20 // = int_0^pi/2 Phi^2(h a sqrt(1 + sin^2(v^2-1)) cos dT 21 // u-substitution of 22 // u = sin, du = cos dT 23 // i(h) = int_0^1 Phi^2(h a sqrt(1 + u^2(v^2-1)) du 24 const double v_square_minus_one = square(radius_polar/radius_equatorial) - 1.0; 25 39 26 // translate a point in [-1,1] to a point in [0, 1] 27 // const double u = Gauss76Z[i]*(upper-lower)/2 + (upper+lower)/2; 40 28 const double zm = 0.5; 41 29 const double zb = 0.5; 42 30 double total = 0.0; 43 31 for (int i=0;i<76;i++) { 44 //const double cos_alpha = (Gauss76Z[i]*(upper-lower) + upper + lower)/2; 45 const double cos_alpha = Gauss76Z[i]*zm + zb; 46 total += Gauss76Wt[i] * _ellipsoid_kernel(q, radius_polar, radius_equatorial, cos_alpha); 32 const double u = Gauss76Z[i]*zm + zb; 33 const double r = radius_equatorial*sqrt(1.0 + u*u*v_square_minus_one); 34 const double f = sas_3j1x_x(q*r); 35 total += Gauss76Wt[i] * f * f; 47 36 } 48 37 // translate dx in [-1,1] to dx in [lower,upper] … … 62 51 double q, sin_alpha, cos_alpha; 63 52 ORIENT_SYMMETRIC(qx, qy, theta, phi, q, sin_alpha, cos_alpha); 64 const double form = _ellipsoid_kernel(q, radius_polar, radius_equatorial, cos_alpha); 53 const double r = sqrt(square(radius_equatorial*sin_alpha) 54 + square(radius_polar*cos_alpha)); 55 const double f = sas_3j1x_x(q*r); 65 56 const double s = (sld - sld_solvent) * form_volume(radius_polar, radius_equatorial); 66 57 67 return 1.0e-4 * form * s * s;58 return 1.0e-4 * square(f * s); 68 59 } 69 60 -
sasmodels/models/ellipsoid.py
r925ad6e r0b56f38 18 18 .. math:: 19 19 20 F(q,\alpha) = \frac{3 \Delta \rho V (\sin[qr(R_p,R_e,\alpha)] 21 - \cos[qr(R_p,R_e,\alpha)])} 22 {[qr(R_p,R_e,\alpha)]^3} 20 F(q,\alpha) = \Delta \rho V \frac{3(\sin qr - qr \cos qr)}{(qr)^3} 23 21 24 and 22 for 25 23 26 24 .. math:: 27 25 28 r(R_p,R_e,\alpha) = \left[ R_e^2 \sin^2 \alpha 29 + R_p^2 \cos^2 \alpha \right]^{1/2} 26 r = \left[ R_e^2 \sin^2 \alpha + R_p^2 \cos^2 \alpha \right]^{1/2} 30 27 31 28 32 29 $\alpha$ is the angle between the axis of the ellipsoid and $\vec q$, 33 $V = (4/3)\pi R_pR_e^2$ is the volume of the ellipsoid , $R_p$ is the polar radius along the 34 rotational axis of the ellipsoid, $R_e$ is the equatorial radius perpendicular 35 to the rotational axis of the ellipsoid and $\Delta \rho$ (contrast) is the 36 scattering length density difference between the scatterer and the solvent. 30 $V = (4/3)\pi R_pR_e^2$ is the volume of the ellipsoid, $R_p$ is the polar 31 radius along the rotational axis of the ellipsoid, $R_e$ is the equatorial 32 radius perpendicular to the rotational axis of the ellipsoid and 33 $\Delta \rho$ (contrast) is the scattering length density difference between 34 the scatterer and the solvent. 37 35 38 For randomly oriented particles :36 For randomly oriented particles use the orientational average, 39 37 40 38 .. math:: 41 39 42 F^2(q)=\int_{0}^{\pi/2}{F^2(q,\alpha)\sin(\alpha)d\alpha}40 \langle F^2(q) \rangle = \int_{0}^{\pi/2}{F^2(q,\alpha)\sin(\alpha)\,d\alpha} 43 41 42 43 computed via substitution of $u=\sin(\alpha)$, $du=\cos(\alpha)\,d\alpha$ as 44 45 .. math:: 46 47 \langle F^2(q) \rangle = \int_0^1{F^2(q, u)\,du} 48 49 with 50 51 .. math:: 52 53 r = R_e \left[ 1 + u^2\left(R_p^2/R_e^2 - 1\right)\right]^{1/2} 44 54 45 55 To provide easy access to the orientation of the ellipsoid, we define … … 48 58 :ref:`cylinder orientation figure <cylinder-angle-definition>`. 49 59 For the ellipsoid, $\theta$ is the angle between the rotational axis 50 and the $z$ -axis. 60 and the $z$ -axis in the $xz$ plane followed by a rotation by $\phi$ 61 in the $xy$ plane. 51 62 52 63 NB: The 2nd virial coefficient of the solid ellipsoid is calculated based … … 90 101 than 500. 91 102 103 Model was also tested against the triaxial ellipsoid model with equal major 104 and minor equatorial radii. It is also consistent with the cyclinder model 105 with polar radius equal to length and equatorial radius equal to radius. 106 92 107 References 93 108 ---------- … … 96 111 *Structure Analysis by Small-Angle X-Ray and Neutron Scattering*, 97 112 Plenum Press, New York, 1987. 113 114 Authorship and Verification 115 ---------------------------- 116 117 * **Author:** NIST IGOR/DANSE **Date:** pre 2010 118 * **Converted to sasmodels by:** Helen Park **Date:** July 9, 2014 119 * **Last Modified by:** Paul Kienzle **Date:** March 22, 2017 98 120 """ 99 121 100 from numpy import inf 122 from numpy import inf, sin, cos, pi 101 123 102 124 name = "ellipsoid" … … 139 161 def ER(radius_polar, radius_equatorial): 140 162 import numpy as np 141 163 # see equation (26) in A.Isihara, J.Chem.Phys. 18(1950)1446-1449 142 164 ee = np.empty_like(radius_polar) 143 165 idx = radius_polar > radius_equatorial … … 168 190 theta_pd=15, theta_pd_n=45, 169 191 phi_pd=15, phi_pd_n=1) 192 q = 0.1 193 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 194 qx = q*cos(pi/6.0) 195 qy = q*sin(pi/6.0) 196 tests = [[{}, 0.05, 54.8525847025], 197 [{'theta':80., 'phi':10.}, (qx, qy), 1.74134670026 ], 198 ] 199 del qx, qy # not necessary to delete, but cleaner -
sasmodels/models/elliptical_cylinder.c
r592343f r61104c8 67 67 double theta, double phi, double psi) 68 68 { 69 double q, cos_val, cos_mu, cos_nu;70 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_val, cos_mu, cos_nu);69 double q, xhat, yhat, zhat; 70 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 71 71 72 72 // Compute: r = sqrt((radius_major*cos_nu)^2 + (radius_minor*cos_mu)^2) 73 73 // Given: radius_major = r_ratio * radius_minor 74 const double r = radius_minor*sqrt(square(r_ratio* cos_nu) + cos_mu*cos_mu);74 const double r = radius_minor*sqrt(square(r_ratio*xhat) + square(yhat)); 75 75 const double be = sas_2J1x_x(q*r); 76 const double si = sas_sinx_x(q* 0.5*length*cos_val);76 const double si = sas_sinx_x(q*zhat*0.5*length); 77 77 const double Aq = be * si; 78 78 const double delrho = sld - solvent_sld; -
sasmodels/models/elliptical_cylinder.py
rfcb33e4 r0b56f38 108 108 """ 109 109 110 from numpy import pi, inf, sqrt 110 from numpy import pi, inf, sqrt, sin, cos 111 111 112 112 name = "elliptical_cylinder" … … 149 149 + (length + radius) * (length + pi * radius)) 150 150 return 0.5 * (ddd) ** (1. / 3.) 151 q = 0.1 152 # april 6 2017, rkh added a 2d unit test, NOT READY YET pull #890 branch assume correct! 153 qx = q*cos(pi/6.0) 154 qy = q*sin(pi/6.0) 151 155 152 156 tests = [ … … 158 162 'sld_solvent':1.0, 'background':0.0}, 159 163 0.001, 675.504402], 164 # [{'theta':80., 'phi':10.}, (qx, qy), 7.88866563001 ], 160 165 ] -
sasmodels/models/fcc_paracrystal.c
r4962519 r50beefe 90 90 double theta, double phi, double psi) 91 91 { 92 double q, cos_a1, cos_a2, cos_a3;93 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_a3, cos_a2, cos_a1);92 double q, zhat, yhat, xhat; 93 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 94 94 95 const double a1 = cos_a2 + cos_a3;96 const double a2 = cos_a3 + cos_a1;97 const double a3 = cos_a2 + cos_a1;95 const double a1 = yhat + xhat; 96 const double a2 = xhat + zhat; 97 const double a3 = yhat + zhat; 98 98 const double qd = 0.5*q*dnn; 99 99 const double arg = 0.5*square(qd*d_factor)*(a1*a1 + a2*a2 + a3*a3); -
sasmodels/models/fcc_paracrystal.py
r925ad6e re2d6e3b 90 90 """ 91 91 92 from numpy import inf 92 from numpy import inf, pi 93 93 94 94 name = "fcc_paracrystal" … … 128 128 psi_pd=15, psi_pd_n=0, 129 129 ) 130 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 131 # add 2d test later 132 q =4.*pi/220. 133 tests = [ 134 [{ }, 135 [0.001, q, 0.215268], [0.275164706668, 5.7776842567, 0.00958167119232]], 136 ] -
sasmodels/models/hollow_cylinder.py
raea2e2a r0b56f38 60 60 """ 61 61 62 from numpy import pi, inf 62 from numpy import pi, inf, sin, cos 63 63 64 64 name = "hollow_cylinder" … … 129 129 theta_pd=10, theta_pd_n=5, 130 130 ) 131 131 q = 0.1 132 # april 6 2017, rkh added a 2d unit test, assume correct! 133 qx = q*cos(pi/6.0) 134 qy = q*sin(pi/6.0) 132 135 # Parameters for unit tests 133 136 tests = [ 134 137 [{}, 0.00005, 1764.926], 135 138 [{}, 'VR', 1.8], 136 [{}, 0.001, 1756.76] 137 ] 139 [{}, 0.001, 1756.76], 140 [{}, (qx, qy), 2.36885476192 ], 141 ] 142 del qx, qy # not necessary to delete, but cleaner -
sasmodels/models/parallelepiped.c
r1e7b0db0 rd605080 67 67 double psi) 68 68 { 69 double q, cos_val_a, cos_val_b, cos_val_c;70 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_val_c, cos_val_b, cos_val_a);69 double q, xhat, yhat, zhat; 70 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 71 71 72 const double siA = sas_sinx_x(0.5* q*length_a*cos_val_a);73 const double siB = sas_sinx_x(0.5* q*length_b*cos_val_b);74 const double siC = sas_sinx_x(0.5* q*length_c*cos_val_c);72 const double siA = sas_sinx_x(0.5*length_a*q*xhat); 73 const double siB = sas_sinx_x(0.5*length_b*q*yhat); 74 const double siC = sas_sinx_x(0.5*length_c*q*zhat); 75 75 const double V = form_volume(length_a, length_b, length_c); 76 76 const double drho = (sld - solvent_sld); -
sasmodels/models/sc_paracrystal.c
r4962519 r50beefe 111 111 double psi) 112 112 { 113 double q, cos_a1, cos_a2, cos_a3;114 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_a3, cos_a2, cos_a1);113 double q, zhat, yhat, xhat; 114 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 115 115 116 116 const double qd = q*dnn; … … 118 118 const double tanh_qd = tanh(arg); 119 119 const double cosh_qd = cosh(arg); 120 const double Zq = tanh_qd/(1. - cos(qd* cos_a1)/cosh_qd)121 * tanh_qd/(1. - cos(qd* cos_a2)/cosh_qd)122 * tanh_qd/(1. - cos(qd* cos_a3)/cosh_qd);120 const double Zq = tanh_qd/(1. - cos(qd*zhat)/cosh_qd) 121 * tanh_qd/(1. - cos(qd*yhat)/cosh_qd) 122 * tanh_qd/(1. - cos(qd*xhat)/cosh_qd); 123 123 124 124 const double Fq = sphere_form(q, radius, sphere_sld, solvent_sld)*Zq; -
sasmodels/models/stacked_disks.py
rc3ccaec r0b56f38 103 103 """ 104 104 105 from numpy import inf 105 from numpy import inf, sin, cos, pi 106 106 107 107 name = "stacked_disks" … … 152 152 # After redefinition of spherical coordinates - 153 153 # tests had in old coords theta=0, phi=0; new coords theta=90, phi=0 154 # but should not matter here as so far all the tests are 1D not 2D 154 q = 0.1 155 # april 6 2017, rkh added a 2d unit test, assume correct! 156 qx = q*cos(pi/6.0) 157 qy = q*sin(pi/6.0) 155 158 tests = [ 156 159 # Accuracy tests based on content in test/utest_extra_models.py. … … 186 189 [{'thick_core': 10.0, 187 190 'thick_layer': 15.0, 191 'radius': 100.0, 192 'n_stacking': 5, 193 'sigma_d': 0.0, 194 'sld_core': 4.0, 195 'sld_layer': -0.4, 196 'solvent_sd': 5.0, 197 'theta': 90.0, 198 'phi': 20.0, 199 'scale': 0.01, 200 'background': 0.001}, 201 (qx, qy), 0.0491167089952 ], 202 [{'thick_core': 10.0, 203 'thick_layer': 15.0, 188 204 'radius': 3000.0, 189 205 'n_stacking': 5, … … 228 244 'background': 0.001, 229 245 }, ([0.4, 0.5]), [0.00105074, 0.00121761]], 246 [{'thick_core': 10.0, 247 'thick_layer': 15.0, 248 'radius': 3000.0, 249 'n_stacking': 1.0, 250 'sigma_d': 0.0, 251 'sld_core': 4.0, 252 'sld_layer': -0.4, 253 'solvent_sd': 5.0, 254 'theta': 90.0, 255 'phi': 20.0, 256 'scale': 0.01, 257 'background': 0.001, 258 }, (qx, qy), 0.0341738733124 ], 230 259 231 260 [{'thick_core': 10.0, -
sasmodels/models/triaxial_ellipsoid.c
r925ad6e r68dd6a9 20 20 double radius_polar) 21 21 { 22 double sn, cn; 23 // translate a point in [-1,1] to a point in [0, 1] 24 const double zm = 0.5; 25 const double zb = 0.5; 22 const double pa = square(radius_equat_minor/radius_equat_major) - 1.0; 23 const double pc = square(radius_polar/radius_equat_major) - 1.0; 24 // translate a point in [-1,1] to a point in [0, pi/2] 25 const double zm = M_PI_4; 26 const double zb = M_PI_4; 26 27 double outer = 0.0; 27 28 for (int i=0;i<76;i++) { 28 //const double cos_alpha = (Gauss76Z[i]*(upper-lower) + upper + lower)/2; 29 const double x = 0.5*(Gauss76Z[i] + 1.0); 30 SINCOS(M_PI_2*x, sn, cn); 31 const double acosx2 = radius_equat_minor*radius_equat_minor*cn*cn; 32 const double bsinx2 = radius_equat_major*radius_equat_major*sn*sn; 33 const double c2 = radius_polar*radius_polar; 29 //const double u = Gauss76Z[i]*(upper-lower)/2 + (upper + lower)/2; 30 const double phi = Gauss76Z[i]*zm + zb; 31 const double pa_sinsq_phi = pa*square(sin(phi)); 34 32 35 33 double inner = 0.0; 34 const double um = 0.5; 35 const double ub = 0.5; 36 36 for (int j=0;j<76;j++) { 37 const double ysq = square(Gauss76Z[j]*zm + zb); 38 const double t = q*sqrt(acosx2 + bsinx2*(1.0-ysq) + c2*ysq); 39 const double fq = sas_3j1x_x(t); 40 inner += Gauss76Wt[j] * fq * fq ; 37 // translate a point in [-1,1] to a point in [0, 1] 38 const double usq = square(Gauss76Z[j]*um + ub); 39 const double r = radius_equat_major*sqrt(pa_sinsq_phi*(1.0-usq) + 1.0 + pc*usq); 40 const double fq = sas_3j1x_x(q*r); 41 inner += Gauss76Wt[j] * fq * fq; 41 42 } 42 outer += Gauss76Wt[i] * 0.5 * inner;43 outer += Gauss76Wt[i] * inner; // correcting for dx later 43 44 } 44 // translate dx in [-1,1] to dx in [lower,upper]45 const double fqsq = outer *zm;45 // translate integration ranges from [-1,1] to [lower,upper] and normalize by 4 pi 46 const double fqsq = outer/4.0; // = outer*um*zm*8.0/(4.0*M_PI); 46 47 const double s = (sld - sld_solvent) * form_volume(radius_equat_minor, radius_equat_major, radius_polar); 47 48 return 1.0e-4 * s * s * fqsq; … … 58 59 double psi) 59 60 { 60 double q, calpha, cmu, cnu;61 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, calpha, cmu, cnu);61 double q, xhat, yhat, zhat; 62 ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat); 62 63 63 const double t = q*sqrt(radius_equat_minor*radius_equat_minor*cnu*cnu64 + radius_equat_major*radius_equat_major*cmu*cmu65 + radius_polar*radius_polar*calpha*calpha);66 const double fq = sas_3j1x_x( t);64 const double r = sqrt(square(radius_equat_minor*xhat) 65 + square(radius_equat_major*yhat) 66 + square(radius_polar*zhat)); 67 const double fq = sas_3j1x_x(q*r); 67 68 const double s = (sld - sld_solvent) * form_volume(radius_equat_minor, radius_equat_major, radius_polar); 68 69 -
sasmodels/models/triaxial_ellipsoid.py
r925ad6e r0b56f38 2 2 # Note: model title and parameter table are inserted automatically 3 3 r""" 4 All three axes are of different lengths with $R_a \leq R_b \leq R_c$ 5 **Users should maintain this inequality for all calculations**. 4 Definition 5 ---------- 6 7 .. figure:: img/triaxial_ellipsoid_geometry.jpg 8 9 Ellipsoid with $R_a$ as *radius_equat_minor*, $R_b$ as *radius_equat_major* 10 and $R_c$ as *radius_polar*. 11 12 Given an ellipsoid 6 13 7 14 .. math:: 8 15 9 P(q) = \text{scale} V \left< F^2(q) \right> + \text{background}16 \frac{X^2}{R_a^2} + \frac{Y^2}{R_b^2} + \frac{Z^2}{R_c^2} = 1 10 17 11 where the volume $V = 4/3 \pi R_a R_b R_c$, and the averaging 12 $\left<\ldots\right>$ is applied over all orientations for 1D. 13 14 .. figure:: img/triaxial_ellipsoid_geometry.jpg 15 16 Ellipsoid schematic. 17 18 Definition 19 ---------- 20 21 The form factor calculated is 18 the scattering for randomly oriented particles is defined by the average over all orientations $\Omega$ of: 22 19 23 20 .. math:: 24 21 25 P(q) = \frac{\text{scale}}{V}\int_0^1\int_0^1 26 \Phi^2(qR_a^2\cos^2( \pi x/2) + qR_b^2\sin^2(\pi y/2)(1-y^2) + R_c^2y^2) 27 dx dy 22 P(q) = \text{scale}(\Delta\rho)^2\frac{V}{4 \pi}\int_\Omega \Phi^2(qr) d\Omega + \text{background} 28 23 29 24 where … … 31 26 .. math:: 32 27 33 \Phi(u) = 3 u^{-3} (\sin u - u \cos u) 28 \Phi(qr) &= 3 j_1(qr)/qr = 3 (\sin qr - qr \cos qr)/(qr)^3 \\ 29 r^2 &= R_a^2e^2 + R_b^2f^2 + R_c^2g^2 \\ 30 V &= \tfrac{4}{3} \pi R_a R_b R_c 31 32 The $e$, $f$ and $g$ terms are the projections of the orientation vector on $X$, 33 $Y$ and $Z$ respectively. Keeping the orientation fixed at the canonical 34 axes, we can integrate over the incident direction using polar angle 35 $-\pi/2 \le \gamma \le \pi/2$ and equatorial angle $0 \le \phi \le 2\pi$ 36 (as defined in ref [1]), 37 38 .. math:: 39 40 \langle\Phi^2\rangle = \int_0^{2\pi} \int_{-\pi/2}^{\pi/2} \Phi^2(qr) \cos \gamma\,d\gamma d\phi 41 42 with $e = \cos\gamma \sin\phi$, $f = \cos\gamma \cos\phi$ and $g = \sin\gamma$. 43 A little algebra yields 44 45 .. math:: 46 47 r^2 = b^2(p_a \sin^2 \phi \cos^2 \gamma + 1 + p_c \sin^2 \gamma) 48 49 for 50 51 .. math:: 52 53 p_a = \frac{a^2}{b^2} - 1 \text{ and } p_c = \frac{c^2}{b^2} - 1 54 55 Due to symmetry, the ranges can be restricted to a single quadrant 56 $0 \le \gamma \le \pi/2$ and $0 \le \phi \le \pi/2$, scaling the resulting 57 integral by 8. The computation is done using the substitution $u = \sin\gamma$, 58 $du = \cos\gamma\,d\gamma$, giving 59 60 .. math:: 61 62 \langle\Phi^2\rangle &= 8 \int_0^{\pi/2} \int_0^1 \Phi^2(qr) du d\phi \\ 63 r^2 &= b^2(p_a \sin^2(\phi)(1 - u^2) + 1 + p_c u^2) 34 64 35 65 To provide easy access to the orientation of the triaxial ellipsoid, … … 49 79 The radius-of-gyration for this system is $R_g^2 = (R_a R_b R_c)^2/5$. 50 80 51 The contrast is defined as SLD(ellipsoid) - SLD(solvent). In the81 The contrast $\Delta\rho$ is defined as SLD(ellipsoid) - SLD(solvent). In the 52 82 parameters, $R_a$ is the minor equatorial radius, $R_b$ is the major 53 83 equatorial radius, and $R_c$ is the polar radius of the ellipsoid. … … 69 99 ---------- 70 100 71 L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray 72 and Neutron Scattering*, Plenum, New York, 1987. 101 [1] Finnigan, J.A., Jacobs, D.J., 1971. 102 *Light scattering by ellipsoidal particles in solution*, 103 J. Phys. D: Appl. Phys. 4, 72-77. doi:10.1088/0022-3727/4/1/310 104 105 Authorship and Verification 106 ---------------------------- 107 108 * **Author:** NIST IGOR/DANSE **Date:** pre 2010 109 * **Last Modified by:** Paul Kienzle (improved calculation) **Date:** April 4, 2017 110 * **Last Reviewed by:** Paul Kienzle &Richard Heenan **Date:** April 4, 2017 111 73 112 """ 74 113 75 from numpy import inf 114 from numpy import inf, sin, cos, pi 76 115 77 116 name = "triaxial_ellipsoid" … … 91 130 "Solvent scattering length density"], 92 131 ["radius_equat_minor", "Ang", 20, [0, inf], "volume", 93 "Minor equatorial radius "],132 "Minor equatorial radius, Ra"], 94 133 ["radius_equat_major", "Ang", 400, [0, inf], "volume", 95 "Major equatorial radius "],134 "Major equatorial radius, Rb"], 96 135 ["radius_polar", "Ang", 10, [0, inf], "volume", 97 "Polar radius "],136 "Polar radius, Rc"], 98 137 ["theta", "degrees", 60, [-inf, inf], "orientation", 99 138 "In plane angle"], … … 112 151 import numpy as np 113 152 from .ellipsoid import ER as ellipsoid_ER 153 # now that radii can be in any size order, radii need sorting a,b,c where a~b and c is either much smaller or much larger 154 # also need some unit tests! 155 114 156 return ellipsoid_ER(radius_polar, np.sqrt(radius_equat_minor * radius_equat_major)) 115 157 … … 124 166 phi_pd=15, phi_pd_n=1, 125 167 psi_pd=15, psi_pd_n=1) 168 q = 0.1 169 # april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct! 170 # add 2d test after pull #890 171 qx = q*cos(pi/6.0) 172 qy = q*sin(pi/6.0) 173 tests = [[{}, 0.05, 24.8839548033], 174 # [{'theta':80., 'phi':10.}, (qx, qy), 9999. ], 175 ] 176 del qx, qy # not necessary to delete, but cleaner
Note: See TracChangeset
for help on using the changeset viewer.