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]))
|
return math.sqrt(sum([x*x for x in object]))
|
||||||
|
|
||||||
|
# p = infinity
|
||||||
|
def maxnorm(object):
|
||||||
|
return max(map(abs, object))
|
||||||
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
# MAIN
|
# 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', \
|
parser.add_option('-v','--vector', dest='vector', action='extend', type='string', \
|
||||||
help='heading of columns containing vector field values')
|
help='heading of columns containing vector field values')
|
||||||
parser.add_option('-t','--tensor', dest='tensor', action='extend', type='string', \
|
parser.add_option('-t','--tensor', dest='tensor', action='extend', type='string', \
|
||||||
help='heading of columns containing tensor field values')
|
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(vector = [])
|
||||||
parser.set_defaults(tensor = [])
|
parser.set_defaults(tensor = [])
|
||||||
|
parser.set_defaults(slipsystem = [])
|
||||||
|
parser.set_defaults(Nslipsystems = 12)
|
||||||
|
|
||||||
(options,filenames) = parser.parse_args()
|
(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...')
|
parser.error('no data column specified...')
|
||||||
|
|
||||||
datainfo = { # list of requested labels per datatype
|
datainfo = { # list of requested labels per datatype
|
||||||
'vector': {'len':3,
|
'vector': {'len':3,
|
||||||
'label':[]},
|
'label':[]},
|
||||||
'tensor': {'len':9,
|
'tensor': {'len':9,
|
||||||
'label':[]},
|
'label':[]},
|
||||||
|
'slipsystem': {'len':options.Nslipsystems,
|
||||||
|
'label':[]},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if options.vector != None: datainfo['vector']['label'] += options.vector
|
if options.vector != None: datainfo['vector']['label'] += options.vector
|
||||||
if options.tensor != None: datainfo['tensor']['label'] += options.tensor
|
if options.tensor != None: datainfo['tensor']['label'] += options.tensor
|
||||||
|
if options.slipsystem != None:datainfo['slipsystem']['label'] += options.slipsystem
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------ setup file handles ---------------------------------------
|
# ------------------------------------------ setup file handles ---------------------------------------
|
||||||
|
@ -99,7 +121,7 @@ for file in files:
|
||||||
if datatype not in column: column[datatype] = {}
|
if datatype not in column: column[datatype] = {}
|
||||||
active[datatype].append(label)
|
active[datatype].append(label)
|
||||||
column[datatype][label] = table.labels.index(key) # remember columns of requested data
|
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 ---------------------------------------
|
# ------------------------------------------ assemble header ---------------------------------------
|
||||||
|
|
||||||
|
@ -111,8 +133,7 @@ for file in files:
|
||||||
|
|
||||||
for datatype,labels in active.items(): # loop over vector,tensor
|
for datatype,labels in active.items(): # loop over vector,tensor
|
||||||
for label in labels: # loop over all requested norms
|
for label in labels: # loop over all requested norms
|
||||||
table.data_append(L2(map(float,table.data[column[datatype][label]:
|
eval("table.data_append(%s(map(float,table.data[column[datatype][label]:column[datatype][label]+datainfo[datatype]['len']])))"%options.norm)
|
||||||
column[datatype][label]+datainfo[datatype]['len']])))
|
|
||||||
|
|
||||||
table.data_write() # output processed line
|
table.data_write() # output processed line
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue