reducec vectorized is improved

This commit is contained in:
f.basile 2020-06-29 18:25:45 +02:00
parent 4875191ffd
commit d06daec4cb
2 changed files with 22 additions and 14 deletions

View File

@ -140,15 +140,23 @@ class Orientation: # ToDo: make subclass of lattice and Rotation
@property @property
def reduced_vec(self): def reduced_vec(self):
"""Transform orientation to fall into fundamental zone according to symmetry.""" """Transform orientation to fall into fundamental zone according to symmetry."""
equi=self.equivalent_vec.rotation #24 x rot x 3(rodrigues vector) equi= self.equivalent_vec.rotation #equivalent orientations
r= 1 if not self.rotation.shape else equi.shape[1] #number of rotations r= 1 if not self.rotation.shape else equi.shape[1] #number of rotations
quat=np.empty( [r , 4]) num_equi=equi.shape[0] #number of equivalente orientations
for rot in range(r): quat= np.reshape( equi.as_quaternion(), (r*num_equi,4) ,order='F') #equivalents are listed in intiuitive order
for sym in range(equi.shape[0]): boolean=Orientation(quat, self.lattice).inFZ_vec() #check which ones are in FZ
if self.lattice.symmetry.inFZ(equi.as_Rodrigues(vector=True)[sym,rot]): if sum(boolean) == r:
quat[rot]=equi.as_quaternion()[sym,rot] return self.__class__(quat[boolean],self.lattice)
break
return self.__class__(quat,self.lattice) else:
print('More than 1 equivalent orientation has been found for an orientation')
index=np.empty(r, dtype=int)
for l,h in enumerate(range(0,r*num_equi, num_equi)):
index[l]=np.where(boolean[h:h+num_equi])[0][0] + (l*num_equi) #get first index that is true then go check to next orientation
return self.__class__(quat[index],self.lattice)
@ -187,7 +195,7 @@ class Orientation: # ToDo: make subclass of lattice and Rotation
return color return color
def IPFcolor_vec(self,axis): def IPF_color(self,axis):
"""TSL color of inverse pole figure for given axis. Not for hex or triclinic lattices.""" """TSL color of inverse pole figure for given axis. Not for hex or triclinic lattices."""
eq = self.equivalent_vec eq = self.equivalent_vec
pole = eq.rotation @ np.broadcast_to(axis/np.linalg.norm(axis),eq.rotation.shape+(3,)) pole = eq.rotation @ np.broadcast_to(axis/np.linalg.norm(axis),eq.rotation.shape+(3,))

View File

@ -110,7 +110,7 @@ class TestOrientation_vec:
rot2.as_quaternion(),rot3.as_quaternion()]) rot2.as_quaternion(),rot3.as_quaternion()])
ori_vec=Orientation(quat,lattice) ori_vec=Orientation(quat,lattice)
assert np.allclose( ori_vec.IPFcolor_vec(np.array([0,0,1]))[0],ori0.IPFcolor(np.array([0,0,1]))) assert np.allclose( ori_vec.IPF_color(np.array([0,0,1]))[0],ori0.IPFcolor(np.array([0,0,1])))
assert np.allclose( ori_vec.IPFcolor_vec(np.array([0,2,1]))[1],ori1.IPFcolor(np.array([0,2,1]))) assert np.allclose( ori_vec.IPF_color(np.array([0,2,1]))[1],ori1.IPFcolor(np.array([0,2,1])))
assert np.allclose( ori_vec.IPFcolor_vec(np.array([0,3,1]))[2],ori2.IPFcolor(np.array([0,3,1]))) assert np.allclose( ori_vec.IPF_color(np.array([0,3,1]))[2],ori2.IPFcolor(np.array([0,3,1])))
assert np.allclose( ori_vec.IPFcolor_vec(np.array([4,0,1]))[3],ori3.IPFcolor(np.array([4,0,1]))) assert np.allclose( ori_vec.IPF_color(np.array([4,0,1]))[3],ori3.IPFcolor(np.array([4,0,1])))