fix for vectorized in_SST + test
This commit is contained in:
parent
49d448dced
commit
ef0c78745a
|
@ -160,7 +160,7 @@ class Symmetry:
|
||||||
Fundamental zone in Rodrigues space is point symmetric around origin.
|
Fundamental zone in Rodrigues space is point symmetric around origin.
|
||||||
"""
|
"""
|
||||||
if(rho.shape[-1] != 3):
|
if(rho.shape[-1] != 3):
|
||||||
raise ValueError('Input is not a Rodrigues-Frank vector.')
|
raise ValueError('Input is not a Rodrigues-Frank vector field.')
|
||||||
|
|
||||||
rho_abs = np.abs(rho)
|
rho_abs = np.abs(rho)
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ class Symmetry:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if(rho.shape[-1] != 3):
|
if(rho.shape[-1] != 3):
|
||||||
raise ValueError('Input is not a Rodrigues-Frank vector.')
|
raise ValueError('Input is not a Rodrigues-Frank vector field.')
|
||||||
|
|
||||||
with np.errstate(invalid='ignore'):
|
with np.errstate(invalid='ignore'):
|
||||||
# using '*' for 'and'
|
# using '*' for 'and'
|
||||||
|
@ -242,6 +242,9 @@ class Symmetry:
|
||||||
... }
|
... }
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
if(vector.shape[-1] != 3):
|
||||||
|
raise ValueError('Input is not a 3D vector field.')
|
||||||
|
|
||||||
if self.system == 'cubic':
|
if self.system == 'cubic':
|
||||||
basis = {'improper':np.array([ [-1. , 0. , 1. ],
|
basis = {'improper':np.array([ [-1. , 0. , 1. ],
|
||||||
[ np.sqrt(2.) , -np.sqrt(2.) , 0. ],
|
[ np.sqrt(2.) , -np.sqrt(2.) , 0. ],
|
||||||
|
@ -280,16 +283,17 @@ class Symmetry:
|
||||||
else:
|
else:
|
||||||
return np.ones_like(vector[...,0],bool)
|
return np.ones_like(vector[...,0],bool)
|
||||||
|
|
||||||
b_p = np.broadcast_to(basis['proper'], vector.shape+(3,))
|
|
||||||
if proper:
|
|
||||||
b_i = np.broadcast_to(basis['improper'],vector.shape+(3,))
|
b_i = np.broadcast_to(basis['improper'],vector.shape+(3,))
|
||||||
|
if proper:
|
||||||
|
b_p = np.broadcast_to(basis['proper'], vector.shape+(3,))
|
||||||
improper = np.all(np.around(np.einsum('...ji,...i',b_i,vector),12)>=0.0,axis=-1,keepdims=True)
|
improper = np.all(np.around(np.einsum('...ji,...i',b_i,vector),12)>=0.0,axis=-1,keepdims=True)
|
||||||
theComponents = np.where(np.broadcast_to(improper,vector.shape),
|
theComponents = np.where(np.broadcast_to(improper,vector.shape),
|
||||||
np.around(np.einsum('...ji,...i',b_i,vector),12),
|
np.around(np.einsum('...ji,...i',b_i,vector),12),
|
||||||
np.around(np.einsum('...ji,...i',b_p,vector),12))
|
np.around(np.einsum('...ji,...i',b_p,vector),12))
|
||||||
else:
|
else:
|
||||||
vector_ = np.block([vector[...,0:2],np.abs(vector[...,2:3])]) # z component projects identical
|
vector_ = np.block([vector[...,0:2],np.abs(vector[...,2:3])]) # z component projects identical
|
||||||
theComponents = np.around(np.einsum('...ji,...i',b_p,vector_),12)
|
theComponents = np.around(np.einsum('...ji,...i',b_i,vector_),12)
|
||||||
|
|
||||||
in_SST = np.all(theComponents >= 0.0,axis=-1)
|
in_SST = np.all(theComponents >= 0.0,axis=-1)
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,6 @@ class Orientation: # ToDo: make subclass of lattice and Rotation
|
||||||
# ... own sym, other sym,
|
# ... own sym, other sym,
|
||||||
# self-->other: True, self<--other: False
|
# self-->other: True, self<--other: False
|
||||||
|
|
||||||
|
|
||||||
def in_FZ(self):
|
def in_FZ(self):
|
||||||
"""Check if orientations fall into Fundamental Zone."""
|
"""Check if orientations fall into Fundamental Zone."""
|
||||||
return self.lattice.in_FZ(self.rotation.as_Rodrigues(vector=True))
|
return self.lattice.in_FZ(self.rotation.as_Rodrigues(vector=True))
|
||||||
|
|
|
@ -106,14 +106,23 @@ class TestSymmetry:
|
||||||
|
|
||||||
@pytest.mark.parametrize('system',Symmetry.crystal_systems)
|
@pytest.mark.parametrize('system',Symmetry.crystal_systems)
|
||||||
def test_in_FZ_vectorize(self,set_of_rodrigues,system):
|
def test_in_FZ_vectorize(self,set_of_rodrigues,system):
|
||||||
for i,in_FZ_ in enumerate(Symmetry(system).in_FZ(set_of_rodrigues)):
|
result = Symmetry(system).in_FZ(set_of_rodrigues.reshape(50,4,3)).reshape(200)
|
||||||
assert in_FZ_ == in_FZ(system,set_of_rodrigues[i])
|
for i,r in enumerate(result):
|
||||||
|
assert r == in_FZ(system,set_of_rodrigues[i])
|
||||||
|
|
||||||
@pytest.mark.parametrize('system',Symmetry.crystal_systems)
|
@pytest.mark.parametrize('system',Symmetry.crystal_systems)
|
||||||
def test_in_disorientation_SST_vectorize(self,set_of_rodrigues,system):
|
def test_in_disorientation_SST_vectorize(self,set_of_rodrigues,system):
|
||||||
for i,in_disorientation_SST_ in enumerate(Symmetry(system).in_disorientation_SST(set_of_rodrigues)):
|
result = Symmetry(system).in_disorientation_SST(set_of_rodrigues.reshape(50,4,3)).reshape(200)
|
||||||
assert in_disorientation_SST_ == in_disorientation_SST(system,set_of_rodrigues[i])
|
for i,r in enumerate(result):
|
||||||
|
assert r == in_disorientation_SST(system,set_of_rodrigues[i])
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('proper',[True,False])
|
||||||
|
@pytest.mark.parametrize('system',Symmetry.crystal_systems)
|
||||||
|
def test_in_SST_vectorize(self,system,proper):
|
||||||
|
vecs = np.random.rand(20,4,3)
|
||||||
|
result = Symmetry(system).in_SST(vecs,proper).reshape(20*4)
|
||||||
|
for i,r in enumerate(result):
|
||||||
|
assert r == in_SST(system,vecs.reshape(20*4,3)[i],proper)
|
||||||
|
|
||||||
@pytest.mark.parametrize('invalid_symmetry',['fcc','bcc','hello'])
|
@pytest.mark.parametrize('invalid_symmetry',['fcc','bcc','hello'])
|
||||||
def test_invalid_symmetry(self,invalid_symmetry):
|
def test_invalid_symmetry(self,invalid_symmetry):
|
||||||
|
@ -142,7 +151,7 @@ class TestSymmetry:
|
||||||
def test_in_SST(self,system,proper):
|
def test_in_SST(self,system,proper):
|
||||||
assert Symmetry(system).in_SST(np.zeros(3),proper)
|
assert Symmetry(system).in_SST(np.zeros(3),proper)
|
||||||
|
|
||||||
@pytest.mark.parametrize('function',['in_FZ','in_disorientation_SST'])
|
@pytest.mark.parametrize('function',['in_FZ','in_disorientation_SST','in_SST'])
|
||||||
def test_invalid_argument(self,function):
|
def test_invalid_argument(self,function):
|
||||||
s = Symmetry() # noqa
|
s = Symmetry() # noqa
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
|
|
|
@ -319,4 +319,4 @@ class TestResult:
|
||||||
|
|
||||||
def test_XDMF(self,tmp_path,single_phase):
|
def test_XDMF(self,tmp_path,single_phase):
|
||||||
os.chdir(tmp_path)
|
os.chdir(tmp_path)
|
||||||
single_phase.write_XDMF
|
single_phase.write_XDMF()
|
||||||
|
|
|
@ -20,7 +20,7 @@ def set_of_rotations(set_of_quaternions):
|
||||||
|
|
||||||
|
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
# Code below available according to the following conditions on https://github.com/MarDiehl/3Drotations
|
# Code below available according to the following conditions
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
# Copyright (c) 2017-2019, Martin Diehl/Max-Planck-Institut für Eisenforschung GmbH
|
# Copyright (c) 2017-2019, Martin Diehl/Max-Planck-Institut für Eisenforschung GmbH
|
||||||
# Copyright (c) 2013-2014, Marc De Graef/Carnegie Mellon University
|
# Copyright (c) 2013-2014, Marc De Graef/Carnegie Mellon University
|
||||||
|
|
Loading…
Reference in New Issue