Changeset 6e7ba14 in sasmodels for sasmodels/models
- Timestamp:
- Aug 20, 2018 8:52:21 AM (6 years ago)
- Branches:
- master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- aa44a6a
- Parents:
- bad3093
- Location:
- sasmodels/models
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/models/ellipsoid.c
r71b751d r6e7ba14 4 4 return M_4PI_3*radius_polar*radius_equatorial*radius_equatorial; 5 5 } 6 7 8 static double 9 radius_from_volume(double radius_polar, double radius_equatorial) 10 { 11 return cbrt(radius_polar*radius_equatorial*radius_equatorial); 12 } 13 14 static double 15 radius_from_curvature(double radius_polar, double radius_equatorial) 16 { 17 // Trivial cases 18 if (radius_polar == radius_equatorial) return radius_polar; 19 if (radius_polar * radius_equatorial == 0.) return 0.; 20 21 // see equation (26) in A.Isihara, J.Chem.Phys. 18(1950)1446-1449 22 const double ratio = (radius_polar < radius_equatorial 23 ? radius_polar / radius_equatorial 24 : radius_equatorial / radius_polar); 25 const double e1 = sqrt(1.0 - ratio*ratio); 26 const double b1 = 1.0 + asin(e1) / (e1 * ratio); 27 const double bL = (1.0 + e1) / (1.0 - e1); 28 const double b2 = 1.0 + 0.5 * ratio * ratio / e1 * log(bL); 29 const double delta = 0.75 * b1 * b2; 30 const double ddd = 2.0 * (delta + 1.0) * radius_polar * radius_equatorial * radius_equatorial; 31 return 0.5 * cbrt(ddd); 32 } 33 34 static double 35 effective_radius(int mode, double radius_polar, double radius_equatorial) 36 { 37 if (mode == 1) { 38 return radius_from_curvature(radius_polar, radius_equatorial); 39 } else if (mode == 2) { 40 return radius_from_volume(radius_polar, radius_equatorial); 41 } else if (mode == 3) { 42 return (radius_polar < radius_equatorial ? radius_polar : radius_equatorial); 43 } else { 44 return (radius_polar > radius_equatorial ? radius_polar : radius_equatorial); 45 } 46 } 47 6 48 7 49 static void -
sasmodels/models/ellipsoid.py
r71b751d r6e7ba14 164 164 source = ["lib/sas_3j1x_x.c", "lib/gauss76.c", "ellipsoid.c"] 165 165 have_Fq = True 166 167 def ER(radius_polar, radius_equatorial): 168 # see equation (26) in A.Isihara, J.Chem.Phys. 18(1950)1446-1449 169 ee = np.empty_like(radius_polar) 170 idx = radius_polar > radius_equatorial 171 ee[idx] = (radius_polar[idx] ** 2 - radius_equatorial[idx] ** 2) / radius_polar[idx] ** 2 172 idx = radius_polar < radius_equatorial 173 ee[idx] = (radius_equatorial[idx] ** 2 - radius_polar[idx] ** 2) / radius_equatorial[idx] ** 2 174 idx = radius_polar == radius_equatorial 175 ee[idx] = 2 * radius_polar[idx] 176 valid = (radius_polar * radius_equatorial != 0) 177 bd = 1.0 - ee[valid] 178 e1 = np.sqrt(ee[valid]) 179 b1 = 1.0 + np.arcsin(e1) / (e1 * np.sqrt(bd)) 180 bL = (1.0 + e1) / (1.0 - e1) 181 b2 = 1.0 + bd / 2 / e1 * np.log(bL) 182 delta = 0.75 * b1 * b2 183 184 ddd = np.zeros_like(radius_polar) 185 ddd[valid] = 2.0 * (delta + 1.0) * radius_polar * radius_equatorial ** 2 186 return 0.5 * ddd ** (1.0 / 3.0) 166 effective_radius_type = ["average curvature", "equivalent sphere", "min radius", "max radius"] 187 167 188 168 def random():
Note: See TracChangeset
for help on using the changeset viewer.