def _grid_kpoints(kpoints): # k-points has to cover the full BZ kpoints = kpoints_to_first_bz(kpoints) mesh_dim = get_mesh_from_kpoint_numbers(kpoints) if np.product(mesh_dim) != len(kpoints): raise ValueError("K-points do not cover full Brillouin zone.") kpoints = np.around(kpoints, 5) # get the indices to sort the k-points on the Z, then Y, then X columns sort_idx = np.lexsort((kpoints[:, 2], kpoints[:, 1], kpoints[:, 0])) # put the kpoints into a 3D grid so that they can be indexed as # kpoints[ikx][iky][ikz] = [kx, ky, kz] grid_kpoints = kpoints[sort_idx].reshape(mesh_dim + (3,)) # Expand the k-point mesh to account for periodic boundary conditions grid_kpoints = np.pad( grid_kpoints, ((1, 1), (1, 1), (1, 1), (0, 0)), mode="wrap" ) grid_kpoints[0, :, :] -= [1, 0, 0] grid_kpoints[:, 0, :] -= [0, 1, 0] grid_kpoints[:, :, 0] -= [0, 0, 1] grid_kpoints[-1, :, :] += [1, 0, 0] grid_kpoints[:, -1, :] += [0, 1, 0] grid_kpoints[:, :, -1] += [0, 0, 1] return grid_kpoints, mesh_dim, sort_idx
def from_coefficients( cls, coefficients, gpoints, kpoints, structure, symprec=defaults["symprec"] ): logger.info("Initializing wavefunction overlap calculator") mesh_dim = get_mesh_from_kpoint_numbers(kpoints) if np.product(mesh_dim) == len(kpoints): return cls(kpoints, coefficients, gpoints) full_kpoints, *symmetry_mapping = expand_kpoints( structure, kpoints, time_reversal=True, return_mapping=True, symprec=symprec ) coefficients = desymmetrize_coefficients( coefficients, gpoints, kpoints, structure, *symmetry_mapping ) return cls(full_kpoints, coefficients, gpoints)
def from_deformation_potentials(cls, deformation_potentials, kpoints, structure, symprec=defaults["symprec"]): logger.info("Initializing deformation potential interpolator") mesh_dim = get_mesh_from_kpoint_numbers(kpoints) if np.product(mesh_dim) == len(kpoints): return cls.from_data(kpoints, deformation_potentials) full_kpoints, rotations, _, _, op_mapping, kp_mapping = expand_kpoints( structure, kpoints, time_reversal=True, return_mapping=True, symprec=symprec) logger.warning( "Desymmetrizing deformation potentials, this could go wrong.") deformation_potentials = desymmetrize_deformation_potentials( deformation_potentials, structure, rotations, op_mapping, kp_mapping) return cls.from_data(full_kpoints, deformation_potentials)