Esempio n. 1
0
 def __init__(self, configfile):
     if os.path.isfile(configfile):
         self.configfile = configfile
     else:
         print('file:{} is not found.'.format(configfile))
         exit()
     self.generator = ParseGenerator()
     self.main()
    def __init__(self,
                 min_spg_index=8,
                 max_spg_index=None,
                 natoms=1,
                 use_progress_bar=False):
        spg = ParseGenerator()
        self.min_spg_index = spg.get_ispg(min_spg_index)

        if max_spg_index is None:
            self.max_spg_index = spg.get_ispg(min_spg_index)
        else:
            self.max_spg_index = spg.get_ispg(max_spg_index)
        self.natoms = natoms
        self.use_tqdm = use_progress_bar
        self.get_wyckoff_list()
Esempio n. 3
0
 def __init__(self, configfile):
     configure = ParseConfig(configfile)
     self.wyckoff = ParseWyckoff()
     self.generator = ParseGenerator()
     self.min_spg_index = configure.min_spg_index
     self.max_spg_index = configure.max_spg_index
     self.ichoice = configure.ichoice
     self.main()
Esempio n. 4
0
 def set_space_group(self, ispg, ichoice=1):
     ispg = ParseGenerator().get_ispg(ispg)
     spg_obj = self.generator_obj.generator_list[ispg - 1][ichoice - 1]
     self.schname = spg_obj.schname
     self.hmname = spg_obj.hmname
     self.il = spg_obj.il
     wyckoff_obj = self.wyckoff_obj.wyckoff_position[ispg - 1][ichoice - 1]
     self.npos = wyckoff_obj.npos
     self.wyckoff_position_list = wyckoff_obj.position
     self.set_position_index_list()
     return self
Esempio n. 5
0
 def __init__(self, ispg, ichoice=1):
     Gen_obj = ParseGenerator()
     self.generator = Gen_obj.get_generator(ispg, ichoice)
     self.il = Gen_obj.get_il(ispg, ichoice)
     self.schname = Gen_obj.get_schname(ispg, ichoice)
     self.hmname = Gen_obj.get_hmname(ispg, ichoice)
     self.ispg = Gen_obj.get_ispg(ispg, ichoice)
     self.ichoice = ichoice
     self.define_rotation_operator()
     self.initialize_operator()
     self.generate_group_elements()
     self.set_point_group_info()
Esempio n. 6
0
 def __init__(self):
     self.generator_obj = ParseGenerator()
     self.wyckoff_obj = ParseWyckoff()
Esempio n. 7
0
        import GenerateWyckoffPositionsList
from Metis.SpaceGroup.IdentifySubIndex \
        import IdentifySubIndex
from Metis.SpaceGroup.ParseGenerator import ParseGenerator
import random
import sys

min_spg = 8
max_spg = 230
max_natoms = 16
max_sub_index = 0
jspg = 0
hmname = ''
schname = ''

generator = ParseGenerator()

for natoms in range(1, max_natoms):
    total_pattern = 0
    for ispg in range(min_spg, max_spg + 1):
        wyckoff_obj = GenerateWyckoffPositionsList(min_spg_index=ispg,
                                                   natoms=natoms,
                                                   use_progress_bar=False)
        wyckoff_dic = wyckoff_obj.wyckoff_list[0]['wyckoff_positions']
        for i in range(len(wyckoff_dic)):
            total_pattern += 1
            target_list = wyckoff_dic[i]
            random.shuffle(target_list)
            sys.stdout.write('\r')
            sys.stdout.write('> natoms = {0:>2d}  '.format(natoms))
            sys.stdout.write('ispg = {0:>3d} '.format(ispg))
Esempio n. 8
0
#!/usr/bin/env python3
from Metis.SpaceGroup.ParseGenerator import ParseGenerator
import sys


def get_args():
    if len(sys.argv) < 2:
        print('usage {0} [ispg] [ichoice]'.format(sys.argv[0]))
        exit()
    ispg = sys.argv[1]
    if len(sys.argv) == 2:
        ichoice = 1
    else:
        ichoice = int(sys.argv[2])
    return [ispg, ichoice]


if __name__ == '__main__':
    ispg, ichoice = get_args()
    obj = ParseGenerator('generator')
    for gen in obj.get_generator(ispg, ichoice=ichoice):
        print(gen)
Esempio n. 9
0
    def __init__(self,
                 configfile,
                 qe_inputfile='espresso_relax.in',
                 ispg=None,
                 sub_index=None,
                 atom_info=None,
                 submit_job=False,
                 logfile=None):
        if os.path.isfile(configfile):
            self.configfile = configfile
        else:
            print('===== Error(GenerateEspressoIn) ======')
            print('file:{} is not found.'.format(configfile))
            exit()
        #
        # temporary dir:
        #  if you need, you can change it.
        #
        self.tmpdir = os.path.join('/work', os.environ['USER'])

        self.ispg = ispg
        self.sub_index = sub_index
        self.atom_info = atom_info
        self.qe_inputfile = qe_inputfile
        self.logfile = logfile
        self.main()

        if self.eliminate_redundancy:
            compound_name = self.crystal_structure.compound_name
            redundancy = CheckRedundancy()
            consistency, prim_cell = redundancy.check(compound_name, self.ispg,
                                                      self.sub_index)
            spg_obj = ParseGenerator()
            hmname_try = spg_obj.get_hmname(self.ispg)
            #
            # for bug for trigonal by H.F on 5 Sep. 2019
            #
            if 143 <= ispg <= 164:
                redundancy = False
                consistency = True
            # end of bug kaihi
            if not consistency:
                if prim_cell.ispg is None:
                    hmname_true = hmname_try
                else:
                    hmname_true = spg_obj.get_hmname(prim_cell.ispg)
                if hmname_try == hmname_true:
                    fout = open(self.logfile, 'a')
                    if compound_name == prim_cell.compound_name:
                        consistency = True
                        print(' Acceptation: redundancy check was passed ',
                              end='')
                        print('for DIR:{}.'.format(self.wkdir), end='')
                        print(' This calculation will be performed.')
                        fout.write(' Acceptation: ')
                        fout.write('redundancy check was passed ')
                        fout.write('for DIR:{}.'.format(self.wkdir))
                        fout.write(' This calculation will be performed.\n')
                        fout.close()
                    else:
                        print(' Redundancy : For {0:6s},'.format(self.wkdir),
                              end='')
                        fout.write(' Redundancy : For {0:6s},'.format(
                            self.wkdir))
                        print(' cell is over size', end='')
                        fout.write(' cell is over size')
                        print(' Alternative calculation ', end='')
                        print('will be performed in {}.'.format(
                            prim_cell.dirname))
                        fout.write(' Alternative calculation ')
                        fout.write('will be performed in {}.\n'.format(
                            prim_cell.dirname))
                        fout.close()
                        for (i, atom) in enumerate(prim_cell.atom_info):
                            if atom['element'] != self.atom_info[i]['element']:
                                print('=== Error(GenerateEspressoIn) ===')
                                print('logic error for prim_cell.atom_info')
                                exit()
                            prim_cell.atom_info[i]['semi_core'] =\
                                self.atom_info[i]['semi_core']
                        GenerateEspressoIn(configfile=self.configfile,
                                           ispg=prim_cell.ispg,
                                           qe_inputfile=qe_inputfile,
                                           sub_index=prim_cell.sub_index,
                                           atom_info=prim_cell.atom_info,
                                           submit_job=submit_job,
                                           logfile=self.logfile)
                else:  # space group is different case
                    fout = open(self.logfile, 'a')
                    print(' Redundancy : For {0:6s},'.format(self.wkdir),
                          end='')
                    fout.write(' Redundancy : For {0:6s},'.format(self.wkdir))
                    print(' you assumed the symmetry:{0}, '.format(hmname_try),
                          end='')
                    print('but metis found higher symmetry:{0}.'.format(
                        hmname_true),
                          end='')
                    fout.write(
                        ' you assumed the symmetry:{0}, '.format(hmname_try))
                    fout.write('but metis found higher symmetry:{0}.'.format(
                        hmname_true))
                    for (i, atom) in enumerate(prim_cell.atom_info):
                        if atom['element'] != self.atom_info[i]['element']:
                            print('=== Error(GenerateEspressoIn) ===')
                            print('logic error for prim_cell.atom_info')
                            exit()
                        prim_cell.atom_info[i]['semi_core'] =\
                            self.atom_info[i]['semi_core']

                    if compound_name == prim_cell.compound_name:
                        print(' This calculation will be skipped.')
                        fout.write(' This calculation will be skipped.\n')
                        fout.close()
                    else:
                        if os.path.isdir(prim_cell.dirname):
                            print(' This calculation will be skipped.')
                            fout.write(' This calculation will be skipped.\n')
                            fout.close()
                        else:
                            print(' Alternative calculation ', end='')
                            print('will be performed in {}.'.format(
                                prim_cell.dirname))
                            fout.write(' Alternative calculation ')
                            fout.write('will be performed in {}.\n'.format(
                                prim_cell.dirname))
                            fout.close()
                            os.makedirs(prim_cell.dirname)
                            qe_inputfile = os.path.basename(self.qe_inputfile)
                            GenerateEspressoIn(configfile=self.configfile,
                                               ispg=prim_cell.ispg,
                                               qe_inputfile=qe_inputfile,
                                               sub_index=prim_cell.sub_index,
                                               atom_info=prim_cell.atom_info,
                                               submit_job=submit_job,
                                               logfile=self.logfile)
                if not consistency:
                    if os.path.isdir(self.wkdir):
                        shutil.rmtree(self.wkdir)
                    return
            else:
                fout = open(self.logfile, 'a')
                print(' Acceptation: redundancy check was passed ', end='')
                print('for DIR:{}.'.format(self.wkdir), end='')
                print(' This calculation will be performed.')
                fout.write(' Acceptation: redundancy check was passed ')
                fout.write('for DIR:{}.'.format(self.wkdir))
                fout.write(' This calculation will be performed.\n')
                fout.close()

        if submit_job:
            self.submit_job()
Esempio n. 10
0
class ParseConfig(object):
    def __init__(self, configfile):
        if os.path.isfile(configfile):
            self.configfile = configfile
        else:
            print('file:{} is not found.'.format(configfile))
            exit()
        self.generator = ParseGenerator()
        self.main()

    def main(self):
        self.set_default_value()
        self.parse()
        self.check_spg()

    def get_linebuf(self, line):
        linebuf = line.strip()
        if '#' in linebuf:
            linebuf = linebuf.split('#')[0].strip()
        return linebuf

    def get_key_and_value(self, linedata, token='='):
        if token not in linedata:
            return [None, None]
        key, value = [x.strip() for x in linedata.split(token)[:2]]
        key = key.lower()
        return [key, value]

    def spg2ispg(self, spg):
        return self.generator.get_ispg(spg)

    def set_default_value(self):
        self.min_spg_index = None
        self.max_spg_index = None
        self.ichoice = 1

    def check_spg(self):
        if [self.min_spg_index, self.max_spg_index] == [None] * 2:
            print('space group is not defined')
            exit()

        if self.min_spg_index is not None:
            if self.max_spg_index is None:
                self.max_spg_index = self.min_spg_index

        if self.max_spg_index is not None:
            if self.min_spg_index is None:
                self.mim_spg_index = self.max_spg_index

        if self.min_spg_index > self.max_spg_index:
            self.min_spg_index, self.max_spg_index =\
                    self.max_spg_index, self.min_spg_index

    def parse(self):
        for line in open(self.configfile, 'r'):
            linebuf = self.get_linebuf(line)
            if linebuf == '':
                continue
            if '=' in linebuf:
                key, value = self.get_key_and_value(linebuf)
                if key is None:
                    continue
                if value == '':
                    continue
                if key == 'min_spg_index':
                    self.min_spg_index = self.spg2ispg(value)
                elif key == 'max_spg_index':
                    self.max_spg_index = self.spg2ispg(value)
                elif key == 'ichoice':
                    self.ichoice = int(value)