/* Return 0 if failed */ static int iterative_search_hall_number(double origin_shift[3], double conv_lattice[3][3], const int candidates[], const int num_candidates, SPGCONST Cell * primitive, SPGCONST Symmetry * symmetry, const double symprec) { int attempt, hall_number; double tolerance; Symmetry * sym_reduced; debug_print("iterative_search_hall_number:\n"); hall_number = 0; sym_reduced = NULL; hall_number = search_hall_number(origin_shift, conv_lattice, candidates, num_candidates, primitive->lattice, symmetry, symprec); if (hall_number > 0) { goto ret; } tolerance = symprec; for (attempt = 0; attempt < 100; attempt++) { warning_print("spglib: Attempt %d tolerance = %f failed", attempt, tolerance); warning_print("(line %d, %s).\n", __LINE__, __FILE__); tolerance *= REDUCE_RATE; sym_reduced = sym_reduce_operation(primitive, symmetry, tolerance); hall_number = search_hall_number(origin_shift, conv_lattice, candidates, num_candidates, primitive->lattice, sym_reduced, symprec); sym_free_symmetry(sym_reduced); sym_reduced = NULL; if (hall_number > 0) { break; } } ret: return hall_number; }
static int get_hall_number( double origin_shift[3], double conv_lattice[3][3], Centering * centering, SPGCONST Cell * primitive, SPGCONST Symmetry * symmetry, const double symprec ) { int pg_num, attempt, hall_number=0; double tolerance; Symmetry * sym_reduced; tolerance = symprec; pg_num = ptg_get_pointgroup_number( symmetry ); if ( pg_num > -1 ) { hall_number = get_hall_number_local( origin_shift, conv_lattice, centering, primitive, symmetry, symprec ); if ( hall_number > 0 ) { goto ret; } } /* Reduce tolerance and search hall symbol again when hall symbol */ /* could not be found by the given tolerance. */ /* The situation this happens is that symmetry operations found */ /* don't match any of hall symbol database due to tricky */ /* displacements of atoms from the exact points. */ for ( attempt = 0; attempt < 100; attempt++ ) { tolerance *= REDUCE_RATE; sym_reduced = sym_reduce_operation( primitive, symmetry, tolerance ); pg_num = ptg_get_pointgroup_number( sym_reduced ); if ( pg_num > -1 ) { hall_number = get_hall_number_local( origin_shift, conv_lattice, centering, primitive, sym_reduced, symprec ); if ( hall_number > 0 ) { sym_free_symmetry( sym_reduced ); warning_print("spglib: Tolerance to find Hall symbol was changed to %f\n", tolerance); goto ret; } } sym_free_symmetry( sym_reduced ); } warning_print("spglib: Iterative attempt to find Hall symbol was failed."); ret: return hall_number; }
static int get_hall_number_local_iteration(double origin_shift[3], double conv_lattice[3][3], SPGCONST Cell * primitive, SPGCONST Symmetry * symmetry, const double symprec) { int attempt, pg_num, hall_number=0; double tolerance; Symmetry * sym_reduced; debug_print("get_hall_number_local_iteration:\n"); tolerance = symprec; for (attempt = 0; attempt < 100; attempt++) { tolerance *= REDUCE_RATE; debug_print(" Attempt %d tolerance = %f\n", attempt, tolerance); sym_reduced = sym_reduce_operation(primitive, symmetry, tolerance); pg_num = ptg_get_pointgroup_number(sym_reduced); if (pg_num > -1) { hall_number = get_hall_number_local(origin_shift, conv_lattice, primitive, sym_reduced, symprec); if (hall_number > 0) { sym_free_symmetry(sym_reduced); break; } } sym_free_symmetry(sym_reduced); } #ifdef SPGWARNING if (hall_number == 0) { warning_print("spglib: Iterative attempt with sym_reduce_operation to find Hall symbol failed.\n"); } #endif return hall_number; }