Merge branch 'PythonImprovements' into pytest
This commit is contained in:
commit
ea4c4b6636
|
@ -15,11 +15,6 @@ scriptName = os.path.splitext(os.path.basename(__file__))[0]
|
||||||
scriptID = ' '.join([scriptName,damask.version])
|
scriptID = ' '.join([scriptName,damask.version])
|
||||||
|
|
||||||
|
|
||||||
def mostFrequent(arr):
|
|
||||||
unique, inverse = np.unique(arr, return_inverse=True)
|
|
||||||
return unique[np.argmax(np.bincount(inverse))]
|
|
||||||
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------------------------
|
#--------------------------------------------------------------------------------------------------
|
||||||
# MAIN
|
# MAIN
|
||||||
#--------------------------------------------------------------------------------------------------
|
#--------------------------------------------------------------------------------------------------
|
||||||
|
@ -46,9 +41,8 @@ for name in filenames:
|
||||||
|
|
||||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
|
|
||||||
damask.util.croak(geom.update(ndimage.filters.generic_filter(
|
damask.util.croak(geom.clean(options.stencil))
|
||||||
geom.microstructure,mostFrequent,
|
|
||||||
size=(options.stencil,)*3).astype(geom.microstructure.dtype)))
|
|
||||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
if name is None:
|
if name is None:
|
||||||
|
|
|
@ -38,16 +38,6 @@ parser.set_defaults(reflect = False)
|
||||||
|
|
||||||
(options, filenames) = parser.parse_args()
|
(options, filenames) = parser.parse_args()
|
||||||
|
|
||||||
if options.directions is None:
|
|
||||||
parser.error('no direction given.')
|
|
||||||
|
|
||||||
if not set(options.directions).issubset(validDirections):
|
|
||||||
invalidDirections = [str(e) for e in set(options.directions).difference(validDirections)]
|
|
||||||
parser.error('invalid directions {}. '.format(*invalidDirections))
|
|
||||||
|
|
||||||
limits = [None,None] if options.reflect else [-2,0]
|
|
||||||
|
|
||||||
|
|
||||||
if filenames == []: filenames = [None]
|
if filenames == []: filenames = [None]
|
||||||
|
|
||||||
for name in filenames:
|
for name in filenames:
|
||||||
|
@ -55,15 +45,7 @@ for name in filenames:
|
||||||
|
|
||||||
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name)
|
||||||
|
|
||||||
microstructure = geom.get_microstructure()
|
damask.util.croak(geom.mirror(options.directions,options.reflect))
|
||||||
if 'z' in options.directions:
|
|
||||||
microstructure = np.concatenate([microstructure,microstructure[:,:,limits[0]:limits[1]:-1]],2)
|
|
||||||
if 'y' in options.directions:
|
|
||||||
microstructure = np.concatenate([microstructure,microstructure[:,limits[0]:limits[1]:-1,:]],1)
|
|
||||||
if 'x' in options.directions:
|
|
||||||
microstructure = np.concatenate([microstructure,microstructure[limits[0]:limits[1]:-1,:,:]],0)
|
|
||||||
|
|
||||||
damask.util.croak(geom.update(microstructure,rescale=True))
|
|
||||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||||
|
|
||||||
if name is None:
|
if name is None:
|
||||||
|
|
|
@ -2,6 +2,7 @@ import os
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from scipy import ndimage
|
||||||
import vtk
|
import vtk
|
||||||
from vtk.util import numpy_support
|
from vtk.util import numpy_support
|
||||||
|
|
||||||
|
@ -286,7 +287,6 @@ class Geom():
|
||||||
abs(int(items[2])-int(items[0]))+1,dtype=float)
|
abs(int(items[2])-int(items[0]))+1,dtype=float)
|
||||||
else: items = list(map(float,items))
|
else: items = list(map(float,items))
|
||||||
else: items = list(map(float,items))
|
else: items = list(map(float,items))
|
||||||
|
|
||||||
microstructure[i:i+len(items)] = items
|
microstructure[i:i+len(items)] = items
|
||||||
i += len(items)
|
i += len(items)
|
||||||
|
|
||||||
|
@ -299,6 +299,7 @@ class Geom():
|
||||||
|
|
||||||
return cls(microstructure.reshape(grid),size,origin,homogenization,comments)
|
return cls(microstructure.reshape(grid),size,origin,homogenization,comments)
|
||||||
|
|
||||||
|
|
||||||
def to_file(self,fname):
|
def to_file(self,fname):
|
||||||
"""
|
"""
|
||||||
Writes a geom file.
|
Writes a geom file.
|
||||||
|
@ -317,8 +318,6 @@ class Geom():
|
||||||
self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T,
|
self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T,
|
||||||
header='\n'.join(header), fmt=format_string, comments='')
|
header='\n'.join(header), fmt=format_string, comments='')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def to_vtk(self,fname=None):
|
def to_vtk(self,fname=None):
|
||||||
"""
|
"""
|
||||||
Generates vtk file.
|
Generates vtk file.
|
||||||
|
@ -387,3 +386,51 @@ class Geom():
|
||||||
self.to_file(f)
|
self.to_file(f)
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
return ''.join(f.readlines())
|
return ''.join(f.readlines())
|
||||||
|
|
||||||
|
|
||||||
|
def mirror(self,directions,reflect=False):
|
||||||
|
"""
|
||||||
|
Mirror microstructure along given directions.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
directions : iterable containing str
|
||||||
|
direction(s) along which the microstructure is mirrored. Valid entries are 'x', 'y', 'z'.
|
||||||
|
reflect : bool, optional
|
||||||
|
reflect (include) outermost layers.
|
||||||
|
"""
|
||||||
|
valid = {'x','y','z'}
|
||||||
|
if not all(isinstance(d, str) for d in directions):
|
||||||
|
raise TypeError('Directions are not of type str.')
|
||||||
|
elif not set(directions).issubset(valid):
|
||||||
|
raise ValueError('Invalid direction specified {}'.format(*set(directions).difference(valid)))
|
||||||
|
|
||||||
|
limits = [None,None] if reflect else [-2,0]
|
||||||
|
ms = self.get_microstructure()
|
||||||
|
|
||||||
|
if 'z' in directions:
|
||||||
|
ms = np.concatenate([ms,ms[:,:,limits[0]:limits[1]:-1]],2)
|
||||||
|
if 'y' in directions:
|
||||||
|
ms = np.concatenate([ms,ms[:,limits[0]:limits[1]:-1,:]],1)
|
||||||
|
if 'x' in directions:
|
||||||
|
ms = np.concatenate([ms,ms[limits[0]:limits[1]:-1,:,:]],0)
|
||||||
|
|
||||||
|
return self.update(ms,rescale=True)
|
||||||
|
#self.add_comments('tbd')
|
||||||
|
|
||||||
|
|
||||||
|
def clean(self,stencil=3):
|
||||||
|
"""
|
||||||
|
Smooth microstructure by selecting most frequent index within given stencil at each location.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
stencil : int, optional
|
||||||
|
size of smoothing stencil.
|
||||||
|
"""
|
||||||
|
def mostFrequent(arr):
|
||||||
|
unique, inverse = np.unique(arr, return_inverse=True)
|
||||||
|
return unique[np.argmax(np.bincount(inverse))]
|
||||||
|
|
||||||
|
return self.update(ndimage.filters.generic_filter(self.microstructure,
|
||||||
|
mostFrequent,
|
||||||
|
size=(stencil,)*3).astype(self.microstructure.dtype))
|
||||||
|
#self.add_comments('tbd')
|
||||||
|
|
Loading…
Reference in New Issue