static int get_primitive_lattice_vectors_iterative( double prim_lattice[3][3], SPGCONST Cell * cell, const VecDBL * pure_trans, const double symprec ) { int i, multi, attempt; double tolerance; VecDBL * vectors, * pure_trans_reduced, *tmp_vec; tolerance = symprec; pure_trans_reduced = mat_alloc_VecDBL( pure_trans->size ); for ( i = 0; i < pure_trans->size; i++ ) { mat_copy_vector_d3( pure_trans_reduced->vec[i], pure_trans->vec[i] ); } for ( attempt = 0; attempt < 100; attempt++ ) { multi = pure_trans_reduced->size; vectors = get_translation_candidates( pure_trans_reduced ); /* Lattice of primitive cell is found among pure translation vectors */ if ( get_primitive_lattice_vectors( prim_lattice, vectors, cell, tolerance ) ) { mat_free_VecDBL( vectors ); mat_free_VecDBL( pure_trans_reduced ); goto found; } else { tmp_vec = mat_alloc_VecDBL( multi ); for ( i = 0; i < multi; i++ ) { mat_copy_vector_d3( tmp_vec->vec[i], pure_trans_reduced->vec[i] ); } mat_free_VecDBL( pure_trans_reduced ); pure_trans_reduced = sym_reduce_pure_translation( cell, tmp_vec, tolerance ); debug_print("Tolerance is reduced to %f (%d), size = %d\n", tolerance, attempt, pure_trans_reduced->size); mat_free_VecDBL( tmp_vec ); mat_free_VecDBL( vectors ); tolerance *= REDUCE_RATE; } } /* Not found */ return 0; found: #ifdef SPGWARNING if ( attempt > 0 ) { printf("spglib: Tolerance to find primitive lattice vectors was changed to %f ", tolerance); } #endif return multi; }
/* Return 0 if failed */ static int get_primitive_lattice_vectors_iterative(double prim_lattice[3][3], SPGCONST Cell * cell, const VecDBL * pure_trans, const double symprec) { int i, multi, attempt; double tolerance; VecDBL * vectors, * pure_trans_reduced, *tmp_vec; vectors = NULL; pure_trans_reduced = NULL; tmp_vec = NULL; tolerance = symprec; if ((pure_trans_reduced = mat_alloc_VecDBL(pure_trans->size)) == NULL) { goto fail; } for (i = 0; i < pure_trans->size; i++) { mat_copy_vector_d3(pure_trans_reduced->vec[i], pure_trans->vec[i]); } for (attempt = 0; attempt < 100; attempt++) { multi = pure_trans_reduced->size; if ((vectors = get_translation_candidates(pure_trans_reduced)) == NULL) { mat_free_VecDBL(pure_trans_reduced); goto fail; } /* Lattice of primitive cell is found among pure translation vectors */ if (get_primitive_lattice_vectors(prim_lattice, vectors, cell, tolerance)) { mat_free_VecDBL(vectors); mat_free_VecDBL(pure_trans_reduced); goto found; } else { if ((tmp_vec = mat_alloc_VecDBL(multi)) == NULL) { mat_free_VecDBL(vectors); mat_free_VecDBL(pure_trans_reduced); goto fail; } for (i = 0; i < multi; i++) { mat_copy_vector_d3(tmp_vec->vec[i], pure_trans_reduced->vec[i]); } mat_free_VecDBL(pure_trans_reduced); pure_trans_reduced = sym_reduce_pure_translation(cell, tmp_vec, tolerance); mat_free_VecDBL(tmp_vec); mat_free_VecDBL(vectors); if (pure_trans_reduced == NULL) { goto fail; } warning_print("Tolerance is reduced to %f (%d), size = %d\n", tolerance, attempt, pure_trans_reduced->size); tolerance *= REDUCE_RATE; } } mat_free_VecDBL(pure_trans_reduced); fail: return 0; found: return multi; }