From 3231a491073c26bfba26a87bb3bae6c491569aa1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 24 May 2020 09:06:42 +0200 Subject: [PATCH] centralize functionality --- processing/pre/geom_canvas.py | 27 ++++---------- processing/pre/geom_renumber.py | 12 +++---- processing/pre/geom_rotate.py | 60 +++++++++++--------------------- processing/pre/geom_translate.py | 22 +++++------- python/damask/_geom.py | 52 +++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 81 deletions(-) diff --git a/processing/pre/geom_canvas.py b/processing/pre/geom_canvas.py index edd5fe622..b309364e8 100755 --- a/processing/pre/geom_canvas.py +++ b/processing/pre/geom_canvas.py @@ -40,35 +40,22 @@ parser.add_option('-f','--fill', parser.set_defaults(offset = (0,0,0)) (options, filenames) = parser.parse_args() - - if filenames == []: filenames = [None] + for name in filenames: damask.util.report(scriptName,name) geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - origin = geom.get_origin() - size = geom.get_size() - old = new = geom.get_grid() offset = np.asarray(options.offset) if options.grid is not None: - new = np.maximum(1, - np.array([int(o*float(n.lower().replace('x',''))) if n.lower().endswith('x') \ - else int(n) for o,n in zip(old,options.grid)],dtype=int)) + grid = np.maximum(1, + np.array([int(o*float(n.lower().replace('x',''))) if n.lower().endswith('x') \ + else int(n) for o,n in zip(geom.grid,options.grid)],dtype=int)) + else: + grid = np.array(options.grid,dtype=int) - canvas = np.full(new,options.fill if options.fill is not None - else np.nanmax(geom.microstructure)+1,geom.microstructure.dtype) - - l = np.clip( offset, 0,np.minimum(old +offset,new)) # noqa - r = np.clip( offset+old,0,np.minimum(old*2+offset,new)) - L = np.clip(-offset, 0,np.minimum(new -offset,old)) - R = np.clip(-offset+new,0,np.minimum(new*2-offset,old)) - canvas[l[0]:r[0],l[1]:r[1],l[2]:r[2]] = geom.microstructure[L[0]:R[0],L[1]:R[1],L[2]:R[2]] - - - damask.util.croak(geom.update(canvas,origin=origin+offset*size/old,rescale=True)) + damask.util.croak(geom.canvas(grid,np.asarray(options.offset),options.fill)) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_renumber.py b/processing/pre/geom_renumber.py index 6e51062a5..8eab9064a 100755 --- a/processing/pre/geom_renumber.py +++ b/processing/pre/geom_renumber.py @@ -22,14 +22,12 @@ Renumber sorted microstructure indices to 1,...,N. """, version=scriptID) (options, filenames) = parser.parse_args() - - if filenames == []: filenames = [None] for name in filenames: - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) - geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - damask.util.croak(geom.renumber()) - geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - geom.to_file(sys.stdout if name is None else name,pack=False) + geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) + damask.util.croak(geom.renumber()) + geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_rotate.py b/processing/pre/geom_rotate.py index dc2e8e2a3..bbfeceb0b 100755 --- a/processing/pre/geom_rotate.py +++ b/processing/pre/geom_rotate.py @@ -52,47 +52,27 @@ parser.add_option('-f', '--fill', parser.set_defaults(degrees = False) (options, filenames) = parser.parse_args() - -if [options.rotation,options.eulers,options.matrix,options.quaternion].count(None) < 3: - parser.error('more than one rotation specified.') -if [options.rotation,options.eulers,options.matrix,options.quaternion].count(None) > 3: - parser.error('no rotation specified.') - -if options.quaternion is not None: - rot = damask.Rotation.from_quaternion(np.array(options.quaternion)) # we might need P=+1 here, too... -if options.rotation is not None: - rot = damask.Rotation.from_axis_angle(np.array(options.rotation),degrees=options.degrees,normalise=True,P=+1) -if options.matrix is not None: - rot = damask.Rotation.from_matrix(np.array(options.Matrix)) -if options.eulers is not None: - rot = damask.Rotation.from_Eulers(np.array(options.eulers),degrees=options.degrees) - -eulers = rot.as_Eulers(degrees=True) - - if filenames == []: filenames = [None] +if [options.rotation,options.eulers,options.matrix,options.quaternion].count(None) < 3: + parser.error('more than one rotation specified.') +if [options.rotation,options.eulers,options.matrix,options.quaternion].count(None) > 3: + parser.error('no rotation specified.') + +if options.quaternion is not None: + rot = damask.Rotation.from_quaternion(np.array(options.quaternion)) # we might need P=+1 here, too... +if options.rotation is not None: + rot = damask.Rotation.from_axis_angle(np.array(options.rotation),degrees=options.degrees,normalise=True,P=+1) +if options.matrix is not None: + rot = damask.Rotation.from_matrix(np.array(options.Matrix)) +if options.eulers is not None: + rot = damask.Rotation.from_Eulers(np.array(options.eulers),degrees=options.degrees) + + for name in filenames: - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) - geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - size = geom.get_size() - grid = geom.get_grid() - origin = geom.get_origin() - microstructure = geom.get_microstructure() - fill = np.nanmax(microstructure)+1 if options.fill is None else options.fill - dtype = float if np.isnan(fill) or int(fill) != fill or microstructure.dtype==np.float else int - - # These rotations are always applied in the reference coordinate system, i.e. (z,x,z) not (z,x',z'') - # this seems to be ok, see https://www.cs.utexas.edu/~theshark/courses/cs354/lectures/cs354-14.pdf - microstructure = ndimage.rotate(microstructure,eulers[2],(0,1),order=0, - prefilter=False,output=dtype,cval=fill) # rotation around z - microstructure = ndimage.rotate(microstructure,eulers[1],(1,2),order=0, - prefilter=False,output=dtype,cval=fill) # rotation around x - microstructure = ndimage.rotate(microstructure,eulers[0],(0,1),order=0, - prefilter=False,output=dtype,cval=fill) # rotation around z - - damask.util.croak(geom.update(microstructure,origin=origin-(np.asarray(microstructure.shape)-grid)/2*size/grid,rescale=True)) - geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - - geom.to_file(sys.stdout if name is None else name,pack=False) + geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) + damask.util.croak(geom.rotate(rot,options.fill)) + geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/processing/pre/geom_translate.py b/processing/pre/geom_translate.py index 1d08c23dc..25164b794 100755 --- a/processing/pre/geom_translate.py +++ b/processing/pre/geom_translate.py @@ -40,22 +40,16 @@ parser.set_defaults(origin = (0.0,0.0,0.0), ) (options, filenames) = parser.parse_args() +if filenames == []: filenames = [None] sub = list(map(int,options.substitute)) - -if filenames == []: filenames = [None] - for name in filenames: - damask.util.report(scriptName,name) + damask.util.report(scriptName,name) - geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) - - substituted = geom.get_microstructure() - for old,new in zip(sub[0::2],sub[1::2]): substituted[geom.microstructure==old] = new # substitute microstructure indices - substituted += options.microstructure # constant shift - - damask.util.croak(geom.update(substituted,origin=geom.get_origin()+options.origin)) - geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) - - geom.to_file(sys.stdout if name is None else name,pack=False) + geom = damask.Geom.from_file(StringIO(''.join(sys.stdin.read())) if name is None else name) + geom.renumber(sub[0::2],sub[1::2],origin=geom.origin+options.origin) + geom.microstructure+= option.microstructure + damask.util.croak(geom) + geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) + geom.to_file(sys.stdout if name is None else name,pack=False) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index 892000b7c..bfba3465b 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -10,6 +10,7 @@ from . import VTK from . import util from . import Environment from . import grid_filters +from . import Rotation class Geom: @@ -581,3 +582,54 @@ class Geom: #self.add_comments('geom.py:renumber v{}'.format(version) return self.update(renumbered) + + + def rotate(self,R,fill=None): + """Rotate microstructure (pad if required).""" + if fill is None: fill = np.nanmax(self.microstructure) + 1 + dtype = float if np.isnan(fill) or int(fill) != fill or self.microstructure.dtype==np.float else int + + Eulers = R.as_Eulers(degrees=True) + # These rotations are always applied in the reference coordinate system, i.e. (z,x,z) not (z,x',z'') + # this seems to be ok, see https://www.cs.utexas.edu/~theshark/courses/cs354/lectures/cs354-14.pdf + microstructure = ndimage.rotate(self.microstructure,Eulers[2],(0,1),order=0, + prefilter=False,output=dtype,cval=fill) # rotation around z + microstructure = ndimage.rotate(microstructure,Eulers[1],(1,2),order=0, + prefilter=False,output=dtype,cval=fill) # rotation around x + microstructure = ndimage.rotate(microstructure,Eulers[0],(0,1),order=0, + prefilter=False,output=dtype,cval=fill) # rotation around z + + origin = self.origin-(np.asarray(microstructure.shape)-self.grid)//2 * self.size/self.grid + + #self.add_comments('geom.py:renumber v{}'.format(version) + return self.update(microstructure,origin=origin,rescale=True) + + + def canvas(self,grid=None,offset=None,fill=None): + """Rotate microstructure (pad if required).""" + if fill is None: fill = np.nanmax(self.microstructure) + 1 + dtype = float if np.isnan(fill) or int(fill) != fill or self.microstructure.dtype==np.float else int + + canvas = np.full(self.grid if grid is None else grid, + fill if fill is not None else np.nanmax(self.microstructure)+1, + self.microstructure.dtype) + if offset is None: offset = 0 + + l = np.clip( offset, 0,np.minimum(self.grid +offset,grid)) # noqa + r = np.clip( offset+self.grid,0,np.minimum(self.grid*2+offset,grid)) + L = np.clip(-offset, 0,np.minimum(grid -offset,self.grid)) + R = np.clip(-offset+grid, 0,np.minimum(grid*2 -offset,self.grid)) + + canvas[l[0]:r[0],l[1]:r[1],l[2]:r[2]] = self.microstructure[L[0]:R[0],L[1]:R[1],L[2]:R[2]] + + #self.add_comments('geom.py:renumber v{}'.format(version) + return self.update(canvas,origin=self.origin+offset*self.size/self.grid,rescale=True) + + + def substitute(self,from_microstructure,to_microstructure): + """Substitude microstructure indices.""" + substituted = self.get_microstructure() + for from_ms,to_ms in zip(from_microstructure,to_microstructure): + substituted[self.microstructure==from_ms] = to_ms + + return self.update(substituted)