Merge branch 'lattice-points' into 'development'
lattice points See merge request damask/DAMASK!441
This commit is contained in:
commit
a0d516958d
|
@ -98,13 +98,13 @@ class Crystal():
|
||||||
or (self.alpha is None or ('alpha' in self.immutable and self.alpha != self.immutable['alpha'])) \
|
or (self.alpha is None or ('alpha' in self.immutable and self.alpha != self.immutable['alpha'])) \
|
||||||
or (self.beta is None or ('beta' in self.immutable and self.beta != self.immutable['beta'])) \
|
or (self.beta is None or ('beta' in self.immutable and self.beta != self.immutable['beta'])) \
|
||||||
or (self.gamma is None or ('gamma' in self.immutable and self.gamma != self.immutable['gamma'])):
|
or (self.gamma is None or ('gamma' in self.immutable and self.gamma != self.immutable['gamma'])):
|
||||||
raise ValueError (f'Incompatible parameters {self.parameters} for crystal family {self.family}')
|
raise ValueError (f'incompatible parameters {self.parameters} for crystal family {self.family}')
|
||||||
|
|
||||||
if np.any(np.array([self.alpha,self.beta,self.gamma]) <= 0):
|
if np.any(np.array([self.alpha,self.beta,self.gamma]) <= 0):
|
||||||
raise ValueError ('Lattice angles must be positive')
|
raise ValueError ('lattice angles must be positive')
|
||||||
if np.any([np.roll([self.alpha,self.beta,self.gamma],r)[0]
|
if np.any([np.roll([self.alpha,self.beta,self.gamma],r)[0]
|
||||||
> np.sum(np.roll([self.alpha,self.beta,self.gamma],r)[1:]) for r in range(3)]):
|
>= np.sum(np.roll([self.alpha,self.beta,self.gamma],r)[1:]) for r in range(3)]):
|
||||||
raise ValueError ('Each lattice angle must be less than sum of others')
|
raise ValueError ('each lattice angle must be less than sum of others')
|
||||||
else:
|
else:
|
||||||
self.a = self.b = self.c = None
|
self.a = self.b = self.c = None
|
||||||
self.alpha = self.beta = self.gamma = None
|
self.alpha = self.beta = self.gamma = None
|
||||||
|
@ -285,6 +285,33 @@ class Crystal():
|
||||||
return np.linalg.inv(self.basis_real.T)
|
return np.linalg.inv(self.basis_real.T)
|
||||||
|
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lattice_points(self):
|
||||||
|
"""Return lattice points."""
|
||||||
|
_lattice_points = {
|
||||||
|
'P': [
|
||||||
|
],
|
||||||
|
'S': [
|
||||||
|
[0.5,0.5,0],
|
||||||
|
],
|
||||||
|
'I': [
|
||||||
|
[0.5,0.5,0.5],
|
||||||
|
],
|
||||||
|
'F': [
|
||||||
|
[0.0,0.5,0.5],
|
||||||
|
[0.5,0.0,0.5],
|
||||||
|
[0.5,0.5,0.0],
|
||||||
|
],
|
||||||
|
'hP': [
|
||||||
|
[2./3.,1./3.,0.5],
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.lattice is None: raise KeyError('no lattice type specified')
|
||||||
|
return np.array([[0,0,0]]
|
||||||
|
+ _lattice_points.get(self.lattice if self.lattice == 'hP' else \
|
||||||
|
self.lattice[-1],None),dtype=float)
|
||||||
|
|
||||||
def to_lattice(self,*,direction=None,plane=None):
|
def to_lattice(self,*,direction=None,plane=None):
|
||||||
"""
|
"""
|
||||||
Calculate lattice vector corresponding to crystal frame direction or plane normal.
|
Calculate lattice vector corresponding to crystal frame direction or plane normal.
|
||||||
|
@ -302,7 +329,7 @@ class Crystal():
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if (direction is not None) ^ (plane is None):
|
if (direction is not None) ^ (plane is None):
|
||||||
raise KeyError('Specify either "direction" or "plane"')
|
raise KeyError('specify either "direction" or "plane"')
|
||||||
axis,basis = (np.array(direction),self.basis_reciprocal.T) \
|
axis,basis = (np.array(direction),self.basis_reciprocal.T) \
|
||||||
if plane is None else \
|
if plane is None else \
|
||||||
(np.array(plane),self.basis_real.T)
|
(np.array(plane),self.basis_real.T)
|
||||||
|
@ -325,7 +352,7 @@ class Crystal():
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if (uvw is not None) ^ (hkl is None):
|
if (uvw is not None) ^ (hkl is None):
|
||||||
raise KeyError('Specify either "uvw" or "hkl"')
|
raise KeyError('specify either "uvw" or "hkl"')
|
||||||
axis,basis = (np.array(uvw),self.basis_real) \
|
axis,basis = (np.array(uvw),self.basis_real) \
|
||||||
if hkl is None else \
|
if hkl is None else \
|
||||||
(np.array(hkl),self.basis_reciprocal)
|
(np.array(hkl),self.basis_reciprocal)
|
||||||
|
|
|
@ -65,4 +65,17 @@ class TestCrystal:
|
||||||
alpha=alpha,beta=beta,gamma=gamma)
|
alpha=alpha,beta=beta,gamma=gamma)
|
||||||
assert np.allclose(vector,
|
assert np.allclose(vector,
|
||||||
c.to_frame(**{keyFrame:c.to_lattice(**{keyLattice:vector})}))
|
c.to_frame(**{keyFrame:c.to_lattice(**{keyLattice:vector})}))
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('lattice,a,b,c,alpha,beta,gamma,points',
|
||||||
|
[
|
||||||
|
('aP',0.5,2.0,3.0,0.8,0.5,1.2,[[0,0,0]]),
|
||||||
|
('mS',1.0,2.0,3.0,np.pi/2,0.5,np.pi/2,[[0,0,0],[0.5,0.5,0.0]]),
|
||||||
|
('oI',0.5,1.5,3.0,np.pi/2,np.pi/2,np.pi/2,[[0,0,0],[0.5,0.5,0.5]]),
|
||||||
|
('hP',1.0,1.0,1.6,np.pi/2,np.pi/2,2*np.pi/3,[[0,0,0],[2./3.,1./3.,0.5]]),
|
||||||
|
('cF',1.0,1.0,1.0,np.pi/2,np.pi/2,np.pi/2,[[0,0,0],[0.0,0.5,0.5],[0.5,0.0,0.5],[0.5,0.5,0.0]]),
|
||||||
|
])
|
||||||
|
def test_lattice_points(self,lattice,a,b,c,alpha,beta,gamma,points):
|
||||||
|
c = Crystal(lattice=lattice,
|
||||||
|
a=a,b=b,c=c,
|
||||||
|
alpha=alpha,beta=beta,gamma=gamma)
|
||||||
|
assert np.allclose(points,c.lattice_points)
|
||||||
|
|
Loading…
Reference in New Issue