explicit loop for simpler code

- no invalid combintations any more (allow to move the original
microstructure out of the new canvas)
- handling of origin needs discussion. When we want to recover the old
behavior, the origin might be located outside of the new geometry
This commit is contained in:
Martin Diehl 2019-05-30 10:54:33 +02:00
parent e974bb9c43
commit 49c3903cc7
1 changed files with 32 additions and 56 deletions

View File

@ -1,52 +1,46 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: UTF-8 no BOM -*-
import os import os
import sys import sys
import numpy as np
import damask
from io import StringIO from io import StringIO
from optparse import OptionParser from optparse import OptionParser
import numpy as np
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])
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# MAIN # MAIN
# -------------------------------------------------------------------- # --------------------------------------------------------------------
parser = OptionParser(option_class=damask.extendableOption, usage='%prog option(s) [geomfile(s)]', description = """ parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [geomfile(s)]', description = """
Changes the (three-dimensional) canvas of a spectral geometry description. Increases or decreases the (three-dimensional) canvas.
Grid can be given as absolute or relative values, e.g. 16 16 16 or 2x 0.5x 32. Grid can be given as absolute or relative values, e.g. 16 16 16 or 2x 0.5x 32.
""", version = scriptID) """, version = scriptID)
parser.add_option('-g', parser.add_option('-g','--grid',
'--grid',
dest = 'grid', dest = 'grid',
type = 'string', nargs = 3, metavar = ' '.join(['string']*3), type = 'string', nargs = 3, metavar = ' '.join(['string']*3),
help = 'a,b,c grid of hexahedral box. [auto]') help = 'a,b,c grid of hexahedral box')
parser.add_option('-o', parser.add_option('-o','--offset',
'--offset',
dest = 'offset', dest = 'offset',
type = 'int', nargs = 3, metavar = ' '.join(['int']*3), type = 'int', nargs = 3, metavar = ' '.join(['int']*3),
help = 'a,b,c offset from old to new origin of grid [%default]') help = 'a,b,c offset from old to new origin of grid [%default]')
parser.add_option('-f', parser.add_option('-f','--fill',
'--fill',
dest = 'fill', dest = 'fill',
type = 'float', metavar = 'float', type = 'float', metavar = 'int',
help = '(background) canvas grain index. "0" selects maximum microstructure index + 1 [%default]') help = 'background microstructure index, defaults to max microstructure index + 1')
parser.set_defaults(grid = ['0','0','0'], parser.set_defaults(offset = (0,0,0))
offset = (0,0,0),
)
(options, filenames) = parser.parse_args() (options, filenames) = parser.parse_args()
# --- loop over input files -------------------------------------------------------------------------
if filenames == []: filenames = [None] if filenames == []: filenames = [None]
for name in filenames: for name in filenames:
@ -55,44 +49,26 @@ 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)
grid = geom.get_grid() grid = geom.get_grid()
size = geom.get_size() if options.grid is not None:
origin = geom.get_origin() grid = np.array([int(o*float(n.lower().replace('x',''))) if n.lower().endswith('x') \
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
# --- do work ------------------------------------------------------------------------------------
new_grid = np.array([int(o*float(n.lower().replace('x',''))) if n.lower().endswith('x') \
else int(n) for o,n in zip(grid,options.grid)],dtype=int) else int(n) for o,n in zip(grid,options.grid)],dtype=int)
new_grid = np.where(new_grid > 0, new_grid,grid) grid = np.maximum(grid,1)
microstructure_cropped = np.zeros(new_grid,dtype=dtype) new = np.full(grid,options.fill if options.fill is not None
microstructure_cropped.fill(fill) else np.nanmax(geom.microstructure)+1,geom.microstructure.dtype)
xindex = np.arange(max(options.offset[0],0),min(options.offset[0]+new_grid[0],grid[0])) for x in range(geom.microstructure.shape[0]):
yindex = np.arange(max(options.offset[1],0),min(options.offset[1]+new_grid[1],grid[1])) X = x + options.offset[0]
zindex = np.arange(max(options.offset[2],0),min(options.offset[2]+new_grid[2],grid[2])) if not 0 <= X < new.shape[0]: continue
translate_x = [i - options.offset[0] for i in xindex] for y in range(geom.microstructure.shape[1]):
translate_y = [i - options.offset[1] for i in yindex] Y = y + options.offset[1]
translate_z = [i - options.offset[2] for i in zindex] if not 0 <= Y < new.shape[1]: continue
if 0 in map(len,[xindex,yindex,zindex,translate_x,translate_y,translate_z]): for z in range(geom.microstructure.shape[2]):
damask.util.croak('invaldid combination of grid and offset.') Z = z + options.offset[2]
continue if not 0 <= Z < new.shape[2]: continue
microstructure_cropped[min(translate_x):max(translate_x)+1, new[X,Y,Z] = geom.microstructure[x,y,z]
min(translate_y):max(translate_y)+1,
min(translate_z):max(translate_z)+1] \
= microstructure[min(xindex):max(xindex)+1,
min(yindex):max(yindex)+1,
min(zindex):max(zindex)+1]
new_size = size/grid*new_grid if np.all(grid > 0) else new_grid damask.util.croak(geom.update(new,origin=(0,0,0),rescale=True))
new_origin = origin + (size/grid if np.all(grid > 0) else new_size/new_grid) * options.offset
damask.util.croak(geom.update(microstructure=microstructure_cropped,
size=new_size,
origin=new_origin,
))
geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:])) geom.add_comments(scriptID + ' ' + ' '.join(sys.argv[1:]))
if name is None: if name is None: