Changeset 2461 for trunk/GSASIIspc.py


Ignore:
Timestamp:
Sep 8, 2016 9:09:47 AM (6 years ago)
Author:
vondreele
Message:

magnetic space group determination done

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIspc.py

    r2458 r2461  
    102102            SGData['SGGen'].append(int(SGInfo[8][i]))
    103103        SGData['SGSpin'].append(1)
     104    if SGData['SGLaue'] == '2/m' and SGData['SGLatt'] != 'P' and '/' in SGData['SpGrp']:
     105        SGData['SGSpin'].append(1)  #fix bug in fortran
     106    if SGData['SpGrp'] in ['F 2 2 2','F m m m','F m m 2','F m 2 m','F 2 m m']:
     107        SGData['SGSpin'] = [1,1,1,1,1,1]
     108    if SGData['SpGrp'] in ['F d d 2','F d 2 d','F 2 d d','F d d d']:
     109        SGData['SGSpin'] = [1,1,1]
    104110    if SGData['SGInv']:
    105111        if SGData['SGLaue'] in ['-1','2/m','mmm']:
     
    500506    OprFlg = []   
    501507    if Nsyms in [1,3]: NunqOp = 0       #Triclinic acentric OR trigonal 3
    502     elif Nsyms == 2:                    #Centric triclinic or acentric momoclinic
     508    elif Nsyms == 2:                    #Centric triclinic or acentric monoclinic
    503509        NunqOp = 1
    504510        UsymOp.append(OprNames[1])
     
    578584            UsymOp.append(OprNames[7])
    579585            OprFlg.append(SGData['SGGen'][7])
    580     elif Nsyms == 12 and '3' in OprNames[1]:        #Trigonal
     586    elif Nsyms == 12 and '3' in OprNames[1] and SGData['SGSys'] != 'cubic':        #Trigonal
    581587        NunqOp = 2
    582588        UsymOp.append(OprNames[3])
     
    636642    if ncv > 1:
    637643        for icv in range(ncv):
     644            if SGData['SpGrp'] in ['F d d 2','F d 2 d','F 2 d d','F d d d']:
     645                break
     646            if 'F' in SGData['SpGrp'] and SGData['SGSys'] == 'cubic':
     647                break
    638648            if icv:
    639649                if SGData['SGCen'][icv][0] == 0.5:
    640650                    if SGData['SGCen'][icv][1] == 0.5:
    641651                        if SGData['SGCen'][icv][2] == 0.5:
    642                             UsymOp.append(' Icen ')
     652                            if not SGData['SpGrp'] in ['I 41/a','I 41 m d',
     653                                'I 41 c d','I -4 2 d','I -4 3 d',
     654                                'I a 3 d','I a -3 d','I b 3 d','I b -3 d']:
     655                                UsymOp.append(' Icen ')
    643656                        else:
    644657                            UsymOp.append(' Ccen ')
     
    652665    return UsymOp,OprFlg
    653666   
     667def CheckSpin(isym,SGData):
     668    ''' Check for exceptions in spin rules
     669    '''
     670    if SGData['SpGrp'] in ['R 3 2','R -3',]:
     671        if SGData['SGSpin'][isym] < 0:
     672            SGData['SGSpin'][(isym+1)%2] = 1
     673    elif SGData['SpGrp'] == 'R -3 m':
     674        if SGData['SGSpin'][2] < 0:
     675            if SGData['SGSpin'][0]*SGData['SGSpin'][1] < 0:
     676                if SGData['SGSpin'][isym] < 0:
     677                    SGData['SGSpin'][:2] = [-1,-1]
     678                else:
     679                    SGData['SGSpin'][:2] = [1,1]
     680    elif SGData['SpGrp'] in ['C c','C 1 c 1','A a','A 1 a 1','B b 1 1','C c 1 1',
     681        'A 1 1 a','B 1 1 b','I -4']:
     682        if SGData['SGSpin'][:2] == [-1,-1]:
     683            SGData['SGSpin'][(isym+1)%2] = 1
     684    elif SGData['SpGrp'] in ['C 2/c','C 1 2/c 1','A 2/a','A 1 2/a 1','B 2/b 1 1','C 2/c 1 1',
     685        'A 1 1 2/a','B 1 1 2/b']:
     686        if SGData['SGSpin'][1:3] == [-1,-1]:
     687            SGData['SGSpin'][isym%2+1] = 1
     688    elif SGData['SGPtGrp'] in ['222','mm2','2mm','m2m']:
     689        if SGData['SGSpin'][0]*SGData['SGSpin'][1]*SGData['SGSpin'][2] < 0:
     690            SGData['SGSpin'][(isym+1)%3] *= -1
     691        if SGData['SpGrp'][0] == 'F' and isym > 2:
     692            SGData['SGSpin'][(isym+1)%3+3] *= -1
     693    elif SGData['SGPtGrp'] == 'mmm':
     694        if SGData['SpGrp'][0] == 'F' and isym > 2:
     695            SGData['SGSpin'][(isym+1)%3+3] *= -1
     696        elif SGData['SGSpin'][3] < 0:
     697            if SGData['SpGrp'] in ['C m m a','A b m m','B m c m','B m a m','C m m b','A c m m',
     698                'C c c a','A b a a','B b c b','B b a b','C c c b','A c a a','I b c a','I c a b']:
     699                for i in [0,1,2]:
     700                    if i != isym and SGData['SGSpin'][i] < 0:
     701                        SGData['SGSpin'][i] = 1
     702            elif SGData['SpGrp'] in ['I m m a','I b m m','I m c m','I m a m','I m m b','I c m m']:
     703                if SGData['SGSpin'][0]*SGData['SGSpin'][1]*SGData['SGSpin'][2] < 0:
     704                    SGData['SGSpin'][(isym+1)%3] *= -1
     705    elif SGData['SpGrp'] in ['I -4 m 2','I -4 c 2']:
     706        if SGData['SGSpin'][2] < 0:
     707            if 'm' in SGData['SpGrp']:
     708                SGData['SGSpin'][1] = 1
     709            elif isym < 2:
     710                if SGData['SGSpin'][isym] < 0:
     711                    SGData['SGSpin'][:2] = [-1,-1]
     712                else:
     713                    SGData['SGSpin'][:2] = [1,1]
     714            else:
     715                SGData['SGSpin'][:2] = [1,1]
     716   
    654717def MagSGSym(SGData):
    655718    SGLaue = SGData['SGLaue']
     
    659722        return SGData['SpGrp']
    660723    magSym = SGData['SpGrp'].split()
    661     if len(SpnFlp) == 1:
     724    if len(SpnFlp) == 1:    #ok
    662725        if SpnFlp[-1] == -1:
    663726            magSym[1] += "'"
    664727        return ' '.join(magSym)
    665     if SGLaue in ['mmm','4/mmm','6/mmm']:
     728    if SGLaue in ['mmm',]:
    666729        for i in [0,1,2]:
    667             if SpnFlp[i] < 0: 
     730            if SpnFlp[i] < 0:
    668731                magSym[i+1] += "'"
    669     elif SGLaue in ['2/m','4/m','6/m']:
    670         sym = magSym[1].replace("'","").split('/')
    671         for i in [0,1]:
    672             if SpnFlp[i] < 0:                     
    673                 sym[i] += "'"
    674         magSym[1] = '/'.join(sym)
     732        if len(GenSym) > 3:
     733            if magSym[0] == 'F':
     734                if SpnFlp[3]+SpnFlp[4]+SpnFlp[5] < 0:
     735                    if SpnFlp[3] > 0:
     736                        magSym[0] += '(A)'
     737                    elif SpnFlp[4] > 0:
     738                        magSym[0] += '(B)'
     739                    elif SpnFlp[5] > 0:
     740                        magSym[0] += '(C)'
     741            else:
     742                if SpnFlp[3] < 0:
     743                    magSym[0] += '(P)'
     744    elif SGLaue == '6/mmm': #ok
     745        if len(GenSym) == 2:
     746            for i in [0,1]:
     747                if SpnFlp[i] < 0:
     748                    magSym[i+2] += "'"
     749            if SpnFlp[0]*SpnFlp[1] < 0:
     750                magSym[1] += "'"
     751        else:
     752            sym = magSym[1].split('/')
     753            for i in [0,1,2]:
     754                if SpnFlp[i] < 0:
     755                    if i:
     756                        magSym[i+1] += "'"
     757                    else:
     758                        sym[1] += "'"
     759            if SpnFlp[1]*SpnFlp[2] < 0:
     760                sym[0] += "'"                   
     761            magSym[1] = '/'.join(sym)
     762    elif SGLaue == '4/mmm':
     763        if len(GenSym) == 2:
     764            for i in [0,1]:
     765                if SpnFlp[i] < 0:
     766                    magSym[i+2] += "'"
     767            if SpnFlp[0]*SpnFlp[1] < 0:
     768                magSym[1] += "'"
     769        else:
     770            if '/' in magSym[1]:    #P 4/m m m, etc.
     771                sym = magSym[1].split('/')
     772                for i in [0,1,2]:
     773                    if SpnFlp[i] < 0:
     774                        if i:
     775                            magSym[i+1] += "'"
     776                        else:
     777                            sym[1] += "'"
     778                if SpnFlp[1]*SpnFlp[2] < 0:
     779                    sym[0] += "'"                   
     780                magSym[1] = '/'.join(sym)
     781                if SpnFlp[3] < 0:
     782                    magSym[0] += '(P)'
     783            else:
     784                for i in [0,1]:
     785                    if SpnFlp[i] < 0:
     786                        magSym[i+2] += "'"
     787                if SpnFlp[0]*SpnFlp[1] < 0:
     788                    magSym[1] += "'"
     789                if SpnFlp[2] < 0:
     790                    magSym[0] += '(P)'
     791    elif SGLaue in ['2/m','4/m','6/m']: #all ok
     792        Uniq = {'a':1,'b':2,'c':3,'':1}
     793        id = [0,1]
     794        if len(magSym) > 2:
     795            id = [0,Uniq[SGData['SGUniq']]]
     796        sym = magSym[id[1]].split('/')
     797        if len(GenSym) == 3:
     798            for i in [0,1,2]:
     799                if SpnFlp[i] < 0:
     800                    if i == 2:
     801                        magSym[0] += '(P)'
     802                    else:
     803                        sym[i] += "'"
     804        else:
     805            for i in [0,1]:
     806                if SpnFlp[i] < 0:                     
     807                    if i and magSym[0] in ['A','B','C','I'] and SGData['SpGrp'] != 'I 41/a':
     808                        magSym[0] += '(P)'
     809                    else:
     810                        sym[i] += "'"
     811        magSym[id[1]] = '/'.join(sym)
    675812    elif SGLaue in ['3','3m1','31m']:   #ok
    676813#        GSASIIpath.IPyBreak()
    677         print GenSym
    678         print magSym
    679         print SpnFlp
    680         if len(GenSym) == 1:
    681             id = 2
    682             if (len(magSym) == 4) and (magSym[2] == '1'):
    683                 id = 3
    684             if '3' in GenSym[0]:
    685                 id = 1
    686             magSym[id].strip("'")
    687             if SpnFlp[0] < 0:
    688                 magSym[id] += "'"
    689         else:
    690             i,j = [1,2]
    691             if magSym[2] == '1':
    692                 i,j = [1,3]
    693             magSym[i].strip("'")
    694             magSym[j].strip("'")
    695             if SpnFlp[:2] == [1,-1]:
    696                 magSym[i] += "'"
    697             elif SpnFlp[:2] == [-1,-1]:
    698                 magSym[j] += "'"
    699             elif SpnFlp[:2] == [-1,1]:
    700                 magSym[i] += "'"
    701                 magSym[j] += "'"
    702             if 'c' not in magSym[2]:
    703                 magSym[0] = magSym[0][0]
     814        magSym[0] = magSym[0].split('(')[0]
     815        if len(GenSym) == 1:    #all ok
     816            if 'R' in GenSym[0]:
     817                if SpnFlp[0] < 0:
     818                    magSym[0] += '(R)'
     819            else:   
     820                id = 2
     821                if (len(magSym) == 4) and (magSym[2] == '1'):
     822                    id = 3
     823                if '3' in GenSym[0]:
     824                    id = 1
     825                magSym[id].strip("'")
     826                if SpnFlp[0] < 0:
     827                    magSym[id] += "'"
     828        elif len(GenSym) == 2:
     829            if 'R' in GenSym[1]:
    704830                if SpnFlp[1] < 0:
    705831                    magSym[0] += '(R)'
    706                
    707                    
    708        
    709     print SGData['SpGrp'],': ',SGData['SGGen'],SpnFlp,' '.join(magSym),SGData['SGLatt']
     832                magSym[-1].strip("'")
     833                if SpnFlp[0] < 0:
     834                    magSym[-1] += "'"
     835            else:
     836                i,j = [1,2]
     837                if magSym[2] == '1':
     838                    i,j = [1,3]
     839                magSym[i].strip("'")
     840                magSym[j].strip("'")
     841                if SpnFlp[:2] == [1,-1]:
     842                    magSym[i] += "'"
     843                elif SpnFlp[:2] == [-1,-1]:
     844                    magSym[j] += "'"
     845                elif SpnFlp[:2] == [-1,1]:
     846                    magSym[i] += "'"
     847                    magSym[j] += "'"
     848        else:
     849            if 'c' not in magSym[2]:
     850                if SpnFlp[2] < 0:
     851                    magSym[0] += '(R)'
     852                i,j = [1,2]
     853                magSym[i].strip("'")
     854                magSym[j].strip("'")
     855                if SpnFlp[:2] == [1,-1]:
     856                    magSym[i] += "'"
     857                elif SpnFlp[:2] == [-1,-1]:
     858                    magSym[j] += "'"
     859                elif SpnFlp[:2] == [-1,1]:
     860                    magSym[i] += "'"
     861                    magSym[j] += "'"
     862    elif SGData['SGPtGrp'] == '23' and len(magSym):
     863        if SpnFlp[0] < 0:
     864            magSym[0] += '(P)'
     865    elif SGData['SGPtGrp'] == 'm3':
     866        if SpnFlp[0] < 0:
     867            magSym[1] += "'"
     868            magSym[2] += "'"
     869        if SpnFlp[1] < 0:
     870            magSym[0] += '(P)'
     871            if not 'm' in magSym[1]:
     872                magSym[1].strip("'")
     873    elif SGData['SGPtGrp'] in ['432','-43m']:
     874        if SpnFlp[0] < 0:
     875            magSym[1] += "'"
     876            magSym[3] += "'"
     877        if SpnFlp[1] < 0:
     878            magSym[0] += '(P)'
     879    elif SGData['SGPtGrp'] == 'm-3m':
     880        if SpnFlp[:2] == [-1,1]:
     881            magSym[1] += "'"
     882            magSym[2] += "'"
     883        elif SpnFlp[:2] == [1,-1]:
     884            magSym[3] += "'"
     885        elif SpnFlp[:2] == [-1,-1]:
     886            magSym[1] += "'"
     887            magSym[2] += "'"
     888            magSym[3] += "'"
     889        if SpnFlp[2] < 0:
     890            magSym[0] += '(P)'
    710891    return ' '.join(magSym)
     892   
     893   
    711894       
    712895################################################################################
Note: See TracChangeset for help on using the changeset viewer.