Changeset 1533


Ignore:
Timestamp:
Oct 22, 2014 4:33:10 PM (7 years ago)
Author:
vondreele
Message:

further on supersymmetry; monoclinics done, hexagonals (not 6/mmm) done; others started

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIspc.py

    r1531 r1533  
    510510        if SGData['SGPtGrp'] in ['2','m']:  #OK
    511511            if mod in ['a00','0b0','00g']:
    512                 return [i*-1 for i in SGData['SSGKl']]
     512                result = [i*-1 for i in SGData['SSGKl']]
    513513            else:
    514                 return SGData['SSGKl']
     514                result = SGData['SSGKl'][:]
     515            if '/' in mod:
     516                return [i*-1 for i in result]
     517            else:
     518                return result
    515519        elif SGData['SGPtGrp'] == '2/m':    #OK
    516520            if mod in ['a00','0b0','00g']:
    517                 return SGData['SSGKl'][:]
     521                result = SGData['SSGKl'][:]
    518522            else:
    519                 return [i*-1 for i in SGData['SSGKl']]
     523                result = [i*-1 for i in SGData['SSGKl']]
     524            if '/' in mod:
     525                return [i*-1 for i in result]
     526            else:
     527                return result
    520528        else:   #orthorhombic
    521529            if SGData['SGPtGrp'] == '222':
     
    545553                return [-1 if i in ['a','b','g'] else 1 for i in mod]
    546554               
     555    def extendSSGOps(SSGOps):
     556        nOps = len(SSGOps)
     557        for i in range(nOps):
     558            if np.allclose(SSGOps[i][0][3],np.zeros(4)):
     559                continue
     560            for j in range(nOps):
     561                if np.allclose(SSGOps[j][0][3],np.zeros(4)):
     562                    continue
     563                OpC = list(SGProd(SSGOps[j],SSGOps[i]))
     564                OpC[1] %= 1.
     565                for k in range(nOps):
     566                    OpD = SSGOps[k]
     567                    if SSMT2text(OpC) == SSMT2text(OpD):
     568                        continue
     569                    elif np.allclose(OpC[0][:3,:3],OpD[0][:3,:3]):
     570                        if np.allclose(OpD[0][3],np.zeros(4)):
     571                            SSGOps[k] = OpC
     572                        elif np.any([np.allclose(OpC[0][3][:3],cen) for cen in SGData['SGCen']]):   #?
     573                            continue
     574                        else:
     575                            OpCtxt = SSMT2text(OpC).replace(' ','')
     576                            OpDtxt = SSMT2text(OpD).replace(' ','')
     577                            print 'OpC',OpCtxt,'OpD',OpDtxt
     578                            return False,OpCtxt+' conflict with '+OpDtxt
     579        return True,SSGOps
     580       
     581               
    547582    def genSSGOps():
    548         SSGOps = SSGData['SSGOps']
     583        SSGOps = SSGData['SSGOps'][:]
    549584        iFrac = {}
    550585        for i,frac in enumerate(SSGData['modSymb']):
    551586            if frac in ['1/2','1/3','1/4','1/6','1']:
    552587                iFrac[i] = frac
    553         print SSymbol
     588        print SGData['SpGrp']+SSymbol
    554589        print 'SSGKl',SSGKl,'genQ',genQ,'iFrac',iFrac
    555590# set identity & 1,-1; triclinic
     
    557592# expand if centrosymmetric
    558593        if SGData['SGInv']:
    559             SSGOps = SSGOps[:] + [[-1*M,V] for M,V in SSGOps]
     594            SSGOps += [[-1*M,V] for M,V in SSGOps[:]]
    560595# monoclinic
    561596        if SGData['SGPtGrp'] in ['2','m']:  #OK
     
    563598            SSGOps[1][1][3] = genQ[0]
    564599            for i in iFrac:
    565                 if SGData['SGPtGrp'] == '2':
    566                     SSGOps[1][0][3,i] = 1
    567                 else:
    568                     SSGOps[1][0][3,i] = -1
    569                 if genQ:
    570                     SSGOps[1][0][3,i] *= -1
    571         elif SGData['SGPtGrp'] == '2/m':    #OK
    572             SSGOps[1][0][3,3] = -SSGKl[0]
    573             SSGOps[3][0][3,3] = -SSGKl[1]
     600                SSGOps[1][0][3,i] = -SSGKl[0]
     601        elif SGData['SGPtGrp'] == '2/m':
     602            for i,j in enumerate([1,3]):
     603                SSGOps[j][0][3,3] = -SSGKl[i]
     604                if genQ[i]:
     605                    SSGOps[j][1][3] = genQ[i]
     606                for k in iFrac:
     607                    SSGOps[j][0][3,k] = SSGKl[i]
     608                E,SSGOps = extendSSGOps(SSGOps)
     609            print E,SSMT2text(SSGOps[1]).replace(' ',''),SSMT2text(SSGOps[3]).replace(' ','')
     610           
     611# orthorhombic
     612        elif SGData['SGPtGrp'] in ['222','mm2','m2m','2mm','mmm']:
     613            for i in [0,1,2]:
     614                SSGOps[i+1][0][3,3] = SSGKl[i]
     615                SSGOps[i+1][1][3] = genQ[i]
    574616            for i in iFrac:
    575617                SSGOps[1][0][3,i] = -1
    576 # orthorhombic
    577         elif SGData['SGPtGrp'] in ['222','mm2','m2m','2mm','mmm']:
    578             SSGOps[1][0][3,3] = SSGKl[0]
    579             SSGOps[2][0][3,3] = SSGKl[1]
    580             SSGOps[3][0][3,3] = SSGKl[2]
     618            print SSMT2text(SSGOps[1]).replace(' ',''),SSMT2text(SSGOps[2]).replace(' ',''), \
     619                SSMT2text(SSGOps[3]).replace(' ','')
    581620# tetragonal
    582621        elif SGData['SGPtGrp'] == '4':  #OK
     
    596635                SSGOps[1][0][3,1] = -1
    597636        elif SGData['SGPtGrp'] in ['422','4mm','-42m','-4m2',]:
    598             SSGOps[1][0][3,3] = SSGKl[1]
     637            for i,j in enumerate([1,4,5]):
     638                SSGOps[j][0][3,3] = SSGKl[i]
     639                if genQ[i]:
     640                    SSGOps[j][1][3] = genQ[i]
     641                E,SSGOps = extendSSGOps(SSGOps)
    599642        elif SGData['SGPtGrp'] in ['4/mmm',]:
    600643            SSGOps[1][0][3,3] = SSGKl[1]
     
    625668            SSGOps[1][1][3] = genQ[0]
    626669            SSGOps[2][1][3] = genQ[1]
    627         elif SGData['SGPtGrp'] in ['622','6mm','-62m','-62',]:
    628             SSGOps[1][0][3,3] = SSGKl[0]
    629             SSGOps[2][0][3,3] = -SSGKl[1]
    630             SSGOps[3][0][3,3] = -SSGKl[2]
    631         elif SGData['SGPtGrp'] in ['6/mmm',]:
    632             SSGOps[1][0][3,3] = SSGKl[0]
    633             if genQ[0]:
    634                 SSGOps[1][0][3,3] = -SSGKl[0]
    635                 SSGOps[1][1][3] = genQ[0]
    636             SSGOps[3][0][3,3] = -SSGKl[1]
    637             if genQ[1]:
    638                 SSGOps[3][0][3,3] = SSGKl[1]
    639                 SSGOps[3][1][3] = genQ[1]
    640             SSGOps[10][0][3,3] = SSGKl[2]
    641             if genQ[2]:
    642                 SSGOps[10][0][3,3] = -SSGKl[2]
    643                 SSGOps[10][1][3] = genQ[2]
    644             SSGOps[11][0][3,3] = SSGKl[3]
    645             if genQ[3]:
    646                 SSGOps[11][0][3,3] = -SSGKl[3]
    647                 SSGOps[11][1][3] = genQ[3]
     670        elif SGData['SGPtGrp'] in ['622','6mm','-62m','-6m2',]: #OK
     671            for i,j in enumerate([1,10,11]):
     672                SSGOps[j][0][3,3] = SSGKl[i]
     673                if genQ[i]:
     674                    SSGOps[j][1][3] = genQ[i]
     675                E,SSGOps = extendSSGOps(SSGOps)
     676        elif SGData['SGPtGrp'] in ['6/mmm',]: #not OK
     677            for i,j in enumerate([1,15,19,11]):
     678                SSGOps[j][0][3,3] = SSGKl[i]
     679                if genQ[i]:
     680                    SSGOps[j][1][3] = genQ[i]
     681                E,SSGOps = extendSSGOps(SSGOps)
    648682        if SGData['SGPtGrp'] in ['1','-1']: #triclinic - done
    649683            return True,SSGOps
    650         nOps = len(SSGOps)
    651         for i in range(nOps):
    652             for j in range(nOps):
    653                 OpC = list(SGProd(SSGOps[j],SSGOps[i]))
    654                 OpC[1] %= 1.
    655                 for k in range(nOps):
    656                     OpD = SSGOps[k]
    657                     if SSMT2text(OpC) == SSMT2text(OpD):
    658                         continue
    659                     elif np.allclose(OpC[0][:3,:3],OpD[0][:3,:3]):
    660                         if np.allclose(OpD[0][3],np.zeros(4)):
    661                             SSGOps[k] = OpC
    662                         elif np.any([np.allclose(OpC[0][3][:3],cen) for cen in SGData['SGCen']]):   #?
    663                             continue
    664                         else:
    665                             OpCtxt = SSMT2text(OpC).strip()
    666                             OpDtxt = SSMT2text(OpD).strip()
    667                             print 'OpC',OpCtxt,'OpD',OpDtxt
    668                             return False,OpCtxt+' conflict with '+OpDtxt
    669         return True,SSGOps
     684        E,SSGOps = extendSSGOps(SSGOps)
     685        return E,SSGOps
     686       
     687    def specialGen(gensym):
     688        sym = ''.join(gensym)
     689        if SGData['SGPtGrp'] in ['-62m',] and sym == '00s':
     690            gensym = '0ss'
     691        return gensym
    670692                   
    671     def getTau():
    672         if not genQ:
    673             return [0,0,0,0]
    674         newQ = genQ
    675         if SGData['SGPtGrp'] in ['2/m']:  #OK           
    676             newQ = [0.5,]
    677         return newQ
     693    def checkGen(gensym):
     694        sym = ''.join(gensym)
     695# monoclinic - all done
     696        if str(SSGKl) == '[-1]' and sym == 's':
     697            return False
     698        elif str(SSGKl) == '[-1, 1]' and sym == 's0':
     699            return False
     700        elif str(SSGKl) == '[1, -1]' and sym == '0s':
     701            return False
     702#orthorhombic - all
     703        elif SGData['SGPtGrp'] in ['222',] and sym not in ['','s00','0s0','00s']:
     704            return False
     705        elif SGData['SGPtGrp'] in ['2mm','m2m','mm2','mmm'] and sym not in GenSymList[4:15]:
     706            return False
     707#tetragonal - all done
     708        elif SGData['SGPtGrp'] in ['4',] and sym not in ['','s','q']:
     709            return False
     710        elif SGData['SGPtGrp'] in ['-4',] and sym not in ['',]:
     711            return False             
     712        elif SGData['SGPtGrp'] in ['4/m',] and sym not in ['','s0','q0']:
     713            return False
     714        elif SGData['SGPtGrp'] in ['422',] and sym not in ['','q00','s00']:
     715            return False         
     716        elif SGData['SGPtGrp'] in ['4mm',] and sym not in ['','ss0','s0s','0ss','qq0','qqs']:
     717            return False
     718        elif SGData['SGPtGrp'] in ['-4m2',] and sym not in ['','00s','00q']:
     719            return False
     720        elif SGData['SGPtGrp'] in ['-42m',] and sym not in ['','0s0','0q0']:
     721            return False
     722        elif SGData['SGPtGrp'] in ['4/mmm',] and sym not in ['','s00s','s0s0','00ss','q0q0','q0qs']:
     723            return False
     724#trigonal/rhombohedral - all done
     725        elif SGData['SGPtGrp'] in ['3',] and sym not in ['','t']:
     726            return False
     727        elif SGData['SGPtGrp'] in ['-3',] and sym not in ['',]:
     728            return False
     729        elif SGData['SGPtGrp'] in ['32',] and sym not in ['','t0']:
     730            return False
     731        elif SGData['SGPtGrp'] in ['321',] and sym not in ['','t00']:
     732            return False
     733        elif SGData['SGPtGrp'] in ['312',] and sym not in ['',]:
     734            return False
     735        elif SGData['SGPtGrp'] in ['3m','-3m'] and sym not in ['','0s']:
     736            return False
     737        elif SGData['SGPtGrp'] in ['3m1','-3m1'] and sym not in ['','0s0']:
     738            return False
     739        elif SGData['SGPtGrp'] in ['31m','-31m'] and sym not in ['','00s']:
     740            return False
     741#hexagonal - all done
     742        elif SGData['SGPtGrp'] in ['6',] and sym not in ['','s','h','t']:
     743            return False
     744        elif SGData['SGPtGrp'] in ['-6',] and sym not in ['',]:
     745            return False
     746        elif SGData['SGPtGrp'] in ['6/m',] and sym not in ['','s0']:
     747            return False
     748        elif SGData['SGPtGrp'] in ['622',] and sym not in ['','h00','t00','s00']:
     749            return False         
     750        elif SGData['SGPtGrp'] in ['6mm',] and sym not in ['','ss0','s0s','0ss']:
     751            return False
     752        elif SGData['SGPtGrp'] in ['-6m2',] and sym not in ['','0s0']:
     753            return False
     754        elif SGData['SGPtGrp'] in ['-62m',] and sym not in ['','0ss']:
     755            return False
     756        elif SGData['SGPtGrp'] in ['6/mmm',] and sym not in ['','s00s','s0s0','00ss']:
     757            return False
     758        return True
    678759       
    679760    LaueModList = ['abg', 'ab0', 'ab1/2', 'a0g', 'a1/2g','0bg', '1/2bg',
     
    706787    if SGData['SGLaue'] in ['2/m','mmm']:
    707788        SSGKl = fixMonoOrtho()
    708     genQ = [Fracs[mod] for mod in gensym]
    709789    if len(gensym) and len(gensym) != len(SSGKl):
    710790        return 'Wrong number of items in generator symbol '+''.join(gensym),None
    711     genQ = getTau()
     791    gensym = specialGen(gensym)
     792    if not checkGen(gensym):
     793        return 'Generator '+''.join(gensym)+' not consistent with space group '+SGData['SpGrp'],None
     794    genQ = [Fracs[mod] for mod in gensym]
     795    if not genQ:
     796        genQ = [0,0,0,0]
    712797    SSGData = {'SSpGrp':SGData['SpGrp']+SSymbol,'modQ':modQ,'modSymb':modsym}
    713798    SSCen = np.ones((len(SGData['SGCen']),4))*0.5
     
    796881        IK = int(round(T[j]*12))%12
    797882        if IK:
     883            if not IJ:
     884                break
    798885            if IJ[0] == '-':
    799886                Fld += (TRA[IK]+IJ).rjust(8)
Note: See TracChangeset for help on using the changeset viewer.