Re: [Spglib-users] Can not find atoms related by space group symmetry
Brought to you by:
atztogo
From: Atsushi T. <atz...@gm...> - 2022-03-29 01:04:36
|
Hi, Please define what you want to do more clearly. For example, Given a space group operation (R|t), and a point x in crystallographic coordinates x' = (R|t) x = Rx + t Then what do you want to do? In addition, your script doesn't work as it is. Togo On Mon, Mar 28, 2022 at 4:26 PM Dorde Dangic <Dan...@ho...> wrote: > > Dear all, > > I am having trouble finding atoms related by a spacegroup symmetry. I am not sure what I am doing wrong. I am sending a script that I am using to find symmetry-related atoms. > > POSCAR: > > H > 1.00000000 > 0.59175841 -0.59175841 1.52600353 > 0.59175841 0.59175841 1.52600353 > -0.59175841 -0.59175841 1.52600353 > H > 2 > Direct > 0.00000000 0.00000000 0.00000000 > 0.50000000 -0.25000000 0.25000000 > > test.py: > > import numpy as np > import spglib > from phonopy.interface.calculator import read_crystal_structure > > # Function to check if the vector is the translational lattice vector > def check_if_R(vec): > rvec = False > for i in range(-1,2): > if not rvec: > for j in range(-1,2): > if not rvec: > for k in range(-1,2): > vec1 = vec + np.array([float(i), float(j), float(k)]) > if(np.linalg.norm(vec1) < 1.0e-5): > rvec = True > break > return rvec > > unitcell, _ = read_crystal_structure("POSCAR", interface_mode='vasp') # read in structure > cell = (unitcell.cell, unitcell.scaled_positions, unitcell.numbers) > > dataset = spglib.get_symmetry_dataset(cell, symprec=1e-5, angle_tolerance=-1.0, hall_number=0) # get datasets > rotations = dataset['rotations'].copy() > translations = dataset['translations'].copy() > > print(scaled_positions) > > atom_image = np.zeros((len(rotations), len(numbers))) + len(numbers) # array to store to which atom we go with symmetry > for irot in range(len(rotations)): > new_pos = np.einsum('ij,jk->ik', scaled_positions, rotations[irot]) + translations[irot] # symmetry operation on the scaled positions > for iat in range(natom): # Try to match rotated atom with the original set > found = False > for jat in range(natom): > pos = new_pos[iat] - scaled_positions[jat] > pos -= np.rint(pos) > if(check_if_R(pos)): > atom_image[irot, iat] = jat > found = True > break > if(not found): # Print rotated atom if could not match > print(irot, iat) > print(new_pos[iat]) > # Print atom images > print(atom_image) > > Could you please tell me what am I missing? > > Thank you for your help. > _______________________________________________ > Spglib-users mailing list > Spg...@li... > https://lists.sourceforge.net/lists/listinfo/spglib-users -- Atsushi Togo |