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 07:10:03
|
Hi,
I haven't tested your script, but
> Part of the code that does that should be:
> new_pos = np.einsum('ij,jk->ik', scaled_positions, rotations[irot]) + translations[irot]
Following your definition, rotation has to be transposed:
new_pos = np.einsum('ij,jk->ik', scaled_positions, rotations[irot].T)
+ translations[irot]
Does this fix your problem?
Togo
On Tue, Mar 29, 2022 at 3:44 PM Đorđe Dangić <dan...@ho...> wrote:
>
> Hello again,
>
>
>
> I apologize I accidently hit send.
>
>
>
> I apologize for the confusion. I was copy/paste-ing part from a larger code and I have not checked the script. I am attaching the script with the email. Test contains the python code.
>
>
>
> Let’s say the position of an atom in the primitive cell in crystal coordinates is x1, and it is a component of the vector of all atomic positions inside primitive cell X. If I act with the space group symmetry on x1 I would get, as you said x’:
>
>
>
> x' = (R|t) x1 = Rx1 + t
>
>
>
> Part of the code that does that should be:
>
>
>
> new_pos = np.einsum('ij,jk->ik', scaled_positions, rotations[irot]) + translations[irot]
>
>
>
> Now, I would expect that x’ is also a position of some atom in the primitive cell, maybe translated by the lattice vector. If I compare x’ with each component of X I should get a match for some x2. That would mean that my original x1 that I transformed transforms to some other atomic position x2 (which could be the same). Now I could say that space group symmetry (R|t) maps atom x1 to atom x2. Am I correct in saying this? Matching of transformed and original atomic positions should be done with this part of the code:
>
>
>
> for iat in range(natom):
>
> 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
>
>
>
> I hope now you can run the code and see that I do not match all of the transformed atoms. Can you help me fix this?
>
>
>
> Kind regards,
>
>
>
> Đorđe
>
>
>
> From: Atsushi Togo
> Sent: Tuesday 29 March 2022 03:04
> To: spglib-users
> Subject: Re: [Spglib-users] Can not find atoms related by space group symmetry
>
>
>
> 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
>
>
> _______________________________________________
> Spglib-users mailing list
> Spg...@li...
> https://lists.sourceforge.net/lists/listinfo/spglib-users
>
>
>
> _______________________________________________
> Spglib-users mailing list
> Spg...@li...
> https://lists.sourceforge.net/lists/listinfo/spglib-users
--
Atsushi Togo
|