/* Only the atoms corresponding to those in primitive are returned. */ static Cell * get_bravais_exact_positions_and_lattice(int * wyckoffs, int * equiv_atoms, SPGCONST Spacegroup *spacegroup, SPGCONST Cell * primitive, const double symprec) { int i; Symmetry *conv_sym; Cell *bravais; VecDBL *exact_positions; /* Positions of primitive atoms are represented wrt Bravais lattice */ bravais = get_conventional_primitive(spacegroup, primitive); /* Symmetries in database (wrt Bravais lattice) */ conv_sym = get_db_symmetry(spacegroup->hall_number); /* Lattice vectors are set. */ get_conventional_lattice(bravais->lattice, spacegroup->holohedry, spacegroup->bravais_lattice); /* Symmetrize atomic positions of conventional unit cell */ exact_positions = ssm_get_exact_positions(wyckoffs, equiv_atoms, bravais, conv_sym, spacegroup->hall_number, symprec); sym_free_symmetry(conv_sym); if (exact_positions->size > 0) { for (i = 0; i < bravais->size; i++) { mat_copy_vector_d3(bravais->position[i], exact_positions->vec[i]); } } else { cel_free_cell(bravais); bravais = cel_alloc_cell(0); } mat_free_VecDBL(exact_positions); return bravais; }
/* 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; }