From 3ed3073eff9aa89757e6ce3f8a8e77519442db73 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 2 Mar 2016 11:29:07 +0100 Subject: [PATCH] more... --- processing/pre/geom_fromAng.py | 18 ++++++++----- processing/pre/geom_fromVPSC.py | 18 ++++++++----- .../pre/geom_fromVoronoiTessellation.py | 21 +++++++-------- processing/pre/geom_rescale.py | 26 +++++++++++-------- processing/pre/geom_toTable.py | 2 +- 5 files changed, 50 insertions(+), 35 deletions(-) diff --git a/processing/pre/geom_fromAng.py b/processing/pre/geom_fromAng.py index 3cf031db8..987ff8ac1 100755 --- a/processing/pre/geom_fromAng.py +++ b/processing/pre/geom_fromAng.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: UTF-8 no BOM -*- -import os,sys,math,string +import os,sys,math import numpy as np from optparse import OptionParser import damask @@ -124,16 +124,22 @@ for name in filenames: continue eulerangles=np.around(eulerangles,int(options.precision)) # round to desired precision +# ensure, that rounded euler angles are not out of bounds (modulo by limits) for i,angle in enumerate(['phi1','PHI','phi2']): - eulerangles[:,i]%=limits[i] # ensure, that rounded euler angles are not out of bounds (modulo by limits) + eulerangles[:,i]%=limits[i] +# scale angles by desired precision and convert to int. create unique integer key from three euler angles by +# concatenating the string representation with leading zeros and store as integer and search unique euler angle keys. +# Texture IDs are the indices of the first occurrence, the inverse is used to construct the microstructure +# create a microstructure (texture/phase pair) for each point using unique texture IDs. +# Use longInt (64bit, i8) because the keys might be long if options.compress: formatString='{0:0>'+str(int(options.precision)+3)+'}' - euleranglesRadInt = (eulerangles*10**int(options.precision)).astype('int') # scale by desired precision and convert to int + euleranglesRadInt = (eulerangles*10**int(options.precision)).astype('int') eulerKeys = np.array([int(''.join(map(formatString.format,euleranglesRadInt[i,:]))) \ - for i in xrange(info['grid'].prod())]) # create unique integer key from three euler angles by concatenating the string representation with leading zeros and store as integer - devNull, texture, eulerKeys_idx = np.unique(eulerKeys, return_index = True, return_inverse=True)# search unique euler angle keys. Texture IDs are the indices of the first occurrence, the inverse is used to construct the microstructure - msFull = np.array([[eulerKeys_idx[i],phase[i]] for i in xrange(info['grid'].prod())],'i8') # create a microstructure (texture/phase pair) for each point using unique texture IDs. Use longInt (64bit, i8) because the keys might be long + for i in xrange(info['grid'].prod())]) + devNull, texture, eulerKeys_idx = np.unique(eulerKeys, return_index = True, return_inverse=True) + msFull = np.array([[eulerKeys_idx[i],phase[i]] for i in xrange(info['grid'].prod())],'i8') devNull,msUnique,matPoints = np.unique(msFull.view('c16'),True,True) matPoints+=1 microstructure = np.array([msFull[i] for i in msUnique]) # pick only unique microstructures diff --git a/processing/pre/geom_fromVPSC.py b/processing/pre/geom_fromVPSC.py index 99762fd5e..a555f6d07 100755 --- a/processing/pre/geom_fromVPSC.py +++ b/processing/pre/geom_fromVPSC.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: UTF-8 no BOM -*- -import os,sys,math,string +import os,sys,math import numpy as np from optparse import OptionParser import damask @@ -101,16 +101,22 @@ for name in filenames: %(angle,n,eulerangles[n,0],eulerangles[n,1],eulerangles[n,2])) continue eulerangles=np.around(eulerangles,int(options.precision)) # round to desired precision +# ensure, that rounded euler angles are not out of bounds (modulo by limits) for i,angle in enumerate(['phi1','PHI','phi2']): - eulerangles[:,i]%=limits[i] # ensure, that rounded euler angles are not out of bounds (modulo by limits) + eulerangles[:,i]%=limits[i] +# scale angles by desired precision and convert to int. create unique integer key from three euler angles by +# concatenating the string representation with leading zeros and store as integer and search unique euler angle keys. +# Texture IDs are the indices of the first occurrence, the inverse is used to construct the microstructure +# create a microstructure (texture/phase pair) for each point using unique texture IDs. +# Use longInt (64bit, i8) because the keys might be long if options.compress: formatString='{0:0>'+str(int(options.precision)+3)+'}' - euleranglesRadInt = (eulerangles*10**int(options.precision)).astype('int') # scale by desired precision and convert to int + euleranglesRadInt = (eulerangles*10**int(options.precision)).astype('int') eulerKeys = np.array([int(''.join(map(formatString.format,euleranglesRadInt[i,:]))) \ - for i in xrange(info['grid'].prod())]) # create unique integer key from three euler angles by concatenating the string representation with leading zeros and store as integer - devNull, texture, eulerKeys_idx = np.unique(eulerKeys, return_index = True, return_inverse=True)# search unique euler angle keys. Texture IDs are the indices of the first occurence, the inverse is used to construct the microstructure - msFull = np.array([[eulerKeys_idx[i],phase[i]] for i in xrange(info['grid'].prod())],'i8') # create a microstructure (texture/phase pair) for each point using unique texture IDs. Use longInt (64bit, i8) because the keys might be long + for i in xrange(info['grid'].prod())]) + devNull, texture, eulerKeys_idx = np.unique(eulerKeys, return_index = True, return_inverse=True) + msFull = np.array([[eulerKeys_idx[i],phase[i]] for i in xrange(info['grid'].prod())],'i8') devNull,msUnique,matPoints = np.unique(msFull.view('c16'),True,True) matPoints+=1 microstructure = np.array([msFull[i] for i in msUnique]) # pick only unique microstructures diff --git a/processing/pre/geom_fromVoronoiTessellation.py b/processing/pre/geom_fromVoronoiTessellation.py index 0a6e186fe..ee29f4536 100755 --- a/processing/pre/geom_fromVoronoiTessellation.py +++ b/processing/pre/geom_fromVoronoiTessellation.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: UTF-8 no BOM -*- -import os,sys,math,string +import os,sys,math import numpy as np import multiprocessing from optparse import OptionParser @@ -13,9 +13,7 @@ scriptID = ' '.join([scriptName,damask.version]) def meshgrid2(*arrs): - ''' - code inspired by http://stackoverflow.com/questions/1827489/numpy-meshgrid-in-3d - ''' + """code inspired by http://stackoverflow.com/questions/1827489/numpy-meshgrid-in-3d""" arrs = tuple(reversed(arrs)) arrs = tuple(arrs) lens = np.array(map(len, arrs)) @@ -45,7 +43,7 @@ def laguerreTessellation(undeformed, coords, weights, grains, nonperiodic = Fals np.array([ [ 0, 0, 0 ], ]).astype(float) if nonperiodic else \ - np.array([ + np.array([ [ -1,-1,-1 ], [ 0,-1,-1 ], [ 1,-1,-1 ], @@ -99,7 +97,8 @@ def laguerreTessellation(undeformed, coords, weights, grains, nonperiodic = Fals for i,arg in enumerate(arguments): closestSeeds[i] = findClosestSeed(arg) - return grains[closestSeeds%coords.shape[0]] # closestSeed is modulo number of original seed points (i.e. excluding periodic copies) +# closestSeed is modulo number of original seed points (i.e. excluding periodic copies) + return grains[closestSeeds%coords.shape[0]] # -------------------------------------------------------------------- # MAIN @@ -210,9 +209,9 @@ for name in filenames: table.head_read() info,extra_header = table.head_getGeom() - if options.grid != None: info['grid'] = options.grid - if options.size != None: info['size'] = options.size - if options.origin != None: info['origin'] = options.origin + if options.grid is not None: info['grid'] = options.grid + if options.size is not None: info['size'] = options.size + if options.origin is not None: info['origin'] = options.origin # ------------------------------------------ sanity checks --------------------------------------- @@ -298,7 +297,7 @@ for name in filenames: phase = options.phase * np.ones(info['microstructures'],'i') if int(options.secondphase*info['microstructures']) > 0: phase[0:int(options.secondphase*info['microstructures'])] += 1 - randomSeed = int(os.urandom(4).encode('hex'), 16) if options.randomSeed == None \ + randomSeed = int(os.urandom(4).encode('hex'), 16) if options.randomSeed is None \ else options.randomSeed # random seed for second phase np.random.seed(randomSeed) np.random.shuffle(phase) @@ -317,7 +316,7 @@ for name in filenames: config_header += ['[Grain%s]'%(str(ID).zfill(formatwidth)), '(gauss)\tphi1 %g\tPhi %g\tphi2 %g\tscatter 0.0\tfraction 1.0'%tuple(eulers[eulerID]) ] - if options.axes != None: config_header.append('axes\t%s %s %s'%tuple(options.axes)) + if options.axes is not None: config_header.append('axes\t%s %s %s'%tuple(options.axes)) table.labels_clear() table.info_clear() diff --git a/processing/pre/geom_rescale.py b/processing/pre/geom_rescale.py index b0d27f474..e005e41a9 100755 --- a/processing/pre/geom_rescale.py +++ b/processing/pre/geom_rescale.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: UTF-8 no BOM -*- -import os,sys,string,math +import os,sys,math import numpy as np from optparse import OptionParser import damask @@ -82,8 +82,12 @@ for name in filenames: 'microstructures': 0, } - newInfo['grid'] = np.array([{True:round(o*float(n.translate(None,'xX'))), False: round(float(n.translate(None,'xX')))}[n[-1].lower() == 'x'] for o,n in zip(info['grid'],options.grid)],'i') - newInfo['size'] = np.array([{True: o*float(n.translate(None,'xX')) , False: float(n.translate(None,'xX')) }[n[-1].lower() == 'x'] for o,n in zip(info['size'],options.size)],'d') + newInfo['grid'] = np.array([{True:round(o*float(n.translate(None,'xX'))), + False: round(float(n.translate(None,'xX')))}[n[-1].lower() == 'x'] + for o,n in zip(info['grid'],options.grid)],'i') + newInfo['size'] = np.array([{True: o*float(n.translate(None,'xX')) , + False: float(n.translate(None,'xX')) }[n[-1].lower() == 'x'] + for o,n in zip(info['size'],options.size)],'d') newInfo['grid'] = np.where(newInfo['grid'] <= 0 , info['grid'],newInfo['grid']) newInfo['size'] = np.where(newInfo['size'] <= 0.0, info['size'],newInfo['size']) @@ -97,11 +101,8 @@ for name in filenames: last = this microstructure = microstructure.reshape(info['grid'],order='F') - microstructure = np.repeat( - np.repeat( - np.repeat(microstructure,multiplicity[0], axis=0), - multiplicity[1], axis=1), - multiplicity[2], axis=2) + microstructure = np.repeat(np.repeat(np.repeat(microstructure, + multiplicity[0], axis=0),multiplicity[1], axis=1),multiplicity[2], axis=2) # --- renumber to sequence 1...Ngrains if requested ------------------------------------------------ # http://stackoverflow.com/questions/10741346/np-frequency-counts-for-unique-values-in-an-array @@ -119,9 +120,12 @@ for name in filenames: remarks = [] errors = [] - if (any(newInfo['grid'] != info['grid'])): remarks.append('--> grid a b c: %s'%(' x '.join(map(str,newInfo['grid'])))) - if (any(newInfo['size'] != info['size'])): remarks.append('--> size x y z: %s'%(' x '.join(map(str,newInfo['size'])))) - if ( newInfo['microstructures'] != info['microstructures']): remarks.append('--> microstructures: %i'%newInfo['microstructures']) + if (any(newInfo['grid'] != info['grid'])): + remarks.append('--> grid a b c: %s'%(' x '.join(map(str,newInfo['grid'])))) + if (any(newInfo['size'] != info['size'])): + remarks.append('--> size x y z: %s'%(' x '.join(map(str,newInfo['size'])))) + if ( newInfo['microstructures'] != info['microstructures']): + remarks.append('--> microstructures: %i'%newInfo['microstructures']) if np.any(newInfo['grid'] < 1): errors.append('invalid new grid a b c.') if np.any(newInfo['size'] <= 0.0): errors.append('invalid new size x y z.') diff --git a/processing/pre/geom_toTable.py b/processing/pre/geom_toTable.py index 79ace7d24..dff0c8150 100755 --- a/processing/pre/geom_toTable.py +++ b/processing/pre/geom_toTable.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: UTF-8 no BOM -*- -import os,sys,string,vtk +import os,sys import numpy as np from optparse import OptionParser import damask