diff --git a/processing/pre/geom_fromVoronoiTessellation.py b/processing/pre/geom_fromVoronoiTessellation.py index 569c181c5..8b88c3321 100755 --- a/processing/pre/geom_fromVoronoiTessellation.py +++ b/processing/pre/geom_fromVoronoiTessellation.py @@ -112,84 +112,92 @@ Generate geometry description and material configuration by standard Voronoi tes group = OptionGroup(parser, "Tessellation","") -group.add_option('-l', '--laguerre', - dest = 'laguerre', - action = 'store_true', - help = 'use Laguerre (weighted Voronoi) tessellation') +group.add_option('-l', + '--laguerre', + dest = 'laguerre', + action = 'store_true', + help = 'use Laguerre (weighted Voronoi) tessellation') group.add_option('--cpus', - dest = 'cpus', - type = 'int', metavar = 'int', - help = 'number of parallel processes to use for Laguerre tessellation [%default]') + dest = 'cpus', + type = 'int', metavar = 'int', + help = 'number of parallel processes to use for Laguerre tessellation [%default]') group.add_option('--nonperiodic', - dest = 'nonperiodic', - action = 'store_true', - help = 'use nonperiodic tessellation') + dest = 'nonperiodic', + action = 'store_true', + help = 'nonperiodic tessellation') parser.add_option_group(group) group = OptionGroup(parser, "Geometry","") -group.add_option('-g', '--grid', - dest = 'grid', - type = 'int', nargs = 3, metavar = ' '.join(['int']*3), - help = 'a,b,c grid of hexahedral box [auto]') -group.add_option('-s', '--size', - dest = 'size', - type = 'float', nargs = 3, metavar=' '.join(['float']*3), - help = 'x,y,z size of hexahedral box [auto]') -group.add_option('-o', '--origin', - dest = 'origin', - type = 'float', nargs = 3, metavar=' '.join(['float']*3), - help = 'origin of grid') +group.add_option('-g', + '--grid', + dest = 'grid', + type = 'int', nargs = 3, metavar = ' '.join(['int']*3), + help = 'a,b,c grid of hexahedral box [auto]') +group.add_option('-s', + '--size', + dest = 'size', + type = 'float', nargs = 3, metavar=' '.join(['float']*3), + help = 'x,y,z size of hexahedral box [auto]') +group.add_option('-o', + '--origin', + dest = 'origin', + type = 'float', nargs = 3, metavar=' '.join(['float']*3), + help = 'origin of grid') parser.add_option_group(group) group = OptionGroup(parser, "Seeds","") -group.add_option('-p', '--position', - dest = 'position', +group.add_option('-p', + '--pos', '--seedposition', + dest = 'pos', type = 'string', metavar = 'string', - help = 'column label for seed positions [%default]') -group.add_option('-w', '--weight', - dest = 'weight', - type = 'string', metavar = 'string', - help = 'column label for seed weights [%default]') -group.add_option('-m', '--microstructure', - dest = 'microstructure', - type = 'string', metavar = 'string', - help = 'column label for seed microstructures [%default]') -group.add_option('-e', '--eulers', - dest = 'eulers', - type = 'string', metavar = 'string', - help = 'column label for seed Euler angles [%default]') + help = 'label of coordinates [%default]') +group.add_option('-w', + '--weight', + dest = 'weight', + type = 'string', metavar = 'string', + help = 'label of weights [%default]') +group.add_option('-m', + '--microstructure', + dest = 'microstructure', + type = 'string', metavar = 'string', + help = 'label of microstructures [%default]') +group.add_option('-e', + '--eulers', + dest = 'eulers', + type = 'string', metavar = 'string', + help = 'label of Euler angles [%default]') group.add_option('--axes', - dest = 'axes', - type = 'string', nargs = 3, metavar = ' '.join(['string']*3), - help = 'orientation coordinate frame in terms of position coordinate frame') + dest = 'axes', + type = 'string', nargs = 3, metavar = ' '.join(['string']*3), + help = 'orientation coordinate frame in terms of position coordinate frame') parser.add_option_group(group) group = OptionGroup(parser, "Configuration","") group.add_option('--homogenization', - dest = 'homogenization', - type = 'int', metavar = 'int', - help = 'homogenization index to be used [%default]') + dest = 'homogenization', + type = 'int', metavar = 'int', + help = 'homogenization index to be used [%default]') group.add_option('--crystallite', - dest = 'crystallite', - type = 'int', metavar = 'int', - help = 'crystallite index to be used [%default]') + dest = 'crystallite', + type = 'int', metavar = 'int', + help = 'crystallite index to be used [%default]') group.add_option('--phase', - dest = 'phase', - type = 'int', metavar = 'int', - help = 'phase index to be used [%default]') + dest = 'phase', + type = 'int', metavar = 'int', + help = 'phase index to be used [%default]') parser.add_option_group(group) -parser.set_defaults(position = 'pos', +parser.set_defaults(pos = 'pos', weight = 'weight', microstructure = 'microstructure', - eulers = 'eulerangles', + eulers = 'euler', homogenization = 1, crystallite = 1, phase = 1, @@ -205,7 +213,7 @@ if filenames == []: filenames = [None] for name in filenames: try: table = damask.ASCIItable(name = name, - outname = os.path.splitext(name)[-2]+'.geom' if name else name, + outname = os.path.splitext(name)[0]+'.geom' if name else name, buffered = False) except: continue damask.util.report(scriptName,name) @@ -238,11 +246,11 @@ for name in filenames: info['size'][i] = float(info['grid'][i])/max(info['grid']) # normalize to grid remarks.append('rescaling size {} to {}...'.format({0:'x',1:'y',2:'z'}[i],info['size'][i])) - if table.label_dimension(options.position) != 3: - errors.append('position columns "{}" have dimension {}.'.format(options.position, - table.label_dimension(options.position))) + if table.label_dimension(options.pos) != 3: + errors.append('seed positions "{}" have dimension {}.'.format(options.pos, + table.label_dimension(options.pos))) else: - labels += [options.position] + labels += [options.pos] if not hasEulers: remarks.append('missing seed orientations...') else: labels += [options.eulers] @@ -260,15 +268,14 @@ for name in filenames: # ------------------------------------------ read seeds --------------------------------------- table.data_readArray(labels) - coords = table.data[:,table.label_index(options.position):table.label_index(options.position)+3]\ - * info['size'] - eulers = table.data[:,table.label_index(options.eulers ):table.label_index(options.eulers )+3]\ - if hasEulers else np.zeros(3*len(coords)) - grains = table.data[:,table.label_index(options.microstructure)].astype('i')\ - if hasGrains else 1+np.arange(len(coords)) - weights = table.data[:,table.label_index(options.weight)]\ - if hasWeights else np.zeros(len(coords)) - grainIDs = np.unique(grains).astype('i') + coords = table.data[:,table.label_indexrange(options.pos)] * info['size'] + eulers = table.data[:,table.label_indexrange(options.eulers)] if hasEulers \ + else np.zeros(3*len(coords)) + grains = table.data[:,table.label_indexrange(options.microstructure)].astype('i') if hasGrains \ + else 1+np.arange(len(coords)) + weights = table.data[:,table.label_indexrange(options.weight)] if hasWeights \ + else np.zeros(len(coords)) + grainIDs = np.unique(grains).astype('i') NgrainIDs = len(grainIDs) # --- tessellate microstructure ------------------------------------------------------------ @@ -289,12 +296,12 @@ for name in filenames: if info['homogenization'] == 0: info['homogenization'] = options.homogenization - damask.util.croak(['grid a b c: %s'%(' x '.join(map(str,info['grid']))), - 'size x y z: %s'%(' x '.join(map(str,info['size']))), - 'origin x y z: %s'%(' : '.join(map(str,info['origin']))), - 'homogenization: %i'%info['homogenization'], - 'microstructures: %i%s'%(info['microstructures'], - (' out of %i'%NgrainIDs if NgrainIDs != info['microstructures'] else '')), + damask.util.croak(['grid a b c: {}'.format(' x '.join(map(str,info['grid']))), + 'size x y z: {}'.format(' x '.join(map(str,info['size']))), + 'origin x y z: {}'.format(' : '.join(map(str,info['origin']))), + 'homogenization: {}'.format(info['homogenization']), + 'microstructures: {}{}'.format(info['microstructures'], + (' out of {}'.format(NgrainIDs) if NgrainIDs != info['microstructures'] else '')), ]) config_header = [] @@ -302,28 +309,28 @@ for name in filenames: config_header += [''] for i,ID in enumerate(grainIDs): - config_header += ['[Grain%s]'%(str(ID).zfill(formatwidth)), - 'crystallite %i'%options.crystallite, - '(constituent)\tphase %i\ttexture %s\tfraction 1.0'%(options.phase,str(ID).rjust(formatwidth)), + config_header += ['[Grain{}]'.format(str(ID).zfill(formatwidth)), + 'crystallite {}'.format(options.crystallite), + '(constituent)\tphase {}\ttexture {}\tfraction 1.0'.format(options.phase,str(ID).rjust(formatwidth)), ] if hasEulers: config_header += [''] for ID in grainIDs: eulerID = np.nonzero(grains == ID)[0][0] # find first occurrence of this grain id - config_header += ['[Grain%s]'%(str(ID).zfill(formatwidth)), - '(gauss)\tphi1 %g\tPhi %g\tphi2 %g\tscatter 0.0\tfraction 1.0'%tuple(eulers[eulerID]) + config_header += ['[Grain{}]'.format(str(ID).zfill(formatwidth)), + '(gauss)\tphi1 {:g}\tPhi {:g}\tphi2 {:g}\tscatter 0.0\tfraction 1.0'.format(*eulers[eulerID]) ] - if options.axes is not None: config_header.append('axes\t%s %s %s'%tuple(options.axes)) + if options.axes is not None: config_header.append('axes\t{} {} {}'.format(*options.axes)) table.labels_clear() table.info_clear() table.info_append([ scriptID + ' ' + ' '.join(sys.argv[1:]), - "grid\ta {grid[0]}\tb {grid[1]}\tc {grid[2]}".format(grid=info['grid']), - "size\tx {size[0]}\ty {size[1]}\tz {size[2]}".format(size=info['size']), - "origin\tx {origin[0]}\ty {origin[1]}\tz {origin[2]}".format(origin=info['origin']), - "homogenization\t{homog}".format(homog=info['homogenization']), - "microstructures\t{microstructures}".format(microstructures=info['microstructures']), + "grid\ta {}\tb {}\tc {}".format(*info['grid']), + "size\tx {}\ty {}\tz {}".format(*info['size']), + "origin\tx {}\ty {}\tz {}".format(*info['origin']), + "homogenization\t{}".format(info['homogenization']), + "microstructures\t{}".format(info['microstructures']), config_header, ]) table.head_write()