Exemplo n.º 1
0
def convert_single_structure(cell_file, param_file, directory="."):
    atoms = io.read(cell_file)
    io.write(os.path.join(directory, "geo_end.gen"), atoms)

    with open(param_file, 'r') as stream:
        castep_params = yaml.load(stream)

    dftb_params = param_schema.validate({})

    # get castep parameters
    for castep_name, dftb_name in CASTEP_to_DFTB_map.items():
        if castep_name in castep_params:
            dftb_params[dftb_name] = castep_params[castep_name]

    # get k-points from cell file
    k_points = map(int, atoms.calc.cell.kpoints_mp_grid.value.split())

    dargs = DFTBArgs(dftb_params['dftb_set'])

    custom_species = atoms.get_array('castep_custom_species')
    muon_index = np.where(custom_species == dftb_params['mu_symbol'])[0][0]

    # Add muon mass
    args = dargs.args
    args['Driver_'] = 'ConjugateGradient'
    args['Driver_Masses_'] = ''
    args['Driver_Masses_Mass_'] = ''
    args['Driver_Masses_Mass_Atoms'] = '{}'.format(muon_index)
    args['Driver_Masses_Mass_MassPerAtom [amu]'] = '0.1138'
    args['Driver_MaxSteps'] = dftb_params['geom_steps']
    args['Driver_MaxForceComponent [eV/AA]'] = dftb_params['geom_force_tol']

    calc = Dftb(atoms=atoms, kpts=k_points, run_manyDftb_steps=True, **args)

    calc.write_dftb_in(os.path.join(directory, "dftb_in.hsd"))
 def write_dftb_in(self, filename):
     if self.read_chg and os.path.exists('charges.bin'):
         read_charges = 'Yes'
     else:
         read_charges = 'No'
     self.parameters['Hamiltonian_ReadInitialCharges'] = read_charges
     Dftb.write_dftb_in(self, filename)