/* Return NULL if failed */ static Symmetry * get_refined_symmetry_operations(SPGCONST Cell * cell, SPGCONST Cell * primitive, SPGCONST Spacegroup * spacegroup, const double symprec) { int t_mat_int[3][3]; int frame[3]; double inv_prim_lat[3][3], t_mat[3][3]; Symmetry *conv_sym, *prim_sym, *symmetry; conv_sym = NULL; prim_sym = NULL; symmetry = NULL; /* Primitive symmetry from database */ if ((conv_sym = spgdb_get_spacegroup_operations(spacegroup->hall_number)) == NULL) { return NULL; } mat_inverse_matrix_d3(inv_prim_lat, primitive->lattice, 0); mat_multiply_matrix_d3(t_mat, inv_prim_lat, spacegroup->bravais_lattice); set_translation_with_origin_shift(conv_sym, spacegroup->origin_shift); if ((prim_sym = get_primitive_db_symmetry(t_mat, conv_sym)) == NULL) { sym_free_symmetry(conv_sym); conv_sym = NULL; return NULL; } sym_free_symmetry(conv_sym); conv_sym = NULL; /* Input cell symmetry from primitive symmetry */ mat_multiply_matrix_d3(t_mat, inv_prim_lat, cell->lattice); mat_cast_matrix_3d_to_3i(t_mat_int, t_mat); get_surrounding_frame(frame, t_mat_int); symmetry = recover_symmetry_in_original_cell(frame, prim_sym, t_mat_int, cell->lattice, cell->size / primitive->size, symprec); sym_free_symmetry(prim_sym); prim_sym = NULL; return symmetry; }
int spg_get_symmetry_from_database(int rotations[192][3][3], double translations[192][3], const int hall_number) { int i; Symmetry *symmetry; symmetry = spgdb_get_spacegroup_operations(hall_number); for (i = 0; i < symmetry->size; i++) { mat_copy_matrix_i3(rotations[i], symmetry->rot[i]); mat_copy_vector_d3(translations[i], symmetry->trans[i]); } return symmetry->size; }
/* Return 0 if failed */ int spg_get_symmetry_from_database(int rotations[192][3][3], double translations[192][3], const int hall_number) { int i, size; Symmetry *symmetry; symmetry = NULL; if ((symmetry = spgdb_get_spacegroup_operations(hall_number)) == NULL) { return 0; } for (i = 0; i < symmetry->size; i++) { mat_copy_matrix_i3(rotations[i], symmetry->rot[i]); mat_copy_vector_d3(translations[i], symmetry->trans[i]); } size = symmetry->size; sym_free_symmetry(symmetry); return size; }
/* Return NULL if failed */ static Cell * get_bravais_exact_positions_and_lattice(int * wyckoffs, int * equiv_atoms, SPGCONST Spacegroup *spacegroup, SPGCONST Cell * primitive, const double symprec) { int i; int *wyckoffs_prim, *equiv_atoms_prim; Symmetry *conv_sym; Cell *bravais, *conv_prim; VecDBL *exact_positions; debug_print("get_bravais_exact_positions_and_lattice\n"); wyckoffs_prim = NULL; equiv_atoms_prim = NULL; conv_prim = NULL; bravais = NULL; conv_sym = NULL; exact_positions = NULL; /* Symmetrize atomic positions of conventional unit cell */ if ((wyckoffs_prim = (int*)malloc(sizeof(int) * primitive->size)) == NULL) { warning_print("spglib: Memory could not be allocated "); return NULL; } if ((equiv_atoms_prim = (int*)malloc(sizeof(int) * primitive->size)) == NULL) { warning_print("spglib: Memory could not be allocated "); free(wyckoffs_prim); wyckoffs_prim = NULL; return NULL; } for (i = 0; i < primitive->size; i++) { wyckoffs_prim[i] = -1; equiv_atoms_prim[i] = -1; } /* Positions of primitive atoms are represented wrt Bravais lattice */ if ((conv_prim = get_conventional_primitive(spacegroup, primitive)) == NULL) { free(wyckoffs_prim); wyckoffs_prim = NULL; free(equiv_atoms_prim); equiv_atoms_prim = NULL; return NULL; } /* Symmetries in database (wrt Bravais lattice) */ if ((conv_sym = spgdb_get_spacegroup_operations(spacegroup->hall_number)) == NULL) { goto err; } /* Lattice vectors are set. */ get_conventional_lattice(conv_prim->lattice, spacegroup); if ((exact_positions = ssm_get_exact_positions(wyckoffs_prim, equiv_atoms_prim, conv_prim, conv_sym, spacegroup->hall_number, symprec)) == NULL) { sym_free_symmetry(conv_sym); conv_sym = NULL; goto err; } for (i = 0; i < conv_prim->size; i++) { mat_copy_vector_d3(conv_prim->position[i], exact_positions->vec[i]); } bravais = expand_positions(wyckoffs, equiv_atoms, conv_prim, conv_sym, wyckoffs_prim, equiv_atoms_prim); mat_free_VecDBL(exact_positions); exact_positions = NULL; sym_free_symmetry(conv_sym); conv_sym = NULL; err: free(wyckoffs_prim); wyckoffs_prim = NULL; free(equiv_atoms_prim); equiv_atoms_prim = NULL; cel_free_cell(conv_prim); conv_prim = NULL; return bravais; }