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:
parent
e7d407c2f6
commit
2f07faa0e2
|
@ -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 ---------------------------------------
|
||||
|
||||
|
@ -111,8 +133,7 @@ for file in files:
|
|||
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue