File: make_sitesym.py

package info (click to toggle)
spglib 2.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 14,180 kB
  • sloc: ansic: 125,066; python: 7,717; cpp: 2,197; f90: 2,143; ruby: 792; makefile: 22; sh: 18
file content (50 lines) | stat: -rwxr-xr-x 1,832 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env python

import numpy as np
import hall2operations as h2o
import make_Wyckoff_db as wdb

characters = "abcdefghijklmnopqrstuvwxyz"

def get_Hall_operations( hall_file, hall_number ):
    hall_symbols = h2o.read_spg_csv( hall_file  )
    return h2o.HallSymbol( hall_symbols[ hall_number - 1 ][0] ).get_full_operations()

def get_wyckoff_position_operators( wyckoff_file, hall_number ):
    wyckoff = wdb.read_wyckoff_csv( wyckoff_file )
    operations = wdb.get_wyckoff_positions( wyckoff )
    return operations[ hall_number - 1 ]

def multiply_operations( spg_op, pos_op ):
    r, t = spg_op
    o_r, o_t = pos_op
    return ( np.dot( r, o_r ), np.dot( o_t, r.T ) + t )

def show_site_symmetries( rotations, translations, operators ):
    for i, o_site in enumerate( operators ):
        for j, o in enumerate( o_site ):
            o_r = o[0]
            o_t = o[1] / 24.0
            print "--------- %s, %d ----------" % (characters[len(operators) - i - 1], j+1)
            for r, t in zip( rotations, translations ):
                mo = multiply_operations( ( r, t ), ( o_r, o_t ) )
                diff = mo[1] - o_t
                if ( mo[0] - o_r == 0 ).all() and ( abs( diff - diff.round() ) < 0.01 ).all():
                    print r, t


if __name__ == '__main__':
    from optparse import OptionParser
    parser = OptionParser()
    parser.set_defaults( is_site = False )
    parser.add_option("--site", dest="is_site",
                      action="store_true",
                      help="Show site symmetries")
    (options, args) = parser.parse_args()

    rotations, translations = get_Hall_operations( args[0], int( args[2] ) )
    operators = get_wyckoff_position_operators( args[1], int( args[2] ) )


    if options.is_site:
        show_site_symmetries( rotations, translations, operators )