def _solve_fc4(fc4, first_atom_num, supercell, site_symmetry, displacements_first, delta_fc3s, symprec): lattice = supercell.get_cell().T site_sym_cart = np.double([similarity_transformation(lattice, sym) for sym in site_symmetry]) num_atom = supercell.get_number_of_atoms() positions = supercell.get_scaled_positions() pos_center = positions[first_atom_num].copy() positions -= pos_center rot_map_syms = get_positions_sent_by_rot_inv(positions, site_symmetry, symprec) rot_disps = get_rotated_displacement(displacements_first, site_sym_cart) inv_U = np.linalg.pinv(rot_disps) for (i, j, k) in list(np.ndindex(num_atom, num_atom, num_atom)): fc4[first_atom_num, i, j, k] = np.dot( inv_U, _rotate_delta_fc3s( i, j, k, delta_fc3s, rot_map_syms, site_sym_cart) ).reshape(3, 3, 3, 3)
def solve_fc3(fc3, first_atom_num, supercell, site_symmetry, displacements_first, delta_fc2s, symprec, pinv="numpy"): lattice = supercell.get_cell().T site_sym_cart = [similarity_transformation(lattice, sym) for sym in site_symmetry] num_atom = supercell.get_number_of_atoms() positions = supercell.get_scaled_positions() pos_center = positions[first_atom_num].copy() positions -= pos_center rot_map_syms = get_positions_sent_by_rot_inv(positions, site_symmetry, symprec) rot_disps = get_rotated_displacement(displacements_first, site_sym_cart) if pinv == "numpy": inv_U = np.linalg.pinv(rot_disps) else: try: import anharmonic._phono3py as phono3c inv_U = np.zeros((rot_disps.shape[1], rot_disps.shape[0]), dtype='double') phono3c.pinv(inv_U, rot_disps, 1e-13) except ImportError: inv_U = np.linalg.pinv(rot_disps) for (i, j) in list(np.ndindex(num_atom, num_atom)): fc3[first_atom_num, i, j] = np.dot(inv_U, _get_rotated_fc2s( i, j, delta_fc2s, rot_map_syms, site_sym_cart)).reshape(3, 3, 3)
def solve_fc3(fc3, first_atom_num, supercell, site_symmetry, displacements_first, delta_fc2s, symprec, pinv="numpy", verbose=False): if verbose: text = "Solving fc3[ %d, x, x ] with " % (first_atom_num + 1) if len(displacements_first) > 1: text += "displacements:" else: text += "a displacement:" print(text) for i, v in enumerate(displacements_first): print(" [%7.4f %7.4f %7.4f]" % tuple(v)) sys.stdout.flush() if verbose > 2: print(" Site symmetry:") for i, v in enumerate(site_symmetry): print(" [%2d %2d %2d] #%2d" % tuple(list(v[0]) + [i + 1])) print(" [%2d %2d %2d]" % tuple(v[1])) print(" [%2d %2d %2d]\n" % tuple(v[2])) sys.stdout.flush() lattice = supercell.get_cell().T site_sym_cart = [ similarity_transformation(lattice, sym) for sym in site_symmetry ] num_atom = supercell.get_number_of_atoms() positions = supercell.get_scaled_positions() pos_center = positions[first_atom_num].copy() positions -= pos_center rot_map_syms = get_positions_sent_by_rot_inv(positions, site_symmetry, symprec) rot_disps = get_rotated_displacement(displacements_first, site_sym_cart) if pinv == "numpy": inv_U = np.linalg.pinv(rot_disps) else: try: import phonopy._lapackepy as lapackepy inv_U = np.zeros((rot_disps.shape[1], rot_disps.shape[0]), dtype='double') lapackepy.pinv(inv_U, rot_disps, 1e-13) except ImportError: inv_U = np.linalg.pinv(rot_disps) for (i, j) in list(np.ndindex(num_atom, num_atom)): fc3[first_atom_num, i, j] = np.dot( inv_U, _get_rotated_fc2s(i, j, delta_fc2s, rot_map_syms, site_sym_cart)).reshape(3, 3, 3)
def solve_fc3(fc3, first_atom_num, supercell, site_symmetry, displacements_first, delta_fc2s, symprec, pinv="numpy", verbose=False): if verbose: text = "Solving fc3[ %d, x, x ] with " % (first_atom_num + 1) if len(displacements_first) > 1: text += "displacements:" else: text += "a displacement:" print(text) for i, v in enumerate(displacements_first): print(" [%7.4f %7.4f %7.4f]" % tuple(v)) sys.stdout.flush() if verbose > 2: print(" Site symmetry:") for i, v in enumerate(site_symmetry): print(" [%2d %2d %2d] #%2d" % tuple(list(v[0])+[i + 1])) print(" [%2d %2d %2d]" % tuple(v[1])) print(" [%2d %2d %2d]\n" % tuple(v[2])) sys.stdout.flush() lattice = supercell.get_cell().T site_sym_cart = [similarity_transformation(lattice, sym) for sym in site_symmetry] num_atom = supercell.get_number_of_atoms() positions = supercell.get_scaled_positions() pos_center = positions[first_atom_num].copy() positions -= pos_center rot_map_syms = get_positions_sent_by_rot_inv(positions, site_symmetry, symprec) rot_disps = get_rotated_displacement(displacements_first, site_sym_cart) if pinv == "numpy": inv_U = np.linalg.pinv(rot_disps) else: try: import phonopy._lapackepy as lapackepy inv_U = np.zeros((rot_disps.shape[1], rot_disps.shape[0]), dtype='double') lapackepy.pinv(inv_U, rot_disps, 1e-13) except ImportError: inv_U = np.linalg.pinv(rot_disps) for (i, j) in list(np.ndindex(num_atom, num_atom)): fc3[first_atom_num, i, j] = np.dot(inv_U, _get_rotated_fc2s( i, j, delta_fc2s, rot_map_syms, site_sym_cart)).reshape(3, 3, 3)
def solve_fc3(fc3, first_atom_num, supercell, site_symmetry, displacements_first, delta_fc2s, symprec, pinv="numpy"): lattice = supercell.get_cell().T site_sym_cart = [ similarity_transformation(lattice, sym) for sym in site_symmetry ] num_atom = supercell.get_number_of_atoms() positions = supercell.get_scaled_positions() pos_center = positions[first_atom_num].copy() positions -= pos_center rot_map_syms = get_positions_sent_by_rot_inv(positions, site_symmetry, symprec) rot_disps = get_rotated_displacement(displacements_first, site_sym_cart) if pinv == "numpy": inv_U = np.linalg.pinv(rot_disps) else: try: import anharmonic._phono3py as phono3c inv_U = np.zeros((rot_disps.shape[1], rot_disps.shape[0]), dtype='double') phono3c.pinv(inv_U, rot_disps, 1e-13) except ImportError: inv_U = np.linalg.pinv(rot_disps) for (i, j) in list(np.ndindex(num_atom, num_atom)): fc3[first_atom_num, i, j] = np.dot( inv_U, _get_rotated_fc2s(i, j, delta_fc2s, rot_map_syms, site_sym_cart)).reshape(3, 3, 3)
def solve_fc3(first_atom_num, supercell, site_symmetry, displacements_first, delta_fc2s, symprec, pinv_solver="numpy", verbose=False): logger.debug("solve_fc3") if pinv_solver == "numpy": solver = "numpy.linalg.pinv" else: try: import phono3py._lapackepy as lapackepy solver = "lapacke-dgesvd" except ImportError: print("Phono3py C-routine is not compiled correctly.") solver = "numpy.linalg.pinv" if verbose: text = ("Computing fc3[ %d, x, x ] using %s with " % (first_atom_num + 1, solver)) if len(displacements_first) > 1: text += "displacements:" else: text += "a displacement:" print(text) for i, v in enumerate(displacements_first): print(" [%7.4f %7.4f %7.4f]" % tuple(v)) sys.stdout.flush() if verbose > 2: print(" Site symmetry:") for i, v in enumerate(site_symmetry): print(" [%2d %2d %2d] #%2d" % tuple(list(v[0]) + [i + 1])) print(" [%2d %2d %2d]" % tuple(v[1])) print(" [%2d %2d %2d]\n" % tuple(v[2])) sys.stdout.flush() lattice = supercell.get_cell().T site_sym_cart = np.array( [similarity_transformation(lattice, sym) for sym in site_symmetry], dtype='double', order='C') num_atom = supercell.get_number_of_atoms() positions = supercell.get_scaled_positions() pos_center = positions[first_atom_num].copy() positions -= pos_center logger.debug("get_positions_sent_by_rot_inv") rot_map_syms = get_positions_sent_by_rot_inv(lattice, positions, site_symmetry, symprec) rot_disps = get_rotated_displacement(displacements_first, site_sym_cart) logger.debug("pinv") if "numpy" in solver: inv_U = np.array(np.linalg.pinv(rot_disps), dtype='double', order='C') else: inv_U = np.zeros((rot_disps.shape[1], rot_disps.shape[0]), dtype='double', order='C') lapackepy.pinv(inv_U, rot_disps, 1e-13) fc3 = np.zeros((num_atom, num_atom, 3, 3, 3), dtype='double', order='C') logger.debug("rotate_delta_fc2s") try: import phono3py._phono3py as phono3c phono3c.rotate_delta_fc2s(fc3, delta_fc2s, inv_U, site_sym_cart, rot_map_syms) except ImportError: for i, j in np.ndindex(num_atom, num_atom): fc3[i, j] = np.dot( inv_U, _get_rotated_fc2s(i, j, delta_fc2s, rot_map_syms, site_sym_cart)).reshape(3, 3, 3) return fc3