diff --git a/processing/pre/geom_clean.py b/processing/pre/geom_clean.py index aeafe4f09..7ee87fe0a 100755 --- a/processing/pre/geom_clean.py +++ b/processing/pre/geom_clean.py @@ -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: diff --git a/processing/pre/geom_mirror.py b/processing/pre/geom_mirror.py index 67bd2366f..3f9755818 100755 --- a/processing/pre/geom_mirror.py +++ b/processing/pre/geom_mirror.py @@ -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: diff --git a/python/damask/geom.py b/python/damask/geom.py index 5bf4f7750..640203be1 100644 --- a/python/damask/geom.py +++ b/python/damask/geom.py @@ -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 @@ -385,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')