Changeset aa2edb2 in sasmodels for sasmodels/models/poly_gauss_coil.py
- Timestamp:
- Mar 17, 2016 9:07:04 AM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 4373d62
- Parents:
- d634601
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/models/poly_gauss_coil.py
r246517d raa2edb2 14 14 15 15 *I(q)* = *scale* |cdot| *I* \ :sub:`0` |cdot| *P(q)* + *background* 16 16 17 17 where 18 18 … … 20 20 21 21 *P(q)* = 2 [(1 + UZ)\ :sup:`-1/U` + Z - 1] / [(1 + U) Z\ :sup:`2`] 22 23 24 25 22 23 *Z* = [(*q R*\ :sub:`g`)\ :sup:`2`] / (1 + 2U) 24 25 *U* = (Mw / Mn) - 1 = (*polydispersity ratio*) - 1 26 26 27 27 and 28 28 29 30 29 *V* = *M* / (*N*\ :sub:`A` |delta|) 30 31 31 Here, |phi|\ :sub:`poly`, is the volume fraction of polymer, *V* is the volume of a polymer coil, *M* is the molecular weight of the polymer, *N*\ :sub:`A` is Avogadro's Number, |delta| is the bulk density of the polymer, |rho|\ :sub:`poly` is the sld of the polymer, |rho|\ :sub:`solv` is the sld of the solvent, and *R*\ :sub:`g` is the radius of gyration of the polymer coil. 32 32 … … 57 57 description = """ 58 58 Evaluates the scattering from 59 59 polydisperse polymer chains. 60 60 """ 61 61 category = "shape-independent" 62 62 63 63 # ["name", "units", default, [lower, upper], "type", "description"], 64 parameters = [["i_zero", "1/cm", 70.0, [0.0, inf], "", "Intensity at q=0"],65 ["radius_gyration", "Ang", 75.0, [0.0, inf], "", "Radius of gyration"],64 parameters = [["i_zero", "1/cm", 1.0, [-inf, inf], "", "Intensity at q=0"], 65 ["radius_gyration", "Ang", 50.0, [0.0, inf], "", "Radius of gyration"], 66 66 ["polydispersity", "None", 2.0, [1.0, inf], "", "Polymer Mw/Mn"]] 67 67 … … 69 69 def Iq(q, i_zero, radius_gyration, polydispersity): 70 70 # pylint: disable = missing-docstring 71 # need to trap the case of the polydispersity being 1 (ie, monodispersity)72 71 u = polydispersity - 1.0 73 if polydispersity == 1: 74 minusoneonu = -1.0 / u 72 # TO DO 73 # should trap the case of polydispersity = 1 by switching to a taylor expansion 74 minusoneonu = -1.0 / u 75 z = (q * radius_gyration) ** 2 / (1.0 + 2.0 * u) 76 if q == 0: 77 inten = i_zero * 1.0 75 78 else: 76 minusoneonu = -1.0 / u 77 z = ((q * radius_gyration) * (q * radius_gyration)) / (1.0 + 2.0 * u) 78 if (q == 0).any(): 79 inten = i_zero 80 else: 81 inten = i_zero * 2.0 * (power((1.0 + u * z),minusoneonu) + z - 1.0 ) / ((1.0 + u) * (z * z)) 79 inten = i_zero * 2.0 * (power((1.0 + u * z),minusoneonu) + z - 1.0 ) / ((1.0 + u) * (z * z)) 82 80 return inten 83 Iq.vectorized = True# Iq accepts an array of q values81 #Iq.vectorized = True # Iq accepts an array of q values 84 82 85 83 def Iqxy(qx, qy, *args): … … 89 87 90 88 demo = dict(scale = 1.0, 91 i_zero = 70.0,92 radius_gyration = 75.0,89 i_zero = 1.0, 90 radius_gyration = 50.0, 93 91 polydispersity = 2.0, 94 92 background = 0.0) … … 101 99 102 100 tests = [ 103 [{'scale': 70.0, 'radius_gyration': 75.0, 'polydispersity': 2.0, 'background': 0.0},104 [0.0106939, 0.469418], [ 57.6405, 0.169016]],101 [{'scale': 1.0, 'radius_gyration': 50.0, 'polydispersity': 2.0, 'background': 0.0}, 102 [0.0106939, 0.469418], [0.912993, 0.0054163]], 105 103 ]
Note: See TracChangeset
for help on using the changeset viewer.