def Al1st(qminp, runjob=False, ref_dir='restart_path', **setting): #assert os.path.exists(ref_dir) if 'ref_dir' in setting: ref_dir = setting['ref_dir'] setting['ref_dir'] = os.path.abspath(ref_dir) if 'runjob' not in setting: setting['runjob'] = False qminp = copy.deepcopy(univ.toInp(qminp, **setting)) if hasattr(qminp.setting, 'save_restart'): qminp.setting['save_restart'] = False name = qminp.molecule.name if 'out_dir' in setting: name = setting['out_dir'] del setting['out_dir'] qminp.molecule.name = name qminp.setting['root_dir'] = name if qminp.setting['program'] == 'cpmd': setting['restart'] = True setting['scf_step'] = 1 rst = os.path.join(setting['ref_dir'], 'RESTART') assert os.path.exists(rst) rst = os.path.abspath(rst) if 'dependent_files' in setting: setting['dependent_files'].append(rst) else: setting['dependent_files'] = [rst] elif qminp.setting['program'] == 'abinit': setting['restart'] = True setting['scf_step'] = 0 rstList = sorted(glob.glob(os.path.join(setting['ref_dir'], '*o_*WFK'))) assert len(rstList) > 0 rstSrc = rstList[-1] if 'dependent_file' in setting: setting['dependent_files'].append([rstSrc, name+'i_WFK']) else: setting['dependent_files'] = [[rstSrc, name+'i_WFK']] denList = sorted(glob.glob(os.path.join(setting['ref_dir'], '*o_*DEN'))) if len(denList) > 0: setting['restart_density'] = True denSrc = denList[-1] setting['dependent_files'].append([denSrc, name+'i_DEN']) elif qminp.setting['program'] == 'espresso': wfn = glob.glob(setting['ref_dir'] + '/*.wfc[0-9]*') if 'threads' not in setting or setting['threads'] != len(wfn): qtk.warning('threads must be the same as ref_dir, reset to %d'\ % len(wfn)) setting['threads'] = len(wfn) setting['restart'] = True setting['scf_step'] = 1 rst = glob.glob(setting['ref_dir'] + '/*.restart*') save = glob.glob(setting['ref_dir'] + '/*.save') if 'dependent_files' in setting: for lst in [wfn, rst, save]: setting['dependent_files'].extend(lst) else: setting['dependent_files'] = wfn for lst in [rst, save]: setting['dependent_files'].extend(lst) elif qminp.setting['program'] == 'vasp': setting['restart'] = True setting['scf_step'] = 1 wfn_list = sorted(glob.glob(setting['ref_dir'] + '/WAVECAR')) assert len(wfn_list) == 1 wfn = wfn_list[0] if 'dependent_files' in setting: setting['dependent_files'].append(wfn) else: setting['dependent_files'] = [wfn] elif qminp.setting['program'] == 'bigdft': pass elif qminp.setting['program'] == 'nwchem': pass if setting['runjob']: qmout = qminp.run(name, **setting) return qmout else: qminp.molecule.name = name qminp.setting.update(setting) new_inp = qtk.QMInp(qminp.molecule, **qminp.setting) return new_inp
def __init__(self, ref, tar, **kwargs): self.setting = kwargs if 'pp_string' not in kwargs: self.setting['pp_string'] = 'pbe' self.ref = univ.toInp(ref, **self.setting) self.tar = univ.toInp(tar, **self.setting) self.name = self.ref.molecule.name + '_' + self.tar.molecule.name self.mutation = {} qm_setting = {} if 'qm_setting' in self.setting: qm_setting.update(kwargs['qm_setting']) if 'qm_setting' in kwargs: qm_setting.update(kwargs['qm_setting']) if 'program' not in qm_setting: qm_setting['program'] = self.ref.setting['program'] self.qm_setting = qm_setting # !!!!!!!!!!!!!!!!!!!!!!! # construct mutation list # tar_list: list of matching location ref = self.ref.molecule tar = self.tar.molecule tar_list = [True for i in range(tar.N)] to_void = True ref_ind = [] tar_ind = [] mutation_fix = [] mutation_ind = ref_ind mutation_ref = [] mutation_tar = [] mutation_crd = [] mutation_string = [] # loop through every atom in reference system for i in range(ref.N): Zi = ref.type_list[i] Ri = copy.deepcopy(ref.R[i]) # loop through every atom in target system for j in range(tar.N): # every atom-pair distance Rj = copy.deepcopy(tar.R[j]) diff = np.linalg.norm(Ri-Rj) # search for atoms at same location if diff < 10E-6: to_void = False tar_list[j] = False Zj = tar.type_list[j] if Zi != Zj: ref_ind.append(i) mutation_ref.append(Zi) mutation_tar.append(Zj) mutation_crd.append(Ri) else: mutation_fix.append(i) # when no distance matched, set atom target to void if to_void: ref_ind.append(i) mutation_ref.append(Zi) mutation_tar.append('VOID') mutation_crd.append(Ri) # loop through every target atom for non-matching atoms N = ref.N for j in range(tar.N): if tar_list[j]: ref_ind.append(j) mutation_ref.append('VOID') mutation_tar.append(tar.type_list[j]) mutation_crd.append(tar.R[j]) for k in range(len(mutation_ref)): string = mutation_ref[k] + '2' + mutation_tar[k] if self.setting['pp_string']: string = string + '_' + self.setting['pp_string'] mutation_string.append(string) self.mutation ={ 'ind': mutation_ind, 'ref': mutation_ref, 'tar': mutation_tar, 'crd': mutation_crd, 'fix': mutation_fix, 'string': mutation_string, }
def Al1st(qminp, **setting): assert 'ref_dir' in setting assert os.path.exists(setting['ref_dir']) if 'runjob' not in setting: setting['runjob'] = True qminp = copy.deepcopy(univ.toInp(qminp, **setting)) name = qminp.molecule.name if 'out_dir' in setting: name = setting['out_dir'] del setting['out_dir'] qminp.molecule.name = name qminp.setting['root_dir'] = name if qminp.setting['program'] == 'cpmd': setting['restart'] = True setting['scf_step'] = 1 rst = os.path.join(setting['ref_dir'], 'RESTART') assert os.path.exists(rst) rst = os.path.abspath(rst) if 'dependent_files' in setting: setting['dependent_files'].append(rst) else: setting['dependent_files'] = [rst] elif qminp.setting['program'] == 'abinit': setting['restart'] = True setting['scf_step'] = 0 rstList = glob.glob(os.path.join(setting['ref_dir'], '*o_WFK')) assert len(rstList) > 0 rstSrc = rstList[-1] rstTar = rstSrc.replace('o_WFK', 'i_WFK') rstTar = os.path.split(rstTar)[-1] if 'dependent_file' in setting: setting['dependent_files'].append([rstSrc, name+'i_WFK']) else: setting['dependent_files'] = [[rstSrc, name+'i_WFK']] elif qminp.setting['program'] == 'espresso': wfn = glob.glob(setting['ref_dir'] + '/*.wfc[0-9]*') if 'threads' not in setting or setting['threads'] != len(wfn): qtk.warning('threads must be the same as ref_dir, reset to %d'\ % len(wfn)) setting['threads'] = len(wfn) setting['restart'] = True setting['scf_step'] = 1 rst = glob.glob(setting['ref_dir'] + '/*.restart*') save = glob.glob(setting['ref_dir'] + '/*.save') if 'dependent_files' in setting: for lst in [wfn, rst, save]: setting['dependent_files'].extend(lst) else: setting['dependent_files'] = wfn for lst in [rst, save]: setting['dependent_files'].extend(lst) elif qminp.setting['program'] == 'vasp': setting['restart'] = True setting['scf_step'] = 1 wfn_list = glob.glob(setting['ref_dir'] + '/WAVECAR') assert len(wfn_list) == 1 wfn = wfn_list[0] if 'dependent_files' in setting: setting['dependent_files'].append(wfn) else: setting['dependent_files'] = [wfn] elif qminp.setting['program'] == 'bigdft': pass elif qminp.setting['program'] == 'nwchem': pass if setting['runjob']: qmout = qminp.run(name, **setting) return qmout else: qminp.molecule.name = name qminp.setting.update(setting) new_inp = qtk.QMInp(qminp.molecule, **qminp.setting) return new_inp
def __init__(self, ref, tar, **kwargs): self.setting = kwargs if 'pp_string' not in kwargs: self.setting['pp_string'] = 'pbe' self.ref = univ.toInp(ref, **self.setting) self.tar = univ.toInp(tar, **self.setting) self.name = self.ref.molecule.name + '_' + self.tar.molecule.name self.mutation = {} qm_setting = {} if 'qm_setting' in self.setting: qm_setting.update(kwargs['qm_setting']) if 'qm_setting' in kwargs: qm_setting.update(kwargs['qm_setting']) if 'program' not in qm_setting: qm_setting['program'] = self.ref.setting['program'] self.qm_setting = qm_setting # !!!!!!!!!!!!!!!!!!!!!!! # construct mutation list # tar_list: list of matching location ref = self.ref.molecule tar = self.tar.molecule tar_list = [True for i in range(tar.N)] to_void = True ref_ind = [] tar_ind = [] mutation_fix = [] mutation_ind = ref_ind mutation_ref = [] mutation_tar = [] mutation_crd = [] mutation_string = [] # loop through every atom in reference system for i in range(ref.N): Zi = ref.type_list[i] Ri = copy.deepcopy(ref.R[i]) # loop through every atom in target system for j in range(tar.N): # every atom-pair distance Rj = copy.deepcopy(tar.R[j]) diff = np.linalg.norm(Ri - Rj) # search for atoms at same location if diff < 10E-6: to_void = False tar_list[j] = False Zj = tar.type_list[j] if Zi != Zj: ref_ind.append(i) mutation_ref.append(Zi) mutation_tar.append(Zj) mutation_crd.append(Ri) else: mutation_fix.append(i) # when no distance matched, set atom target to void if to_void: ref_ind.append(i) mutation_ref.append(Zi) mutation_tar.append('VOID') mutation_crd.append(Ri) # loop through every target atom for non-matching atoms N = ref.N for j in range(tar.N): if tar_list[j]: ref_ind.append(j) mutation_ref.append('VOID') mutation_tar.append(tar.type_list[j]) mutation_crd.append(tar.R[j]) for k in range(len(mutation_ref)): string = mutation_ref[k] + '2' + mutation_tar[k] if self.setting['pp_string']: string = string + '_' + self.setting['pp_string'] mutation_string.append(string) self.mutation = { 'ind': mutation_ind, 'ref': mutation_ref, 'tar': mutation_tar, 'crd': mutation_crd, 'fix': mutation_fix, 'string': mutation_string, }