From a614e769683fb9830fe228c3b1ce0b086ee52e12 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 7 Jan 2014 20:42:51 +0000 Subject: [PATCH] first post processing script for HDF5 output --- processing/post/addCauchyX.py | 86 +++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 processing/post/addCauchyX.py diff --git a/processing/post/addCauchyX.py b/processing/post/addCauchyX.py new file mode 100755 index 000000000..862bc547f --- /dev/null +++ b/processing/post/addCauchyX.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import os,re,sys,math,string,h5py +import numpy as np +import damask +from optparse import OptionParser, Option + +# ----------------------------- +class extendableOption(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=extendableOption, usage='%prog options [file[s]]', description = """ +Add column(s) containing Cauchy stress based on given column(s) of +deformation gradient and first Piola--Kirchhoff stress. + +""" + string.replace('$Id$','\n','\\n') +) + + +parser.add_option('-f','--defgrad', dest='defgrad', type='string', \ + help='heading of columns containing deformation gradient [%default]') +parser.add_option('-p','--stress', dest='stress', type='string', \ + help='heading of columns containing first Piola--Kirchhoff stress [%default]') +parser.add_option('-o','--output', dest='output', type='string', \ + help='group containing requested data [%default]') +parser.set_defaults(defgrad = 'f') +parser.set_defaults(stress = 'p') +parser.set_defaults(output = 'crystallite') + +(options,filenames) = parser.parse_args() + +if options.defgrad == None or options.stress == None or options.output == None: + parser.error('missing data column...') + + +# ------------------------------------------ setup file handles --------------------------------------- + +files = [] +for name in filenames: + if os.path.exists(name): + files.append({'name':name, 'file':h5py.File(name,"a")}) + +# ------------------------------------------ loop over input files ------------------------------------ + +match=re.compile("increment[0-9]*") +for myFile in files: + print(myFile['name']) + +# ------------------------------------------ loop over increments --------------------------------------- + increments = [incs+"/"+options.output for incs in filter(match.search, myFile['file'].keys())] + for inc in increments: + print("Current Group: "+inc) + for instance in myFile['file'][inc].keys(): + path = inc+"/"+instance + dsets = myFile['file'][path].keys() + if (options.defgrad in dsets and options.stress in dsets): + defgrad = myFile['file'][path+"/"+options.defgrad] + stress = myFile['file'][path+"/"+options.stress] + cauchy=np.zeros(np.shape(stress),'f') + for p in range(stress.shape[0]): + cauchy[p,...] = 1.0/np.linalg.det(defgrad[p,...])*np.dot(stress[p,...],defgrad[p,...].T) # [Cauchy] = (1/det(F)) * [P].[F_transpose] + cauchyFile = myFile['file'][path].create_dataset("cauchy", data=cauchy) + cauchyFile.attrs['units'] = "Pa" + + +