Changeset 2401 for trunk/GSASIIspc.py


Ignore:
Timestamp:
Jul 29, 2016 3:52:31 PM (6 years ago)
Author:
vondreele
Message:

begin adding magnetism; change space group fortran code
modify tutorial menus

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIspc.py

    r2367 r2401  
    9393        SGData['SGCen'] = np.array(([0,0,0],[1./3.,2./3.,2./3.],[2./3.,1./3.,1./3.]))
    9494    SGData['SGOps'] = []
     95    SGData['SGGen'] = []
     96    SGData['SGSpin'] = []
    9597    for i in range(SGInfo[5]):
    9698        Mat = np.array(SGInfo[6][i])
    9799        Trns = np.array(SGInfo[7][i])
    98100        SGData['SGOps'].append([Mat,Trns])
     101        SGData['SGGen'].append(int(SGInfo[8][i]))
     102        SGData['SGSpin'].append('black')
    99103    if SGData['SGLaue'] in '-1':
    100104        SGData['SGSys'] = SysSym[0]
     
    115119    SGData['SGPolax'] = SGpolar(SGData)
    116120    SGData['SGPtGrp'],SGData['SSGKl'] = SGPtGroup(SGData)
    117     return SGInfo[8],SGData
     121    return SGInfo[-1],SGData
    118122
    119123def SGErrors(IErr):
     
    417421    for l in SGPrint(A):
    418422        print l
     423       
     424def GetGenSym(SGData):
     425    '''
     426    Get the space group generator symbols
     427    :param SGData: from :func:`SpcGroup`
     428    LaueSym = ('-1','2/m','mmm','4/m','4/mmm','3R','3mR','3','3m1','31m','6/m','6/mmm','m3','m3m')
     429    LattSym = ('P','A','B','C','I','F','R')
     430    UniqSym = ('','','a','b','c','',)
     431   
     432    '''
     433    if SGData['SGInv']:
     434        if SGData['SGLaue'] in ['-1','2/m','mmm']:
     435            Ibar = 7
     436        elif SGData['SGLaue'] in ['4/m','4/mmm']:
     437            Ibar = 1
     438        elif SGData['SGLaue'] in ['3R','3mR','3','3m1','31m','6/m','6/mmm']:
     439            Ibar = 15 #8+4+2+1
     440        else:
     441            Ibar = 4
     442        Ibarx = Ibar&14
     443    else:
     444        Ibarx = 8
     445        if SGData['SGLaue'] in ['-1','2/m','mmm','m3','m3m']:
     446            Ibarx = 0
     447    moregen = []
     448    for gen in SGData['SGGen']:
     449        if SGData['SGLaue'] in ['m3','m3m']:
     450            if gen in [1,2,4]: gen = 4
     451            elif gen < 7: gen = 0
     452        elif SGData['SGLaue'] in ['4/m','4/mmm','3R','3mR','3','3m1','31m','6/m','6/mmm']:
     453            if gen == 2: gen = 4
     454            elif gen in [3,5]: gen = 3
     455            elif gen == 6:
     456                if SGData['SGLaue'] in ['4/m','4/mmm']: gen = 128
     457                else: gen = 16
     458            elif not SGData['SGInv'] and gen == 12: gen = 8
     459            elif not SGData['SGInv'] and SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm'] and gen == 1 : gen = 24
     460        if gen == 99:
     461            if SGData['SGLaue'] in ['3m1','31m','6/m','6/mmm']: gen = 3
     462            elif SGData['SGLaue'] == 'm3m': gen = 12
     463            else: gen = 8
     464        elif gen == 98:
     465            if SGData['SGLaue'] in ['3m1','31m','6/m','6/mmm']: gen = 4
     466            else: gen = 8
     467        elif not SGData['SGInv'] and gen == 23 and SGData['SGLaue'] in ['m3','m3m']: gen = 24
     468        elif gen >= 16 and gen != 128:
     469            if not SGData['SGInv']: gen = 31
     470            else: gen = gen^Ibarx
     471        if SGData['SGInv']:
     472            if gen < 128:
     473                moregen.append(gen^Ibar)
     474            else:
     475                moregen.append(1)
     476    SGData['SGGen'] += moregen
     477    OprNames = [GetOprPtrName(str(irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     478    if SGData['SGInv']:
     479        OprNames += [GetOprPtrName(str(-irtx))[1] for irtx in PackRot(SGData['SGOps'])]
     480    Nsyms = len(SGData['SGOps'])
     481    if SGData['SGInv']: Nsyms *= 2
     482    UsymOp = []
     483    OprFlg = []   
     484    if Nsyms in [1,3]: NunqOp = 0       #Triclinic acentric OR trigonal 3
     485    elif Nsyms == 2:                    #Centric triclinic or acentric momoclinic
     486        NunqOp = 1
     487        UsymOp.append(OprNames[1])
     488        OprFlg.append(SGData['SGGen'][1])
     489    elif Nsyms == 4:                    #Point symmetry 2/m, 222, 22m, or 4
     490        if '4z' in OprNames[1]:          #Point symmetry 4 or -4
     491            NunqOp = 1
     492            UsymOp.append(OprNames[1])
     493            OprFlg.append(SGData['SGGen'][1])
     494        elif not SGData['SGInv']:       #Acentric Orthorhombic
     495            if 'm' in OprNames[1:4]:    #22m, 2m2 or m22
     496                NunqOp = 2
     497                if '2' in OprNames[1]:      #Acentric orthorhombic, 2mm
     498                    UsymOp.append(OprNames[2])
     499                    OprFlg.append(SGData['SGGen'][2])
     500                    UsymOp.append(OprNames[3])
     501                    OprFlg.append(SGData['SGGen'][3])
     502                elif '2' in OprNames[2]:    #Acentric orthorhombic, m2m
     503                    UsymOp.append(OprNames[1])
     504                    OprFlg.append(SGData['SGGen'][1])
     505                    UsymOp.append(OprNames[3])
     506                    OprFlg.append(SGData['SGGen'][3])
     507                else:                       #Acentric orthorhombic, mm2
     508                    UsymOp.append(OprNames[1])
     509                    OprFlg.append(SGData['SGGen'][1])
     510                    UsymOp.append(OprNames[2])
     511                    OprFlg.append(SGData['SGGen'][2])
     512            else:                           #Acentric orthorhombic, 222
     513                NunqOp = -3
     514                SGData['SGGen'][1:] = [4,2,1]
     515                UsymOp.append(OprNames[1])
     516                OprFlg.append(SGData['SGGen'][1])
     517                UsymOp.append(OprNames[2])
     518                OprFlg.append(SGData['SGGen'][2])
     519                UsymOp.append(OprNames[3])
     520                OprFlg.append(SGData['SGGen'][3])
     521        else:                               #Centric Monoclinic
     522            NunqOp = 2
     523            UsymOp.append(OprNames[1])
     524            OprFlg.append(SGData['SGGen'][1])
     525            UsymOp.append(OprNames[3])
     526            OprFlg.append(SGData['SGGen'][3])
     527    elif Nsyms == 6:                    #Point symmetry 32, 3m or 6
     528            NunqOp = 1
     529            if '6' in OprNames[1]:      #Hexagonal 6/m Laue symmetry
     530                UsymOp.append(OprNames[1])
     531                OprFlg.append(SGData['SGGen'][1])
     532            else:                       #Trigonal
     533                UsymOp.append(OprNames[4])
     534                OprFlg.append(SGData['SGGen'][3])
     535                if '2100' in OprNames[1]: UsymOp[-1] = ' 2100 '
     536    elif Nsyms == 8:                    #Point symmetry mmm, 4/m, or 422, etc
     537        if '4' in OprNames[1]:           #Tetragonal
     538            NunqOp = 2
     539            if SGData['SGInv']:         #4/m
     540                UsymOp.append(OprNames[1])
     541                OprFlg.append(SGData['SGGen'][1])
     542                UsymOp.append(OprNames[6])
     543                OprFlg.append(SGData['SGGen'][6])
     544            else:
     545                if 'x' in OprNames[4]:      #4mm type group
     546                    UsymOp.append(OprNames[4])
     547                    OprFlg.append(5)
     548                    UsymOp.append(OprNames[7])
     549                    OprFlg.append(7)
     550                else:                       #-42m, -4m2, and 422 type groups
     551                    UsymOp.append(OprNames[5])
     552                    OprFlg.append(7)
     553                    UsymOp.append(OprNames[6])
     554                    OprFlg.append(18)
     555        else:                               #Orthorhombic, mmm
     556            NunqOp = 3
     557            UsymOp.append(OprNames[1])
     558            OprFlg.append(SGData['SGGen'][1])
     559            UsymOp.append(OprNames[2])
     560            OprFlg.append(SGData['SGGen'][2])
     561            UsymOp.append(OprNames[7])
     562            OprFlg.append(SGData['SGGen'][7])
     563    elif Nsyms == 12 and '3' in OprNames[1]:        #Trigonal
     564        NunqOp = 2
     565        UsymOp.append(OprNames[3])
     566        OprFlg.append(SGData['SGGen'][3])
     567        UsymOp.append(OprNames[9])
     568        OprFlg.append(SGData['SGGen'][9])
     569    elif Nsyms == 12 and '6' in OprNames[1]:        #Hexagonal
     570        NunqOp = 2
     571        if 'mz' in OprNames[9]:                     #6/m
     572            UsymOp.append(OprNames[1])
     573            OprFlg.append(SGData['SGGen'][1])
     574            UsymOp.append(OprNames[6])
     575            OprFlg.append(SGData['SGGen'][6])
     576        else:                                       #6mm, -62m, -6m2 or 622
     577            UsymOp.append(OprNames[6])
     578            OprFlg.append(17)
     579            if 'm' in OprNames[1]: OprFlg[-1] = 20
     580            UsymOp.append(OprNames[7])
     581            OprFlg.append(23)
     582    elif Nsyms in [16,24]:
     583        if '3' in OprNames[1]:
     584            NunqOp = 1
     585            UsymOp.append('')
     586            OprFlg.append(SGData['SGGen'][3])
     587            for i in range(Nsyms):
     588                if 'mx' in OprNames[i]:
     589                    UsymOp[-1] = OprNames[i]
     590                elif 'm11' in OprNames[i]:
     591                    UsymOp[-1] = OprNames[i]
     592                elif '211' in OprNames[i]:
     593                    UsymOp[-1] = OprNames[i]
     594                    OprFlg[-1] = 24
     595        else:                                     #4/mmm or 6/mmm
     596            NunqOp = 3
     597            UsymOp.append('  mz  ')
     598            OprFlg.append(1)
     599            if '4' in OprNames[1]:                  #4/mmm
     600                UsymOp.append('  mx  ')
     601                OprFlg.append(19)
     602                UsymOp.append(' m110 ')
     603                OprFlg.append(21)
     604            else:                                   #6/mmm
     605                UsymOp.append(' m110 ')
     606                OprFlg.append(3)
     607                UsymOp.append(' m+-0 ')
     608                OprFlg.append(7)
     609    else:                                           #System is cubic
     610        if Nsyms == 48:
     611            NunqOp = 2
     612            UsymOp.append('  mx  ')
     613            OprFlg.append(3)
     614            UsymOp.append(' m110 ')
     615            OprFlg.append(23)
     616        else:
     617            NunqOp = 0
     618    ncv = len(SGData['SGCen'])
     619    if ncv > 1:
     620        for icv in range(ncv):
     621            if icv:
     622                if SGData['SGCen'][icv][0] == 0.5:
     623                    if SGData['SGCen'][icv][1] == 0.5:
     624                        if SGData['SGCen'][icv][2] == 0.5:
     625                            UsymOp.append(' Icen ')
     626                        else:
     627                            UsymOp.append(' Ccen ')
     628                    else:
     629                        UsymOp.append(' Bcen ')
     630                elif SGData['SGCen'][icv][1] == 0.5:
     631                    UsymOp.append(' Acen ')
     632                else:
     633                    UsymOp.append(' Rcen ')
     634    return UsymOp,OprFlg
     635   
     636def MagSGSym(SGData):
     637    SGLaue = SGData['SGLaue']
     638    SpnFlp = SGData['SGSpin']
     639    if not len(SpnFlp):
     640        return SGData['SpGrp']
     641    print SGData['SpGrp'],': ',SGData['SGGen'],SpnFlp
     642    magSym = SGData['SpGrp'].split()
     643    if len(SpnFlp) == 1:
     644        if 'red' == SpnFlp[-1]:
     645            magSym[1] += "'"
     646        return ' '.join(magSym)
     647                   
     648       
     649    return ' '.join(magSym)
    419650       
    420651################################################################################
     
    20232254    return result[0]
    20242255       
     2256def PackRot(SGOps):
     2257    IRT = []
     2258    for ops in SGOps:
     2259        M = ops[0]
     2260        irt = 0
     2261        for j in range(2,-1,-1):
     2262            for k in range(2,-1,-1):
     2263                irt *= 3
     2264                irt += M[k][j]
     2265        IRT.append(int(irt))
     2266    return IRT
     2267       
    20252268def SytSym(XYZ,SGData):
    20262269    '''
     
    20352278
    20362279    '''
    2037     def PackRot(SGOps):
    2038         IRT = []
    2039         for ops in SGOps:
    2040             M = ops[0]
    2041             irt = 0
    2042             for j in range(2,-1,-1):
    2043                 for k in range(2,-1,-1):
    2044                     irt *= 3
    2045                     irt += M[k][j]
    2046             IRT.append(int(irt))
    2047         return IRT
    2048        
    20492280    SymName = ''
    20502281    Mult = 1
Note: See TracChangeset for help on using the changeset viewer.