Changeset 3835


Ignore:
Timestamp:
Mar 5, 2019 2:57:21 PM (3 years ago)
Author:
vondreele
Message:

Allow constraints on modulation vector
changes to incommensurate mag. str factr math - a lot closer to correct

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIconstrGUI.py

    r3829 r3835  
    150150        elif 'Tm' in name:
    151151            namelist = ['Tmin','Tmax']
     152        elif 'MX' in name or 'MY' in name or 'MZ' in name:
     153            namelist = ['MXcos','MYcos','MZcos','MXsin','MYsin','MZsin']
     154        elif 'mV' in name:
     155            namelist = ['mV0','mV1','mV2']
    152156        elif 'RB' in name:
    153157            rbfx = 'RB'+items[2][2]
     
    11011105    rbIds = rigidbodyDict.get('RBIds',{'Vector':[],'Residue':[]})
    11021106    rbVary,rbDict = G2stIO.GetRigidBodyModels(rigidbodyDict,Print=False)
    1103     badPhaseParms = ['Ax','Ay','Az','Amul','AI/A','Atype','SHorder','mV0','mV1','mV2','AwaveType','FwaveType','PwaveType','MwaveType','Vol','isMag',]
     1107    badPhaseParms = ['Ax','Ay','Az','Amul','AI/A','Atype','SHorder','AwaveType','FwaveType','PwaveType','MwaveType','Vol','isMag',]
    11041108    globalList = list(rbDict.keys())
    11051109    globalList.sort()
  • trunk/GSASIImath.py

    r3821 r3835  
    13551355        Mmod = 1.0
    13561356    return ngl,nWaves,Fmod,Xmod,Umod,Mmod,glTau,glWt
     1357
     1358def MagMod(XYZ,modQ,MSSdata):
     1359    Am = np.array(MSSdata[:3]).T   #atoms x waves x sin pos mods
     1360    Bm = np.array(MSSdata[3:]).T   #...cos pos mods
     1361    nWaves = Am.shape[1]
     1362    MmodA = 0.
     1363    MmodB = 0.
     1364    if nWaves:
     1365        modind = np.arange(nWaves)+1.
     1366        MmodA = np.sum(Am[:,nxs,:,:]*np.sin(twopi*XYZ[:,:,nxs,:]*modind[nxs,nxs,:,nxs]*modQ[nxs,nxs,nxs,:]),axis=2) #natm,Nops,Mxyz
     1367        MmodB = np.sum(Bm[:,nxs,:,:]*np.cos(twopi*XYZ[:,:,nxs,:]*modind[nxs,nxs,:,nxs]*modQ[nxs,nxs,nxs,:]),axis=2)
     1368    return np.swapaxes(MmodA,0,1),np.swapaxes(MmodB,0,1)    #Nops,Natm,Mxyz
    13571369       
    13581370def Modulation(H,HP,nWaves,Fmod,Xmod,Umod,glTau,glWt):
  • trunk/GSASIIstrMath.py

    r3832 r3835  
    15101510
    15111511    if parmDict[pfx+'isMag']:       #This part correct for making modulated mag moments on equiv atoms
     1512       
    15121513        GSdata = np.inner(Gdata.T,np.swapaxes(SGMT,1,2))  #apply sym. ops.--> Natm,Nops,Nxyz
    1513         MSmod = np.array([np.roll(Mmod+Gdata.T[:,nxs,:],-int(round(ngl*ssgt[3])),2) for ssgt in SSGT])   #Nops,Natm,Ntau,Mxyz
    15141514        if SGData['SGInv'] and not SGData['SGFixed']:   #inversion if any
    15151515            GSdata = np.hstack((GSdata,-GSdata))     
    1516             MSmod = np.vstack((MSmod,-MSmod))
    15171516        GSdata = np.hstack([GSdata for cen in SSCen])        #dup over cell centering - Natm,Nops,Mxyz
    1518         MSmod = np.vstack([np.roll(MSmod,-int(round(ngl*cen[3])),2) for cen in SSCen])        #dup over cell centering - right??
     1517        GSdata = SGData['MagMom'][nxs,:,nxs]*GSdata   #flip vectors according to spin flip * det(opM)
     1518        GSdata = np.swapaxes(GSdata,0,1)    #Nop,Natm,Mxyz
    15191519       
    1520 #another try - keep MSmod separated & calc Kdata without modulation
    1521         GSdata = SGData['MagMom'][nxs,:,nxs]*GSdata   #flip vectors according to spin flip * det(opM)
    1522         Kdata = np.inner(GSdata,uAmat).T     #Cartesian unit vectors
    1523         SMag = np.sqrt(np.sum(Kdata**2,axis=0))     #magnitude of fixed part of moment
    1524         Kdata /= SMag      #mxyz,nops,natm- unit Cart. vector for fixed component of moment
     1520        mXYZ = np.array([[xyz[0] for xyz in list(G2spc.GenAtom(xyz,SGData,All=True,Move=True))] for xyz in (Xdata+dXdata).T])%1. #Natn,Nop,xyz
     1521        MmodA,MmodB = G2mth.MagMod(mXYZ,modQ,MSSdata)   #Im sin/Re cos,Nops,Natm,Mxyz
    15251522       
    1526 # GSMdata has modulation       
    1527         GSMdata = np.swapaxes(MSmod,0,1)         #Natm,Nops,Ntau,Mxyz
    1528         mXYZ = np.array([[xyz[0] for xyz in list(G2spc.GenAtom(xyz,SGData,All=True,Move=True))] for xyz in (Xdata+dXdata).T])%1.
    1529         mXYZ = np.array(np.rint(ngl*np.inner(mXYZ,modQ)),dtype=int)
    1530         RGSdata = np.array([[np.roll(GSMdata[i,j],-mXYZ[i,j],0) for j in range(mXYZ.shape[1])] for i in range(mXYZ.shape[0])])
    1531         KMdata = np.inner(RGSdata,uAmat).T     #Cartesian unit vectors
    1532         SMMag = np.sqrt(np.sum(KMdata**2,axis=0))
    1533         KMdata /= SMMag      #mxyz,ntau,nops,natm
    15341523
    15351524    FF = np.zeros(len(Tdata))
     
    15881577        FF = np.repeat(refDict['FF']['FF'][iBeg:iFin].T[Tindx].T,Uniq.shape[1],axis=0)
    15891578        phase = twopi*(np.inner(Uniq[:,:,:3],(dXdata.T+Xdata.T))-Phi[:,:,nxs])
     1579        phase = np.hstack([phase for cen in SSCen])
    15901580        sinp = np.sin(phase)
    15911581        cosp = np.cos(phase)
     
    15971587
    15981588        if 'N' in calcControls[hfx+'histType'] and parmDict[pfx+'isMag']:       #TODO: mag math here??
     1589            phasem = twopi*np.inner(H.T[:,:3],mXYZ)
     1590            phasem = np.swapaxes(phasem,1,2)
     1591            sinm = np.sin(phasem)
     1592            cosm = np.cos(phasem)
    15991593            MF = refDict['FF']['MF'][iBeg:iFin].T[Tindx].T   #Nref,Natm
    16001594            TMcorr = 0.539*(np.reshape(Tiso,Tuij.shape)*Tuij)[:,0,:]*Fdata*Mdata*MF/(2*Nops)     #Nref,Natm
    16011595                     
    1602             mphase = np.array([phase+twopi*np.inner(cen,HP.T)[:,nxs,nxs] for cen in SGData['SGCen']])
    1603             mphase = np.concatenate(mphase,axis=1)    #remove extra axis; Nref,Nop,Natm
    1604             sinm = np.sin(mphase)    #--> Nref,Ntau,Nop,Natm
    1605             cosm = np.cos(mphase)                               #ditto
    1606            
    16071596            HM = np.inner(Bmat,HP.T)                             #put into cartesian space
    16081597            HM = HM/np.sqrt(np.sum(HM**2,axis=0))               #Gdata = MAGS & HM = UVEC in magstrfc.for both OK
    16091598           
    1610             eDotK = np.sum(HM[:,:,nxs,nxs]*Kdata[:,nxs,:,:],axis=0)           
    1611             Q = HM[:,:,nxs,nxs]*eDotK[nxs,:,:,:]-Kdata[:,nxs,:,:] #Mxyz,Nref,Nop,Natm
    1612             fam0 = Q*TMcorr[nxs,:,nxs,:]*cosm[nxs,:,:,:]*SMag[nxs,nxs,:,:]  #Mxyz,Nref,Nop,Natm
    1613             fbm0 = Q*TMcorr[nxs,:,nxs,:]*sinm[nxs,:,:,:]*SMag[nxs,nxs,:,:]
     1599            fam0 = TMcorr[:,nxs,:,nxs]*GSdata[nxs,:,:,:]*cosm[:,:,:,nxs]
     1600            fbm0 = TMcorr[:,nxs,:,nxs]*GSdata[nxs,:,:,:]*sinm[:,:,:,nxs]
     1601                       
     1602            fam = TMcorr[:,nxs,:,nxs]*(MmodB[nxs,:,:,:]*cosm[:,:,:,nxs]-np.sign(H[3])[:,nxs,nxs,nxs]*MmodA[nxs,:,:,:]*sinm[:,:,:,nxs]) #Nref,Nops,Natm,Mxyz
     1603            fbm = TMcorr[:,nxs,:,nxs]*(MmodB[nxs,:,:,:]*sinm[:,:,:,nxs]+np.sign(H[3])[:,nxs,nxs,nxs]*MmodA[nxs,:,:,:]*cosm[:,:,:,nxs])
     1604                       
     1605            famq = np.sum(np.sum(fam,axis=-2),axis=-2)      #Nref,Mxyz; sum ops & atoms
     1606            fbmq = np.sum(np.sum(fbm,axis=-2),axis=-2)
    16141607           
    1615             eDotKM = np.sum(HM[:,:,nxs,nxs,nxs]*KMdata[:,nxs,:,:,:],axis=0)
    1616             QM = HM[:,:,nxs,nxs,nxs]*eDotKM[nxs,:,:,:,:]-KMdata[:,nxs,:,:,:] #Mxyz,Nref,ntau,Nop,Natm
    1617             sinQM = np.sin(twopi*QM)*SMMag[nxs,nxs,:,:,:]    #Mxyz,Nref,Ntau,Nop,Natm
    1618             cosQM = np.cos(twopi*QM)*SMMag[nxs,nxs,:,:,:]
     1608            famq0 = np.sum(np.sum(fam0,axis=-2),axis=-2)
     1609            fbmq0 = np.sum(np.sum(fbm0,axis=-2),axis=-2)
     1610           
     1611            fas = np.sum(famq,axis=-1)**2-np.sum(HM.T*famq,axis=-1)**2
     1612            fbs = np.sum(fbmq,axis=-1)**2-np.sum(HM.T*fbmq,axis=-1)**2
     1613                       
     1614            fas0 = np.sum(famq0,axis=-1)**2-np.sum(HM.T*famq0,axis=-1)**2
     1615            fbs0 = np.sum(fbmq0,axis=-1)**2-np.sum(HM.T*fbmq0,axis=-1)**2
    16191616
    1620             fam = TMcorr[:,nxs,:]*cosm    #Nref,Nops,Natm
    1621             fbm = TMcorr[:,nxs,:]*sinm
    1622            
    1623             famg = fam[nxs,:,nxs,:,:]*cosQM-fbm[nxs,:,nxs,:,:]*sinQM
    1624             fbmg = fbm[nxs,:,nxs,:,:]*cosQM+fam[nxs,:,nxs,:,:]*sinQM
    1625                        
    1626             fas = np.sum(np.sum(famg,axis=-1)**2,axis=-1)      #xyz,Nref; sum ops & atoms
    1627             fbs = np.sum(np.sum(fbmg,axis=-1)**2,axis=-1)
    1628            
    1629             refl.T[10] = 0.25*np.sum(np.sum(fas,axis=0)+np.sum(fbs,axis=0),axis=-1)/ngl    #square of sums
    1630 #            refl.T[11] = mphase[:,0,0]  #ignore f' & f"
     1617            refl.T[10] = np.where(H[3],fas+fbs,fas0+fbs0)
     1618            refl.T[11] = np.where(H[3],atan2d(fas,fbs),atan2d(fas0,fbs0))
    16311619           
    16321620        else:
Note: See TracChangeset for help on using the changeset viewer.