Beispiel #1
0
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;
}
Beispiel #2
0
/* 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;
}