Source code for pyPRISM.omega.FreelyJointedChain

#!python
from __future__ import division,print_function
from pyPRISM.omega.Omega import Omega
import numpy as np


[docs]class FreelyJointedChain(Omega): r'''Freely jointed chain intra-molecular correlation function **Mathematical Definition** .. math:: \hat{\omega}(k) = \frac{1 - E^2 - \frac{2E}{N} + \frac{2E^{N+1}}{N}}{(1-E)^2} .. math:: E = \frac{\sin(k l)}{k l} **Variable Definitions** - :math:`\hat{\omega}(k)` *intra*-molecular correlation function at wavenumber :math:`k` - :math:`N` number of repeat units in chain - :math:`l` bond-length **Description** The freely-jointed chain is an ideal polymer chain model that assumes a constant bond length :math:`l` and no correlations between the directions of different bond vectors (i.e. :math:`<cos(\theta_{ij})>=0`). In other words, monomer segments are assumed to have no intra-molecular excluded volume. References ---------- #. Schweizer, K.S.; Curro, J.G.; Integral-Equation Theory of Polymer Melts - Intramolecular Structure, Local Order, and the Correlation Hole, Macromolecules, 1988, 21 (10), pp 3070 [`link <https://doi.org/10.1021/ma00188a027>`__] #. Rubinstein, M; Colby, R.H; Polymer Physics. 2003. Oxford University Press. Example ------- .. code-block:: python import pyPRISM import numpy as np import matplotlib.pyplot as plt #calculate Fourier space domain and omega values domain = pyPRISM.domain(dr=0.1,length=1000) omega = pyPRISM.omega.FreelyJointedChain(length=100,l=1.0) x = domain.k y = omega.calculate(x) #plot using matplotlib plt.plot(x,y) plt.gca().set_xscale("log", nonposx='clip') plt.gca().set_yscale("log", nonposy='clip') plt.show() #define a PRISM system and set omega(k) for type A sys = pyPRISM.System(['A','B'],kT=1.0) sys.domain = pyPRISM.Domain(dr=0.1,length=1024) sys.omega['A','A'] = pyPRISM.omega.FreelyJointedChain(length=100,l=1.0) '''
[docs] def __init__(self,length,l): r'''Constructor Arguments --------- length: float number of monomers/sites in Freely-jointed chain l: float bond length ''' self.length = self.N = length self.l = l self.value = None
def __repr__(self): return '<Omega: FreelyJointedChain>'
[docs] def calculate(self,k): '''Return value of :math:`\hat{\omega}` at supplied :math:`k` Arguments --------- k: np.ndarray array of wavenumber values to calculate :math:`\omega` at ''' E = np.sin(k*self.l)/(k*self.l) N = self.N self.value = (1 - E*E - 2*E/N + (2*E**(N+1))/N)/((1-E)**2.0) return self.value
[docs]class FJC(FreelyJointedChain): '''Alias of FreelyJointedChain''' pass