polished scripts (option parser, numpy)
This commit is contained in:
parent
fd2164b391
commit
f72a87f94b
|
@ -1,33 +1,14 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 no BOM -*-
|
||||
|
||||
# This script is used for the post processing of the results achieved by the spectral method.
|
||||
# As it reads in the data coming from "materialpoint_results", it can be adopted to the data
|
||||
# computed using the FEM solvers. Its capable to handle elements with one IP in a regular order
|
||||
|
||||
import os,sys,threading,re,numpy,time,string,fnmatch,vtk
|
||||
import os,sys,threading,re,time,string,fnmatch,vtk
|
||||
import numpy as np
|
||||
from optparse import OptionParser
|
||||
from vtk.util import numpy_support
|
||||
import damask
|
||||
from optparse import OptionParser, OptionGroup, Option, SUPPRESS_HELP
|
||||
|
||||
# -----------------------------
|
||||
class extendedOption(Option):
|
||||
# -----------------------------
|
||||
# used for definition of new option parser action 'extend', which enables to take multiple option arguments
|
||||
# taken from online tutorial http://docs.python.org/library/optparse.html
|
||||
|
||||
ACTIONS = Option.ACTIONS + ("extend",)
|
||||
STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
|
||||
TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
|
||||
ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)
|
||||
|
||||
def take_action(self, action, dest, opt, value, values, parser):
|
||||
if action == "extend":
|
||||
lvalue = value.split(",")
|
||||
values.ensure_value(dest, []).extend(lvalue)
|
||||
else:
|
||||
Option.take_action(self, action, dest, opt, value, values, parser)
|
||||
|
||||
scriptID = '$Id$'
|
||||
scriptName = scriptID.split()[1]
|
||||
|
||||
# -----------------------------
|
||||
class backgroundMessage(threading.Thread):
|
||||
|
@ -130,7 +111,7 @@ def vtk_writeASCII_mesh(mesh,data,res,sep):
|
|||
|
||||
cmds = [\
|
||||
'# vtk DataFile Version 3.1',
|
||||
string.replace('powered by $Id$','\n','\\n'),
|
||||
string.replace('powered by %s'%scriptID,'\n','\\n'),
|
||||
'ASCII',
|
||||
'DATASET UNSTRUCTURED_GRID',
|
||||
'POINTS %i double'%N1,
|
||||
|
@ -247,7 +228,7 @@ def vtk_writeASCII_points(coordinates,data,res,sep):
|
|||
|
||||
cmds = [\
|
||||
'# vtk DataFile Version 3.1',
|
||||
'powered by $Id$',
|
||||
string.replace('powered by %s'%scriptID,'\n','\\n'),
|
||||
'ASCII',
|
||||
'DATASET UNSTRUCTURED_GRID',
|
||||
'POINTS %i float'%N,
|
||||
|
@ -275,28 +256,30 @@ def vtk_writeASCII_points(coordinates,data,res,sep):
|
|||
|
||||
# ----------------------- MAIN -------------------------------
|
||||
|
||||
parser = OptionParser(option_class=extendedOption, usage='%prog [options] datafile[s]', description = """
|
||||
parser = OptionParser(option_class=damask.extendableOption, usage='%prog [options] datafile[s]', description = """
|
||||
Produce VTK file from data field. Coordinates are taken from (consecutive) x, y, and z columns.
|
||||
|
||||
""" + string.replace('$Id$','\n','\\n')
|
||||
""",version = string.replace(scriptID,'\n','\\n')
|
||||
)
|
||||
|
||||
parser.add_option('-s', '--scalar', action='extend', dest='scalar', type='string', \
|
||||
help='list of scalars to visualize')
|
||||
help='list of single scalars to visualize', metavar = '<string LIST>')
|
||||
parser.add_option( '--double', action='extend', dest='double', type='string', \
|
||||
help='list of scalars to visualize')
|
||||
help='list of two scalars to visualize', metavar = '<string LIST>')
|
||||
parser.add_option( '--triple', action='extend', dest='triple', type='string', \
|
||||
help='list of scalars to visualize')
|
||||
help='list of three scalars to visualize', metavar = '<string LIST>')
|
||||
parser.add_option( '--quadruple', action='extend', dest='quadruple', type='string', \
|
||||
help='list of scalars to visualize')
|
||||
help='list of four scalars to visualize', metavar = '<string LIST>')
|
||||
parser.add_option('-v', '--vector', action='extend', dest='vector', type='string', \
|
||||
help='list of vectors to visualize')
|
||||
help='list of vectors to visualize', metavar = '<string LIST>')
|
||||
parser.add_option('-t', '--tensor', action='extend', dest='tensor', type='string', \
|
||||
help='list of tensors to visualize', metavar = '<string LIST>')
|
||||
parser.add_option('-d', '--deformation', dest='defgrad', type='string', \
|
||||
help='heading of deformation gradient columns [%default]')
|
||||
help='heading of deformation gradient columns [%default]', metavar = 'string')
|
||||
parser.add_option('--reference', dest='undeformed', action='store_true',\
|
||||
help='map results to reference (undeformed) configuration')
|
||||
help='map results to reference (undeformed) configuration [%default]')
|
||||
parser.add_option('-c','--cell', dest='cell', action='store_true',\
|
||||
help='data is cell-centered')
|
||||
help='data is cell-centered [%default]')
|
||||
parser.add_option('-p','--vertex', dest='cell', action='store_false',\
|
||||
help='data is vertex-centered')
|
||||
parser.add_option('--mesh', dest='output_mesh', action='store_true', \
|
||||
|
@ -308,15 +291,15 @@ parser.add_option('--points', dest='output_points', action='store_true', \
|
|||
parser.add_option('--nopoints', dest='output_points', action='store_false', \
|
||||
help='omit VTK points file')
|
||||
parser.add_option('--separator', dest='separator', type='string', \
|
||||
help='data separator [t(ab), n(ewline), s(pace)]')
|
||||
help='data separator (t(ab), n(ewline), s(pace)) [%default]', metavar = 'string')
|
||||
parser.add_option('--scaling', dest='scaling', action='extend', type='string', \
|
||||
help='scaling of fluctuation')
|
||||
help='scaling of fluctuation', metavar = '<float LIST>')
|
||||
parser.add_option('-u', '--unitlength', dest='unitlength', type='float', \
|
||||
help='set unit length for 2D model [%default]')
|
||||
help='set unit length for 2D model [%default]', metavar = 'float')
|
||||
parser.add_option('--filenodalcoords', dest='filenodalcoords', type='string', \
|
||||
help='ASCII table containing nodal coords')
|
||||
parser.add_option('--labelnodalcoords', dest='nodalcoords', type='string', nargs=3, \
|
||||
help='labels of nodal coords in ASCII table')
|
||||
help='ASCII table containing nodal coords', metavar = 'string')
|
||||
parser.add_option('--labelnodalcoords', dest='labelnodalcoords', type='string', nargs=3, \
|
||||
help='labels of nodal coords in ASCII table %default', metavar = 'string string string')
|
||||
parser.add_option('-l', '--linear', dest='linearreconstruction', action='store_true',\
|
||||
help='use linear reconstruction of geometry [%default]')
|
||||
|
||||
|
@ -345,8 +328,8 @@ sep = {'n': '\n', 't': '\t', 's': ' '}
|
|||
options.scaling += [1.0 for i in xrange(max(0,3-len(options.scaling)))]
|
||||
options.scaling = map(float, options.scaling)
|
||||
|
||||
if numpy.any(options.scaling != 1.0) and options.linearreconstruction: print 'cannot scale for linear reconstruction'
|
||||
if numpy.any(options.scaling != 1.0) and options.filenodalcoords != '': print 'cannot scale when reading coordinate from file'
|
||||
if np.any(options.scaling != 1.0) and options.linearreconstruction: print 'cannot scale for linear reconstruction'
|
||||
if np.any(options.scaling != 1.0) and options.filenodalcoords != '': print 'cannot scale when reading coordinate from file'
|
||||
options.separator = options.separator.lower()
|
||||
|
||||
for filename in args:
|
||||
|
@ -419,7 +402,7 @@ for filename in args:
|
|||
matches[what][needle] += [head]
|
||||
|
||||
|
||||
values = numpy.array(sorted([map(transliterateToFloat,line.split()[:maxcol]) for line in content[headrow+1:]],
|
||||
values = np.array(sorted([map(transliterateToFloat,line.split()[:maxcol]) for line in content[headrow+1:]],
|
||||
key=lambda x:(x[locol+0],x[locol+1],x[locol+2])),'d') # sort with z as fastest and x as slowest index
|
||||
|
||||
N = len(values)
|
||||
|
@ -429,11 +412,11 @@ for filename in args:
|
|||
for i in xrange(N):
|
||||
tempGrid[j][str(values[i,locol+j])] = True
|
||||
|
||||
grid = numpy.array([len(tempGrid[0]),\
|
||||
grid = np.array([len(tempGrid[0]),\
|
||||
len(tempGrid[1]),\
|
||||
len(tempGrid[2]),],'i')
|
||||
|
||||
dim = numpy.ones(3)
|
||||
dim = np.ones(3)
|
||||
|
||||
for i,r in enumerate(grid):
|
||||
if r > 1:
|
||||
|
@ -445,14 +428,14 @@ for filename in args:
|
|||
dim[2] = options.unitlength
|
||||
print dim
|
||||
if options.undeformed:
|
||||
Favg = numpy.eye(3)
|
||||
Favg = np.eye(3)
|
||||
else:
|
||||
Favg = damask.core.math.tensorAvg(
|
||||
numpy.reshape(numpy.transpose(values[:,column['tensor'][options.defgrad]:
|
||||
np.reshape(np.transpose(values[:,column['tensor'][options.defgrad]:
|
||||
column['tensor'][options.defgrad]+9]),
|
||||
(3,3,grid[0],grid[1],grid[2])))
|
||||
if not options.filenodalcoords:
|
||||
F = numpy.reshape(numpy.transpose(values[:,column['tensor'][options.defgrad]:
|
||||
F = np.reshape(np.transpose(values[:,column['tensor'][options.defgrad]:
|
||||
column['tensor'][options.defgrad]+9]),
|
||||
(3,3,grid[0],grid[1],grid[2]))
|
||||
if options.linearreconstruction:
|
||||
|
@ -462,7 +445,7 @@ for filename in args:
|
|||
nodes = damask.core.mesh.nodesAroundCentres(dim,Favg,centroids)
|
||||
|
||||
else:
|
||||
nodes = numpy.zeros(((3,grid[0]+1)*(grid[1]+1)*(grid[2]+1)),'d')
|
||||
nodes = np.zeros(((3,grid[0]+1)*(grid[1]+1)*(grid[2]+1)),'d')
|
||||
|
||||
filenodalcoords = open(options.filenodalcoords)
|
||||
tablenodalcoords = damask.ASCIItable(filenodalcoords)
|
||||
|
@ -555,7 +538,7 @@ for filename in args:
|
|||
col = column[datatype][label]
|
||||
if col != -1:
|
||||
print label,
|
||||
fields[datatype][label] = numpy.reshape(values[:,col:col+length[datatype]],[grid[0],grid[1],grid[2]]+reshape[datatype])
|
||||
fields[datatype][label] = np.reshape(values[:,col:col+length[datatype]],[grid[0],grid[1],grid[2]]+reshape[datatype])
|
||||
fields[datatype]['_order_'] += [label]
|
||||
print '\n'
|
||||
|
||||
|
|
|
@ -19,17 +19,16 @@ def unravel(item):
|
|||
|
||||
parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """
|
||||
Add column(s) with derived values according to user defined arithmetic operation between column(s).
|
||||
Columns can be specified either by label or index. Use ';' for ',' in functions.
|
||||
Columns can be specified either by label or index. Use ';' for ',' in functions. Numpy is available as np
|
||||
|
||||
Example: distance to IP coordinates -- "math.sqrt( #ip.x#**2 + #ip.y#**2 + round(#ip.z#;3)**2 )"
|
||||
""" + string.replace(scriptID,'\n','\\n')
|
||||
""", version = string.replace(scriptID,'\n','\\n')
|
||||
)
|
||||
|
||||
|
||||
parser.add_option('-l','--label', dest='labels', action='extend', type='string', \
|
||||
help='(list of) new column labels', metavar='<LIST>')
|
||||
help='(list of) new column labels', metavar='<string LIST>')
|
||||
parser.add_option('-f','--formula', dest='formulas', action='extend', type='string', \
|
||||
help='(list of) formulas corresponding to labels', metavar='<LIST>')
|
||||
help='(list of) formulas corresponding to labels', metavar='<string LIST>')
|
||||
parser.set_defaults(labels= [])
|
||||
parser.set_defaults(formulas= [])
|
||||
|
||||
|
@ -42,7 +41,6 @@ for i in xrange(len(options.formulas)):
|
|||
options.formulas[i]=options.formulas[i].replace(';',',')
|
||||
|
||||
# ------------------------------------------ setup file handles ---------------------------------------
|
||||
|
||||
files = []
|
||||
if filenames == []:
|
||||
files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout, 'croak':sys.stderr})
|
||||
|
@ -52,7 +50,6 @@ else:
|
|||
files.append({'name':name, 'input':open(name), 'output':open(name+'_tmp','w'), 'croak':sys.stderr})
|
||||
|
||||
#--- loop over input files ------------------------------------------------------------------------
|
||||
|
||||
for file in files:
|
||||
if file['name'] != 'STDIN': file['croak'].write('\033[1m'+scriptName+'\033[0m: '+file['name']+'\n')
|
||||
else: file['croak'].write('\033[1m'+scriptName+'\033[0m\n')
|
||||
|
@ -63,8 +60,7 @@ for file in files:
|
|||
|
||||
table = damask.ASCIItable(file['input'],file['output'],False) # make unbuffered ASCII_table
|
||||
table.head_read() # read ASCII header info
|
||||
table.info_append(string.replace(scriptID,'\n','\\n') + \
|
||||
'\t' + ' '.join(sys.argv[1:]))
|
||||
table.info_append(string.replace(scriptID,'\n','\\n') + '\t' + ' '.join(sys.argv[1:]))
|
||||
|
||||
evaluator = {}
|
||||
brokenFormula = {}
|
||||
|
@ -110,7 +106,6 @@ for file in files:
|
|||
table.head_write()
|
||||
|
||||
# ------------------------------------------ process data ---------------------------------------
|
||||
|
||||
outputAlive = True
|
||||
table.data_rewind()
|
||||
|
||||
|
@ -121,7 +116,6 @@ for file in files:
|
|||
outputAlive = table.data_write() # output processed line
|
||||
|
||||
# ------------------------------------------ output result ---------------------------------------
|
||||
|
||||
outputAlive and table.output_flush() # just in case of buffered ASCII table
|
||||
|
||||
file['input'].close() # close input ASCII table
|
||||
|
|
|
@ -1,45 +1,25 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 no BOM -*-
|
||||
|
||||
import os,re,sys,math,numpy,string,damask
|
||||
import os,re,sys,math,numpy,string
|
||||
from collections import defaultdict
|
||||
from optparse import OptionParser, Option
|
||||
from optparse import OptionParser
|
||||
import damask
|
||||
|
||||
scriptID = '$Id$'
|
||||
scriptName = scriptID.split()[1]
|
||||
|
||||
# -----------------------------
|
||||
class extendableOption(Option):
|
||||
# -----------------------------
|
||||
# used for definition of new option parser action 'extend', which enables to take multiple option arguments
|
||||
# taken from online tutorial http://docs.python.org/library/optparse.html
|
||||
|
||||
ACTIONS = Option.ACTIONS + ("extend",)
|
||||
STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
|
||||
TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
|
||||
ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",)
|
||||
|
||||
def take_action(self, action, dest, opt, value, values, parser):
|
||||
if action == "extend":
|
||||
lvalue = value.split(",")
|
||||
values.ensure_value(dest, []).extend(lvalue)
|
||||
else:
|
||||
Option.take_action(self, action, dest, opt, value, values, parser)
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# MAIN
|
||||
# --------------------------------------------------------------------
|
||||
|
||||
parser = OptionParser(option_class=extendableOption, usage='%prog options [file[s]]', description = """
|
||||
parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """
|
||||
Add column(s) containing Cauchy stress based on given column(s) of
|
||||
deformation gradient and first Piola--Kirchhoff stress.
|
||||
|
||||
""" + string.replace(scriptID,'\n','\\n')
|
||||
""", version = string.replace(scriptID,'\n','\\n')
|
||||
)
|
||||
|
||||
|
||||
parser.add_option('-f','--defgrad', dest='defgrad', type='string', metavar='string', \
|
||||
help='heading of columns containing deformation gradient [%default]')
|
||||
parser.add_option('-p','--stress', dest='stress', type='string', metavar='string', \
|
||||
|
@ -68,7 +48,6 @@ datainfo['stress']['label'].append(options.stress)
|
|||
|
||||
|
||||
# ------------------------------------------ setup file handles ---------------------------------------
|
||||
|
||||
files = []
|
||||
if filenames == []:
|
||||
files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout, 'croak':sys.stderr})
|
||||
|
@ -78,7 +57,6 @@ else:
|
|||
files.append({'name':name, 'input':open(name), 'output':open(name+'_tmp','w'), 'croak':sys.stderr})
|
||||
|
||||
# ------------------------------------------ loop over input files ---------------------------------------
|
||||
|
||||
for file in files:
|
||||
if file['name'] != 'STDIN': file['croak'].write('\033[1m'+scriptName+'\033[0m: '+file['name']+'\n')
|
||||
else: file['croak'].write('\033[1m'+scriptName+'\033[0m\n')
|
||||
|
@ -109,11 +87,9 @@ for file in files:
|
|||
for i in xrange(datainfo['stress']['len'])]) # extend ASCII header with new labels
|
||||
|
||||
# ------------------------------------------ assemble header ---------------------------------------
|
||||
|
||||
table.head_write()
|
||||
|
||||
# ------------------------------------------ process data ---------------------------------------
|
||||
|
||||
outputAlive = True
|
||||
while outputAlive and table.data_read(): # read next data line of ASCII table
|
||||
|
||||
|
@ -126,10 +102,9 @@ for file in files:
|
|||
outputAlive = table.data_write() # output processed line
|
||||
|
||||
# ------------------------------------------ output result ---------------------------------------
|
||||
|
||||
table.output_flush() # just in case of buffered ASCII table
|
||||
|
||||
file['input'].close() # close input ASCII table
|
||||
if file['name'] != 'STDIN':
|
||||
file['output'].close # close output ASCII table
|
||||
file['output'].close() # close output ASCII table
|
||||
os.rename(file['name']+'_tmp',file['name']) # overwrite old one with tmp new
|
||||
|
|
Loading…
Reference in New Issue