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])
|
||||
|
||||
|
||||
def mostFrequent(arr):
|
||||
unique, inverse = np.unique(arr, return_inverse=True)
|
||||
return unique[np.argmax(np.bincount(inverse))]
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------
|
||||
# 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)
|
||||
|
||||
damask.util.croak(geom.update(ndimage.filters.generic_filter(
|
||||
geom.microstructure,mostFrequent,
|
||||
size=(options.stencil,)*3).astype(geom.microstructure.dtype)))
|
||||
damask.util.croak(geom.clean(options.stencil))
|
||||
|
||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||
|
||||
if name is None:
|
||||
|
|
|
@ -38,16 +38,6 @@ parser.set_defaults(reflect = False)
|
|||
|
||||
(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]
|
||||
|
||||
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)
|
||||
|
||||
microstructure = geom.get_microstructure()
|
||||
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))
|
||||
damask.util.croak(geom.mirror(options.directions,options.reflect))
|
||||
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
|
||||
|
||||
if name is None:
|
||||
|
|
|
@ -2,6 +2,7 @@ import os
|
|||
from io import StringIO
|
||||
|
||||
import numpy as np
|
||||
from scipy import ndimage
|
||||
import vtk
|
||||
from vtk.util import numpy_support
|
||||
|
||||
|
@ -286,7 +287,6 @@ class Geom():
|
|||
abs(int(items[2])-int(items[0]))+1,dtype=float)
|
||||
else: items = list(map(float,items))
|
||||
else: items = list(map(float,items))
|
||||
|
||||
microstructure[i:i+len(items)] = items
|
||||
i += len(items)
|
||||
|
||||
|
@ -299,6 +299,7 @@ class Geom():
|
|||
|
||||
return cls(microstructure.reshape(grid),size,origin,homogenization,comments)
|
||||
|
||||
|
||||
def to_file(self,fname):
|
||||
"""
|
||||
Writes a geom file.
|
||||
|
@ -317,8 +318,6 @@ class Geom():
|
|||
self.microstructure.reshape([grid[0],np.prod(grid[1:])],order='F').T,
|
||||
header='\n'.join(header), fmt=format_string, comments='')
|
||||
|
||||
|
||||
|
||||
def to_vtk(self,fname=None):
|
||||
"""
|
||||
Generates vtk file.
|
||||
|
@ -387,3 +386,51 @@ class Geom():
|
|||
self.to_file(f)
|
||||
f.seek(0)
|
||||
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