Merge branch 'development' into vector-mechanics
This commit is contained in:
commit
24fabdec22
|
@ -15,7 +15,7 @@ scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
||||||
scriptID = ' '.join([scriptName,damask.version])
|
scriptID = ' '.join([scriptName,damask.version])
|
||||||
|
|
||||||
|
|
||||||
getInterfaceEnergy = lambda A,B: np.float32((A*B != 0)*(A != B)*1.0) # 1.0 if A & B are distinct & nonzero, 0.0 otherwise
|
getInterfaceEnergy = lambda A,B: np.float32((A != B)*1.0) # 1.0 if A & B are distinct, 0.0 otherwise
|
||||||
struc = ndimage.generate_binary_structure(3,1) # 3D von Neumann neighborhood
|
struc = ndimage.generate_binary_structure(3,1) # 3D von Neumann neighborhood
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ if filenames == []: filenames = [None]
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
damask.util.report(scriptName,name)
|
damask.util.report(scriptName,name)
|
||||||
|
|
||||||
geom = damask.Geom.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.load(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
|
|
||||||
grid_original = geom.grid
|
grid_original = geom.grid
|
||||||
damask.util.croak(geom)
|
damask.util.croak(geom)
|
||||||
|
@ -174,4 +174,4 @@ for name in filenames:
|
||||||
origin = geom.origin,
|
origin = geom.origin,
|
||||||
comments = geom.comments + [scriptID + ' ' + ' '.join(sys.argv[1:])],
|
comments = geom.comments + [scriptID + ' ' + ' '.join(sys.argv[1:])],
|
||||||
)\
|
)\
|
||||||
.save_ASCII(sys.stdout if name is None else name)
|
.save(sys.stdout if name is None else name)
|
||||||
|
|
|
@ -11,8 +11,6 @@ import numpy as np
|
||||||
|
|
||||||
import damask
|
import damask
|
||||||
|
|
||||||
sys.path.append(str(damask.solver.Marc().library_path))
|
|
||||||
|
|
||||||
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
||||||
scriptID = ' '.join([scriptName,damask.version])
|
scriptID = ' '.join([scriptName,damask.version])
|
||||||
|
|
||||||
|
@ -235,6 +233,7 @@ if remote and filenames != []:
|
||||||
if filenames == []: filenames = [None]
|
if filenames == []: filenames = [None]
|
||||||
|
|
||||||
if remote:
|
if remote:
|
||||||
|
sys.path.append(str(damask.solver.Marc().library_path))
|
||||||
import py_mentat
|
import py_mentat
|
||||||
|
|
||||||
damask.util.report(scriptName, 'waiting to connect...')
|
damask.util.report(scriptName, 'waiting to connect...')
|
||||||
|
|
|
@ -9,7 +9,6 @@ import damask
|
||||||
|
|
||||||
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
||||||
scriptID = ' '.join([scriptName,damask.version])
|
scriptID = ' '.join([scriptName,damask.version])
|
||||||
sys.path.append(str(damask.solver.Marc().library_path))
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------------------------
|
||||||
def outMentat(cmd,locals):
|
def outMentat(cmd,locals):
|
||||||
|
@ -185,9 +184,10 @@ parser.set_defaults(port = None,
|
||||||
|
|
||||||
if options.port is not None:
|
if options.port is not None:
|
||||||
try:
|
try:
|
||||||
|
sys.path.append(str(damask.solver.Marc().library_path))
|
||||||
import py_mentat
|
import py_mentat
|
||||||
except ImportError:
|
except ImportError:
|
||||||
parser.error('no valid Mentat release found.')
|
parser.error('no valid Mentat release found')
|
||||||
|
|
||||||
# --- loop over input files ------------------------------------------------------------------------
|
# --- loop over input files ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ if filenames == []: filenames = [None]
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
damask.util.report(scriptName,name)
|
damask.util.report(scriptName,name)
|
||||||
|
|
||||||
geom = damask.Geom.load_ASCII(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.load(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
material = geom.material.flatten(order='F')
|
material = geom.material.flatten(order='F')
|
||||||
|
|
||||||
cmds = [\
|
cmds = [\
|
||||||
|
|
|
@ -213,9 +213,8 @@ class Geom:
|
||||||
if not keyword.startswith('head') or header_length < 3:
|
if not keyword.startswith('head') or header_length < 3:
|
||||||
raise TypeError('Header length information missing or invalid')
|
raise TypeError('Header length information missing or invalid')
|
||||||
|
|
||||||
content = f.readlines()
|
|
||||||
|
|
||||||
comments = []
|
comments = []
|
||||||
|
content = f.readlines()
|
||||||
for i,line in enumerate(content[:header_length]):
|
for i,line in enumerate(content[:header_length]):
|
||||||
items = line.split('#')[0].lower().strip().split()
|
items = line.split('#')[0].lower().strip().split()
|
||||||
key = items[0] if items else ''
|
key = items[0] if items else ''
|
||||||
|
@ -247,7 +246,7 @@ class Geom:
|
||||||
raise TypeError(f'Invalid file: expected {grid.prod()} entries, found {i}')
|
raise TypeError(f'Invalid file: expected {grid.prod()} entries, found {i}')
|
||||||
|
|
||||||
if not np.any(np.mod(material,1) != 0.0): # no float present
|
if not np.any(np.mod(material,1) != 0.0): # no float present
|
||||||
material = material.astype('int')
|
material = material.astype('int') - (1 if material.min() > 0 else 0)
|
||||||
|
|
||||||
return Geom(material.reshape(grid,order='F'),size,origin,comments)
|
return Geom(material.reshape(grid,order='F'),size,origin,comments)
|
||||||
|
|
||||||
|
@ -510,7 +509,7 @@ class Geom:
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
fname : str or or pathlib.Path
|
fname : str or pathlib.Path
|
||||||
Filename to write. Valid extension is .vtr, it will be appended if not given.
|
Filename to write. Valid extension is .vtr, it will be appended if not given.
|
||||||
compress : bool, optional
|
compress : bool, optional
|
||||||
Compress with zlib algorithm. Defaults to True.
|
Compress with zlib algorithm. Defaults to True.
|
||||||
|
|
|
@ -803,7 +803,7 @@ class Orientation(Rotation):
|
||||||
return np.all(components >= 0.0,axis=-1)
|
return np.all(components >= 0.0,axis=-1)
|
||||||
|
|
||||||
|
|
||||||
def IPF_color(self,vector,proper=False):
|
def IPF_color(self,vector,in_SST=True,proper=False):
|
||||||
"""
|
"""
|
||||||
Map vector to RGB color within standard stereographic triangle of own symmetry.
|
Map vector to RGB color within standard stereographic triangle of own symmetry.
|
||||||
|
|
||||||
|
@ -811,6 +811,9 @@ class Orientation(Rotation):
|
||||||
----------
|
----------
|
||||||
vector : numpy.ndarray of shape (...,3)
|
vector : numpy.ndarray of shape (...,3)
|
||||||
Vector to colorize.
|
Vector to colorize.
|
||||||
|
in_SST : bool, optional
|
||||||
|
Consider symmetrically equivalent orientations such that poles are located in SST.
|
||||||
|
Defaults to True.
|
||||||
proper : bool, optional
|
proper : bool, optional
|
||||||
Consider only vectors with z >= 0, hence combine two neighboring SSTs (with mirrored colors).
|
Consider only vectors with z >= 0, hence combine two neighboring SSTs (with mirrored colors).
|
||||||
Defaults to False.
|
Defaults to False.
|
||||||
|
@ -825,7 +828,7 @@ class Orientation(Rotation):
|
||||||
Inverse pole figure color of the e_3 direction for a crystal in "Cube" orientation with cubic symmetry:
|
Inverse pole figure color of the e_3 direction for a crystal in "Cube" orientation with cubic symmetry:
|
||||||
|
|
||||||
>>> o = damask.Orientation(lattice='cubic')
|
>>> o = damask.Orientation(lattice='cubic')
|
||||||
>>> o.IPF_color(o.to_SST([0,0,1]))
|
>>> o.IPF_color([0,0,1])
|
||||||
array([1., 0., 0.])
|
array([1., 0., 0.])
|
||||||
|
|
||||||
References
|
References
|
||||||
|
@ -1076,7 +1079,7 @@ class Orientation(Rotation):
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def Bravais_to_Miller(cls,uvtw=None,hkil=None):
|
def Bravais_to_Miller(cls,*,uvtw=None,hkil=None):
|
||||||
"""
|
"""
|
||||||
Transform 4 Miller–Bravais indices to 3 Miller indices of crystal direction [uvw] or plane normal (hkl).
|
Transform 4 Miller–Bravais indices to 3 Miller indices of crystal direction [uvw] or plane normal (hkl).
|
||||||
|
|
||||||
|
@ -1104,7 +1107,7 @@ class Orientation(Rotation):
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def Miller_to_Bravais(cls,uvw=None,hkl=None):
|
def Miller_to_Bravais(cls,*,uvw=None,hkl=None):
|
||||||
"""
|
"""
|
||||||
Transform 3 Miller indices to 4 Miller–Bravais indices of crystal direction [uvtw] or plane normal (hkil).
|
Transform 3 Miller indices to 4 Miller–Bravais indices of crystal direction [uvtw] or plane normal (hkil).
|
||||||
|
|
||||||
|
@ -1133,7 +1136,7 @@ class Orientation(Rotation):
|
||||||
return np.einsum('il,...l',basis,axis)
|
return np.einsum('il,...l',basis,axis)
|
||||||
|
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
@ -1157,7 +1160,7 @@ class Orientation(Rotation):
|
||||||
return np.einsum('il,...l',basis,axis)
|
return np.einsum('il,...l',basis,axis)
|
||||||
|
|
||||||
|
|
||||||
def to_frame(self,uvw=None,hkl=None,with_symmetry=False):
|
def to_frame(self,*,uvw=None,hkl=None,with_symmetry=False):
|
||||||
"""
|
"""
|
||||||
Calculate crystal frame vector along lattice direction [uvw] or plane normal (hkl).
|
Calculate crystal frame vector along lattice direction [uvw] or plane normal (hkl).
|
||||||
|
|
||||||
|
@ -1185,7 +1188,7 @@ class Orientation(Rotation):
|
||||||
np.einsum('il,...l',basis,axis))
|
np.einsum('il,...l',basis,axis))
|
||||||
|
|
||||||
|
|
||||||
def to_pole(self,uvw=None,hkl=None,with_symmetry=False):
|
def to_pole(self,*,uvw=None,hkl=None,with_symmetry=False):
|
||||||
"""
|
"""
|
||||||
Calculate lab frame vector along lattice direction [uvw] or plane normal (hkl).
|
Calculate lab frame vector along lattice direction [uvw] or plane normal (hkl).
|
||||||
|
|
||||||
|
|
|
@ -747,7 +747,7 @@ class Result:
|
||||||
'hex':'hP'}[q['meta']['Lattice']])
|
'hex':'hP'}[q['meta']['Lattice']])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'data': np.uint8(o.IPF_color(o.to_SST(l))*255),
|
'data': np.uint8(o.IPF_color(l)*255),
|
||||||
'label': 'IPFcolor_[{} {} {}]'.format(*m),
|
'label': 'IPFcolor_[{} {} {}]'.format(*m),
|
||||||
'meta' : {
|
'meta' : {
|
||||||
'Unit': '8-bit RGB',
|
'Unit': '8-bit RGB',
|
||||||
|
|
|
@ -74,6 +74,7 @@ class TestGeom:
|
||||||
|
|
||||||
def test_save_load_ASCII(self,default,tmp_path):
|
def test_save_load_ASCII(self,default,tmp_path):
|
||||||
default.save_ASCII(tmp_path/'ASCII')
|
default.save_ASCII(tmp_path/'ASCII')
|
||||||
|
default.material -= 1
|
||||||
assert geom_equal(Geom.load_ASCII(tmp_path/'ASCII'),default)
|
assert geom_equal(Geom.load_ASCII(tmp_path/'ASCII'),default)
|
||||||
|
|
||||||
def test_invalid_origin(self,default):
|
def test_invalid_origin(self,default):
|
||||||
|
|
|
@ -231,11 +231,11 @@ class TestOrientation:
|
||||||
@pytest.mark.parametrize('shape',[(1),(2,3),(4,3,2)])
|
@pytest.mark.parametrize('shape',[(1),(2,3),(4,3,2)])
|
||||||
@pytest.mark.parametrize('vector',np.array([[1,0,0],[1,2,3],[-1,1,-1]]))
|
@pytest.mark.parametrize('vector',np.array([[1,0,0],[1,2,3],[-1,1,-1]]))
|
||||||
@pytest.mark.parametrize('proper',[True,False])
|
@pytest.mark.parametrize('proper',[True,False])
|
||||||
def test_IPF_color_vectorization(self,lattice,shape,vector,proper):
|
@pytest.mark.parametrize('in_SST',[True,False])
|
||||||
|
def test_IPF_color_vectorization(self,lattice,shape,vector,proper,in_SST):
|
||||||
o = Orientation.from_random(lattice=lattice,shape=shape)
|
o = Orientation.from_random(lattice=lattice,shape=shape)
|
||||||
poles = o.to_SST(vector=vector,proper=proper)
|
for r, theO in zip(o.IPF_color(vector,in_SST=in_SST,proper=proper).reshape((-1,3)),o.flatten()):
|
||||||
for r, theO in zip(o.IPF_color(poles,proper=proper).reshape((-1,3)),o.flatten()):
|
assert np.allclose(r,theO.IPF_color(vector,in_SST=in_SST,proper=proper))
|
||||||
assert np.allclose(r,theO.IPF_color(theO.to_SST(vector=vector,proper=proper),proper=proper))
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('lattice',Orientation.crystal_families)
|
@pytest.mark.parametrize('lattice',Orientation.crystal_families)
|
||||||
@pytest.mark.parametrize('a,b',[
|
@pytest.mark.parametrize('a,b',[
|
||||||
|
@ -263,14 +263,14 @@ class TestOrientation:
|
||||||
cube = Orientation(lattice='cubic')
|
cube = Orientation(lattice='cubic')
|
||||||
for direction in set(permutations(np.array(color['direction']))):
|
for direction in set(permutations(np.array(color['direction']))):
|
||||||
assert np.allclose(np.array(color['RGB']),
|
assert np.allclose(np.array(color['RGB']),
|
||||||
cube.IPF_color(cube.to_SST(vector=np.array(direction),proper=proper),proper=proper))
|
cube.IPF_color(vector=np.array(direction),proper=proper))
|
||||||
|
|
||||||
@pytest.mark.parametrize('lattice',Orientation.crystal_families)
|
@pytest.mark.parametrize('lattice',Orientation.crystal_families)
|
||||||
@pytest.mark.parametrize('proper',[True,False])
|
@pytest.mark.parametrize('proper',[True,False])
|
||||||
def test_IPF_equivalent(self,set_of_quaternions,lattice,proper):
|
def test_IPF_equivalent(self,set_of_quaternions,lattice,proper):
|
||||||
direction = np.random.random(3)*2.0-1.0
|
direction = np.random.random(3)*2.0-1.0
|
||||||
o = Orientation(rotation=set_of_quaternions,lattice=lattice).equivalent
|
o = Orientation(rotation=set_of_quaternions,lattice=lattice).equivalent
|
||||||
color = o.IPF_color(o.to_SST(vector=direction,proper=proper),proper=proper)
|
color = o.IPF_color(vector=direction,proper=proper)
|
||||||
assert np.allclose(np.broadcast_to(color[0,...],color.shape),color)
|
assert np.allclose(np.broadcast_to(color[0,...],color.shape),color)
|
||||||
|
|
||||||
@pytest.mark.parametrize('lattice',Orientation.crystal_families)
|
@pytest.mark.parametrize('lattice',Orientation.crystal_families)
|
||||||
|
|
|
@ -178,7 +178,7 @@ class TestResult:
|
||||||
lattice={'fcc':'cF',
|
lattice={'fcc':'cF',
|
||||||
'bcc':'cI',
|
'bcc':'cI',
|
||||||
'hex':'hP'}[crystal_structure])
|
'hex':'hP'}[crystal_structure])
|
||||||
in_memory = np.uint8(c.IPF_color(c.to_SST(np.array(d)))*255)
|
in_memory = np.uint8(c.IPF_color(np.array(d))*255)
|
||||||
in_file = default.read_dataset(loc['color'])
|
in_file = default.read_dataset(loc['color'])
|
||||||
assert np.allclose(in_memory,in_file)
|
assert np.allclose(in_memory,in_file)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue