norm capable of using different p-norms (abs norm, frobenius norm, and max norm). also able to handle "slipsystem" outputs (use option -s). number of slip systems can be set by option -i, if not 12 is default.

This commit is contained in:
Christoph Kords 2012-02-07 13:02:56 +00:00
parent e7d407c2f6
commit 2f07faa0e2
1 changed files with 29 additions and 8 deletions

View File

@ -23,10 +23,20 @@ class extendableOption(Option):
def L2(object):
# definition of element-wise p-norms for matrices
# p = 1
def absnorm(object):
return sum(map(abs, object))
# p = 2
def frobeniusnorm(object):
return math.sqrt(sum([x*x for x in object]))
# p = infinity
def maxnorm(object):
return max(map(abs, object))
# --------------------------------------------------------------------
# MAIN
@ -39,29 +49,41 @@ Add column(s) containing norm of requested column(s) being either vectors or ten
)
parser.add_option('-n','--norm', dest='norm', action='store', type='choice', choices=('absnorm','frobeniusnorm','maxnorm'), \
help='used p-norm, choose either absnorm, frobeniusnorm, or maxnorm [DEFAULT=%default]')
parser.add_option('-v','--vector', dest='vector', action='extend', type='string', \
help='heading of columns containing vector field values')
parser.add_option('-t','--tensor', dest='tensor', action='extend', type='string', \
help='heading of columns containing tensor field values')
parser.add_option('-s','--slipsystem ', dest='slipsystem', action='extend', type='string', \
help='heading of columns containing values per slipsystem')
parser.add_option('-i','--nslipsystems',dest='Nslipsystems', action='store', type='int', \
help='number of slip systems [DEFAULT=%default]')
parser.set_defaults(norm = 'frobeniusnorm')
parser.set_defaults(vector = [])
parser.set_defaults(tensor = [])
parser.set_defaults(slipsystem = [])
parser.set_defaults(Nslipsystems = 12)
(options,filenames) = parser.parse_args()
if len(options.vector) + len(options.tensor) == 0:
if len(options.vector) + len(options.tensor) + len(options.slipsystem)== 0:
parser.error('no data column specified...')
datainfo = { # list of requested labels per datatype
'vector': {'len':3,
'vector': {'len':3,
'label':[]},
'tensor': {'len':9,
'label':[]},
'slipsystem': {'len':options.Nslipsystems,
'label':[]},
}
if options.vector != None: datainfo['vector']['label'] += options.vector
if options.tensor != None: datainfo['tensor']['label'] += options.tensor
if options.slipsystem != None:datainfo['slipsystem']['label'] += options.slipsystem
# ------------------------------------------ setup file handles ---------------------------------------
@ -99,7 +121,7 @@ for file in files:
if datatype not in column: column[datatype] = {}
active[datatype].append(label)
column[datatype][label] = table.labels.index(key) # remember columns of requested data
table.labels_append('norm(%s)'%label) # extend ASCII header with new labels
table.labels_append('%s(%s)'%(options.norm,label)) # extend ASCII header with new labels
# ------------------------------------------ assemble header ---------------------------------------
@ -108,12 +130,11 @@ for file in files:
# ------------------------------------------ process data ---------------------------------------
while table.data_read(): # read next data line of ASCII table
for datatype,labels in active.items(): # loop over vector,tensor
for label in labels: # loop over all requested norms
table.data_append(L2(map(float,table.data[column[datatype][label]:
column[datatype][label]+datainfo[datatype]['len']])))
eval("table.data_append(%s(map(float,table.data[column[datatype][label]:column[datatype][label]+datainfo[datatype]['len']])))"%options.norm)
table.data_write() # output processed line
# ------------------------------------------ output result ---------------------------------------