2019-12-09 02:18:32 +05:30
|
|
|
import os
|
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
import pytest
|
2019-11-22 01:31:01 +05:30
|
|
|
import numpy as np
|
2019-11-24 10:59:00 +05:30
|
|
|
|
2019-11-22 01:31:01 +05:30
|
|
|
from damask import Rotation
|
2020-04-08 17:11:46 +05:30
|
|
|
|
2020-01-15 03:00:08 +05:30
|
|
|
n = 1000
|
2020-04-08 22:08:57 +05:30
|
|
|
atol=1.e-5
|
|
|
|
scatter=1.e-9
|
2019-11-24 10:59:00 +05:30
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def default():
|
|
|
|
"""A set of n random rotations."""
|
2020-04-08 22:08:57 +05:30
|
|
|
specials = np.array(
|
|
|
|
[np.array([ 1.0, 0.0, 0.0, 0.0]),
|
2020-04-08 17:11:46 +05:30
|
|
|
#-----------------------------------------------
|
2020-04-08 22:08:57 +05:30
|
|
|
np.array([0.0, 1.0, 0.0, 0.0]),
|
|
|
|
np.array([0.0, 0.0, 1.0, 0.0]),
|
|
|
|
np.array([0.0, 0.0, 0.0, 1.0]),
|
|
|
|
np.array([0.0,-1.0, 0.0, 0.0]),
|
|
|
|
np.array([0.0, 0.0,-1.0, 0.0]),
|
|
|
|
np.array([0.0, 0.0, 0.0,-1.0]),
|
2020-04-08 17:11:46 +05:30
|
|
|
#-----------------------------------------------
|
2020-04-08 22:08:57 +05:30
|
|
|
np.array([1.0, 1.0, 0.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([1.0, 0.0, 1.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([1.0, 0.0, 0.0, 1.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 1.0, 1.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 1.0, 0.0, 1.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 0.0, 1.0, 1.0])/np.sqrt(2.),
|
2020-04-08 17:11:46 +05:30
|
|
|
#-----------------------------------------------
|
2020-04-08 22:08:57 +05:30
|
|
|
np.array([1.0,-1.0, 0.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([1.0, 0.0,-1.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([1.0, 0.0, 0.0,-1.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 1.0,-1.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 1.0, 0.0,-1.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 0.0, 1.0,-1.0])/np.sqrt(2.),
|
2020-04-08 17:11:46 +05:30
|
|
|
#-----------------------------------------------
|
2020-04-08 22:08:57 +05:30
|
|
|
np.array([0.0, 1.0,-1.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 1.0, 0.0,-1.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 0.0, 1.0,-1.0])/np.sqrt(2.),
|
2020-04-08 17:11:46 +05:30
|
|
|
#-----------------------------------------------
|
2020-04-08 22:08:57 +05:30
|
|
|
np.array([0.0,-1.0,-1.0, 0.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0,-1.0, 0.0,-1.0])/np.sqrt(2.),
|
|
|
|
np.array([0.0, 0.0,-1.0,-1.0])/np.sqrt(2.),
|
|
|
|
#-----------------------------------------------
|
|
|
|
np.array([1.0, 1.0, 1.0, 0.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 1.0, 0.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 0.0, 1.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0,-1.0, 1.0, 0.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0,-1.0, 0.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 0.0,-1.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 1.0,-1.0, 0.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 1.0, 0.0,-1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 0.0, 1.0,-1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0,-1.0,-1.0, 0.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0,-1.0, 0.0,-1.0])/np.sqrt(3.),
|
|
|
|
np.array([1.0, 0.0,-1.0,-1.0])/np.sqrt(3.),
|
|
|
|
#-----------------------------------------------
|
|
|
|
np.array([0.0, 1.0, 1.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([0.0, 1.0,-1.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([0.0, 1.0, 1.0,-1.0])/np.sqrt(3.),
|
|
|
|
np.array([0.0,-1.0, 1.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([0.0,-1.0,-1.0, 1.0])/np.sqrt(3.),
|
|
|
|
np.array([0.0,-1.0, 1.0,-1.0])/np.sqrt(3.),
|
|
|
|
np.array([0.0,-1.0,-1.0,-1.0])/np.sqrt(3.),
|
|
|
|
#-----------------------------------------------
|
|
|
|
np.array([1.0, 1.0, 1.0, 1.0])/2.,
|
|
|
|
np.array([1.0,-1.0, 1.0, 1.0])/2.,
|
|
|
|
np.array([1.0, 1.0,-1.0, 1.0])/2.,
|
|
|
|
np.array([1.0, 1.0, 1.0,-1.0])/2.,
|
|
|
|
np.array([1.0,-1.0,-1.0, 1.0])/2.,
|
|
|
|
np.array([1.0,-1.0, 1.0,-1.0])/2.,
|
|
|
|
np.array([1.0, 1.0,-1.0,-1.0])/2.,
|
|
|
|
np.array([1.0,-1.0,-1.0,-1.0])/2.,
|
|
|
|
])
|
|
|
|
specials += np.broadcast_to(np.random.rand(4)*scatter,specials.shape)
|
|
|
|
specials /= np.linalg.norm(specials,axis=1).reshape(-1,1)
|
|
|
|
specials[specials[:,0]<0]*=-1
|
2020-04-08 17:11:46 +05:30
|
|
|
return [Rotation.fromQuaternion(s) for s in specials] + \
|
|
|
|
[Rotation.fromRandom() for r in range(n-len(specials))]
|
2019-11-24 10:59:00 +05:30
|
|
|
|
2019-12-09 02:18:32 +05:30
|
|
|
@pytest.fixture
|
|
|
|
def reference_dir(reference_dir_base):
|
|
|
|
"""Directory containing reference results."""
|
|
|
|
return os.path.join(reference_dir_base,'Rotation')
|
|
|
|
|
2019-11-22 01:31:01 +05:30
|
|
|
|
|
|
|
class TestRotation:
|
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_Eulers(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asQuaternion()
|
|
|
|
o = Rotation.fromEulers(rot.asEulers()).asQuaternion()
|
|
|
|
ok = np.allclose(m,o,atol=atol)
|
|
|
|
if np.isclose(rot.asQuaternion()[0],0.0,atol=atol):
|
|
|
|
ok = ok or np.allclose(m*-1.,o,atol=atol)
|
|
|
|
print(m,o,rot.asQuaternion())
|
2020-04-08 17:11:46 +05:30
|
|
|
assert ok
|
2019-11-22 01:31:01 +05:30
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_AxisAngle(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asEulers()
|
|
|
|
o = Rotation.fromAxisAngle(rot.asAxisAngle()).asEulers()
|
|
|
|
u = np.array([np.pi*2,np.pi,np.pi*2])
|
|
|
|
ok = np.allclose(m,o,atol=atol)
|
|
|
|
ok = ok or np.allclose(np.where(np.isclose(m,u),m-u,m),np.where(np.isclose(o,u),o-u,o),atol=atol)
|
|
|
|
if np.isclose(m[1],0.0,atol=atol) or np.isclose(m[1],np.pi,atol=atol):
|
|
|
|
sum_phi = np.unwrap([m[0]+m[2],o[0]+o[2]])
|
|
|
|
ok = ok or np.isclose(sum_phi[0],sum_phi[1],atol=atol)
|
|
|
|
print(m,o,rot.asQuaternion())
|
|
|
|
assert ok
|
2019-11-22 01:31:01 +05:30
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_Matrix(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asAxisAngle()
|
|
|
|
o = Rotation.fromAxisAngle(rot.asAxisAngle()).asAxisAngle()
|
|
|
|
ok = np.allclose(m,o,atol=atol)
|
|
|
|
if np.isclose(m[3],np.pi,atol=atol):
|
|
|
|
ok = ok or np.allclose(m*np.array([-1.,-1.,-1.,1.]),o,atol=atol)
|
|
|
|
print(m,o,rot.asQuaternion())
|
2020-04-08 17:11:46 +05:30
|
|
|
assert ok
|
2019-11-22 01:31:01 +05:30
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_Rodriques(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asMatrix()
|
|
|
|
o = Rotation.fromRodrigues(rot.asRodrigues()).asMatrix()
|
|
|
|
print(m,o)
|
|
|
|
assert np.allclose(m,o,atol=atol)
|
2019-11-22 01:31:01 +05:30
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_Homochoric(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asRodrigues()
|
|
|
|
o = Rotation.fromHomochoric(rot.asHomochoric()).asRodrigues()
|
|
|
|
ok = np.allclose(np.clip(m,None,1.e9),np.clip(o,None,1.e9),atol=atol)
|
|
|
|
print(m,o,rot.asQuaternion())
|
|
|
|
ok = ok or np.isclose(m[3],0.0,atol=atol)
|
2019-11-22 01:31:01 +05:30
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_Cubochoric(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asHomochoric()
|
|
|
|
o = Rotation.fromCubochoric(rot.asCubochoric()).asHomochoric()
|
|
|
|
print(m,o,rot.asQuaternion())
|
|
|
|
assert np.allclose(m,o,atol=atol*1e2)
|
2019-11-22 01:31:01 +05:30
|
|
|
|
2019-11-24 10:59:00 +05:30
|
|
|
def test_Quaternion(self,default):
|
|
|
|
for rot in default:
|
2020-04-08 22:08:57 +05:30
|
|
|
m = rot.asCubochoric()
|
|
|
|
o = Rotation.fromQuaternion(rot.asQuaternion()).asCubochoric()
|
|
|
|
print(m,o,rot.asQuaternion())
|
|
|
|
assert np.allclose(m,o,atol=atol)
|