Пример #1
0
def check_symmetry(input_cell,
                   primitive_axis=None,
                   symprec=1e-5,
                   distance_to_A=1.0,
                   phonopy_version=None):
    if primitive_axis is None:
        cell = get_primitive(input_cell, np.eye(3), symprec=symprec)
    else:
        cell = get_primitive(input_cell, primitive_axis, symprec=symprec)
    lattice = cell.get_cell() * distance_to_A
    cell.set_cell(lattice)

    symmetry = Symmetry(cell, symprec)
    print(_get_symmetry_yaml(cell, symmetry, phonopy_version))

    if input_cell.get_magnetic_moments() is None:
        primitive = find_primitive(cell, symprec)
        if primitive is not None:
            print("# Primitive cell was found. It is written into PPOSCAR.")
            write_vasp('PPOSCAR', primitive)

            # Overwrite symmetry and cell
            symmetry = Symmetry(primitive, symprec)
            cell = primitive

        (bravais_lattice, bravais_pos,
         bravais_numbers) = spg.refine_cell(cell, symprec)
        bravais = Atoms(numbers=bravais_numbers,
                        scaled_positions=bravais_pos,
                        cell=bravais_lattice,
                        pbc=True)
        print("# Bravais lattice is written into BPOSCAR.")
        write_vasp('BPOSCAR', bravais)
Пример #2
0
def check_symmetry(input_cell,
                   primitive_axis=None,
                   symprec=1e-5,
                   distance_to_A=1.0,
                   phonopy_version=None):
    if primitive_axis is None:
        cell = get_primitive(input_cell, np.eye(3), symprec=symprec)
    else:
        cell = get_primitive(input_cell, primitive_axis, symprec=symprec)
    lattice = cell.get_cell() * distance_to_A
    cell.set_cell(lattice)

    symmetry = Symmetry(cell, symprec)
    print(_get_symmetry_yaml(cell, symmetry, phonopy_version))

    if input_cell.get_magnetic_moments() is None:
        primitive = find_primitive(cell, symprec)
        if primitive is not None:
            print("# Primitive cell was found. It is written into PPOSCAR.")
            write_vasp('PPOSCAR', primitive)

            # Overwrite symmetry and cell
            symmetry = Symmetry(primitive, symprec)
            cell = primitive

        (bravais_lattice,
         bravais_pos,
         bravais_numbers) = spg.refine_cell(cell, symprec)
        bravais = Atoms(numbers=bravais_numbers,
                        scaled_positions=bravais_pos,
                        cell=bravais_lattice,
                        pbc=True)
        print("# Bravais lattice is written into BPOSCAR.")
        write_vasp('BPOSCAR', bravais)
Пример #3
0
def check_symmetry(input_cell,
                   primitive_axis=None,
                   symprec=1e-5,
                   phonopy_version=None):
    if primitive_axis is None:
        cell = get_primitive(input_cell, np.eye(3), symprec=symprec)
    else:
        cell = get_primitive(input_cell, primitive_axis, symprec=symprec)
    symmetry = Symmetry(cell, symprec)
    print get_symmetry_yaml(cell, symmetry, phonopy_version),

    if input_cell.get_magnetic_moments() == None:
        primitive = find_primitive(cell, symprec)
        if not primitive==None:
            print "# Primitive cell was found. It is written into PPOSCAR."
            write_vasp('PPOSCAR', primitive)
            
            # Overwrite symmetry and cell
            symmetry = Symmetry(primitive, symprec)
            cell = primitive
    
        bravais_lattice, bravais_pos, bravais_numbers = \
            spg.refine_cell(cell, symprec)
        bravais = Atoms(numbers=bravais_numbers,
                        scaled_positions=bravais_pos,
                        cell=bravais_lattice,
                        pbc=True)
        print "# Bravais lattice is written into BPOSCAR."
        write_vasp('BPOSCAR', bravais)
Пример #4
0
def _extract_independent_borns(borns,
                               ucell,
                               primitive_matrix=None,
                               supercell_matrix=None,
                               is_symmetry=True,
                               symprec=1e-5):
    if primitive_matrix is None:
        pmat = np.eye(3)
    else:
        pmat = primitive_matrix
    if supercell_matrix is None:
        smat = np.eye(3, dtype='intc')
    else:
        smat = supercell_matrix

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc')
    p_sym = Symmetry(pcell, is_symmetry=is_symmetry, symprec=symprec)

    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = borns[u_indep_atoms].copy()

    return reduced_borns, s_indep_atoms
Пример #5
0
def test_get_primitive_convcell_nacl(convcell_nacl,
                                     primcell_nacl,
                                     helper_methods):
    pcell = get_primitive(convcell_nacl, [[0, 0.5, 0.5],
                                          [0.5, 0, 0.5],
                                          [0.5, 0.5, 0]])
    helper_methods.compare_cells_with_order(pcell, primcell_nacl)
Пример #6
0
    def _arrange_supercell_fc(self, cell, q2r_fc, is_full_fc=False):
        dim = self.dimension
        q2r_spos = self._get_q2r_positions(cell)
        scell = get_supercell(cell, np.diag(dim))
        pcell = get_primitive(scell, np.diag(1.0 / dim))

        diff = cell.get_scaled_positions() - pcell.get_scaled_positions()
        diff -= np.rint(diff)
        assert (np.abs(diff) < 1e-8).all()
        assert scell.get_number_of_atoms() == len(q2r_spos)

        site_map = self._get_site_mapping(scell.get_scaled_positions(),
                                          q2r_spos,
                                          scell.get_cell())
        natom = pcell.get_number_of_atoms()
        ndim = np.prod(dim)
        natom_s = natom * ndim

        if is_full_fc:
            fc = np.zeros((natom_s, natom_s, 3, 3), dtype='double', order='C')
            p2s = pcell.get_primitive_to_supercell_map()
            fc[p2s, :] = q2r_fc[:, site_map]
            distribute_force_constants_by_translations(fc,
                                                       pcell,
                                                       scell)
        else:
            fc = np.zeros((natom, natom_s, 3, 3), dtype='double', order='C')
            fc[:, :] = q2r_fc[:, site_map]

        return fc, pcell, scell
Пример #7
0
    def test(self):
        natoms = self._atoms.get_number_of_atoms()
        primitive = get_primitive(self._atoms, self._primitive_matrix)
        symprec = 1e-6

        smallest_vectors0, multiplicity0 = _get_smallest_vectors(
            self._atoms, primitive, symprec)
        smallest_vectors1, multiplicity1 = get_smallest_vectors_upho(
            self._atoms, primitive, symprec)

        dt_old = 0.0
        dt_new = 0.0
        for i in range(natoms):
            for j in range(primitive.get_number_of_atoms()):
                t0 = time.time()
                tmp0 = smallest_vectors0[i, j, :multiplicity0[i][j]]
                t1 = time.time()
                dt_old += t1 - t0

                t0 = time.time()
                tmp1 = smallest_vectors1[i, j, :multiplicity1[i][j]]
                t1 = time.time()
                dt_new += t1 - t0

                print(tmp0)
                print(tmp1)
                self.assertTrue(np.array_equal(tmp0, tmp1))
        print(dt_old)
        print(dt_new)
Пример #8
0
def get_born_OUTCAR(
    poscar_filename="POSCAR",
    outcar_filename="OUTCAR",
    primitive_axis=np.eye(3),
    supercell_matrix=np.eye(3, dtype="intc"),
    is_symmetry=True,
    symmetrize_tensors=False,
    symprec=1e-5,
):
    ucell = read_vasp(poscar_filename)
    outcar = open(outcar_filename)

    borns, epsilon = _read_born_and_epsilon(outcar)
    num_atom = len(borns)
    assert num_atom == ucell.get_number_of_atoms()

    if symmetrize_tensors:
        lattice = ucell.get_cell().T
        positions = ucell.get_scaled_positions()
        u_sym = Symmetry(ucell, is_symmetry=is_symmetry, symprec=symprec)
        point_sym = [similarity_transformation(lattice, r) for r in u_sym.get_pointgroup_operations()]
        epsilon = _symmetrize_tensor(epsilon, point_sym)
        borns = _symmetrize_borns(borns, u_sym, lattice, positions, symprec)

    inv_smat = np.linalg.inv(supercell_matrix)
    scell = get_supercell(ucell, supercell_matrix, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, primitive_axis), symprec=symprec)
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype="intc")
    p_sym = Symmetry(pcell, is_symmetry=is_symmetry, symprec=symprec)
    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = borns[u_indep_atoms].copy()

    return reduced_borns, epsilon
Пример #9
0
    def __init__(self,
                 paths,
                 dynamical_matrix,
                 unitcell_ideal,
                 primitive_matrix_ideal,
                 is_eigenvectors=False,
                 is_band_connection=False,
                 group_velocity=None,
                 factor=VaspToTHz,
                 star="none",
                 mode="eigenvector",
                 verbose=False):
        """

        Args:
            dynamical_matrix:
                Dynamical matrix for the (disordered) supercell.
            primitive_ideal_wrt_unitcell:
                Primitive cell w.r.t. the unitcell (not the supercell).
        """
        # ._dynamical_matrix must be assigned for calculating DOS
        # using the tetrahedron method.
        self._dynamical_matrix = dynamical_matrix

        # self._cell is used for write_yaml and _shift_point.
        # This must correspond to the "ideal" primitive cell.
        primitive_ideal_wrt_unitcell = (
            get_primitive(unitcell_ideal, primitive_matrix_ideal))
        self._cell = primitive_ideal_wrt_unitcell

        self._factor = factor
        self._is_eigenvectors = is_eigenvectors
        self._is_band_connection = is_band_connection
        if is_band_connection:
            self._is_eigenvectors = True
        self._group_velocity = group_velocity

        self._paths = [np.array(path) for path in paths]
        self._distances = []
        self._distance = 0.
        self._special_point = [0.]
        self._eigenvalues = None
        self._eigenvectors = None
        self._frequencies = None

        self._star = star
        self._mode = mode

        self._eigenstates = Eigenstates(
            dynamical_matrix,
            unitcell_ideal,
            primitive_matrix_ideal,
            mode=mode,
            star=star,
            verbose=verbose)

        with h5py.File('band.hdf5', 'w') as f:
            self._hdf5_file = f
            self._write_hdf5_header()
            self._set_band(verbose=verbose)
Пример #10
0
def ph2fc(ph_orig, supercell_matrix):
    """Transform force constants in Phonopy instance to other shape

    For example, ph_orig.supercell_matrix is np.diag([2, 2, 2]) and
    supercell_matrix is np.diag([4, 4, 4]), force constants having the
    later shape are returned. This is considered useful when ph_orig
    has non-analytical correction (NAC). The effect of this correction
    is included in the returned force constants. Phonons before and after
    this operation at commensurate points of the later supercell_matrix
    should agree.

    """

    smat = shape_supercell_matrix(supercell_matrix)
    scell = get_supercell(ph_orig.unitcell, smat)
    pcell = get_primitive(
        scell,
        np.dot(np.linalg.inv(smat), ph_orig.primitive_matrix),
        positions_to_reorder=ph_orig.primitive.scaled_positions)
    d2f = DynmatToForceConstants(pcell, scell)
    ph_orig.run_qpoints(d2f.commensurate_points, with_dynamical_matrices=True)
    ph_dict = ph_orig.get_qpoints_dict()
    d2f.dynamical_matrices = ph_dict['dynamical_matrices']
    d2f.run()
    return d2f.force_constants
Пример #11
0
def check_symmetry(phonon, optional_structure_info):
    # Assumed that primitive cell is the cell that user is interested in.
    print(_get_symmetry_yaml(phonon.primitive,
                             phonon.primitive_symmetry,
                             phonon.version))

    if phonon.unitcell.magnetic_moments is None:
        base_fname = get_default_cell_filename(phonon.calculator)
        symprec = phonon.primitive_symmetry.get_symmetry_tolerance()
        (bravais_lattice,
         bravais_pos,
         bravais_numbers) = spglib.refine_cell(phonon.primitive, symprec)
        bravais = PhonopyAtoms(numbers=bravais_numbers,
                               scaled_positions=bravais_pos,
                               cell=bravais_lattice)
        filename = 'B' + base_fname
        print("# Symmetrized conventional unit cell is written into %s."
              % filename)
        trans_mat = guess_primitive_matrix(bravais, symprec=symprec)
        primitive = get_primitive(bravais, trans_mat, symprec=symprec)
        write_crystal_structure(
            filename,
            bravais,
            interface_mode=phonon.calculator,
            optional_structure_info=optional_structure_info)

        filename = 'P' + base_fname
        print("# Symmetrized primitive is written into %s." % filename)
        write_crystal_structure(
            filename,
            primitive,
            interface_mode=phonon.calculator,
            optional_structure_info=optional_structure_info)
Пример #12
0
    def __init__(self,
                 dynamical_matrix,
                 unitcell_ideal,
                 primitive_matrix_ideal,
                 star="none",
                 mode="eigenvector",
                 factor=VaspToTHz,
                 verbose=False):
        self._verbose = verbose
        self._mode = mode

        self._factor = factor

        self._cell = dynamical_matrix.get_primitive()  # Disordered
        self._dynamical_matrix = dynamical_matrix

        self._star = star
        self._unitcell_ideal = unitcell_ideal
        # In this module, primitive is w.r.t. the unit cell (may be disordered).
        self._primitive = get_primitive(self._unitcell_ideal,
                                        primitive_matrix_ideal)

        self._build_star_creator()
        self._generate_translational_projector()
        self._generate_vectors_adjuster()
        self._create_rotational_projector()
        self._build_element_weights_calculator()
Пример #13
0
def _extract_independent_borns(borns,
                               ucell,
                               primitive_matrix=None,
                               supercell_matrix=None,
                               is_symmetry=True,
                               symprec=1e-5):
    if primitive_matrix is None:
        pmat = np.eye(3)
    else:
        pmat = primitive_matrix
    if supercell_matrix is None:
        smat = np.eye(3, dtype='intc')
    else:
        smat = supercell_matrix

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc')
    p_sym = Symmetry(pcell, is_symmetry=is_symmetry, symprec=symprec)

    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = borns[u_indep_atoms].copy()

    return reduced_borns, s_indep_atoms
Пример #14
0
def get_data(args, interface_mode=None):
    args = parse_args()
    cell, _ = read_crystal_structure(args.filenames[0],
                                     interface_mode=interface_mode)
    f = h5py.File(args.filenames[1])
    primitive_matrix = np.reshape(
        [fracval(x) for x in args.primitive_matrix.split()], (3, 3))
    primitive = get_primitive(cell, primitive_matrix)
    symmetry = Symmetry(primitive)

    data = {}
    data['cell'] = primitive
    data['symmetry'] = symmetry
    data['mesh'] = np.array(f['mesh'][:], dtype='intc')  # (3)
    data['weight'] = f['weight'][:]  # (gp)
    data['group_velocity'] = f['group_velocity'][:]  # (gp, band, 3)
    data['qpoint'] = f['qpoint'][:]  # (gp, 3)
    data['frequency'] = f['frequency'][:]  # (gp, band)
    if 'gamma_N' in f:
        data['gamma_N'] = f['gamma_N'][:]  # (temps, gp, band)
        data['gamma_U'] = f['gamma_U'][:]  # (temps, gp, band)
    if 'gamma_isotope' in f:
        data['gamma_isotope'] = f['gamma_isotope'][:]  # (gp, band)
    data['heat_capacity'] = f['heat_capacity'][:]  # (temps, gp, band)
    data['temperature'] = np.array(f['temperature'][:],
                                   dtype='double')  # (temps)
    ir_grid_points, grid_address, _ = get_grid_symmetry(data)
    data['ir_grid_points'] = ir_grid_points
    data['grid_address'] = grid_address

    return data
Пример #15
0
    def _arrange_supercell_fc(self, cell, q2r_fc, is_full_fc=False):
        dim = self.dimension
        q2r_spos = self._get_q2r_positions(cell)
        scell = get_supercell(cell, np.diag(dim))
        pcell = get_primitive(scell, np.diag(1.0 / dim))

        diff = cell.get_scaled_positions() - pcell.get_scaled_positions()
        diff -= np.rint(diff)
        assert (np.abs(diff) < 1e-8).all()
        assert scell.get_number_of_atoms() == len(q2r_spos)

        site_map = self._get_site_mapping(scell.get_scaled_positions(),
                                          q2r_spos,
                                          scell.get_cell())
        natom = pcell.get_number_of_atoms()
        ndim = np.prod(dim)
        natom_s = natom * ndim

        if is_full_fc:
            fc = np.zeros((natom_s, natom_s, 3, 3), dtype='double', order='C')
            p2s = pcell.get_primitive_to_supercell_map()
            fc[p2s, :] = q2r_fc[:, site_map]
            distribute_force_constants_by_translations(fc,
                                                       pcell,
                                                       scell)
        else:
            fc = np.zeros((natom, natom_s, 3, 3), dtype='double', order='C')
            fc[:, :] = q2r_fc[:, site_map]

        return fc, pcell, scell
Пример #16
0
    def __init__(self,
                 paths,
                 dynamical_matrix,
                 unitcell_ideal,
                 primitive_matrix_ideal,
                 is_eigenvectors=False,
                 is_band_connection=False,
                 group_velocity=None,
                 factor=VaspToTHz,
                 star="none",
                 mode="eigenvector",
                 verbose=False):
        """

        Args:
            dynamical_matrix:
                Dynamical matrix for the (disordered) supercell.
            primitive_ideal_wrt_unitcell:
                Primitive cell w.r.t. the unitcell (not the supercell).
        """
        # ._dynamical_matrix must be assigned for calculating DOS
        # using the tetrahedron method.
        self._dynamical_matrix = dynamical_matrix

        # self._cell is used for write_yaml and _shift_point.
        # This must correspond to the "ideal" primitive cell.
        primitive_ideal_wrt_unitcell = (get_primitive(unitcell_ideal,
                                                      primitive_matrix_ideal))
        self._cell = primitive_ideal_wrt_unitcell

        self._factor = factor
        self._is_eigenvectors = is_eigenvectors
        self._is_band_connection = is_band_connection
        if is_band_connection:
            self._is_eigenvectors = True
        self._group_velocity = group_velocity

        self._paths = [np.array(path) for path in paths]
        self._distances = []
        self._distance = 0.
        self._special_point = [0.]
        self._eigenvalues = None
        self._eigenvectors = None
        self._frequencies = None

        self._star = star
        self._mode = mode

        self._eigenstates = Eigenstates(dynamical_matrix,
                                        unitcell_ideal,
                                        primitive_matrix_ideal,
                                        mode=mode,
                                        star=star,
                                        verbose=verbose)

        with h5py.File('band.hdf5', 'w') as f:
            self._hdf5_file = f
            self._write_hdf5_header()
            self._set_band(verbose=verbose)
Пример #17
0
 def _get_primitive_cell(self, supercell, supercell_matrix, primitive_matrix):
     inv_supercell_matrix = np.linalg.inv(supercell_matrix)
     if primitive_matrix is None:
         t_mat = inv_supercell_matrix
     else:
         t_mat = np.dot(inv_supercell_matrix, primitive_matrix)
         
     return get_primitive(supercell, t_mat, self._symprec)
Пример #18
0
    def _get_primitive_cell(self, supercell, supercell_matrix, primitive_matrix):
        inv_supercell_matrix = np.linalg.inv(supercell_matrix)
        if primitive_matrix is None:
            t_mat = inv_supercell_matrix
        else:
            t_mat = np.dot(inv_supercell_matrix, primitive_matrix)

        return get_primitive(supercell, t_mat, self._symprec)
 def test_B3(self):
     unitcell = read_vasp("poscars/POSCAR_B3_conv")
     primitive_matrix = [
         [0.0, 0.5, 0.5],
         [0.5, 0.0, 0.5],
         [0.5, 0.5, 0.0],
     ]
     primitive = get_primitive(unitcell, primitive_matrix)
     self.check(unitcell, primitive)
Пример #20
0
 def test_get_commensurate_points(self):
     smat = np.diag([2, 2, 2])
     pmat = np.dot(np.linalg.inv(smat),
                   [[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]])
     supercell = get_supercell(self._cell, smat)
     primitive = get_primitive(supercell, pmat)
     comm_points = get_commensurate_points(primitive, supercell)
     for i, p in enumerate(comm_points):
         print("%d %s" % (i + 1, p))
Пример #21
0
def test_get_primitive_convcell_Cr(convcell_cr: PhonopyAtoms, helper_methods):
    """Test get_primitive by NaCl."""
    convcell_cr.magnetic_moments = [1, -1]
    smat = [[2, 0, 0], [0, 2, 0], [0, 0, 2]]
    scell = get_supercell(convcell_cr, smat, is_old_style=True)
    pmat = np.linalg.inv(smat)
    pcell = get_primitive(scell, pmat)
    helper_methods.compare_cells(convcell_cr, pcell)
    convcell_cr.magnetic_moments = None
Пример #22
0
 def test_get_commensurate_points(self):
     smat = np.diag([2, 2, 2])
     pmat = np.dot(np.linalg.inv(smat),
                   [[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]])
     supercell = get_supercell(self._cell, smat)
     primitive = get_primitive(supercell, pmat)
     comm_points = get_commensurate_points(primitive, supercell)
     for i, p in enumerate(comm_points):
         print("%d %s" % (i + 1, p))
 def test_B3(self):
     unitcell = read_vasp(os.path.join(POSCAR_DIR, "POSCAR_B3_conv"))
     primitive_matrix = [
         [0.0, 0.5, 0.5],
         [0.5, 0.0, 0.5],
         [0.5, 0.5, 0.0],
     ]
     primitive = get_primitive(unitcell, primitive_matrix)
     self.check(unitcell, primitive)
 def test_B3(self):
     unitcell = read_vasp("poscars/POSCAR_B3_conv")
     primitive_matrix = [
         [0.0, 0.5, 0.5],
         [0.5, 0.0, 0.5],
         [0.5, 0.5, 0.0],
     ]
     primitive = get_primitive(unitcell, primitive_matrix)
     self.check(unitcell, primitive)
Пример #25
0
 def create_primitive(self, filename="POSCAR", conf_file=None):
     from phonopy.structure.cells import get_primitive
     from phonopy.interface.vasp import read_vasp
     if conf_file is None:
         self._check_conf_files()
     else:
         self.set_conf_file(conf_file)
     primitive_matrix = self._read_primitive_matrix()
     atoms = read_vasp(filename)
     return get_primitive(atoms, primitive_matrix)
Пример #26
0
 def create_primitive(self, filename="POSCAR", conf_file=None):
     from phonopy.structure.cells import get_primitive
     from phonopy.interface.vasp import read_vasp
     if conf_file is None:
         self._check_conf_files()
     else:
         self.set_conf_file(conf_file)
     primitive_matrix = self._read_primitive_matrix()
     atoms = read_vasp(filename)
     return get_primitive(atoms, primitive_matrix)
Пример #27
0
 def test_get_commensurate_points(self):
     smat = np.diag([2, 2, 2])
     pmat = np.dot(np.linalg.inv(smat),
                   [[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]])
     supercell = get_supercell(self._cell, smat)
     primitive = get_primitive(supercell, pmat)
     supercell_matrix = np.linalg.inv(primitive.get_primitive_matrix())
     supercell_matrix = np.rint(supercell_matrix).astype('intc')
     comm_points = get_commensurate_points(supercell_matrix)
     # self._write(comm_points)
     self._compare(comm_points)
Пример #28
0
 def test_get_commensurate_points(self):
     smat = np.diag([2, 2, 2])
     pmat = np.dot(np.linalg.inv(smat),
                   [[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]])
     supercell = get_supercell(self._cell, smat)
     primitive = get_primitive(supercell, pmat)
     supercell_matrix = np.linalg.inv(primitive.get_primitive_matrix())
     supercell_matrix = np.rint(supercell_matrix).astype('intc')
     comm_points = get_commensurate_points(supercell_matrix)
     # self._write(comm_points)
     self._compare(comm_points)
    def test_project_vectors(self):
        unitcell, unitcell_ideal, primitive_matrix = self.prepare_L1_2()
        primitive = get_primitive(unitcell_ideal, primitive_matrix)

        natoms_u = unitcell.get_number_of_atoms()
        natoms_p = primitive.get_number_of_atoms()

        num_elements = 2
        ndims = 3
        nbands = 4
        vectors = np.arange(ndims * natoms_u * nbands).reshape(-1, nbands)

        elemental_projector = ElementWeightsCalculator(unitcell, primitive)
        projected_vectors = elemental_projector.project_vectors(vectors)
        print(projected_vectors)

        projected_vectors_expected = [
            [
                [0, 1, 2, 3],
                [4, 5, 6, 7],
                [8, 9, 10, 11],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
            ],
            [
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [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],
            ],
        ]

        self.assertTrue(
            np.all(projected_vectors == projected_vectors_expected))
    def test_project_vectors(self):
        unitcell, unitcell_ideal, primitive_matrix = self.prepare_L1_2()
        primitive = get_primitive(unitcell_ideal, primitive_matrix)

        natoms_u = unitcell.get_number_of_atoms()
        natoms_p = primitive.get_number_of_atoms()

        num_elements = 2
        ndims = 3
        nbands = 4
        vectors = np.arange(ndims * natoms_u * nbands).reshape(-1, nbands)

        elemental_projector = ElementWeightsCalculator(unitcell, primitive)
        projected_vectors = elemental_projector.project_vectors(vectors)
        print(projected_vectors)

        projected_vectors_expected = [
            [
                [0, 1, 2, 3],
                [4, 5, 6, 7],
                [8, 9, 10, 11],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
            ],
            [
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [0, 0, 0, 0],
                [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],
            ],
        ]

        self.assertTrue(
            np.all(projected_vectors == projected_vectors_expected))
Пример #31
0
def test_get_primitive_convcell_nacl_svecs(convcell_nacl: PhonopyAtoms,
                                           store_dense_svecs):
    """Test shortest vectors by NaCl."""
    pcell = get_primitive(convcell_nacl,
                          primitive_matrix_nacl,
                          store_dense_svecs=store_dense_svecs)
    svecs, multi = pcell.get_smallest_vectors()
    if store_dense_svecs:
        assert svecs.shape == (54, 3)
        assert multi.shape == (8, 2, 2)
        assert np.sum(multi[:, :, 0]) == 54
        assert np.sum(multi[-1:, -1, :]) == 54
    else:
        assert svecs.shape == (8, 2, 27, 3)
        assert multi.shape == (8, 2)
Пример #32
0
def get_BORN_txt(structure, parameters, nac_data, symprec=1.e-5):

    from phonopy.structure.cells import get_primitive, get_supercell
    from phonopy.structure.symmetry import Symmetry
    from phonopy.interface import get_default_physical_units
    from phonopy.structure.atoms import Atoms as PhonopyAtoms

    born_charges = nac_data.get_array('born_charges')
    epsilon = nac_data.get_array('epsilon')

    print ('inside born parameters')
    pmat = parameters['primitive']
    smat = parameters['supercell']

    ucell = PhonopyAtoms(symbols=[site.kind_name for site in structure.sites],
                         positions=[site.position for site in structure.sites],
                         cell=structure.cell)

    num_atom = len(born_charges)
    assert num_atom == ucell.get_number_of_atoms(), \
        "num_atom %d != len(borns) %d" % (ucell.get_number_of_atoms(),
                                          len(born_charges))

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc')
    p_sym = Symmetry(pcell, is_symmetry=True, symprec=symprec)
    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = born_charges[u_indep_atoms].copy()

    factor = get_default_physical_units('vasp')['nac_factor']  # born charges in VASP units

    born_txt = ('{}\n'.format(factor))
    for num in epsilon.flatten():
        born_txt += ('{0:4.8f}'.format(num))
    born_txt += ('\n')

    for atom in reduced_borns:
        for num in atom:
            born_txt += ('{0:4.8f}'.format(num))
        born_txt += ('\n')
    born_txt += ('{}\n'.format(factor))

    return born_txt
Пример #33
0
def _get_supercell_and_primitive(ucell,
                                 primitive_matrix=None,
                                 supercell_matrix=None,
                                 symprec=1e-5):
    if primitive_matrix is None:
        pmat = np.eye(3)
    else:
        pmat = primitive_matrix
    if supercell_matrix is None:
        smat = np.eye(3, dtype="intc")
    else:
        smat = supercell_matrix

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)

    return scell, pcell
Пример #34
0
def _get_supercell_and_primitive(ucell,
                                 primitive_matrix=None,
                                 supercell_matrix=None,
                                 symprec=1e-5):
    if primitive_matrix is None:
        pmat = np.eye(3)
    else:
        pmat = primitive_matrix
    if supercell_matrix is None:
        smat = np.eye(3, dtype='intc')
    else:
        smat = supercell_matrix

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)

    return scell, pcell
Пример #35
0
def get_born_OUTCAR(poscar_filename="POSCAR",
                    outcar_filename="OUTCAR",
                    primitive_matrix=None,
                    supercell_matrix=None,
                    is_symmetry=True,
                    symmetrize_tensors=False,
                    symprec=1e-5):
    if primitive_matrix is None:
        pmat = np.eye(3)
    else:
        pmat = primitive_matrix
    if supercell_matrix is None:
        smat = np.eye(3, dtype='intc')
    else:
        smat = supercell_matrix
    ucell = read_vasp(poscar_filename)
    outcar = open(outcar_filename)

    borns, epsilon = _read_born_and_epsilon(outcar)
    num_atom = len(borns)
    assert num_atom == ucell.get_number_of_atoms()

    if symmetrize_tensors:
        lattice = ucell.get_cell().T
        positions = ucell.get_scaled_positions()
        u_sym = Symmetry(ucell, is_symmetry=is_symmetry, symprec=symprec)
        point_sym = [
            similarity_transformation(lattice, r)
            for r in u_sym.get_pointgroup_operations()
        ]
        epsilon = _symmetrize_tensor(epsilon, point_sym)
        borns = _symmetrize_borns(borns, u_sym, lattice, positions, symprec)

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc')
    p_sym = Symmetry(pcell, is_symmetry=is_symmetry, symprec=symprec)
    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = borns[u_indep_atoms].copy()

    return reduced_borns, epsilon, s_indep_atoms
Пример #36
0
 def test_reduce_vectors_to_primitive_for_multidimensional_vectors(self):
     vectors_adjuster = self._vectors_adjuster
     atoms = read_vasp(os.path.join(POSCAR_DIR, "POSCAR_fcc"))
     primitive_matrix = [
         [0.0, 0.5, 0.5],
         [0.5, 0.0, 0.5],
         [0.5, 0.5, 0.0],
     ]
     primitive = get_primitive(atoms, primitive_matrix)
     vectors = self.get_eigvec_0()[None, :, None]
     reduced_vectors = vectors_adjuster.reduce_vectors_to_primitive(
         vectors, primitive)
     nexpansion = 4
     exp = np.array([
         0.5,
         0.0,
         0.0,
     ])[None, :, None]
     exp *= np.sqrt(nexpansion)
     self.assertTrue(np.all(np.abs(reduced_vectors - exp) < 1e-6))
Пример #37
0
 def test_reduce_vectors_to_primitive_for_multidimensional_vectors(self):
     vectors_adjuster = self._vectors_adjuster
     atoms = read_vasp("poscars/POSCAR_fcc")
     primitive_matrix = [
         [0.0, 0.5, 0.5],
         [0.5, 0.0, 0.5],
         [0.5, 0.5, 0.0],
     ]
     primitive = get_primitive(atoms, primitive_matrix)
     vectors = self.get_eigvec_0()[None, :, None]
     reduced_vectors = vectors_adjuster.reduce_vectors_to_primitive(
         vectors, primitive)
     nexpansion = 4
     exp = np.array([
         0.5,
         0.0,
         0.0,
     ])[None, :, None]
     exp *= np.sqrt(nexpansion)
     self.assertTrue(np.all(np.abs(reduced_vectors - exp) < 1e-6))
Пример #38
0
 def test_reduce_vectors_to_primitive(self):
     vectors_adjuster = self._vectors_adjuster
     atoms = read_vasp("poscars/POSCAR_fcc")
     primitive_matrix = [
         [0.0, 0.5, 0.5],
         [0.5, 0.0, 0.5],
         [0.5, 0.5, 0.0],
     ]
     primitive = get_primitive(atoms, primitive_matrix)
     vectors = self.get_eigvec_0()[:, None]
     reduced_vectors = vectors_adjuster.reduce_vectors_to_primitive(
         vectors, primitive)
     nexpansion = 4
     exp = np.array([
         [0.5],
         [0.0],
         [0.0],
     ])
     exp *= np.sqrt(nexpansion)
     self.assertTrue(np.all(np.abs(reduced_vectors - exp) < 1e-6))
Пример #39
0
def get_born_parameters(phonon, born_charges, epsilon, symprec=1e-5):
    from phonopy.structure.cells import get_primitive, get_supercell
    from phonopy.structure.symmetry import Symmetry
    from phonopy.interface import get_default_physical_units

    print('inside born parameters')
    pmat = phonon.get_primitive_matrix()
    smat = phonon.get_supercell_matrix()
    ucell = phonon.get_unitcell()

    print pmat
    print smat
    print ucell

    num_atom = len(born_charges)
    assert num_atom == ucell.get_number_of_atoms(), \
        "num_atom %d != len(borns) %d" % (ucell.get_number_of_atoms(),
                                          len(born_charges))

    inv_smat = np.linalg.inv(smat)
    scell = get_supercell(ucell, smat, symprec=symprec)
    pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec)
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc')
    p_sym = Symmetry(pcell, is_symmetry=True, symprec=symprec)
    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = born_charges[u_indep_atoms].copy()

    factor = get_default_physical_units('vasp')[
        'nac_factor']  # born charges in VASP units

    born_dict = {
        'born': reduced_borns,
        'dielectric': epsilon,
        'factor': factor
    }

    print('final born dict', born_dict)

    return born_dict
Пример #40
0
    def _build_primitive_cell_ideal(self):
        """
        primitive_matrix:
          Relative axes of primitive cell to the input unit cell.
          Relative axes to the supercell is calculated by:
             supercell_matrix^-1 * primitive_matrix
          Therefore primitive cell lattice is finally calculated by:
             (supercell_lattice * (supercell_matrix)^-1 * primitive_matrix)^T
        """

        inv_supercell_matrix = np.linalg.inv(self._supercell_matrix)
        if self._primitive_matrix_ideal is None:
            trans_mat = inv_supercell_matrix
        else:
            trans_mat = np.dot(inv_supercell_matrix, self._primitive_matrix_ideal)
        self._primitive_ideal = get_primitive(
            self._supercell_ideal, trans_mat, self._symprec)
        num_satom = self._supercell_ideal.get_number_of_atoms()
        num_patom = self._primitive_ideal.get_number_of_atoms()
        if abs(num_satom * np.linalg.det(trans_mat) - num_patom) < 0.1:
            return True
        else:
            return False
Пример #41
0
    def _build_primitive_cell(self):
        """
        primitive_matrix:
          Relative axes of primitive cell to the input unit cell.
          Relative axes to the supercell is calculated by:
             supercell_matrix^-1 * primitive_matrix
          Therefore primitive cell lattice is finally calculated by:
             (supercell_lattice * (supercell_matrix)^-1 * primitive_matrix)^T
        """

        inv_supercell_matrix = np.linalg.inv(self._supercell_matrix)
        if self._primitive_matrix is None:
            trans_mat = inv_supercell_matrix
        else:
            trans_mat = np.dot(inv_supercell_matrix, self._primitive_matrix)

        try:
            self._primitive = get_primitive(self._supercell, trans_mat,
                                            self._symprec)
        except ValueError as err:
            print("Creating primitive cell is failed.")
            print("PRIMITIVE_AXIS may be incorrectly specified.")
            raise
Пример #42
0
    def _build_primitive_cell_ideal(self):
        """
        primitive_matrix:
          Relative axes of primitive cell to the input unit cell.
          Relative axes to the supercell is calculated by:
             supercell_matrix^-1 * primitive_matrix
          Therefore primitive cell lattice is finally calculated by:
             (supercell_lattice * (supercell_matrix)^-1 * primitive_matrix)^T
        """

        inv_supercell_matrix = np.linalg.inv(self._supercell_matrix)
        if self._primitive_matrix_ideal is None:
            trans_mat = inv_supercell_matrix
        else:
            trans_mat = np.dot(inv_supercell_matrix, self._primitive_matrix_ideal)
        self._primitive_ideal = get_primitive(
            self._supercell_ideal, trans_mat, self._symprec)
        num_satom = self._supercell_ideal.get_number_of_atoms()
        num_patom = self._primitive_ideal.get_number_of_atoms()
        if abs(num_satom * np.linalg.det(trans_mat) - num_patom) < 0.1:
            return True
        else:
            return False
 def test_L1_2(self):
     unitcell, unitcell_ideal, primitive_matrix = self.prepare_L1_2()
     primitive = get_primitive(unitcell_ideal, primitive_matrix)
     self.check(unitcell, primitive)
Пример #44
0
 def setUp(self):
     cell = read_cell_yaml(os.path.join(data_dir, "..", "NaCl.yaml"))
     self._pcell = get_primitive(cell, [[0, 0.5, 0.5],
                                        [0.5, 0, 0.5],
                                        [0.5, 0.5, 0]])
Пример #45
0
def get_born_OUTCAR(poscar_filename="POSCAR",
                    outcar_filename="OUTCAR",
                    primitive_axis=np.eye(3),
                    supercell_matrix=np.eye(3, dtype='intc'),
                    is_symmetry=True,
                    symmetrize_tensors=False):
    ucell = read_vasp(poscar_filename)
    scell = get_supercell(ucell, supercell_matrix)
    inv_smat = np.linalg.inv(supercell_matrix)
    pcell = get_primitive(scell, np.dot(inv_smat, primitive_axis))
    u_sym = Symmetry(ucell, is_symmetry=is_symmetry)
    p_sym = Symmetry(pcell, is_symmetry=is_symmetry)
    lattice = ucell.get_cell().T
    outcar = open(outcar_filename)
    
    borns = []
    while True:
        line = outcar.readline()
        if not line:
            break
    
        if "NIONS" in line:
            num_atom = int(line.split()[11])
    
        if "MACROSCOPIC STATIC DIELECTRIC TENSOR" in line:
            epsilon = []
            outcar.readline()
            epsilon.append([float(x) for x in outcar.readline().split()])
            epsilon.append([float(x) for x in outcar.readline().split()])
            epsilon.append([float(x) for x in outcar.readline().split()])
    
        if "BORN" in line:
            outcar.readline()
            line = outcar.readline()
            if "ion" in line:
                for i in range(num_atom):
                    born = []
                    born.append([float(x)
                                 for x in outcar.readline().split()][1:])
                    born.append([float(x)
                                 for x in outcar.readline().split()][1:])
                    born.append([float(x)
                                 for x in outcar.readline().split()][1:])
                    outcar.readline()
                    borns.append(born)

    borns = np.array(borns, dtype='double')
    epsilon = np.array(epsilon, dtype='double')
    if symmetrize_tensors:
        borns_orig = borns.copy()
        point_sym = [similarity_transformation(lattice, r)
                     for r in u_sym.get_pointgroup_operations()]
        epsilon = symmetrize_tensor(epsilon, point_sym)
        for i in range(num_atom):
            z = borns[i]
            site_sym = [similarity_transformation(lattice, r)
                        for r in u_sym.get_site_symmetry(i)]
            borns[i] = symmetrize_tensor(z, site_sym)

        rotations = u_sym.get_symmetry_operations()['rotations']
        map_atoms = u_sym.get_map_atoms()
        borns_copy = np.zeros_like(borns)
        for i, m_i in enumerate(map_atoms):
            count = 0
            for j, r_j in enumerate(u_sym.get_map_operations()):
                if map_atoms[j] == m_i:
                    count += 1
                    r_cart = similarity_transformation(lattice, rotations[r_j])
                    borns_copy[i] += similarity_transformation(r_cart, borns[j])
            borns_copy[i] /= count

        borns = borns_copy
        sum_born = borns.sum(axis=0) / len(borns)
        borns -= sum_born

        if (np.abs(borns_orig - borns) > 0.1).any():
            sys.stderr.write(
                "Born effective charge symmetrization might go wrong.\n")
        
    p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc')
    s_indep_atoms = p2s[p_sym.get_independent_atoms()]
    u2u = scell.get_unitcell_to_unitcell_map()
    u_indep_atoms = [u2u[x] for x in s_indep_atoms]
    reduced_borns = borns[u_indep_atoms].copy()

    return reduced_borns, epsilon
Пример #46
0
    def __init__(self,
                 dynamical_matrix,
                 unitcell_ideal,
                 primitive_matrix_ideal,
                 mesh,
                 shift=None,
                 is_time_reversal=True,
                 is_mesh_symmetry=True,
                 is_eigenvectors=False,
                 is_gamma_center=False,
                 star="none",
                 group_velocity=None,
                 rotations=None, # Point group operations in real space
                 factor=VaspToTHz,
                 use_lapack_solver=False,
                 mode="eigenvector"):

        self._mesh = np.array(mesh, dtype='intc')
        self._is_eigenvectors = is_eigenvectors
        self._factor = factor

        primitive_ideal_wrt_unitcell = (
            get_primitive(unitcell_ideal, primitive_matrix_ideal))
        self._cell = primitive_ideal_wrt_unitcell

        # ._dynamical_matrix must be assigned for calculating DOS
        # using the tetrahedron method.
        # In the "DOS", this is used to get "primitive".
        # In the "TetrahedronMesh", this is used just as the "Atoms".
        # Currently, we must not use the tetrahedron method,
        # because now we do not give the primitive but the unitcell for the
        # self._dynamical_matrix.
        self._dynamical_matrix = dynamical_matrix
        self._use_lapack_solver = use_lapack_solver

        self._gp = GridPoints(self._mesh,
                              np.linalg.inv(self._cell.get_cell()),
                              q_mesh_shift=shift,
                              is_gamma_center=is_gamma_center,
                              is_time_reversal=is_time_reversal,
                              rotations=rotations,
                              is_mesh_symmetry=is_mesh_symmetry)

        self._qpoints = self._gp.get_ir_qpoints()
        self._weights = self._gp.get_ir_grid_weights()

        self._star = star

        self._eigenstates_unfolding = Eigenstates(
            dynamical_matrix,
            unitcell_ideal,
            primitive_matrix_ideal,
            mode=mode,
            star=star,
            verbose=False)

        self._frequencies = None
        self._eigenvalues = None
        self._eigenvectors = None
        self._set_phonon()

        self._group_velocities = None
        if group_velocity is not None:
            self._set_group_velocities(group_velocity)
Пример #47
0
def get_primitive_structure(structure, primitive_matrix=np.eye(3)):
    from phonopy.structure.cells import get_primitive
    return get_primitive(structure, primitive_matrix)
 def test_L1_2(self):
     unitcell, unitcell_ideal, primitive_matrix = self.prepare_L1_2()
     primitive = get_primitive(unitcell_ideal, primitive_matrix)
     self.check(unitcell, primitive)