Exemplo n.º 1
1
static PyObject * get_dataset(PyObject *self, PyObject *args)
{
  int i, j, k, num_atom;
  double symprec;
  SpglibDataset *dataset;
  PyArrayObject* lattice_vectors;
  PyArrayObject* atomic_positions;
  PyArrayObject* atom_types;
  PyObject* array, *vec, *mat, *rot, *trans, *wyckoffs, *equiv_atoms;
  
  double *p_lattice;
  double *p_positions;
  double lattice[3][3];
  double (*positions)[3];
  int *types_int;
  int *types;

  if (!PyArg_ParseTuple(args, "OOOd",
			&lattice_vectors,
			&atomic_positions,
			&atom_types,
			&symprec)) {
    return NULL;
  }

  p_lattice = (double(*))lattice_vectors->data;
  p_positions = (double(*))atomic_positions->data;
  num_atom = atom_types->dimensions[0];
  positions = (double(*)[3]) malloc(sizeof(double[3]) * num_atom);
  types_int = (int*)atom_types->data;
  types = (int*) malloc(sizeof(int) * num_atom);
  set_spglib_cell(lattice, positions, types, num_atom,
		  p_lattice, p_positions, types_int);
  dataset = spg_get_dataset(lattice, positions, types, num_atom, symprec);
  free(types);
  free(positions);

  array = PyList_New(10);

  /* Space group number, international symbol, hall symbol */
  PyList_SetItem(array, 0, PyInt_FromLong((long) dataset->spacegroup_number));
  PyList_SetItem(array, 1, PyString_FromString(dataset->international_symbol));
  PyList_SetItem(array, 2, PyInt_FromLong((long) dataset->hall_number));
  PyList_SetItem(array, 3, PyString_FromString(dataset->hall_symbol));

  /* Transformation matrix */
  mat = PyList_New(3);
  for (i = 0; i < 3; i++) {
    vec = PyList_New(3);
    for (j = 0; j < 3; j++) {
      PyList_SetItem(vec, j,
		     PyFloat_FromDouble(dataset->transformation_matrix[i][j]));
    }
    PyList_SetItem(mat, i, vec);
  }
  PyList_SetItem(array, 4, mat);

  /* Origin shift */
  vec = PyList_New(3);
  for (i = 0; i < 3; i++) {
    PyList_SetItem(vec, i, PyFloat_FromDouble(dataset->origin_shift[i]));
  }
  PyList_SetItem(array, 5, vec);

  /* Rotation matrices */
  rot = PyList_New(dataset->n_operations);
  for (i = 0; i < dataset->n_operations; i++) {
    mat = PyList_New(3);
    for (j = 0; j < 3; j++) {
      vec = PyList_New(3);
      for (k = 0; k < 3; k++) {
	PyList_SetItem(vec, k,
		       PyInt_FromLong((long) dataset->rotations[i][j][k]));
      }
      PyList_SetItem(mat, j, vec);
    }
    PyList_SetItem(rot, i, mat);
  }
  PyList_SetItem(array, 6, rot);

  /* Translation vectors */
  trans = PyList_New(dataset->n_operations);
  for (i = 0; i < dataset->n_operations; i++) {
    vec = PyList_New(3);
    for (j = 0; j < 3; j++) {
      PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->translations[i][j]));
    }
    PyList_SetItem(trans, i, vec);
  }
  PyList_SetItem(array, 7, trans);

  /* Wyckoff letters, Equivalent atoms */
  wyckoffs = PyList_New(dataset->n_atoms);
  equiv_atoms = PyList_New(dataset->n_atoms);
  for (i = 0; i < dataset->n_atoms; i++) {
    PyList_SetItem(wyckoffs, i, PyInt_FromLong((long) dataset->wyckoffs[i]));
    PyList_SetItem(equiv_atoms, i,
		   PyInt_FromLong((long) dataset->equivalent_atoms[i]));
  }
  PyList_SetItem(array, 8, wyckoffs);
  PyList_SetItem(array, 9, equiv_atoms);

  spg_free_dataset(dataset);

  return array;
}
Exemplo n.º 2
0
static int test_spg_get_stabilized_reciprocal_mesh(void)
{
  SpglibDataset *dataset;
  double lattice[3][3] = {{4, 0, 0}, {0, 4, 0}, {0, 0, 3}};
  double position[][3] =
    {
      {0, 0, 0},
      {0.5, 0.5, 0.5},
      {0.3, 0.3, 0},
      {0.7, 0.7, 0},
      {0.2, 0.8, 0.5},
      {0.8, 0.2, 0.5},
    };
  int types[] = {1, 1, 2, 2, 2, 2};
  int num_atom = 6;

  dataset = spg_get_dataset(lattice,
			    position,
			    types,
			    num_atom,
			    1e-5);
  
  if (dataset == NULL) {
    return 1;
  }
  
  int m = 40;
  int mesh[] = {m, m, m};
  int is_shift[] = {1, 1, 1};
  int grid_address[m * m * m][3];
  int grid_mapping_table[m * m * m];
  double q[] = {0, 0.5, 0.5};

  printf("*** spg_get_stabilized_reciprocal_mesh of Rutile structure ***:\n");

  int num_ir = spg_get_stabilized_reciprocal_mesh(grid_address,
						  grid_mapping_table,
						  mesh,
						  is_shift,
						  1,
						  dataset->n_operations,
						  dataset->rotations,
						  1,
						  (double(*)[3])q);
  spg_free_dataset(dataset);

  if (num_ir) {
    printf("Number of irreducible k-points stabilized by q=(0, 1/2, 1/2) of Rutile with\n");
    printf("40x40x40 Monkhorst-Pack mesh is %d (8000).\n", num_ir);
    return 0;
  } else {
    return 1;
  }
}
Exemplo n.º 3
0
static int test_spg_get_hall_number_from_symmetry(void)
{
  double lattice[3][3] = {{4, 0, 0}, {0, 4, 0}, {0, 0, 4}};
  double position[][3] = {
    {0, 0, 0},
    {0.5, 0.5, 0.5}
  };
  int types[] = {1, 1};
  int num_atom = 2;
  double symprec = 1e-5;

  int hall_number;
  SpglibSpacegroupType spgtype;
  SpglibDataset *dataset;

  printf("*** spg_get_hall_number_from_symmetry ***:\n");
  if ((dataset = spg_get_dataset(lattice,
                                 position,
                                 types,
                                 num_atom,
                                 symprec)) == NULL) {
    return 0;
  }
  printf("hall_number = %d is found by spg_get_dataset.\n", dataset->hall_number);
  hall_number = spg_get_hall_number_from_symmetry(dataset->rotations,
                                                  dataset->translations,
                                                  dataset->n_operations,
                                                  symprec);
  printf("hall_number = %d is found by spg_get_hall_number_from_symmetry.\n",
         hall_number);
  if (hall_number == dataset->hall_number) {
    spgtype = spg_get_spacegroup_type(hall_number);
    if (spgtype.number) {
      show_spacegroup_type(spgtype);
      return 0;
    } else {
      return 1;
    }
  } else {
    return 0;
  }
}
Exemplo n.º 4
0
void wrap_spg_get_syminfo(double flat_lattice[], double flat_position[], double dbl_types[], int num_atom, double tolerance, int dry_run)
{
	if (dry_run == 1) return;

	double lattice[3][3];
	int i, j, n;
	n = 0;
	for (i = 0; i < 3; i++)
	{
		for ( j = 0; j < 3; j++)
		{
			lattice[i][j] = flat_lattice[n];
			n++;
		}
	}

	double position[num_atom][3];
	i = 0;
	j = 0;
	n = 0;
	for (i = 0; i < num_atom; i++)
	{
		for ( j = 0; j < 3; j++)
		{
			position[i][j] = flat_position[n];
			n++;
		}
	}

	int types[num_atom];
	i = 0;
	for (i = 0; i < num_atom; i++)
	{
		types[i] = (int) dbl_types[i];
	}

	SpglibDataset *dataset = spg_get_dataset(lattice, position, types, num_atom, tolerance);

	EM_ASM_({
		window.wrap_spg_handle_result($0, $1);
	}, dataset->spacegroup_number, dataset->international_symbol);
Exemplo n.º 5
0
static int show_spg_dataset(double lattice[3][3],
			    const double origin_shift[3],
			    double position[][3],
			    const int num_atom,
			    const int types[])
{
  SpglibDataset *dataset;
  char ptsymbol[6];
  int pt_trans_mat[3][3];
  int i, j;
  const char *wl = "abcdefghijklmnopqrstuvwxyz";

  for ( i = 0; i < num_atom; i++ ) {
    for ( j = 0; j < 3; j++ ) {
      position[i][j] += origin_shift[j];
    }
  }

  dataset = spg_get_dataset(lattice,
			    position,
			    types,
			    num_atom,
			    1e-5);

  if (dataset == NULL) {
    return 1;
  }
  
  printf("International: %s (%d)\n", dataset->international_symbol, dataset->spacegroup_number );
  printf("Hall symbol:   %s\n", dataset->hall_symbol );
  if (spg_get_pointgroup(ptsymbol,
			 pt_trans_mat,
			 dataset->rotations,
			 dataset->n_operations)) {
    printf("Point group:   %s\n", ptsymbol);
    printf("Transformation matrix:\n");
    for ( i = 0; i < 3; i++ ) {
      printf("%f %f %f\n",
	     dataset->transformation_matrix[i][0],
	     dataset->transformation_matrix[i][1],
	     dataset->transformation_matrix[i][2]);
    }
    printf("Wyckoff letters:\n");
    for ( i = 0; i < dataset->n_atoms; i++ ) {
      printf("%c ", wl[dataset->wyckoffs[i]]);
    }
    printf("\n");
    printf("Equivalent atoms:\n");
    for (i = 0; i < dataset->n_atoms; i++) {
      printf("%d ", dataset->equivalent_atoms[i]);
    }
    printf("\n");
  
    for (i = 0; i < dataset->n_operations; i++) {
      printf("--- %d ---\n", i + 1);
      for (j = 0; j < 3; j++) {
	printf("%2d %2d %2d\n",
	       dataset->rotations[i][j][0],
	       dataset->rotations[i][j][1],
	       dataset->rotations[i][j][2]);
      }
      printf("%f %f %f\n",
	     dataset->translations[i][0],
	     dataset->translations[i][1],
	     dataset->translations[i][2]);
    }
    spg_free_dataset(dataset);
    return 0;
  } else {
    spg_free_dataset(dataset);
    return 1;
  }
}