diff --git a/processing/post/spectral_convergence.py b/processing/post/spectral_convergence.py deleted file mode 100755 index 0cbe1e279..000000000 --- a/processing/post/spectral_convergence.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 no BOM -*- - -import os,sys,string -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) - - - -# ----------------------- MAIN ------------------------------- - -parser = OptionParser(option_class=extendedOption, usage='%prog [options] spectralOut[s]', description = """ -Generate datafile of converged iteration per increment. - -""" + string.replace('$Id$','\n','\\n') -) - -parser.add_option('-m','--memory', dest='memory', action='store_true', \ - help='load complete file into memory [%default]') -parser.add_option('-g','--gap', dest='gap', type='float', \ - help='value to indicate gap between increments [%default]') - -parser.set_defaults(memory = False) -parser.set_defaults(gap = -1) - -(options, filenames) = parser.parse_args() - -# ------------------------------------------ setup file handles --------------------------------------- - -files = [] -if filenames == []: - files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout}) -else: - for name in filenames: - if os.path.exists(name): - (head,tail) = os.path.split(name) - files.append({'name':name, 'input':open(name), - 'output':open(os.path.join(head,'convergence_'+os.path.splitext(tail)[0]+'.txt'), 'w')}) - - -# ------------------------------------------ loop over input files --------------------------------------- - -for file in files: - print file['name'] - inc = 1 - step = 1 - -# ------------------------------------------ assemble header --------------------------------------- - - output = '1\theader\n' + \ - '\t'.join(['inc','err_div']) + '\n' - - if options.memory: - data = file['input'].readlines() - else: - data = [] - file['output'].write(output) - output = '' - -# ------------------------------------------ read file --------------------------------------- - - divergences = [] - - for line in {True : data, - False : file['input']}[options.memory]: - - items = line.split() - if len(items) > 7 and items[0] == 'Loadcase': # 'magic' line? - if int(items[5]) != step: - divergences.append(options.gap) - for i,div in enumerate(divergences): - output += '\t'.join(map(str,[inc+float(i)/(len(divergences)-1),div])) + '\n' - step = int(items[5]) # store current step count - inc += 1 # is next inc - divergences = [] # reset divergences list - - if not options.memory: - file['output'].write(output) - output = '' - - if len(items) > 2 and items[0] == 'error' and items[1] == 'divergence:': # 'magic' line? - divergences.append(float(items[2])) - - for i,div in enumerate(divergences): # process last step (for which, of course, no further step can be found) - output += '\t'.join(map(str,[inc+float(i)/len(divergences),div])) + '\n' - - file['input'].close() - -# ------------------------------------------ output result --------------------------------------- - - file['output'].write(output) - - if file['name'] != 'STDIN': - file['output'].close diff --git a/processing/post/spectral_parseLog.py b/processing/post/spectral_parseLog.py new file mode 100755 index 000000000..d00898de5 --- /dev/null +++ b/processing/post/spectral_parseLog.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 no BOM -*- + +import os,sys,string,re,damask +from optparse import OptionParser, Option + +# ----------------------------- +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) + + + +# ----------------------- MAIN ------------------------------- + + +parsing = [ \ + ['__CLOCK__', r'^Loadcase \d+ Increment \d+/\d+ @ Iteration \d+/\d+'], + ['increment', r'^Loadcase \d+ Increment (\d+)/\d+ @ Iteration \d+/\d+'], + ['iteration', r'^Loadcase \d+ Increment \d+/\d+ @ Iteration (\d+)/\d+'], + ['error_divergence', r'^error divergence = [ +-eE0123456789.]+\(([ +-eE0123456789.]+)'], + ['max(sym(deltaF))', r'^max symmetrix correction of deformation: ([ +-eE0123456789.]+)'], + ['max(skew(deltaF))', r'^max skew correction of deformation: ([ +-eE0123456789.]+)'], + ['max(sym/skew(avg(deltaF)))', r'^max sym/skew of avg correction: ([ +-eE0123456789.]+)'], + ['error_stress', r'^error stress = [ +-eE0123456789.]+\(([ +-eE0123456789.]+)'], + ['det(Fbar)', r'^determinant of new deformation: ([ +-eE0123456789.]+)'], + ['max(det(F))', r'^max determinant of deformation:([ +-eE0123456789.]+)'], + ['min(det(F))', r'^min determinant of deformation:([ +-eE0123456789.]+)'], + ['div_FT_max', r'^error divergence FT max = ([ +-eE0123456789.]+)'], + ['div_Real_RMS', r'^error divergence Real RMS = ([ +-eE0123456789.]+)'], + ['div_Real_max', r'^error divergence Real max = ([ +-eE0123456789.]+)'], + ['real(error_FT)', r'^max FT relative error ([ +-eE0123456789.]+) [ +-eE0123456789.]+'], + ['img(error_FT)', r'^max FT relative error [ +-eE0123456789.]+ ([ +-eE0123456789.]+)'], + ['real(error_iFT)', r'^max iFT relative error ([ +-eE0123456789.]+)'], + ['error_postProc', r'^max deviat. from postProc =([ +-eE0123456789.]+)'], + ['loadcase', r'^Loadcase (\d+) Increment \d+/\d+ @ Iteration \d+/\d+'] + ] + +parser = OptionParser(option_class=extendedOption, usage='%prog [options] spectralOut[s]', description = """ +Generate ASCIItable with data per iteration. + +""" + string.replace('$Id$','\n','\\n') +) + +parser.add_option('-p','--prefix', dest='prefix', type='string',\ + help='prefix of output ASCIItable [%default]') +parser.set_defaults(prefix = 'logParsing_') + +(options, filenames) = parser.parse_args() + + +# ------------------------------------------ pre-compile regular expressions --------------------------------------- + +for i,[what,regexp] in enumerate(parsing): + parsing[i][1] = re.compile(regexp) + +# ------------------------------------------ setup file handles --------------------------------------- + +files = [] +if filenames == []: + files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout}) +else: + for name in filenames: + if os.path.exists(name): + (path,file) = os.path.split(name) + files.append({'name':name, 'input':open(name), + 'output':open(os.path.join(path,options.prefix+os.path.splitext(file)[0]+'.txt'), 'w')}) + +# ------------------------------------------ loop over input files --------------------------------------- + +for file in files: + if file['name'] != 'STDIN': print file['name'] + + table = damask.ASCIItable(fileOut=file['output'],buffered=False) # make unbuffered ASCII_table + table.info_append(string.replace('$Id$','\n','\\n') + \ + '\t' + ' '.join(sys.argv[1:])) + table.labels_append([x[0] for x in parsing[1:]]) # exclude __CLOCK__ + +# ------------------------------------------ assemble header --------------------------------------- + + table.head_write() + +# ------------------------------------------ parse log --------------------------------------- + + for line in file['input']: + for what,regexp in parsing: + m = regexp.search(line) + if m: + if what != '__CLOCK__': table.data_set(m.group(1),what) # unless clock ticking detected... + else: + table.data_write() + table.data_clear() + + if table.data != []: table.data_write() + +# ------------------------------------------ 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 \ No newline at end of file