static Cell * refine_cell(SPGCONST Cell * cell, const double symprec) { int *wyckoffs, *equiv_atoms; double tolerance; Cell *primitive, *bravais, *conv_prim; Symmetry *conv_sym; Spacegroup spacegroup; debug_print("refine_cell:\n"); primitive = prm_get_primitive(cell, symprec); if (primitive->size == 0) { cel_free_cell(primitive); bravais = cel_alloc_cell(0); goto end; } tolerance = prm_get_current_tolerance(); spacegroup = spa_get_spacegroup_with_primitive(primitive, tolerance); wyckoffs = (int*)malloc(sizeof(int) * primitive->size); equiv_atoms = (int*)malloc(sizeof(int) * primitive->size); conv_prim = get_bravais_exact_positions_and_lattice(wyckoffs, equiv_atoms, &spacegroup, primitive, tolerance); free(equiv_atoms); equiv_atoms = NULL; free(wyckoffs); wyckoffs = NULL; conv_sym = get_db_symmetry(spacegroup.hall_number); bravais = expand_positions(conv_prim, conv_sym); debug_print("primitive cell in refine_cell:\n"); debug_print_matrix_d3(primitive->lattice); debug_print("conventional lattice in refine_cell:\n"); debug_print_matrix_d3(conv_prim->lattice); debug_print("bravais lattice in refine_cell:\n"); debug_print_matrix_d3(bravais->lattice); cel_free_cell(conv_prim); sym_free_symmetry(conv_sym); cel_free_cell(primitive); end: /* Return bravais->size = 0, if the bravais could not be found. */ return bravais; }
static Cell * refine_cell( SPGCONST Cell * cell, const double symprec ) { int *mapping_table, *wyckoffs, *equiv_atoms; Cell *primitive, *bravais, *conv_prim; Symmetry *conv_sym; VecDBL *pure_trans; Spacegroup spacegroup; pure_trans = sym_get_pure_translation( cell, symprec ); mapping_table = (int*) malloc( sizeof(int) * cell->size ); primitive = prm_get_primitive( mapping_table, cell, pure_trans, symprec ); free( mapping_table ); mapping_table = NULL; if ( primitive->size == -1 ) { cel_free_cell( primitive ); bravais = cel_alloc_cell( -1 ); goto ret; } spacegroup = spa_get_spacegroup_with_primitive( primitive, symprec ); wyckoffs = (int*)malloc( sizeof( int ) * primitive->size ); equiv_atoms = (int*)malloc( sizeof( int ) * primitive->size ); conv_prim = get_bravais_exact_positions_and_lattice( wyckoffs, equiv_atoms, &spacegroup, primitive, symprec ); free( equiv_atoms ); equiv_atoms = NULL; free( wyckoffs ); wyckoffs = NULL; conv_sym = get_db_symmetry( spacegroup.hall_number ); bravais = expand_positions( conv_prim, conv_sym ); cel_free_cell( conv_prim ); sym_free_symmetry( conv_sym ); cel_free_cell( primitive ); ret: /* Return bravais->size = -1, if the bravais could not be found. */ 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; }