Changeset 1635
- Timestamp:
- Feb 4, 2015 4:38:12 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIImath.py
r1630 r1635 709 709 def Modulation(waveTypes,SSUniq,SSPhi,FSSdata,XSSdata,USSdata): 710 710 import scipy.special as sp 711 for iwt,wt in enumerate(waveTypes): #atom loop! 712 if wt == 'Fourier': 713 A = np.array([[a,b] for a,b in zip(XSSdata[:3],XSSdata[3:])]) 714 HdotA = twopi*np.inner(A.T,SSUniq.T[:3].T) 715 m = SSUniq.T[3] 716 Gp = sp.jn(-m,HdotA) 717 return np.real(Gp),np.imag(Gp) 711 import scipy.integrate as si 712 m = SSUniq.T[3] 713 nh = np.zeros(1) 714 if XSSdata.ndim > 2: 715 nh = np.arange(XSSdata.shape[1]) 716 M = np.where(m>0,m+nh[:,np.newaxis],m-nh[:,np.newaxis]) 717 A = np.array(XSSdata[:3]) 718 B = np.array(XSSdata[3:]) 719 HdotA = (np.inner(A.T,SSUniq.T[:3].T)+SSPhi) 720 HdotB = (np.inner(B.T,SSUniq.T[:3].T)+SSPhi) 721 GpA = sp.jn(M[:,np.newaxis],twopi*HdotA) 722 GpB = sp.jn(M[:,np.newaxis],twopi*HdotB)*(1.j)**M 723 Gp = np.sum(GpA+GpB,axis=0) 724 return np.real(Gp).T,np.imag(Gp).T 725 726 def ModulationDerv(waveTypes,SSUniq,SSPhi,FSSdata,XSSdata,USSdata): 727 import scipy.special as sp 728 m = SSUniq.T[3] 729 nh = np.zeros(1) 730 if XSSdata.ndim > 2: 731 nh = np.arange(XSSdata.shape[1]) 732 M = np.where(m>0,m+nh[:,np.newaxis],m-nh[:,np.newaxis]) 733 A = np.array([[a,b] for a,b in zip(XSSdata[:3],XSSdata[3:])]) 734 HdotA = twopi*(np.inner(SSUniq.T[:3].T,A.T)+SSPhi) 735 Gpm = sp.jn(M[:,np.newaxis,:]-1,HdotA) 736 Gpp = sp.jn(M[:,np.newaxis,:]+1,HdotA) 737 if Gpm.ndim > 3: #sum over multiple harmonics 738 Gpm = np.sum(Gpm,axis=0) 739 Gpp = np.sum(Gpp,axis=0) 740 dGpdk = 0.5*(Gpm+Gpp) 741 return np.real(dGpdk),np.imag(dGpdk) 718 742 719 743 def posFourier(tau,psin,pcos): -
trunk/GSASIIphsGUI.py
r1633 r1635 2081 2081 waveSizer.Add(waveHead) 2082 2082 if len(waveBlk): 2083 nFour = 0 2083 2084 for iwave,wave in enumerate(waveBlk): 2085 if waveType == 'Fourier': 2086 nFour += 1 2084 2087 if not iwave: 2085 CSI = G2spc.GetSSfxuinel(waveType, xyz,uij,SGData,SSGData)2088 CSI = G2spc.GetSSfxuinel(waveType,nFour,xyz,SGData,SSGData) 2086 2089 else: 2087 CSI = G2spc.GetSSfxuinel('Fourier', xyz,uij,SGData,SSGData)2090 CSI = G2spc.GetSSfxuinel('Fourier',nFour,xyz,SGData,SSGData) 2088 2091 waveName = 'Fourier' 2089 2092 if Stype == 'Sfrac': … … 2107 2110 waveSizer.Add(wx.StaticText(waveData,label=' %s parameters: %s'%(waveName,str(names).rstrip(']').lstrip('[').replace("'",''))),0,WACV) 2108 2111 for ival,val in enumerate(wave[0]): 2109 if CSI[Stype][0][ival] == 0: 2110 waveVal = wx.TextCtrl(waveData,value='%.4f'%(val),style=wx.TE_READONLY) 2111 waveVal.SetBackgroundColour(VERY_LIGHT_GREY) 2112 else: 2112 if any(CSI[Stype][0][ival]): 2113 2113 waveVal = wx.TextCtrl(waveData,value='%.4f'%(val),style=wx.TE_PROCESS_ENTER) 2114 2114 waveVal.Bind(wx.EVT_TEXT_ENTER,OnWaveVal) 2115 2115 waveVal.Bind(wx.EVT_KILL_FOCUS,OnWaveVal) 2116 2116 Indx[waveVal.GetId()] = [iatm,Stype,iwave,ival] 2117 else: 2118 waveVal = wx.TextCtrl(waveData,value='%.4f'%(val),style=wx.TE_READONLY) 2119 waveVal.SetBackgroundColour(VERY_LIGHT_GREY) 2117 2120 Waves.Add(waveVal,0,WACV) 2118 2121 if len(wave[0]) > 6 and ival == 5: -
trunk/GSASIIplot.py
r1633 r1635 222 222 Toolbar.__init__(self,plotCanvas) 223 223 self.plotCanvas = plotCanvas 224 POSITION_OF_CONFIGURE_SUBPLOTS_BTN = 6 # remove one button 224 POSITION_OF_CONFIGURE_SUBPLOTS_BTN = 6 # remove one button, nos. start at 1! 225 225 self.DeleteToolByPos(POSITION_OF_CONFIGURE_SUBPLOTS_BTN) 226 226 self.parent = self.GetParent() -
trunk/GSASIIspc.py
r1630 r1635 21 21 import math 22 22 import sys 23 import copy 23 24 import os.path as ospath 24 25 … … 29 30 npsind = lambda x: np.sin(x*np.pi/180.) 30 31 npcosd = lambda x: np.cos(x*np.pi/180.) 31 DEBUG = True32 DEBUG = False 32 33 33 34 ################################################################################ … … 1422 1423 return CSuinel[indx[1]] 1423 1424 1424 def GetSSfxuinel(XYZ,UIJ,SGData,SSGData): 1425 CSI = {'Sfrac':[[1,2],[1.,1.]],'Spos':[[1,2,3, 4,5,6],[1.,1.,1., 1.,1.,1.]], #sin & cos 1426 'Sadp':[[1,2,3,4,5,6, 7,8,9,10,11,12],[1.,1.,1.,1.,1.,1., 1.,1.,1.,1.,1.,1.]], 1427 'Smag':[[1,2,3, 4,5,6],[1.,1.,1., 1.,1.,1.]]} 1428 deltx = np.ones((3,4))*.01 1429 deltx[:3,:3] = np.eye((3))*.001 1430 deltu = np.eye((6))*.0001 1425 def GetSSfxuinel(waveType,nH,XYZ,SGData,SSGData,debug=False): 1426 1427 def fracCrenel(tau,Toff,Twid): 1428 Tau = (tau-Toff)%1. 1429 A = np.where(Tau<Twid,1.,0.) 1430 return A 1431 1432 def fracFourier(tau,nH,fsin,fcos): 1433 SA = np.sin(2.*nH*np.pi*tau) 1434 CB = np.cos(2.*nH*np.pi*tau) 1435 A = SA[np.newaxis,np.newaxis,:]*fsin[:,:,np.newaxis] 1436 B = CB[np.newaxis,np.newaxis,:]*fcos[:,:,np.newaxis] 1437 return A+B 1438 1439 def posFourier(tau,nH,psin,pcos): 1440 SA = np.sin(2*nH*np.pi*tau) 1441 CB = np.cos(2*nH*np.pi*tau) 1442 A = SA[np.newaxis,np.newaxis,:]*psin[:,:,np.newaxis] 1443 B = CB[np.newaxis,np.newaxis,:]*pcos[:,:,np.newaxis] 1444 return A+B 1445 1446 def posSawtooth(tau,Toff,slopes): 1447 Tau = (tau-Toff[:,np.newaxis])%1. 1448 A = slopes[:,:,np.newaxis]*Tau 1449 return A 1450 1451 def posZigZag(tau,Toff,slopes): 1452 Tau = (tau-Toff[:,np.newaxis])%1. 1453 A = np.where(Tau <= 0.5,slopes[:,:,np.newaxis]*Tau,slopes[:,:,np.newaxis]*(1.-Tau)) 1454 return A 1455 1456 print 'super space group: ',SSGData['SSpGrp'] 1457 CSI = {'Sfrac':[[[1,0],[2,0]],[[1.,0.],[1.,0.]]], 1458 'Spos':[[[1,0,0],[2,0,0],[3,0,0], [4,0,0],[5,0,0],[6,0,0]], 1459 [[1.,0.,0.],[1.,0.,0.],[1.,0.,0.], [1.,0.,0.],[1.,0.,0.],[1.,0.,0.]]], #sin & cos 1460 'Sadp':[[[1,0,0],[2,0,0],[3,0,0],[4,0,0],[5,0,0],[6,0,0], 1461 [7,0,0],[8,0,0],[9,0,0],[10,0,0],[11,0,0],[12,0,0]], 1462 [[1.,0.,0.],[1.,0.,0.],[1.,0.,0.], [1.,0.,0.],[1.,0.,0.],[1.,0.,0.], 1463 [1.,0.,0.],[1.,0.,0.],[1.,0.,0.], [1.,0.,0.],[1.,0.,0.],[1.,0.,0.]]], 1464 'Smag':[[[1,0,0],[2,0,0],[3,0,0], [4,0,0],[5,0,0],[6,0,0]], 1465 [[1.,0.,0.],[1.,0.,0.],[1.,0.,0.], [1.,0.,0.],[1.,0.,0.],[1.,0.,0.]]],} 1431 1466 xyz = np.array(XYZ)%1. 1432 1467 xyzt = np.array(XYZ+[0,])%1. 1433 uij = np.array(UIJ) 1434 SGOps = SGData['SGOps'] 1435 SSGOps = SSGData['SSGOps'] 1436 ssop = SSGOps[0] 1437 sop = SGOps[0] 1438 for iop,Op in enumerate(SGOps): 1468 SGOps = copy.deepcopy(SGData['SGOps']) 1469 siteSym = SytSym(XYZ,SGData)[0].strip() 1470 print 'siteSym: ',siteSym 1471 if siteSym == '1': #"1" site symmetry 1472 if debug: 1473 return CSI,None,None,None,None 1474 else: 1475 return CSI 1476 elif siteSym == '-1': #"-1" site symmetry 1477 CSI['Sfrac'][0] = [[1,0],[0,0]] 1478 CSI['Spos'][0] = [[1,0,0],[2,0,0],[3,0,0], [0,0,0],[0,0,0],[0,0,0]] 1479 CSI['Sadp'][0] = [[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0], 1480 [1,0,0],[2,0,0],[3,0,0],[4,0,0],[5,0,0],[6,0,0]] 1481 if debug: 1482 return CSI,None,None,None,None 1483 else: 1484 return CSI 1485 SSGOps = copy.deepcopy(SSGData['SSGOps']) 1486 #expand ops to include inversions if any 1487 if SGData['SGInv']: 1488 for op,sop in zip(SGData['SGOps'],SSGData['SSGOps']): 1489 SGOps.append([-op[0],-op[1]%1.]) 1490 SSGOps.append([-sop[0],-sop[1]%1.]) 1491 #build set of sym ops around special poasition 1492 SSop = [] 1493 Sop = [] 1494 for iop,Op in enumerate(SGOps): 1439 1495 nxyz = (np.inner(Op[0],xyz)+Op[1])%1. 1440 if SGData['SGInv'] and np.allclose(xyz,-nxyz%1.,1.e-6): 1441 ssop = SSGOps[iop] 1442 ssop = [-ssop[0],-ssop[1]%1.] 1443 sop = [-Op[0],-Op[1]%1.] 1444 break 1445 elif np.allclose(xyz,nxyz,1.e-6) and iop: 1446 ssop = SSGOps[iop] 1447 sop = SGOps[iop] 1448 break 1449 siteSym = SytSym(XYZ,SGData)[0].strip().split('(')[0] 1450 OpText = MT2text(sop).replace(' ','') 1451 SSOptext = SSMT2text(ssop).replace(' ','') 1452 if siteSym == '1': #"1" site symmetry 1496 if np.allclose(xyz,nxyz,1.e-4) and iop and MT2text(Op).replace(' ','') != '-X,-Y,-Z': 1497 SSop.append(SSGOps[iop]) 1498 Sop.append(SGOps[iop]) 1499 OpText = [MT2text(s).replace(' ','') for s in Sop] #debug? 1500 SSOpText = [SSMT2text(ss).replace(' ','') for ss in SSop] #debug? 1501 print 'special pos super operators: ',SSOpText 1502 #setup displacement arrays 1503 tau = np.linspace(0,1,49,True) 1504 delt2 = np.eye(2)*0.001 1505 delt4 = np.eye(4)*0.001 1506 delt6 = np.eye(6)*0.001 1507 delt12 = np.eye(12)*0.0001 1508 #make modulation arrays - one parameter at a time 1509 #site fractions 1510 CSI['Sfrac'] = [np.zeros((2),dtype='i'),np.ones(2)] 1511 if 'Crenel' in waveType: 1512 dF = fracCrenel(tau,delt2[:1],delt2[1:]).squeeze() 1513 else: 1514 dF = fracFourier(tau,nH,delt2[:1],delt2[1:]).squeeze() 1515 dFT = np.zeros_like(dF) 1516 #positions 1517 if 'Fourier' in waveType: 1518 dX = posFourier(tau,nH,delt6[:3],delt6[3:]) #+np.array(XYZ)[:,np.newaxis,np.newaxis] 1519 #3x6x12 modulated position array (X,Spos,tau)& force positive 1520 CSI['Spos'] = [np.zeros((6,3),dtype='i'),np.zeros((6,3))] 1521 elif waveType == 'Sawtooth': 1522 CSI['Spos'] = [np.array([[1,],[2,],[3,],[4,]]),np.array([[1.0,],[1.0,],[1.0,],[1.0,]])] 1523 elif waveType == 'ZigZag': 1524 CSI['Spos'] = [np.array([[1,],[2,],[3,],[4,]]),np.array([[1.0,],[1.0,],[1.0,],[1.0,]])] 1525 #anisotropic thermal motion 1526 dU = posFourier(tau,nH,delt12[:6],delt12[6:]) #Uij modulations - 6x12x12 array 1527 CSI['Sadp'] = [np.zeros((12,3),dtype='i'),np.zeros((12,3))] 1528 1529 FSC = np.ones(2,dtype='i') 1530 VFSC = np.ones(2) 1531 XSC = np.ones(6,dtype='i') 1532 USC = np.ones(12,dtype='i') 1533 dFTP = [] 1534 dXTP = [] 1535 dUTP = [] 1536 for sop,ssop in zip(Sop,SSop): 1537 fsc = np.ones(2,dtype='i') 1538 xsc = np.ones(6,dtype='i') 1539 ssopinv = nl.inv(ssop[0]) 1540 mst = ssopinv[3][:3] 1541 epsinv = ssopinv[3][3] 1542 tauT = np.inner(mst,XYZ-sop[1])+epsinv*(tau-ssop[1][3]) 1543 if waveType == 'Fourier': 1544 dXT = posFourier(np.sort(tauT),nH,delt6[:3],delt6[3:]) #+np.array(XYZ)[:,np.newaxis,np.newaxis] 1545 elif waveType == 'Sawtooth': 1546 dXT = posSawtooth(tauT,delt4[0],delt4[1:])+np.array(XYZ)[:,np.newaxis,np.newaxis] 1547 elif waveType == 'ZigZag': 1548 dXT = posZigZag(tauT,delt4[0],delt4[1:])+np.array(XYZ)[:,np.newaxis,np.newaxis] 1549 dXT = np.inner(sop[0],dXT.T) 1550 dXT = np.swapaxes(dXT,1,2) 1551 # dXT = dXT[:,:,np.argsort(tauT)] 1552 dXTP.append(dXT) 1553 if waveType == 'Fourier': 1554 for i in range(3): 1555 if np.allclose(dX[i,i,:],dXT[i,i,:]): 1556 xsc[i] = 1 1557 else: 1558 xsc[i] = 0 1559 if np.allclose(dX[i,i+3,:],dXT[i,i+3,:]): 1560 xsc[i+3] = 1 1561 else: 1562 xsc[i+3] = 0 1563 XSC &= xsc 1564 1565 fsc = np.ones(2,dtype='i') 1566 vfsc = np.ones(2) 1567 if 'Crenel' in waveType: 1568 dFT = fracCrenel(tauT,delt2[:1],delt2[1:]).squeeze() 1569 else: 1570 dFT = fracFourier(tauT,nH,delt2[:1],delt2[1:]).squeeze() 1571 dFT = nl.det(sop[0])*dFT 1572 dFT = dFT[:,np.argsort(tauT)] 1573 dFTP.append(dFT) 1574 for i in range(2): 1575 if np.allclose(dF[i,:],dFT[i,:],atol=1.e-6): 1576 fsc[i] = 1 1577 vfsc[i] = 1.0 1578 else: 1579 fsc[i] = 0 1580 vfsc[i] = 0. 1581 FSC &= fsc 1582 VFSC = vfsc 1583 1584 usc = np.ones(12,dtype='i') 1585 # make 12x12x4x4 with tau layers? 1586 dUT = posFourier(tauT,nH,delt12[:6],delt12[6:]) #Uij modulations - 6x12x12 array 1587 dUijT = np.rollaxis(np.rollaxis(np.array(Uij2U(dUT)),3),3) #convert dUT to 12x12x3x3 1588 dUijT = np.rollaxis(np.inner(np.inner(sop[0],dUijT),sop[0].T),3) 1589 dUT = np.array(U2Uij(dUijT)) 1590 dUT = dUT[:,:,np.argsort(tauT)] 1591 dUTP.append(dUT) 1592 for i in range(6): 1593 if np.allclose(dU[i,i,:],dUT[i,i,:]): 1594 usc[i] = 1 1595 else: 1596 usc[i] = 0 1597 if np.allclose(dU[i,i+6,:],dUT[i,i+6,:]): 1598 usc[i+6] = 1 1599 else: 1600 usc[i+6] = 0 1601 USC &= usc 1602 n = -1 1603 for i,U in enumerate(USC): 1604 if U: 1605 n += 1 1606 CSI['Sadp'][0][i][0] = n+1 1607 CSI['Sadp'][1][i][0] = 1.0 1608 if waveType == 'Fourier': 1609 n = -1 1610 for i,X in enumerate(XSC): 1611 if X: 1612 n += 1 1613 CSI['Spos'][0][i][0] = n+1 1614 CSI['Spos'][1][i][0] = 1.0 1615 n = -1 1616 for i,[F,VF] in enumerate(zip(FSC,VFSC)): 1617 if F: 1618 n += 1 1619 CSI['Sfrac'][0][i] = n+1 1620 CSI['Sfrac'][1][i] = VF 1621 else: 1622 CSI['Sfrac'][0][i] = 0 1623 CSI['Sfrac'][1][i] = 0. 1624 if debug: 1625 return CSI,[tau,tauT],[dF,dFTP],[dX,dXTP],[dU,dUTP] 1626 else: 1453 1627 return CSI 1454 elif siteSym == '-1': #"-1" site symmetry1455 CSI['Spos'][0] = [1,2,3, 0,0,0]1456 CSI['Sadp'][0] = [0,0,0,0,0,0, 1,2,3,4,5,6]1457 return CSI1458 # print siteSym,OpText,SSOptext1459 UniqAx = {'a':'a','b':'b','c':'g'}1460 if SGData['SGLaue'] == '2/m':1461 if UniqAx[SGData['SGUniq']] in SSGData['modSymb']: #e.g. (0b0)1462 if 's' in SSGData['SSpGrp'].split('(')[1]:1463 if siteSym == 'm':1464 CSI['Spos'][0] = [1,0,2, 0,3,0]1465 CSI['Sadp'][0] = [1,2,3,0,4,0, 0,0,0,5,0,6]1466 elif siteSym == '2/m':1467 CSI['Spos'][0] = [1,0,2, 0,0,0]1468 CSI['Sadp'][0] = [0,0,0,0,0,0, 0,0,0,1,0,2]1469 elif siteSym == '2':1470 CSI['Spos'][0] = [1,0,2, 3,0,4]1471 CSI['Sadp'][0] = [0,0,0,1,0,2, 0,0,0,3,0,4]1472 elif '1/2' in SSGData['modSymb']: #e.g. (0b1/2)1473 if siteSym == 'm':1474 CSI['Spos'][0] = [0,0,0, 0,0,0]1475 CSI['Sadp'][0] = [0,0,0,0,0,0, 0,0,0,0,0,0]1476 elif siteSym == '2/m':1477 CSI['Spos'][0] = [1,0,2, 0,0,0]1478 CSI['Sadp'][0] = [0,0,0,0,0,0, 1,2,3,0,4,0]1479 elif siteSym == '2':1480 CSI['Spos'][0] = [1,0,2, 3,0,4]1481 CSI['Sadp'][0] = [0,0,0,1,0,2, 0,0,0,3,0,4]1482 else:1483 if siteSym == 'm':1484 CSI['Spos'][0] = [0,1,0, 2,0,3]1485 CSI['Sadp'][0] = [0,0,0,1,0,2, 3,4,5,0,6,0]1486 elif siteSym == '2/m':1487 CSI['Spos'][0] = [0,1,0, 0,0,0]1488 CSI['Sadp'][0] = [0,0,0,0,0,0, 1,2,3,0,4,0]1489 elif siteSym == '2':1490 CSI['Spos'][0] = [0,1,0, 0,2,0]1491 CSI['Sadp'][0] = [1,2,3,0,4,0, 5,6,7,0,8,0]1492 1493 else: #e.g. (a0g)1494 if 's' in SSGData['SSpGrp'].split('(')[1]:1495 if siteSym == 'm':1496 CSI['Spos'][0] = [0,1,0, 0,2,0]1497 CSI['Sadp'][0] = [0,0,0,1,0,2, 0,0,0,3,0,4]1498 elif siteSym == '2/m':1499 CSI['Spos'][0] = [0,1,0, 0,0,0]1500 CSI['Sadp'][0] = [0,0,0,0,0,0, 0,0,0,1,0,2]1501 elif siteSym == '2':1502 CSI['Spos'][0] = [0,1,0, 2,0,3]1503 CSI['Sadp'][0] = [1,2,3,0,4,0, 0,0,0,5,0,6]1504 else:1505 if siteSym == 'm':1506 CSI['Spos'][0] = [1,0,2, 3,0,4]1507 CSI['Sadp'][0] = [1,2,3,0,4,0, 5,6,7,0,8,0]1508 elif siteSym == '2/m':1509 CSI['Spos'][0] = [1,0,2, 0,0,0]1510 CSI['Sadp'][0] = [0,0,0,0,0,0, 1,2,3,0,4,0]1511 elif siteSym == '2':1512 CSI['Spos'][0] = [1,0,2, 0,3,0]1513 CSI['Sadp'][0] = [0,0,0,1,0,2, 3,4,5,0,6,0]1514 Sx = CSI['Spos'][0]1515 Su = CSI['Sadp'][0]1516 if SGData['SGUniq'] == 'a':1517 CSI['Spos'][0] = [Sx[1],Sx[2],Sx[0], Sx[4],Sx[5],Sx[3]]1518 CSI['Sadp'][0] = [Su[1],Sx[2],Sx[0],Su[4],Su[5],Su[3], Su[7],Su[8],Su[6],Su[10],Su[11],Su[9]]1519 elif SGData['SGUniq'] == 'c':1520 CSI['Spos'][0] = [Sx[2],Sx[0],Sx[1], Sx[5],Sx[3],Sx[4]]1521 CSI['Sadp'][0] = [Su[2],Su[0],Su[1],Su[5],Su[3],Su[4], Su[8],Su[6],Su[7],Su[11],Su[9],Su[10]]1522 # return CSI1523 # elif SGData['SGLaue'] == 'mmm':1524 # elif SGData['SGLaue'] in ['4/m','4/mmm']:1525 # elif SGData['SGLaue'] in ['3','3m1','31m']:1526 # elif SGData['SGLaue'] in ['6/m','6/mmm']:1527 #1528 xsin = np.zeros(3,dtype='i')1529 xcos = np.zeros(3,dtype='i')1530 usin = np.zeros(6,dtype='i')1531 ucos = np.zeros(6,dtype='i')1532 csi = np.ones((6),dtype='i')*-11533 for i,idelt in enumerate(deltx):1534 # print 'idelt:',idelt1535 nxyzt = np.inner(ssop[0],(xyzt+idelt))+ssop[1]1536 nxyzt[3] -= ssop[1][3]1537 # print 'nxyz',nxyzt1538 xsin[i] = np.allclose((xyzt-idelt),nxyzt,1.e-6)1539 # print 'sin ',(xyzt-idelt),xsin[i]1540 xcos[i] = np.allclose((xyzt+idelt),nxyzt,1.e-6)1541 # print 'cos ',(xyzt+idelt),xcos[i]1542 n = -11543 for i,isin in enumerate(xsin):1544 if isin:1545 n += 11546 csi[i] = n1547 for i,icos in enumerate(xcos):1548 if icos:1549 n += 11550 csi[i+3] = n1551 # print csi1552 # print CSI['Spos'][0]1553 # print xsin,xcos1554 for i,idelt in enumerate(deltu):1555 nuij = U2Uij(np.inner(sop[0],np.inner(np.abs(Uij2U(uij+idelt)),sop[0])))1556 usin[i] = np.equal(np.abs(uij-idelt),nuij)[i]1557 ucos[i] = np.equal(np.abs(uij+idelt),nuij)[i]1558 # print CSI['Sadp'][0]1559 # print usin,ucos1560 return CSI1561 1628 1562 1629 def MustrainNames(SGData): -
trunk/GSASIIstrIO.py
r1630 r1635 1092 1092 waveType = AtomSS['waveType'] 1093 1093 phaseDict[pfx+'waveType:'+str(i)] = waveType 1094 CSI = G2spc.GetSSfxuinel(at[cx:cx+3],at[cia+2:cia+8],SGData,SSGData)1095 1094 for Stype in ['Sfrac','Spos','Sadp','Smag']: 1096 1095 Waves = AtomSS[Stype] 1097 1096 uId,uCoef = CSI[Stype] 1098 1097 for iw,wave in enumerate(Waves): 1098 if not iw: 1099 CSI = G2spc.GetSSfxuinel(waveType,at[cx:cx+3],SGData,SSGData) 1100 else: 1101 CSI = G2spc.GetSSfxuinel('Fourier',at[cx:cx+3],SGData,SSGData) 1099 1102 stiw = str(i)+':'+str(iw) 1100 1103 if Stype == 'Spos': … … 1496 1499 cx,ct,cs,cia = General['AtomPtrs'] 1497 1500 print >>pFile,'\n Modulation waves' 1498 # names = {'Sfrac':['Fsin','Fcos','Fzero','Fwid'],'Spos':['Xsin','Ysin','Zsin','Xcos','Ycos','Zcos','Tzero','Xslope','Yslope','Zslope'], 1499 # 'Sadp':['U11sin','U22sin','U33sin','U12sin','U13sin','U23sin','U11cos','U22cos', 1500 # 'U33cos','U12cos','U13cos','U23cos'],'Smag':['MXsin','MYsin','MZsin','MXcos','MYcos','MZcos']} 1501 # print >>pFile,135*'-' 1502 # for i,at in enumerate(Atoms): 1503 # AtomSS = at[-1]['SS1'] 1504 # for Stype in ['Sfrac','Spos','Sadp','Smag']: 1505 # Waves = AtomSS[Stype] 1506 # if len(Waves): 1507 # print >>pFile,' atom: %s, site sym: %s, type: %s wave type: %s:' \ 1508 # %(at[ct-1],at[cs],Stype,AtomSS['waveType']) 1509 # line = '' 1510 # for item in names[Stype]: 1511 # line += '%8s '%(item) 1512 # print >>pFile,line 1513 # for wave in Waves: 1514 # line = '' 1515 # for item in wave[0]: 1516 # line += '%8.4f '%(item) 1517 # line += ' Refine? '+str(wave[1]) 1518 # print >>pFile,line 1501 names = {'Sfrac':['Fsin','Fcos','Fzero','Fwid'],'Spos':['Xsin','Ysin','Zsin','Xcos','Ycos','Zcos','Tzero','Xslope','Yslope','Zslope'], 1502 'Sadp':['U11sin','U22sin','U33sin','U12sin','U13sin','U23sin','U11cos','U22cos', 1503 'U33cos','U12cos','U13cos','U23cos'],'Smag':['MXsin','MYsin','MZsin','MXcos','MYcos','MZcos']} 1504 print >>pFile,135*'-' 1505 for i,at in enumerate(Atoms): 1506 AtomSS = at[-1]['SS1'] 1507 waveType = AtomSS['waveType'] 1508 for Stype in ['Sfrac','Spos','Sadp','Smag']: 1509 Waves = AtomSS[Stype] 1510 if len(Waves): 1511 print >>pFile,' atom: %s, site sym: %s, type: %s wave type: %s:' \ 1512 %(at[ct-1],at[cs],Stype,waveType) 1513 line = '' 1514 for iw,wave in enumerate(Waves): 1515 stiw = ':'+str(i)+':'+str(iw) 1516 namstr = ' names :' 1517 valstr = ' values:' 1518 sigstr = ' esds :' 1519 if Stype == 'Spos': 1520 nt = 6 1521 ot = 0 1522 if waveType in ['Sawtooth','ZigZag'] and not iw: 1523 nt = 4 1524 ot = 6 1525 for j in range(nt): 1526 name = names['Spos'][j+ot] 1527 namstr += '%12s'%(name) 1528 valstr += '%12.4f'%(wave[0][j]) 1529 if name+stiw in wavesSig: 1530 sigstr += '%12.4f'%(wavesSig[name+stiw]) 1531 else: 1532 sigstr += 12*' ' 1533 elif Stype == 'Sfrac': 1534 ot = 0 1535 if 'Crenel' in waveType and not iw: 1536 ot = 2 1537 for j in range(2): 1538 name = names['Sfrac'][j+ot] 1539 namstr += '%12s'%(names['Sfrac'][j+ot]) 1540 valstr += '%12.4f'%(wave[0][j]) 1541 if name+stiw in wavesSig: 1542 sigstr += '%12.4f'%(wavesSig[name+stiw]) 1543 else: 1544 sigstr += 12*' ' 1545 elif Stype == 'Sadp': 1546 for j in range(12): 1547 name = names['Sadp'][j] 1548 namstr += '%10s'%(names['Sadp'][j]) 1549 valstr += '%10.6f'%(wave[0][j]) 1550 if name+stiw in wavesSig: 1551 sigstr += '%10.6f'%(wavesSig[name+stiw]) 1552 else: 1553 sigstr += 10*' ' 1554 elif Stype == 'Smag': 1555 for j in range(6): 1556 name = names['Smag'][j] 1557 namstr += '%12s'%(names['Smag'][j]) 1558 valstr += '%12.4f'%(wave[0][j]) 1559 if name+stiw in wavesSig: 1560 sigstr += '%12.4f'%(wavesSig[name+stiw]) 1561 else: 1562 sigstr += 12*' ' 1563 1564 print >>pFile,namstr 1565 print >>pFile,valstr 1566 print >>pFile,sigstr 1519 1567 1520 1568 … … 1784 1832 if Stype == 'Spos': 1785 1833 if waveType in ['ZigZag','Sawtooth'] and not iw: 1786 names = [ pfx+'Tzero:'+stiw,pfx+'Xslope:'+stiw,pfx+'Yslope:'+stiw,pfx+'Zslope:'+stiw]1834 names = ['Tzero:'+stiw,'Xslope:'+stiw,'Yslope:'+stiw,'Zslope:'+stiw] 1787 1835 else: 1788 names = [ pfx+'Xsin:'+stiw,pfx+'Ysin:'+stiw,pfx+'Zsin:'+stiw,1789 pfx+'Xcos:'+stiw,pfx+'Ycos:'+stiw,pfx+'Zcos:'+stiw]1836 names = ['Xsin:'+stiw,'Ysin:'+stiw,'Zsin:'+stiw, 1837 'Xcos:'+stiw,'Ycos:'+stiw,'Zcos:'+stiw] 1790 1838 elif Stype == 'Sadp': 1791 names = [ pfx+'U11sin:'+stiw,pfx+'U22sin:'+stiw,pfx+'U33sin:'+stiw,1792 pfx+'U12sin:'+stiw,pfx+'U13sin:'+stiw,pfx+'U23sin:'+stiw,1793 pfx+'U11cos:'+stiw,pfx+'U22cos:'+stiw,pfx+'U33cos:'+stiw,1794 pfx+'U12cos:'+stiw,pfx+'U13cos:'+stiw,pfx+'U23cos:'+stiw]1839 names = ['U11sin:'+stiw,'U22sin:'+stiw,'U33sin:'+stiw, 1840 'U12sin:'+stiw,'U13sin:'+stiw,'U23sin:'+stiw, 1841 'U11cos:'+stiw,'U22cos:'+stiw,'U33cos:'+stiw, 1842 'U12cos:'+stiw,'U13cos:'+stiw,'U23cos:'+stiw] 1795 1843 elif Stype == 'Sfrac': 1796 1844 if 'Crenel' in waveType and not iw: 1797 names = [ pfx+'Fzero:'+stiw,pfx+'Fwid:'+stiw]1845 names = ['Fzero:'+stiw,'Fwid:'+stiw] 1798 1846 else: 1799 names = [ pfx+'Fsin:'+stiw,pfx+'Fcos:'+stiw]1847 names = ['Fsin:'+stiw,'Fcos:'+stiw] 1800 1848 elif Stype == 'Smag': 1801 names = [ pfx+'MXsin:'+stiw,pfx+'MYsin:'+stiw,pfx+'MZsin:'+stiw,1802 pfx+'MXcos:'+stiw,pfx+'MYcos:'+stiw,pfx+'MZcos:'+stiw]1849 names = ['MXsin:'+stiw,'MYsin:'+stiw,'MZsin:'+stiw, 1850 'MXcos:'+stiw,'MYcos:'+stiw,'MZcos:'+stiw] 1803 1851 for iname,name in enumerate(names): 1804 AtomSS[Stype][iw][0][iname] = parmDict[ name]1805 if name in sigDict:1806 wavesSig[name] = sigDict[ name]1852 AtomSS[Stype][iw][0][iname] = parmDict[pfx+name] 1853 if pfx+name in sigDict: 1854 wavesSig[name] = sigDict[pfx+name] 1807 1855 1808 1856 PrintAtomsAndSig(General,Atoms,atomsSig) -
trunk/GSASIIstrMath.py
r1630 r1635 711 711 Tcorr = Tiso*Tuij*Mdata*Fdata/len(Uniq) 712 712 fa = np.array([(FF+FP-Bab)*cosp*Tcorr,-FPP*sinp*Tcorr]) 713 fb = 0.713 fb = np.zeros_like(fa) 714 714 if not SGData['SGInv']: 715 715 fb = np.array([(FF+FP-Bab)*sinp*Tcorr,FPP*cosp*Tcorr]) 716 fa = fa*GfpuA .T-fb*GfpuB.T717 fb = fb*GfpuA .T+fa*GfpuB.T718 fas = np. sum(np.sum(fa,axis=1),axis=1) #real719 fbs = np. sum(np.sum(fb,axis=1),axis=1)716 fa = fa*GfpuA-fb*GfpuB 717 fb = fb*GfpuA+fa*GfpuB 718 fas = np.real(np.sum(np.sum(fa,axis=1),axis=1)) #real 719 fbs = np.real(np.sum(np.sum(fb,axis=1),axis=1)) 720 720 721 721 fasq = fas**2 … … 943 943 FP,FPP = G2el.BlenResCW(Tdata,BLtables,refl.T[12+im]) 944 944 H = np.array(refl[:4]) 945 if H[3]:946 continue947 945 SQ = 1./(2.*refl[4+im])**2 # or (sin(theta)/lambda)**2 948 946 SQfactor = 8.0*SQ*np.pi**2 … … 955 953 Phi = np.inner(H[:3],SGT) 956 954 SSPhi = np.inner(H,SSGT) 957 GfpuA,GfpuB = G2mth.Modulation(waveTypes,SSUniq,SSPhi,FSSdata,XSSdata,USSdata) 955 GfpuA,GfpuB = G2mth.Modulation(waveTypes,SSUniq,SSPhi,FSSdata,XSSdata,USSdata) 956 dGAdk,dGBdk = G2mth.ModulationDerv(waveTypes,SSUniq,SSPhi,FSSdata,XSSdata,USSdata) 957 #need ModulationDerv here dGAdXsin, etc 958 958 phase = twopi*(np.inner((dXdata.T+Xdata.T),Uniq)+Phi[np.newaxis,:]) 959 959 sinp = np.sin(phase) … … 962 962 biso = -SQfactor*Uisodata 963 963 Tiso = np.where(biso<1.,np.exp(biso),1.0) 964 HbH = -np.inner(H ,np.inner(bij,H))964 HbH = -np.inner(H[:3],np.inner(bij,H[:3])) 965 965 Hij = np.array([Mast*np.multiply.outer(U,U) for U in Uniq]) 966 966 Hij = np.array([G2lat.UijtoU6(Uij) for Uij in Hij]) … … 971 971 fa = np.array([fot[:,np.newaxis]*cosp,fotp[:,np.newaxis]*cosp]) #non positions 972 972 fb = np.array([fot[:,np.newaxis]*sinp,-fotp[:,np.newaxis]*sinp]) 973 GfpuA = np.swapaxes(GfpuA,1,2) 974 GfpuB = np.swapaxes(GfpuB,1,2) 975 fa = fa*GfpuA-fb*GfpuB 976 fb = fb*GfpuA+fa*GfpuB 973 977 974 978 fas = np.sum(np.sum(fa,axis=1),axis=1) … … 976 980 fax = np.array([-fot[:,np.newaxis]*sinp,-fotp[:,np.newaxis]*sinp]) #positions 977 981 fbx = np.array([fot[:,np.newaxis]*cosp,-fot[:,np.newaxis]*cosp]) 982 fax = fax*GfpuA-fbx*GfpuB 983 fbx = fbx*GfpuA+fax*GfpuB 978 984 #sum below is over Uniq 979 985 dfadfr = np.sum(fa/occ[:,np.newaxis],axis=2) #Fdata != 0 ever avoids /0. problem … … 988 994 dFdua[iref] = 2.*(fas[0]*dfadua[0]+fas[1]*dfadua[1]) 989 995 dFdbab[iref] = 2.*fas[0]*np.array([np.sum(dfadba*dBabdA),np.sum(-dfadba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T 996 #need dFdXsin, etc for modulations... 990 997 if not SGData['SGInv']: 991 998 dfbdfr = np.sum(fb/occ[:,np.newaxis],axis=2) #Fdata != 0 ever avoids /0. problem … … 999 1006 dFdua[iref] += 2.*(fbs[0]*dfbdua[0]+fbs[1]*dfbdua[1]) 1000 1007 dFdbab[iref] += 2.*fbs[0]*np.array([np.sum(dfbdba*dBabdA),np.sum(-dfbdba*parmDict[phfx+'BabA']*SQfactor*dBabdA)]).T 1008 #need dFdXsin, etc for modulations... 1001 1009 #loop over atoms - each dict entry is list of derivatives for all the reflections 1002 1010 for i in range(len(Mdata)): … … 1012 1020 dFdvDict[pfx+'AU13:'+str(i)] = 2.*dFdua.T[4][i] 1013 1021 dFdvDict[pfx+'AU23:'+str(i)] = 2.*dFdua.T[5][i] 1022 #need dFdvDict[pfx+'Xsin:'+str[i]:str(m)], etc for modulations... 1014 1023 dFdvDict[pfx+'BabA'] = dFdbab.T[0] 1015 1024 dFdvDict[pfx+'BabU'] = dFdbab.T[1]
Note: See TracChangeset
for help on using the changeset viewer.