Changeset 1246 for trunk/GSASIIsasd.py


Ignore:
Timestamp:
Mar 12, 2014 3:38:38 PM (8 years ago)
Author:
vondreele
Message:

add PlotSASDSizeDist to auto plots for SASD/Model
fix shapes form factors & volumes to work with numpy arrays - all seem to work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIsasd.py

    r1245 r1246  
    8383    else:
    8484        cth = np.linspace(0,1.,NP)
    85         Rct = R*np.sqrt(1.+(AR**2-1.)*cth**2)
    86         return np.sqrt(np.sum(SphereFF(Q[:,np.newaxis],Rct,0)**2,axis=1)/NP)
     85        Rct = R[:,np.newaxis]*np.sqrt(1.+(AR**2-1.)*cth**2)
     86        return np.sqrt(np.sum(SphereFF(Q[:,np.newaxis],Rct,0)**2,axis=2)/NP)
    8787           
    8888def CylinderFF(Q,R,args):
     
    9696    NP = 200
    9797    alp = np.linspace(0,np.pi/2.,NP)
    98     LBessArg = 0.5*Q[:,np.newaxis]*L*np.cos(alp)
     98    LBessArg = 0.5*L*(Q[:,np.newaxis]*np.cos(alp))
    9999    LBess = np.where(LBessArg<1.e-6,1.,np.sin(LBessArg)/LBessArg)
    100     SBessArg = Q[:,np.newaxis]*R*np.sin(alp)
     100    QR = Q[:,np.newaxis]*R
     101    SBessArg = QR[:,:,np.newaxis]*np.sin(alp)
    101102    SBess = np.where(SBessArg<1.e-6,0.5,scsp.jv(1,SBessArg)/SBessArg)
    102     return np.sqrt(2.*np.pi*np.sum(np.sin(alp)*(LBess*SBess)**2,axis=1)/NP)
     103    LSBess = LBess[:,np.newaxis,:]*SBess
     104    return np.sqrt(2.*np.pi*np.sum(np.sin(alp)*LSBess**2,axis=2)/NP)
    103105   
    104106def CylinderDFF(Q,L,args):
     
    125127    Rg = np.sqrt(3./5.)*R
    126128    B = 1.62/(Rg**4)    #are we missing *np.pi? 1.62 = 6*(3/5)**2/(4/3) sense?
    127     QstV = Q/(scsp.erf(Q*Rg/np.sqrt(6)))**3
    128     return np.sqrt(np.exp((-Q**2*Rg**2)/3.)+(B/QstV**4))
    129    
    130 def UniRodFF(Q,R,L):
     129    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*Rg/np.sqrt(6)))**3
     130    return np.sqrt(np.exp((-Q[:,np.newaxis]**2*Rg**2)/3.)+(B/QstV**4))
     131   
     132def UniRodFF(Q,R,args):
     133    L = args[0]
    131134    Rg2 = np.sqrt(R**2/2+L**2/12)
    132135    B2 = np.pi/L
     
    134137    G1 = (2./3.)*R/L
    135138    B1 = 4.*(L+R)/(R**3*L**2)
    136     QstV = Q/(scsp.erf(Q*Rg2/np.sqrt(6)))**3
    137     FF = np.exp(-Q**2*Rg2**2/3.)+(B2/QstV)*np.exp(-Rg1**2*Q**2/3.)
    138     QstV = Q/(scsp.erf(Q*Rg1/np.sqrt(6)))**3
    139     FF += G1*np.exp(-Q**2*Rg1**2/3.)+(B1/QstV**4)
     139    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*Rg2/np.sqrt(6)))**3
     140    FF = np.exp(-Q[:,np.newaxis]**2*Rg2**2/3.)+(B2/QstV)*np.exp(-Rg1**2*Q[:,np.newaxis]**2/3.)
     141    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*Rg1/np.sqrt(6)))**3
     142    FF += G1*np.exp(-Q[:,np.newaxis]**2*Rg1**2/3.)+(B1/QstV**4)
    140143    return np.sqrt(FF)
    141144   
    142 def UniRodARFF(Q,R,AR):
    143     return UniRodFF(Q,R,AR*R)
    144    
    145 def UniDiskFF(Q,R,T):
     145def UniRodARFF(Q,R,args):
     146    AR = args[0]
     147    return UniRodFF(Q,R,[AR*R,])
     148   
     149def UniDiskFF(Q,R,args):
     150    T = args[0]
    146151    Rg2 = np.sqrt(R**2/2.+T**2/12.)
    147152    B2 = 2./R**2
     
    150155    G1 = (2./3.)*(T/R)**2
    151156    B1 = 4.*(T+R)/(R**3*T**2)
    152     QstV = Q/(scsp.erf(Q*Rg2/np.sqrt(6)))**3
    153     FF = np.exp(-Q**2*Rg2**2/3.)+(B2/QstV**2)*np.exp(-RgC2**2*Q**2/3.)
    154     QstV = Q/(scsp.erf(Q*Rg1/np.sqrt(6)))**3
    155     FF += G1*np.exp(-Q**2*Rg1**2/3.)+(B1/QstV**4)
     157    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*Rg2/np.sqrt(6)))**3
     158    FF = np.exp(-Q[:,np.newaxis]**2*Rg2**2/3.)+(B2/QstV**2)*np.exp(-RgC2**2*Q[:,np.newaxis]**2/3.)
     159    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*Rg1/np.sqrt(6)))**3
     160    FF += G1*np.exp(-Q[:,np.newaxis]**2*Rg1**2/3.)+(B1/QstV**4)
    156161    return np.sqrt(FF)
    157162   
    158 def UniTubeFF(Q,R,L,T):
     163def UniTubeFF(Q,R,args):
     164    L,T = args[:2]
    159165    Ri = R-T
    160166    DR2 = R**2-Ri**2
     
    164170    B2 = np.pi**2*T/Vt
    165171    B3 = np.pi/L
    166     QstV = Q/(scsp.erf(Q*Rg3/np.sqrt(6)))**3
    167     FF = np.exp(-Q**2*Rg3**2/3.)+(B3/QstV)*np.exp(-Q**2*R**2/3.)
    168     QstV = Q/(scsp.erf(Q*R/np.sqrt(6)))**3
    169     FF += (B2/QstV**2)*np.exp(-Q**2*T**2/3.)
    170     QstV = Q/(scsp.erf(Q*T/np.sqrt(6)))**3
     172    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*Rg3/np.sqrt(6)))**3
     173    FF = np.exp(-Q[:,np.newaxis]**2*Rg3**2/3.)+(B3/QstV)*np.exp(-Q[:,np.newaxis]**2*R**2/3.)
     174    QstV = Q/(scsp.erf(Q[:,np.newaxis]*R/np.sqrt(6)))**3
     175    FF += (B2/QstV**2)*np.exp(-Q[:,np.newaxis]**2*T**2/3.)
     176    QstV = Q[:,np.newaxis]/(scsp.erf(Q[:,np.newaxis]*T/np.sqrt(6)))**3
    171177    FF += B1/QstV**4
    172178    return np.sqrt(FF)
     
    176182###############################################################################
    177183
    178 def SphereVol(R,arg=()):
     184def SphereVol(R,args=()):
    179185    ''' Compute volume of sphere
    180186    - numpy array friendly
     
    184190    return (4./3.)*np.pi*R**3
    185191
    186 def SpheroidVol(R,AR):
     192def SpheroidVol(R,args):
    187193    ''' Compute volume of cylindrically symmetric ellipsoid (spheroid)
    188194    - numpy array friendly
     
    191197    returns float: volume
    192198    '''
     199    AR = args[0]
    193200    return AR*SphereVol(R)
    194201   
    195 def CylinderVol(R,L):
     202def CylinderVol(R,args):
    196203    ''' Compute cylinder volume for radius & length
    197204    - numpy array friendly
     
    200207    returns float:volume (A^3)
    201208    '''
     209    L = args[0]
    202210    return np.pi*L*R**2
    203211   
    204 def CylinderDVol(L,D):
     212def CylinderDVol(L,args):
    205213    ''' Compute cylinder volume for length & diameter
    206214    - numpy array friendly
     
    209217    returns float:volume (A^3)
    210218    '''
    211     return CylinderVol(D/2.,2.*L)
    212    
    213 def CylinderARVol(R,AR):
     219    D = args[0]
     220    return CylinderVol(D/2.,[2.*L,])
     221   
     222def CylinderARVol(R,args):
    214223    ''' Compute cylinder volume for radius & aspect ratio = L/D
    215224    - numpy array friendly
     
    218227    returns float:volume
    219228    '''
    220     return CylinderVol(R,2.*R*AR)
    221    
    222 def UniSphereVol(R,arg=()):
     229    AR = args[0]
     230    return CylinderVol(R,[2.*R*AR,])
     231   
     232def UniSphereVol(R,args=()):
    223233    ''' Compute volume of sphere
    224234    - numpy array friendly
     
    228238    return SphereVol(R)
    229239   
    230 def UniRodVol(R,L):
     240def UniRodVol(R,args):
    231241    ''' Compute cylinder volume for radius & length
    232242    - numpy array friendly
     
    235245    returns float:volume (A^3)
    236246    '''
    237     return CylinderVol(R,L)
    238    
    239 def UniRodARVol(R,AR):
    240     return CylinderARVol(R,AR)
    241    
    242 def UniDiskVol(R,T):
    243     return CylinderVol(R,T)
    244    
    245 def UniTubeVol(R,L,T):
     247    L = args[0]
     248    return CylinderVol(R,[L,])
     249   
     250def UniRodARVol(R,args):
     251    AR = args[0]
     252    return CylinderARVol(R,[AR,])
     253   
     254def UniDiskVol(R,args):
     255    T = args[0]
     256    return CylinderVol(R,[T,])
     257   
     258def UniTubeVol(R,args):
    246259    ''' Compute tube volume for radius, length & wall thickness
    247260    - numpy array friendly
     
    251264    returns float: volume (A^3) of tube wall
    252265    '''
    253     return CylinderVol(R,L)-CylinderVol(R-T,L)
     266    L,T = arg[:2]
     267    return CylinderVol(R,[L,])-CylinderVol(R-T,[L,])
    254268         
    255269################################################################################
Note: See TracChangeset for help on using the changeset viewer.