From 2f07faa0e2e131fb70a6c25f198570fc9049ed52 Mon Sep 17 00:00:00 2001 From: Christoph Kords Date: Tue, 7 Feb 2012 13:02:56 +0000 Subject: [PATCH] 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. --- processing/post/addNorm.py | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/processing/post/addNorm.py b/processing/post/addNorm.py index 9e5a2affc..d733a40f0 100755 --- a/processing/post/addNorm.py +++ b/processing/post/addNorm.py @@ -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 ---------------------------------------