示例#1
0
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
示例#2
0
  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,
                   }
示例#3
0
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
示例#4
0
    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,
        }