From a84e7310f58d5a1bc425f338133166ba1cb173b1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 24 Oct 2016 20:30:51 +0200 Subject: [PATCH 01/15] fixed prospector hints --- lib/damask/result/marc2vtk.py | 2 -- processing/post/groupTable.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/damask/result/marc2vtk.py b/lib/damask/result/marc2vtk.py index a04c710d7..f712bd963 100644 --- a/lib/damask/result/marc2vtk.py +++ b/lib/damask/result/marc2vtk.py @@ -13,7 +13,6 @@ import numpy as np import py_post # MSC closed source module to access marc result files class MARC_POST(): - import re def __init__(self): self.projdir='./' @@ -383,7 +382,6 @@ class VTK_WRITER(): to plot semi-transparent iso-surfaces. """ - import re def __init__(self): self.p=MARC_POST() # self.p diff --git a/processing/post/groupTable.py b/processing/post/groupTable.py index cb1359c78..a533794e8 100755 --- a/processing/post/groupTable.py +++ b/processing/post/groupTable.py @@ -2,7 +2,7 @@ # -*- coding: UTF-8 no BOM -*- import os,sys -import math # noqa +import math # noqa import numpy as np from optparse import OptionParser, OptionGroup import damask From 8a94f55a2e7187167f30dbd5b146c2805573f64b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 24 Oct 2016 21:16:29 +0200 Subject: [PATCH 02/15] python 3 compatibility --- lib/damask/asciitable.py | 42 +++++----- lib/damask/config/material.py | 4 +- lib/damask/h5table.py | 15 ++-- lib/damask/test/test.py | 9 +- lib/damask/util.py | 35 ++++---- processing/post/addAPS34IDEstrainCoords.py | 4 +- processing/post/addCalculation.py | 4 +- processing/post/addCauchy.py | 2 +- processing/post/addCompatibilityMismatch.py | 28 +++---- processing/post/addCumulative.py | 2 +- processing/post/addCurl.py | 12 +-- processing/post/addDeviator.py | 4 +- processing/post/addDisplacement.py | 20 ++--- processing/post/addDivergence.py | 12 +-- processing/post/addEuclideanDistance.py | 18 ++-- processing/post/addGradient.py | 10 +-- processing/post/addIPFcolor.py | 2 +- processing/post/addOrientations.py | 6 +- processing/post/addPK2.py | 2 +- processing/post/addPole.py | 2 +- processing/post/addSchmidfactors.py | 2 +- processing/post/addSpectralDecomposition.py | 4 +- processing/post/addStrainTensors.py | 2 +- processing/post/ascii2hdf5.py | 6 +- processing/post/averageDown.py | 2 +- processing/post/binXY.py | 8 +- processing/post/blowUp.py | 14 ++-- processing/post/groupTable.py | 16 ++-- processing/post/h5_addCalculation.py | 4 +- processing/post/h5_addCauchy.py | 2 +- processing/post/h5_addIPFcolor.py | 2 +- processing/post/h5_addMises.py | 6 +- processing/post/h5_addStrainTensors.py | 4 +- processing/post/h5_addXdmfWapper.py | 6 +- processing/post/h5_vtkRectilinearGrid.py | 8 +- processing/post/imageDataDeformed.py | 4 +- processing/post/mentat_colorMap.py | 12 +-- processing/post/postResults.py | 82 +++++++++---------- processing/post/reLabel.py | 2 +- processing/post/vtk2ang.py | 20 ++--- processing/post/vtk_rectilinearGrid.py | 6 +- processing/pre/abq_addUserOutput.py | 33 ++++---- processing/pre/geom_canvas.py | 12 +-- processing/pre/geom_fromMinimalSurface.py | 6 +- processing/pre/geom_fromOsteonGeometry.py | 8 +- processing/pre/geom_fromTable.py | 8 +- .../pre/geom_fromVoronoiTessellation.py | 4 +- processing/pre/geom_grainGrowth.py | 2 +- processing/pre/geom_pack.py | 2 +- processing/pre/geom_rescale.py | 4 +- processing/pre/geom_toTable.py | 2 +- processing/pre/geom_translate.py | 4 +- processing/pre/hybridIA_linODFsampling.py | 16 ++-- processing/pre/marc_addUserOutput.py | 35 ++++---- processing/pre/mentat_pbcOnBoxMesh.py | 20 ++--- .../pre/patchFromReconstructedBoundaries.py | 30 +++---- processing/pre/seeds_fromDistribution.py | 22 +++-- processing/pre/seeds_fromPokes.py | 6 +- processing/pre/seeds_fromRandom.py | 8 +- 59 files changed, 328 insertions(+), 339 deletions(-) diff --git a/lib/damask/asciitable.py b/lib/damask/asciitable.py index 3509a5284..ab745e24d 100644 --- a/lib/damask/asciitable.py +++ b/lib/damask/asciitable.py @@ -84,7 +84,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def _quote(self, what): - """quote empty or white space-containing output""" + """Quote empty or white space-containing output""" import re return '{quote}{content}{quote}'.format( @@ -107,7 +107,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def output_write(self, what): - """aggregate a single row (string) or list of (possibly containing further lists of) rows into output""" + """Aggregate a single row (string) or list of (possibly containing further lists of) rows into output""" if not isinstance(what, (str, unicode)): try: for item in what: self.output_write(item) @@ -147,7 +147,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_read(self): """ - get column labels + Get column labels by either reading the first row or, if keyword "head[*]" is present, the last line of the header @@ -200,7 +200,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_write(self, header = True): - """write current header information (info + labels)""" + """Write current header information (info + labels)""" head = ['{}\theader'.format(len(self.info)+self.__IO__['labeled'])] if header else [] head.append(self.info) if self.__IO__['labeled']: head.append('\t'.join(map(self._quote,self.tags))) @@ -209,7 +209,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_getGeom(self): - """interpret geom header""" + """Interpret geom header""" identifiers = { 'grid': ['a','b','c'], 'size': ['x','y','z'], @@ -249,7 +249,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def head_putGeom(self,info): - """translate geometry description to header""" + """Translate geometry description to header""" self.info_append([ "grid\ta {}\tb {}\tc {}".format(*info['grid']), "size\tx {}\ty {}\tz {}".format(*info['size']), @@ -262,7 +262,7 @@ class ASCIItable(): def labels_append(self, what, reset = False): - """add item or list to existing set of labels (and switch on labeling)""" + """Add item or list to existing set of labels (and switch on labeling)""" if not isinstance(what, (str, unicode)): try: for item in what: self.labels_append(item) @@ -276,7 +276,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def labels_clear(self): - """delete existing labels and switch to no labeling""" + """Delete existing labels and switch to no labeling""" self.tags = [] self.__IO__['labeled'] = False @@ -285,7 +285,7 @@ class ASCIItable(): tags = None, raw = False): """ - tell abstract labels. + Tell abstract labels. "x" for "1_x","2_x",... unless raw output is requested. operates on object tags or given list. @@ -322,7 +322,7 @@ class ASCIItable(): def label_index(self, labels): """ - tell index of column label(s). + Tell index of column label(s). return numpy array if asked for list of labels. transparently deals with label positions implicitly given as numbers or their headings given as strings. @@ -363,7 +363,7 @@ class ASCIItable(): def label_dimension(self, labels): """ - tell dimension (length) of column label(s). + Tell dimension (length) of column label(s). return numpy array if asked for list of labels. transparently deals with label positions implicitly given as numbers or their headings given as strings. @@ -417,7 +417,7 @@ class ASCIItable(): def label_indexrange(self, labels): """ - tell index range for given label(s). + Tell index range for given label(s). return numpy array if asked for list of labels. transparently deals with label positions implicitly given as numbers or their headings given as strings. @@ -434,7 +434,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def info_append(self, what): - """add item or list to existing set of infos""" + """Add item or list to existing set of infos""" if not isinstance(what, (str, unicode)): try: for item in what: self.info_append(item) @@ -445,7 +445,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def info_clear(self): - """delete any info block""" + """Delete any info block""" self.info = [] # ------------------------------------------------------------------ @@ -458,7 +458,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_skipLines(self, count): - """wind forward by count number of lines""" + """Wind forward by count number of lines""" for i in range(count): alive = self.data_read() @@ -468,7 +468,7 @@ class ASCIItable(): def data_read(self, advance = True, respectLabels = True): - """read next line (possibly buffered) and parse it into data array""" + """Read next line (possibly buffered) and parse it into data array""" import shlex self.line = self.__IO__['readBuffer'].pop(0) if len(self.__IO__['readBuffer']) > 0 \ @@ -490,7 +490,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_readArray(self, labels = []): - """read whole data of all (given) labels as numpy array""" + """Read whole data of all (given) labels as numpy array""" from collections import Iterable try: @@ -527,7 +527,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_write(self, delimiter = '\t'): - """write current data array and report alive output back""" + """Write current data array and report alive output back""" if len(self.data) == 0: return True if isinstance(self.data[0],list): @@ -539,7 +539,7 @@ class ASCIItable(): def data_writeArray(self, fmt = None, delimiter = '\t'): - """write whole numpy array data""" + """Write whole numpy array data""" for row in self.data: try: output = [fmt % value for value in row] if fmt else list(map(repr,row)) @@ -562,7 +562,7 @@ class ASCIItable(): # ------------------------------------------------------------------ def data_set(self, what, where): - """update data entry in column "where". grows data array if needed.""" + """Update data entry in column "where". grows data array if needed.""" idx = -1 try: idx = self.label_index(where) @@ -589,7 +589,7 @@ class ASCIItable(): grid, type = 'i', strict = False): - """read microstructure data (from .geom format)""" + """Read microstructure data (from .geom format)""" def datatype(item): return int(item) if type.lower() == 'i' else float(item) diff --git a/lib/damask/config/material.py b/lib/damask/config/material.py index f586ee098..d59aaa6a9 100644 --- a/lib/damask/config/material.py +++ b/lib/damask/config/material.py @@ -104,7 +104,7 @@ class Material(): __slots__ = ['data'] def __init__(self,verbose=True): - """generates ordered list of parts""" + """Generates ordered list of parts""" self.parts = [ 'homogenization', 'microstructure', @@ -122,7 +122,7 @@ class Material(): self.verbose = verbose def __repr__(self): - """returns current configuration to be used as material.config""" + """Returns current configuration to be used as material.config""" me = [] for part in self.parts: if self.verbose: print('doing '+part) diff --git a/lib/damask/h5table.py b/lib/damask/h5table.py index 95e25f191..095146d09 100644 --- a/lib/damask/h5table.py +++ b/lib/damask/h5table.py @@ -24,7 +24,7 @@ except(NameError): def lables_to_path(label, dsXMLPath=None): - """read the xml definition file and return the path.""" + """Read the xml definition file and return the path.""" if dsXMLPath is None: # use the default storage layout in DS_HDF5.xml if "h5table.pyc" in __file__: @@ -48,7 +48,7 @@ def lables_to_path(label, dsXMLPath=None): class H5Table(object): - """light weight interface class for h5py + """Light weight interface class for h5py DESCRIPTION ----------- @@ -85,7 +85,7 @@ class H5Table(object): h5f['/'].attrs['description'] = msg def del_entry(self, feature_name): - """delete entry in HDF5 table""" + """Delete entry in HDF5 table""" dataType, h5f_path = lables_to_path(feature_name, dsXMLPath=self.dsXMLFile) with h5py.File(self.h5f_path, 'a') as h5f: @@ -106,7 +106,7 @@ class H5Table(object): h5f.flush() def get_data(self, feature_name=None): - """extract dataset from HDF5 table and return it in a numpy array""" + """Extract dataset from HDF5 table and return it in a numpy array""" dataType, h5f_path = lables_to_path(feature_name, dsXMLPath=self.dsXMLFile) with h5py.File(self.h5f_path, 'a') as h5f: @@ -116,7 +116,7 @@ class H5Table(object): return rst_data def add_data(self, feature_name, dataset, cmd_log=None): - """adding new feature into existing HDF5 file""" + """Adding new feature into existing HDF5 file""" dataType, h5f_path = lables_to_path(feature_name, dsXMLPath=self.dsXMLFile) with h5py.File(self.h5f_path, 'a') as h5f: @@ -126,8 +126,7 @@ class H5Table(object): # record its state as fresh in the cmd log. try: del h5f[h5f_path] - print "***deleting old {} from {}".format(feature_name, - self.h5f_path) + print("***deleting old {} from {}".format(feature_name,self.h5f_path)) except: # if no cmd log, None will used cmd_log = str(cmd_log) + " [FRESH]" @@ -138,7 +137,7 @@ class H5Table(object): h5f.flush() def get_cmdlog(self, feature_name): - """get cmd history used to generate the feature""" + """Get cmd history used to generate the feature""" dataType, h5f_path = lables_to_path(feature_name, dsXMLPath=self.dsXMLFile) with h5py.File(self.h5f_path, 'a') as h5f: diff --git a/lib/damask/test/test.py b/lib/damask/test/test.py index 5a06939c6..223b21b78 100644 --- a/lib/damask/test/test.py +++ b/lib/damask/test/test.py @@ -1,6 +1,5 @@ # -*- coding: UTF-8 no BOM -*- - import os,sys,shutil import logging,logging.config import damask @@ -191,7 +190,7 @@ class Test(): def copy(self, mapA, mapB, A = [], B = []): """ - copy list of files from (mapped) source to target. + Copy list of files from (mapped) source to target. mapA/B is one of self.fileInX. """ @@ -382,7 +381,7 @@ class Test(): line0 += 1 for i in range(dataLength): - if not perLine: norm[i] = [np.max(norm[i]) for j in xrange(line0-len(skipLines))] + if not perLine: norm[i] = [np.max(norm[i]) for j in range(line0-len(skipLines))] data[i] = np.reshape(data[i],[line0-len(skipLines),length[i]]) if any(norm[i]) == 0.0 or absTol[i]: norm[i] = [1.0 for j in range(line0-len(skipLines))] @@ -425,7 +424,7 @@ class Test(): stdTol = 1.0e-6, preFilter = 1.0e-9): """ - calculate statistics of tables + Calculate statistics of tables threshold can be used to ignore small values (a negative number disables this feature) """ @@ -478,7 +477,7 @@ class Test(): rtol = 1e-5, atol = 1e-8, debug = False): - """compare multiple tables with np.allclose""" + """Compare multiple tables with np.allclose""" if not (isinstance(files, Iterable) and not isinstance(files, str)): # check whether list of files is requested files = [str(files)] diff --git a/lib/damask/util.py b/lib/damask/util.py index 6cea7c54b..2949d259c 100644 --- a/lib/damask/util.py +++ b/lib/damask/util.py @@ -1,6 +1,5 @@ # -*- coding: UTF-8 no BOM -*- -# damask utility functions import sys,time,random,threading,os,subprocess,shlex import numpy as np from optparse import Option @@ -36,7 +35,7 @@ class bcolors: # ----------------------------- def srepr(arg,glue = '\n'): - """joins arguments as individual lines""" + """Joins arguments as individual lines""" if (not hasattr(arg, "strip") and hasattr(arg, "__getitem__") or hasattr(arg, "__iter__")): @@ -45,21 +44,21 @@ def srepr(arg,glue = '\n'): # ----------------------------- def croak(what, newline = True): - """writes formated to stderr""" + """Writes formated to stderr""" sys.stderr.write(srepr(what,glue = '\n') + ('\n' if newline else '')) sys.stderr.flush() # ----------------------------- def report(who = None, what = None): - """reports script and file name""" + """Reports script and file name""" croak( (emph(who)+': ' if who else '') + (what if what else '') ) # ----------------------------- def report_geom(info, what = ['grid','size','origin','homogenization','microstructures']): - """reports (selected) geometry information""" + """Reports (selected) geometry information""" output = { 'grid' : 'grid a b c: {}'.format(' x '.join(map(str,info['grid' ]))), 'size' : 'size x y z: {}'.format(' x '.join(map(str,info['size' ]))), @@ -71,24 +70,24 @@ def report_geom(info, # ----------------------------- def emph(what): - """boldens string""" + """Boldens string""" return bcolors.BOLD+srepr(what)+bcolors.ENDC # ----------------------------- def deemph(what): - """dims string""" + """Dims string""" return bcolors.DIM+srepr(what)+bcolors.ENDC # ----------------------------- def delete(what): - """dims string""" + """Dims string""" return bcolors.DIM+srepr(what)+bcolors.ENDC # ----------------------------- def execute(cmd, streamIn = None, wd = './'): - """executes a command in given directory and returns stdout and stderr for optional stdin""" + """Executes a command in given directory and returns stdout and stderr for optional stdin""" initialPath = os.getcwd() os.chdir(wd) process = subprocess.Popen(shlex.split(cmd), @@ -127,7 +126,7 @@ def gridIndex(location,res): # ----------------------------- class extendableOption(Option): """ - used for definition of new option parser action 'extend', which enables to take multiple option arguments + 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 """ @@ -146,7 +145,7 @@ class extendableOption(Option): # ----------------------------- class backgroundMessage(threading.Thread): - """reporting with animation to indicate progress""" + """Reporting with animation to indicate progress""" choices = {'bounce': ['_', 'o', 'O', '°', '‾', '‾', '°', 'O', 'o', '_'], 'spin': ['◜', '◝', '◞', '◟'], @@ -168,7 +167,7 @@ class backgroundMessage(threading.Thread): } def __init__(self,symbol = None,wait = 0.1): - """sets animation symbol""" + """Sets animation symbol""" super(backgroundMessage, self).__init__() self._stop = threading.Event() self.message = '' @@ -179,7 +178,7 @@ class backgroundMessage(threading.Thread): self.waittime = wait def __quit__(self): - """cleans output""" + """Cleans output""" length = len(self.symbols[self.counter] + self.gap + self.message) sys.stderr.write(chr(8)*length + ' '*length + chr(8)*length) sys.stderr.write('') @@ -282,7 +281,7 @@ def leastsqBound(func, x0, args=(), bounds=None, Dfun=None, full_output=0, return grad def _int2extFunc(bounds): - """transform internal parameters into external parameters.""" + """Transform internal parameters into external parameters.""" local = [_int2extLocal(b) for b in bounds] def _transform_i2e(p_int): p_ext = np.empty_like(p_int) @@ -291,7 +290,7 @@ def leastsqBound(func, x0, args=(), bounds=None, Dfun=None, full_output=0, return _transform_i2e def _ext2intFunc(bounds): - """transform external parameters into internal parameters.""" + """Transform external parameters into internal parameters.""" local = [_ext2intLocal(b) for b in bounds] def _transform_e2i(p_ext): p_int = np.empty_like(p_ext) @@ -300,7 +299,7 @@ def leastsqBound(func, x0, args=(), bounds=None, Dfun=None, full_output=0, return _transform_e2i def _int2extLocal(bound): - """transform a single internal parameter to an external parameter.""" + """Transform a single internal parameter to an external parameter.""" lower, upper = bound if lower is None and upper is None: # no constraints return lambda x: x @@ -312,7 +311,7 @@ def leastsqBound(func, x0, args=(), bounds=None, Dfun=None, full_output=0, return lambda x: lower + ((upper - lower)/2.0)*(np.sin(x) + 1.0) def _ext2intLocal(bound): - """transform a single external parameter to an internal parameter.""" + """Transform a single external parameter to an internal parameter.""" lower, upper = bound if lower is None and upper is None: # no constraints return lambda x: x @@ -469,4 +468,4 @@ def curve_fit_bound(f, xdata, ydata, p0=None, sigma=None, bounds=None, **kw): else: pcov = np.inf - return (popt, pcov, infodict, errmsg, ier) if return_full else (popt, pcov) \ No newline at end of file + return (popt, pcov, infodict, errmsg, ier) if return_full else (popt, pcov) diff --git a/processing/post/addAPS34IDEstrainCoords.py b/processing/post/addAPS34IDEstrainCoords.py index a630a476b..8a793a8cf 100755 --- a/processing/post/addAPS34IDEstrainCoords.py +++ b/processing/post/addAPS34IDEstrainCoords.py @@ -69,7 +69,7 @@ for name in filenames: if columnMissing: continue # ------------------------------------------ assemble header --------------------------------------- - table.labels_append(['%i_coord'%(i+1) for i in xrange(3)]) # extend ASCII header with new labels + table.labels_append(['%i_coord'%(i+1) for i in range(3)]) # extend ASCII header with new labels table.head_write() # ------------------------------------------ process data ------------------------------------------ @@ -94,4 +94,4 @@ for name in filenames: table.input_close() # close input ASCII table (works for stdin) table.output_close() # close output ASCII table (works for stdout) if file['name'] != 'STDIN': - os.rename(file['name']+'_tmp',file['name']) # overwrite old one with tmp new \ No newline at end of file + os.rename(file['name']+'_tmp',file['name']) # overwrite old one with tmp new diff --git a/processing/post/addCalculation.py b/processing/post/addCalculation.py index 2a728578b..fd8707414 100755 --- a/processing/post/addCalculation.py +++ b/processing/post/addCalculation.py @@ -53,7 +53,7 @@ if options.labels is None or options.formulas is None: if len(options.labels) != len(options.formulas): parser.error('number of labels ({}) and formulas ({}) do not match.'.format(len(options.labels),len(options.formulas))) -for i in xrange(len(options.formulas)): +for i in range(len(options.formulas)): options.formulas[i] = options.formulas[i].replace(';',',') # ------------------------------------- loop over input files -------------------------------------- @@ -154,7 +154,7 @@ for name in filenames: # ----------------------------------- line 1: assemble header -------------------------------------- for newby in newbies: - table.labels_append(['{}_{}'.format(i+1,newby) for i in xrange(resultDim[newby])] + table.labels_append(['{}_{}'.format(i+1,newby) for i in range(resultDim[newby])] if resultDim[newby] > 1 else newby) table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) diff --git a/processing/post/addCauchy.py b/processing/post/addCauchy.py index 2d366b198..ab619722e 100755 --- a/processing/post/addCauchy.py +++ b/processing/post/addCauchy.py @@ -68,7 +68,7 @@ for name in filenames: # ------------------------------------------ assemble header -------------------------------------- table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['{}_Cauchy'.format(i+1) for i in xrange(9)]) # extend ASCII header with new labels + table.labels_append(['{}_Cauchy'.format(i+1) for i in range(9)]) # extend ASCII header with new labels table.head_write() # ------------------------------------------ process data ------------------------------------------ diff --git a/processing/post/addCompatibilityMismatch.py b/processing/post/addCompatibilityMismatch.py index 107d5d3d1..51e5f5eab 100755 --- a/processing/post/addCompatibilityMismatch.py +++ b/processing/post/addCompatibilityMismatch.py @@ -17,7 +17,7 @@ def cell2node(cellData,grid): nodeData = 0.0 datalen = np.array(cellData.shape[3:]).prod() - for i in xrange(datalen): + for i in range(datalen): node = scipy.ndimage.convolve(cellData.reshape(tuple(grid[::-1])+(datalen,))[...,i], np.ones((2,2,2))/8., # 2x2x2 neighborhood of cells mode = 'wrap', @@ -33,7 +33,7 @@ def cell2node(cellData,grid): #-------------------------------------------------------------------------------------------------- def deformationAvgFFT(F,grid,size,nodal=False,transformed=False): - """calculate average cell center (or nodal) deformation for deformation gradient field specified in each grid cell""" + """Calculate average cell center (or nodal) deformation for deformation gradient field specified in each grid cell""" if nodal: x, y, z = np.meshgrid(np.linspace(0,size[2],1+grid[2]), np.linspace(0,size[1],1+grid[1]), @@ -55,7 +55,7 @@ def deformationAvgFFT(F,grid,size,nodal=False,transformed=False): #-------------------------------------------------------------------------------------------------- def displacementFluctFFT(F,grid,size,nodal=False,transformed=False): - """calculate cell center (or nodal) displacement for deformation gradient field specified in each grid cell""" + """Calculate cell center (or nodal) displacement for deformation gradient field specified in each grid cell""" integrator = 0.5j * size / math.pi kk, kj, ki = np.meshgrid(np.where(np.arange(grid[2])>grid[2]//2,np.arange(grid[2])-grid[2],np.arange(grid[2])), @@ -131,7 +131,7 @@ def volTetrahedron(coords): def volumeMismatch(size,F,nodes): """ - calculates the volume mismatch + Calculates the volume mismatch volume mismatch is defined as the difference between volume of reconstructed (compatible) cube and determinant of defgrad at the FP @@ -142,9 +142,9 @@ def volumeMismatch(size,F,nodes): #-------------------------------------------------------------------------------------------------- # calculate actual volume and volume resulting from deformation gradient - for k in xrange(grid[2]): - for j in xrange(grid[1]): - for i in xrange(grid[0]): + for k in range(grid[2]): + for j in range(grid[1]): + for i in range(grid[0]): coords[0,0:3] = nodes[k, j, i ,0:3] coords[1,0:3] = nodes[k ,j, i+1,0:3] coords[2,0:3] = nodes[k ,j+1,i+1,0:3] @@ -190,9 +190,9 @@ def shapeMismatch(size,F,nodes,centres): #-------------------------------------------------------------------------------------------------- # compare deformed original and deformed positions to actual positions - for k in xrange(grid[2]): - for j in xrange(grid[1]): - for i in xrange(grid[0]): + for k in range(grid[2]): + for j in range(grid[1]): + for i in range(grid[0]): sMismatch[k,j,i] = \ + np.linalg.norm(nodes[k, j, i ,0:3] - centres[k,j,i,0:3] - np.dot(F[k,j,i,:,:], coordsInitial[0,0:3]))\ + np.linalg.norm(nodes[k, j, i+1,0:3] - centres[k,j,i,0:3] - np.dot(F[k,j,i,:,:], coordsInitial[1,0:3]))\ @@ -288,7 +288,7 @@ for name in filenames: np.zeros((table.data.shape[0], 3-table.data[:,9:].shape[1]),dtype='f'))) # fill coords up to 3D with zeros - coords = [np.unique(table.data[:,9+i]) for i in xrange(3)] + coords = [np.unique(table.data[:,9+i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') @@ -324,9 +324,9 @@ for name in filenames: volumeMismatch = volumeMismatch(size,table.data[:,:9].reshape(grid[2],grid[1],grid[0],3,3),nodes) # ------------------------------------------ output data ------------------------------------------- - for i in xrange(grid[2]): - for j in xrange(grid[1]): - for k in xrange(grid[0]): + for i in range(grid[2]): + for j in range(grid[1]): + for k in range(grid[0]): table.data_read() if options.shape: table.data_append(shapeMismatch[i,j,k]) if options.volume: table.data_append(volumeMismatch[i,j,k]) diff --git a/processing/post/addCumulative.py b/processing/post/addCumulative.py index 37bd7b5de..71fb1effc 100755 --- a/processing/post/addCumulative.py +++ b/processing/post/addCumulative.py @@ -59,7 +59,7 @@ for name in filenames: dims.append(dim) columns.append(table.label_index(what)) table.labels_append('cum({})'.format(what) if dim == 1 else - ['{}_cum({})'.format(i+1,what) for i in xrange(dim)] ) # extend ASCII header with new labels + ['{}_cum({})'.format(i+1,what) for i in range(dim)] ) # extend ASCII header with new labels if remarks != []: damask.util.croak(remarks) if errors != []: diff --git a/processing/post/addCurl.py b/processing/post/addCurl.py index fab704325..fd358703f 100755 --- a/processing/post/addCurl.py +++ b/processing/post/addCurl.py @@ -24,24 +24,24 @@ def curlFFT(geomdim,field): # differentiation in Fourier space k_s = np.zeros([3],'i') TWOPIIMG = 2.0j*math.pi - for i in xrange(grid[2]): + for i in range(grid[2]): k_s[0] = i if grid[2]%2 == 0 and i == grid[2]//2: k_s[0] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) elif i > grid[2]//2: k_s[0] -= grid[2] - for j in xrange(grid[1]): + for j in range(grid[1]): k_s[1] = j if grid[1]%2 == 0 and j == grid[1]//2: k_s[1] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) elif j > grid[1]//2: k_s[1] -= grid[1] - for k in xrange(grid[0]//2+1): + for k in range(grid[0]//2+1): k_s[2] = k if grid[0]%2 == 0 and k == grid[0]//2: k_s[2] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) xi = (k_s/geomdim)[2::-1].astype('c16') # reversing the field input order if dataType == 'tensor': - for l in xrange(3): + for l in range(3): curl_fourier[i,j,k,0,l] = ( field_fourier[i,j,k,l,2]*xi[1]\ -field_fourier[i,j,k,l,1]*xi[2]) *TWOPIIMG curl_fourier[i,j,k,1,l] = (-field_fourier[i,j,k,l,2]*xi[0]\ @@ -136,14 +136,14 @@ for name in filenames: table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) for type, data in items.iteritems(): for label in data['active']: - table.labels_append(['{}_curlFFT({})'.format(i+1,label) for i in xrange(data['dim'])]) # extend ASCII header with new labels + table.labels_append(['{}_curlFFT({})'.format(i+1,label) for i in range(data['dim'])]) # extend ASCII header with new labels table.head_write() # --------------- figure out size and grid --------------------------------------------------------- table.data_readArray() - coords = [np.unique(table.data[:,colCoord+i]) for i in xrange(3)] + coords = [np.unique(table.data[:,colCoord+i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') diff --git a/processing/post/addDeviator.py b/processing/post/addDeviator.py index 1cf301161..471c2635f 100755 --- a/processing/post/addDeviator.py +++ b/processing/post/addDeviator.py @@ -85,7 +85,7 @@ for name in filenames: table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) for type, data in items.iteritems(): for label in data['active']: - table.labels_append(['{}_dev({})'.format(i+1,label) for i in xrange(data['dim'])] + \ + table.labels_append(['{}_dev({})'.format(i+1,label) for i in range(data['dim'])] + \ (['sph({})'.format(label)] if options.spherical else [])) # extend ASCII header with new labels table.head_write() @@ -101,4 +101,4 @@ for name in filenames: # ------------------------------------------ output finalization ----------------------------------- - table.close() # close input ASCII table (works for stdin) \ No newline at end of file + table.close() # close input ASCII table (works for stdin) diff --git a/processing/post/addDisplacement.py b/processing/post/addDisplacement.py index a791a0e84..611e21db2 100755 --- a/processing/post/addDisplacement.py +++ b/processing/post/addDisplacement.py @@ -17,7 +17,7 @@ def cell2node(cellData,grid): nodeData = 0.0 datalen = np.array(cellData.shape[3:]).prod() - for i in xrange(datalen): + for i in range(datalen): node = scipy.ndimage.convolve(cellData.reshape(tuple(grid[::-1])+(datalen,))[...,i], np.ones((2,2,2))/8., # 2x2x2 neighborhood of cells mode = 'wrap', @@ -33,7 +33,7 @@ def cell2node(cellData,grid): #-------------------------------------------------------------------------------------------------- def displacementAvgFFT(F,grid,size,nodal=False,transformed=False): - """calculate average cell center (or nodal) displacement for deformation gradient field specified in each grid cell""" + """Calculate average cell center (or nodal) displacement for deformation gradient field specified in each grid cell""" if nodal: x, y, z = np.meshgrid(np.linspace(0,size[2],1+grid[2]), np.linspace(0,size[1],1+grid[1]), @@ -55,7 +55,7 @@ def displacementAvgFFT(F,grid,size,nodal=False,transformed=False): #-------------------------------------------------------------------------------------------------- def displacementFluctFFT(F,grid,size,nodal=False,transformed=False): - """calculate cell center (or nodal) displacement for deformation gradient field specified in each grid cell""" + """Calculate cell center (or nodal) displacement for deformation gradient field specified in each grid cell""" integrator = 0.5j * size / math.pi kk, kj, ki = np.meshgrid(np.where(np.arange(grid[2])>grid[2]//2,np.arange(grid[2])-grid[2],np.arange(grid[2])), @@ -167,7 +167,7 @@ for name in filenames: np.zeros((table.data.shape[0], 3-table.data[:,9:].shape[1]),dtype='f'))) # fill coords up to 3D with zeros - coords = [np.unique(table.data[:,9+i]) for i in xrange(3)] + coords = [np.unique(table.data[:,9+i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') @@ -196,16 +196,16 @@ for name in filenames: table.labels_clear() table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append((['{}_pos' .format(i+1) for i in xrange(3)] if options.nodal else []) + - ['{}_avg({}).{}' .format(i+1,options.defgrad,options.pos) for i in xrange(3)] + - ['{}_fluct({}).{}'.format(i+1,options.defgrad,options.pos) for i in xrange(3)] ) + table.labels_append((['{}_pos' .format(i+1) for i in range(3)] if options.nodal else []) + + ['{}_avg({}).{}' .format(i+1,options.defgrad,options.pos) for i in range(3)] + + ['{}_fluct({}).{}'.format(i+1,options.defgrad,options.pos) for i in range(3)] ) table.head_write() # ------------------------------------------ output data ------------------------------------------- - Zrange = np.linspace(0,size[2],1+grid[2]) if options.nodal else xrange(grid[2]) - Yrange = np.linspace(0,size[1],1+grid[1]) if options.nodal else xrange(grid[1]) - Xrange = np.linspace(0,size[0],1+grid[0]) if options.nodal else xrange(grid[0]) + Zrange = np.linspace(0,size[2],1+grid[2]) if options.nodal else range(grid[2]) + Yrange = np.linspace(0,size[1],1+grid[1]) if options.nodal else range(grid[1]) + Xrange = np.linspace(0,size[0],1+grid[0]) if options.nodal else range(grid[0]) for i,z in enumerate(Zrange): for j,y in enumerate(Yrange): diff --git a/processing/post/addDivergence.py b/processing/post/addDivergence.py index ebd9e70d3..bbb7ac8d4 100755 --- a/processing/post/addDivergence.py +++ b/processing/post/addDivergence.py @@ -21,23 +21,23 @@ def divFFT(geomdim,field): # differentiation in Fourier space k_s = np.zeros([3],'i') TWOPIIMG = 2.0j*math.pi - for i in xrange(grid[2]): + for i in range(grid[2]): k_s[0] = i if grid[2]%2 == 0 and i == grid[2]//2: k_s[0] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) elif i > grid[2]//2: k_s[0] -= grid[2] - for j in xrange(grid[1]): + for j in range(grid[1]): k_s[1] = j if grid[1]%2 == 0 and j == grid[1]//2: k_s[1] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) elif j > grid[1]//2: k_s[1] -= grid[1] - for k in xrange(grid[0]//2+1): + for k in range(grid[0]//2+1): k_s[2] = k if grid[0]%2 == 0 and k == grid[0]//2: k_s[2] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) xi = (k_s/geomdim)[2::-1].astype('c16') # reversing the field input order if n == 9: # tensor, 3x3 -> 3 - for l in xrange(3): + for l in range(3): div_fourier[i,j,k,l] = sum(field_fourier[i,j,k,l,0:3]*xi) *TWOPIIMG elif n == 3: # vector, 3 -> 1 div_fourier[i,j,k] = sum(field_fourier[i,j,k,0:3]*xi) *TWOPIIMG @@ -123,14 +123,14 @@ for name in filenames: for type, data in items.iteritems(): for label in data['active']: table.labels_append(['divFFT({})'.format(label) if type == 'vector' else - '{}_divFFT({})'.format(i+1,label) for i in xrange(data['dim']//3)]) # extend ASCII header with new labels + '{}_divFFT({})'.format(i+1,label) for i in range(data['dim']//3)]) # extend ASCII header with new labels table.head_write() # --------------- figure out size and grid --------------------------------------------------------- table.data_readArray() - coords = [np.unique(table.data[:,colCoord+i]) for i in xrange(3)] + coords = [np.unique(table.data[:,colCoord+i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') diff --git a/processing/post/addEuclideanDistance.py b/processing/post/addEuclideanDistance.py index dad334beb..b83c36b6c 100755 --- a/processing/post/addEuclideanDistance.py +++ b/processing/post/addEuclideanDistance.py @@ -20,13 +20,13 @@ def periodic_3Dpad(array, rimdim=(1,1,1)): rimdim[2]:rimdim[2]+size[2]] = array p = np.zeros(3,'i') - for side in xrange(3): - for p[(side+2)%3] in xrange(padded.shape[(side+2)%3]): - for p[(side+1)%3] in xrange(padded.shape[(side+1)%3]): - for p[side%3] in xrange(rimdim[side%3]): + for side in range(3): + for p[(side+2)%3] in range(padded.shape[(side+2)%3]): + for p[(side+1)%3] in range(padded.shape[(side+1)%3]): + for p[side%3] in range(rimdim[side%3]): spot = (p-rimdim)%size padded[p[0],p[1],p[2]] = array[spot[0],spot[1],spot[2]] - for p[side%3] in xrange(rimdim[side%3]+size[side%3],size[side%3]+2*rimdim[side%3]): + for p[side%3] in range(rimdim[side%3]+size[side%3],size[side%3]+2*rimdim[side%3]): spot = (p-rimdim)%size padded[p[0],p[1],p[2]] = array[spot[0],spot[1],spot[2]] return padded @@ -178,7 +178,7 @@ for name in filenames: table.data_readArray() - coords = [np.unique(table.data[:,coordCol+i]) for i in xrange(coordDim)] + coords = [np.unique(table.data[:,coordCol+i]) for i in range(coordDim)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords)+[1]*(3-len(coords)),'i') @@ -215,7 +215,7 @@ for name in filenames: # ...reflects number of unique neighbors uniques = np.where(diffToNeighbor[1:-1,1:-1,1:-1,0] != 0, 1,0) # initialize unique value counter (exclude myself [= 0]) - for i in xrange(1,len(neighborhood)): # check remaining points in neighborhood + for i in range(1,len(neighborhood)): # check remaining points in neighborhood uniques += np.where(np.logical_and( diffToNeighbor[1:-1,1:-1,1:-1,i] != 0, # not myself? diffToNeighbor[1:-1,1:-1,1:-1,i] != diffToNeighbor[1:-1,1:-1,1:-1,i-1], @@ -229,7 +229,7 @@ for name in filenames: distance[i,:,:,:] = ndimage.morphology.distance_transform_edt(distance[i,:,:,:])*[options.scale]*3 distance = distance.reshape([len(feature_list),grid.prod(),1],order='F') - for i in xrange(len(feature_list)): + for i in range(len(feature_list)): stack.append(distance[i,:]) # ------------------------------------------ output result ----------------------------------------- @@ -239,4 +239,4 @@ for name in filenames: # ------------------------------------------ output finalization ----------------------------------- - table.close() # close input ASCII table (works for stdin) \ No newline at end of file + table.close() # close input ASCII table (works for stdin) diff --git a/processing/post/addGradient.py b/processing/post/addGradient.py index b77af853e..da6852ac2 100755 --- a/processing/post/addGradient.py +++ b/processing/post/addGradient.py @@ -24,17 +24,17 @@ def gradFFT(geomdim,field): # differentiation in Fourier space k_s = np.zeros([3],'i') TWOPIIMG = 2.0j*math.pi - for i in xrange(grid[2]): + for i in range(grid[2]): k_s[0] = i if grid[2]%2 == 0 and i == grid[2]//2: k_s[0] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) elif i > grid[2]//2: k_s[0] -= grid[2] - for j in xrange(grid[1]): + for j in range(grid[1]): k_s[1] = j if grid[1]%2 == 0 and j == grid[1]//2: k_s[1] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) elif j > grid[1]//2: k_s[1] -= grid[1] - for k in xrange(grid[0]//2+1): + for k in range(grid[0]//2+1): k_s[2] = k if grid[0]%2 == 0 and k == grid[0]//2: k_s[2] = 0 # for even grid, set Nyquist freq to 0 (Johnson, MIT, 2011) @@ -126,14 +126,14 @@ for name in filenames: table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) for type, data in items.iteritems(): for label in data['active']: - table.labels_append(['{}_gradFFT({})'.format(i+1,label) for i in xrange(3 * data['dim'])]) # extend ASCII header with new labels + table.labels_append(['{}_gradFFT({})'.format(i+1,label) for i in range(3 * data['dim'])]) # extend ASCII header with new labels table.head_write() # --------------- figure out size and grid --------------------------------------------------------- table.data_readArray() - coords = [np.unique(table.data[:,colCoord+i]) for i in xrange(3)] + coords = [np.unique(table.data[:,colCoord+i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') diff --git a/processing/post/addIPFcolor.py b/processing/post/addIPFcolor.py index cedd075c1..2fcc000e1 100755 --- a/processing/post/addIPFcolor.py +++ b/processing/post/addIPFcolor.py @@ -108,7 +108,7 @@ for name in filenames: # ------------------------------------------ assemble header --------------------------------------- table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['{}_IPF_{:g}{:g}{:g}_{sym}'.format(i+1,*options.pole,sym = options.symmetry.lower()) for i in xrange(3)]) + table.labels_append(['{}_IPF_{:g}{:g}{:g}_{sym}'.format(i+1,*options.pole,sym = options.symmetry.lower()) for i in range(3)]) table.head_write() # ------------------------------------------ process data ------------------------------------------ diff --git a/processing/post/addOrientations.py b/processing/post/addOrientations.py index c778e67b0..2c70b5db0 100755 --- a/processing/post/addOrientations.py +++ b/processing/post/addOrientations.py @@ -131,9 +131,9 @@ for name in filenames: table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) for output in options.output: - if output == 'quaternion': table.labels_append(['{}_{}_{}({})'.format(i+1,'quat',options.symmetry,label) for i in xrange(4)]) - elif output == 'rodrigues': table.labels_append(['{}_{}_{}({})'.format(i+1,'rodr',options.symmetry,label) for i in xrange(3)]) - elif output == 'eulers': table.labels_append(['{}_{}_{}({})'.format(i+1,'eulr',options.symmetry,label) for i in xrange(3)]) + if output == 'quaternion': table.labels_append(['{}_{}_{}({})'.format(i+1,'quat',options.symmetry,label) for i in range(4)]) + elif output == 'rodrigues': table.labels_append(['{}_{}_{}({})'.format(i+1,'rodr',options.symmetry,label) for i in range(3)]) + elif output == 'eulers': table.labels_append(['{}_{}_{}({})'.format(i+1,'eulr',options.symmetry,label) for i in range(3)]) table.head_write() # ------------------------------------------ process data ------------------------------------------ diff --git a/processing/post/addPK2.py b/processing/post/addPK2.py index 80f5843ec..25fb33c3e 100755 --- a/processing/post/addPK2.py +++ b/processing/post/addPK2.py @@ -69,7 +69,7 @@ for name in filenames: # ------------------------------------------ assemble header -------------------------------------- table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['%i_S'%(i+1) for i in xrange(9)]) # extend ASCII header with new labels + table.labels_append(['%i_S'%(i+1) for i in range(9)]) # extend ASCII header with new labels table.head_write() # ------------------------------------------ process data ------------------------------------------ diff --git a/processing/post/addPole.py b/processing/post/addPole.py index 291c5a712..10c5cce67 100755 --- a/processing/post/addPole.py +++ b/processing/post/addPole.py @@ -113,7 +113,7 @@ for name in filenames: # ------------------------------------------ assemble header --------------------------------------- table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['{}_pole_{}{}{}'.format(i+1,*options.pole) for i in xrange(2)]) + table.labels_append(['{}_pole_{}{}{}'.format(i+1,*options.pole) for i in range(2)]) table.head_write() # ------------------------------------------ process data ------------------------------------------ diff --git a/processing/post/addSchmidfactors.py b/processing/post/addSchmidfactors.py index 067c3036a..4f34621b7 100755 --- a/processing/post/addSchmidfactors.py +++ b/processing/post/addSchmidfactors.py @@ -199,7 +199,7 @@ if options.lattice in latticeChoices[:2]: c_normal = slipSystems[options.lattice][:,3:] elif options.lattice == latticeChoices[2]: # convert 4 Miller index notation of hex to orthogonal 3 Miller index notation - for i in xrange(len(c_direction)): + for i in range(len(c_direction)): c_direction[i] = np.array([slipSystems['hex'][i,0]*1.5, (slipSystems['hex'][i,0] + 2.*slipSystems['hex'][i,1])*0.5*np.sqrt(3), slipSystems['hex'][i,3]*options.CoverA, diff --git a/processing/post/addSpectralDecomposition.py b/processing/post/addSpectralDecomposition.py index f65e8ac76..3c44a16bc 100755 --- a/processing/post/addSpectralDecomposition.py +++ b/processing/post/addSpectralDecomposition.py @@ -57,8 +57,8 @@ for name in filenames: if dim != data['dim']: remarks.append('column {} is not a {}...'.format(what,type)) else: items[type]['column'].append(table.label_index(what)) - table.labels_append(['{}_eigval({})'.format(i+1,what) for i in xrange(3)]) # extend ASCII header with new labels - table.labels_append(['{}_eigvec({})'.format(i+1,what) for i in xrange(9)]) # extend ASCII header with new labels + table.labels_append(['{}_eigval({})'.format(i+1,what) for i in range(3)]) # extend ASCII header with new labels + table.labels_append(['{}_eigvec({})'.format(i+1,what) for i in range(9)]) # extend ASCII header with new labels if remarks != []: damask.util.croak(remarks) if errors != []: diff --git a/processing/post/addStrainTensors.py b/processing/post/addStrainTensors.py index ee760a65b..447ae03ba 100755 --- a/processing/post/addStrainTensors.py +++ b/processing/post/addStrainTensors.py @@ -112,7 +112,7 @@ for name in filenames: table.labels_append(['{}_{}({}){}'.format(i+1, # extend ASCII header with new labels theStrain, theStretch, - what if what != 'f' else '') for i in xrange(9)]) + what if what != 'f' else '') for i in range(9)]) if remarks != []: damask.util.croak(remarks) if errors != []: diff --git a/processing/post/ascii2hdf5.py b/processing/post/ascii2hdf5.py index ea2819592..effac981b 100755 --- a/processing/post/ascii2hdf5.py +++ b/processing/post/ascii2hdf5.py @@ -79,7 +79,7 @@ incNum = int(asciiTable.data[asciiTable.label_index('inc'), 0]) fullTable = np.copy(asciiTable.data) # deep copy all data, just to be safe labels = asciiTable.labels() labels_idx = [asciiTable.label_index(label) for label in labels] -featuresDim = [labels_idx[i+1] - labels_idx[i] for i in xrange(len(labels)-1)] +featuresDim = [labels_idx[i+1] - labels_idx[i] for i in range(len(labels)-1)] featuresDim.append(fullTable.shape[1] - labels_idx[-1]) # ----- figure out size and grid ----- # @@ -113,7 +113,7 @@ h5f.add_data("Vz", Vz, cmd_log=cmd_log) # add the rest of data from table labelsProcessed = ['inc'] -for fi in xrange(len(labels)): +for fi in range(len(labels)): featureName = labels[fi] # remove trouble maker "("" and ")" from label/feature name if "(" in featureName: @@ -136,7 +136,7 @@ for fi in xrange(len(labels)): # mshGridDim[2], # dataset.shape[1])) # write out data - print "adding {}...".format(featureName) + print("adding {}...".format(featureName)) h5f.add_data(featureName, dataset, cmd_log=cmd_log) # write down the processed label labelsProcessed.append(featureName) diff --git a/processing/post/averageDown.py b/processing/post/averageDown.py index 9ad1b7d0b..886083428 100755 --- a/processing/post/averageDown.py +++ b/processing/post/averageDown.py @@ -94,7 +94,7 @@ for name in filenames: table.data_readArray() if (any(options.grid) == 0 or any(options.size) == 0.0): - coords = [np.unique(table.data[:,colCoord+i]) for i in xrange(3)] + coords = [np.unique(table.data[:,colCoord+i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') diff --git a/processing/post/binXY.py b/processing/post/binXY.py index 2c02b8dcb..819e07df5 100755 --- a/processing/post/binXY.py +++ b/processing/post/binXY.py @@ -127,12 +127,12 @@ for name in filenames: weights=None if options.weight is None else table.data[:,2]) if options.normCol: - for x in xrange(options.bins[0]): + for x in range(options.bins[0]): sum = np.sum(grid[x,:]) if sum > 0.0: grid[x,:] /= sum if options.normRow: - for y in xrange(options.bins[1]): + for y in range(options.bins[1]): sum = np.sum(grid[:,y]) if sum > 0.0: grid[:,y] /= sum @@ -150,8 +150,8 @@ for name in filenames: delta[2] = minmax[2,1]-minmax[2,0] - for x in xrange(options.bins[0]): - for y in xrange(options.bins[1]): + for x in range(options.bins[0]): + for y in range(options.bins[1]): result[x,y,:] = [minmax[0,0]+delta[0]/options.bins[0]*(x+0.5), minmax[1,0]+delta[1]/options.bins[1]*(y+0.5), min(1.0,max(0.0,(grid[x,y]-minmax[2,0])/delta[2]))] diff --git a/processing/post/blowUp.py b/processing/post/blowUp.py index 49156c8f4..0642deab1 100755 --- a/processing/post/blowUp.py +++ b/processing/post/blowUp.py @@ -79,7 +79,7 @@ for name in filenames: table.data_readArray(options.pos) table.data_rewind() - coords = [np.unique(table.data[:,i]) for i in xrange(3)] + coords = [np.unique(table.data[:,i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') @@ -99,9 +99,9 @@ for name in filenames: data = np.zeros(outSize.tolist()+[len(table.labels(raw = True))]) p = np.zeros(3,'i') - for p[2] in xrange(grid[2]): - for p[1] in xrange(grid[1]): - for p[0] in xrange(grid[0]): + for p[2] in range(grid[2]): + for p[1] in range(grid[1]): + for p[0] in range(grid[0]): d = p*packing table.data_read() data[d[0]:d[0]+packing[0], @@ -110,9 +110,9 @@ for name in filenames: : ] = np.tile(np.array(table.data_asFloat(),'d'),packing.tolist()+[1]) # tile to match blowUp voxel size elementSize = size/grid/packing elem = 1 - for c in xrange(outSize[2]): - for b in xrange(outSize[1]): - for a in xrange(outSize[0]): + for c in range(outSize[2]): + for b in range(outSize[1]): + for a in range(outSize[0]): data[a,b,c,colCoord:colCoord+3] = [a+0.5,b+0.5,c+0.5]*elementSize if colElem != -1: data[a,b,c,colElem] = elem table.data = data[a,b,c,:].tolist() diff --git a/processing/post/groupTable.py b/processing/post/groupTable.py index a533794e8..a1205eff4 100755 --- a/processing/post/groupTable.py +++ b/processing/post/groupTable.py @@ -110,18 +110,18 @@ for name in filenames: table.data_readArray() rows,cols = table.data.shape - table.data = table.data[np.lexsort([table.data[:,grpColumn]])] # sort data by grpColumn + table.data = table.data[np.lexsort([table.data[:,grpColumn]])] # sort data by grpColumn - values,index = np.unique(table.data[:,grpColumn], return_index = True) # unique grpColumn values and their positions - index = np.append(index,rows) # add termination position - grpTable = np.empty((len(values), cols)) # initialize output + values,index = np.unique(table.data[:,grpColumn], return_index = True) # unique grpColumn values and their positions + index = np.append(index,rows) # add termination position + grpTable = np.empty((len(values), cols)) # initialize output - for i in xrange(len(values)): # iterate over groups (unique values in grpColumn) + for i in range(len(values)): # iterate over groups (unique values in grpColumn) if options.periodic : - grpTable[i] = periodicAverage(table.data[index[i]:index[i+1]],options.boundary) # apply periodicAverage mapping function + grpTable[i] = periodicAverage(table.data[index[i]:index[i+1]],options.boundary) # apply periodicAverage mapping function else : - grpTable[i] = np.apply_along_axis(mapFunction,0,table.data[index[i]:index[i+1]]) # apply mapping function - if not options.all: grpTable[i,grpColumn] = table.data[index[i],grpColumn] # restore grouping column value + grpTable[i] = np.apply_along_axis(mapFunction,0,table.data[index[i]:index[i+1]]) # apply mapping function + if not options.all: grpTable[i,grpColumn] = table.data[index[i],grpColumn] # restore grouping column value table.data = grpTable diff --git a/processing/post/h5_addCalculation.py b/processing/post/h5_addCalculation.py index dc4975dbf..0ce1981a1 100755 --- a/processing/post/h5_addCalculation.py +++ b/processing/post/h5_addCalculation.py @@ -56,7 +56,7 @@ parser.set_defaults(condition=None) (options, filenames) = parser.parse_args() # ----- parse formulas ----- # -for i in xrange(len(options.formulas)): +for i in range(len(options.formulas)): options.formulas[i] = options.formulas[i].replace(';', ',') # ----- loop over input files ----- # @@ -64,7 +64,7 @@ for name in filenames: try: h5f = damask.H5Table(name, new_file=False) except: - print "!!!Cannot process {}".format(name) + print("!!!Cannot process {}".format(name)) continue damask.util.report(scriptName, name) diff --git a/processing/post/h5_addCauchy.py b/processing/post/h5_addCauchy.py index d80492623..84145d99d 100755 --- a/processing/post/h5_addCauchy.py +++ b/processing/post/h5_addCauchy.py @@ -11,7 +11,7 @@ scriptID = ' '.join([scriptName, damask.version]) def getCauchy(f, p): - """return Cauchy stress for given f and p""" + """Return Cauchy stress for given f and p""" # [Cauchy] = (1/det(F)) * [P].[F_transpose] f = f.reshape((3, 3)) p = p.reshape((3, 3)) diff --git a/processing/post/h5_addIPFcolor.py b/processing/post/h5_addIPFcolor.py index e8abc2a0f..c92483fa5 100755 --- a/processing/post/h5_addIPFcolor.py +++ b/processing/post/h5_addIPFcolor.py @@ -119,7 +119,7 @@ for name in filenames: # calculate the IPF color rgbArrays = np.zeros((orieData.shape[0], 3)) - for ci in xrange(rgbArrays.shape[0]): + for ci in range(rgbArrays.shape[0]): if inputtype == 'eulers': o = damask.Orientation(Eulers=np.array(orieData[ci, :])*toRadians, symmetry=options.symmetry).reduced() diff --git a/processing/post/h5_addMises.py b/processing/post/h5_addMises.py index 941a2f5da..99367cd80 100755 --- a/processing/post/h5_addMises.py +++ b/processing/post/h5_addMises.py @@ -14,7 +14,7 @@ scriptID = ' '.join([scriptName, damask.version]) # ----- Helper functions ----- # def calcMises(what, tensor): - """calculate von Mises equivalent""" + """Calculate von Mises equivalent""" dev = tensor - np.trace(tensor)/3.0*np.eye(3) symdev = 0.5*(dev+dev.T) return math.sqrt(np.sum(symdev*symdev.T) * @@ -61,7 +61,7 @@ for name in filenames: # calculate von Mises equivalent row by row vmStress = np.zeros(tnsr.shape[0]) - for ri in xrange(tnsr.shape[0]): + for ri in range(tnsr.shape[0]): stressTnsr = tnsr[ri, :].reshape(3, 3) vmStress[ri] = calcMises('stress', stressTnsr) @@ -77,7 +77,7 @@ for name in filenames: if options.strain is not None: tnsr = h5f.get_data(options.strain) vmStrain = np.zeros(tnsr.shape[0]) - for ri in xrange(tnsr.shape[0]): + for ri in range(tnsr.shape[0]): strainTnsr = tnsr[ri, :].reshape(3, 3) vmStrain[ri] = calcMises('strain', strainTnsr) label = "Mises{}".format(options.strain) diff --git a/processing/post/h5_addStrainTensors.py b/processing/post/h5_addStrainTensors.py index 65f71e50c..9e3f49233 100755 --- a/processing/post/h5_addStrainTensors.py +++ b/processing/post/h5_addStrainTensors.py @@ -25,13 +25,13 @@ def operator(stretch, strain, eigenvalues): def calcEPS(defgrads, stretchType, strainType): - """calculate specific type of strain tensor""" + """Calculate specific type of strain tensor""" eps = np.zeros(defgrads.shape) # initialize container # TODO: # this loop can use some performance boost # (multi-threading?) - for ri in xrange(defgrads.shape[0]): + for ri in range(defgrads.shape[0]): f = defgrads[ri, :].reshape(3, 3) U, S, Vh = np.linalg.svd(f) R = np.dot(U, Vh) # rotation of polar decomposition diff --git a/processing/post/h5_addXdmfWapper.py b/processing/post/h5_addXdmfWapper.py index 2f213ba84..e5588a069 100755 --- a/processing/post/h5_addXdmfWapper.py +++ b/processing/post/h5_addXdmfWapper.py @@ -29,7 +29,7 @@ scriptID = ' '.join([scriptName,damask.version]) # ----- HELPER FUNCTIONS -----# def addTopLvlCmt(xmlstr, topLevelCmt): - """add top level comment to string from ET""" + """Add top level comment to string from ET""" # a quick hack to add the top level comment to XML file # --> somehow Elementtree does not provide this functionality # --> by default @@ -42,7 +42,7 @@ def addTopLvlCmt(xmlstr, topLevelCmt): # MAIN # -------------------------------------------------------------------- -msg = 'generate Xdmf wrapper for HDF5 file.' +msg = 'Generate Xdmf wrapper for HDF5 file.' parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = msg, @@ -108,7 +108,7 @@ labelsProcessed = ['Vx', 'Vy', 'Vz'] # walk through each attributes for label in labels: if label in labelsProcessed: continue - print "adding {}...".format(label) + print("adding {}...".format(label)) attr = ET.SubElement(grid, 'Attribute', Name=label, Type="None", diff --git a/processing/post/h5_vtkRectilinearGrid.py b/processing/post/h5_vtkRectilinearGrid.py index e8a615986..b08070b84 100755 --- a/processing/post/h5_vtkRectilinearGrid.py +++ b/processing/post/h5_vtkRectilinearGrid.py @@ -21,24 +21,24 @@ scriptID = ' '.join([scriptName, damask.version]) # ----- HELPER FUNCTION ----- # def getMeshFromXYZ(xyzArray, mode): - """calc Vx,Vy,Vz vectors for vtk rectangular mesh""" + """Calc Vx,Vy,Vz vectors for vtk rectangular mesh""" # NOTE: # --> np.unique will automatically sort the list # --> although not exactly n(1), but since mesh dimension should # small anyway, so this is still light weight. dim = xyzArray.shape[1] # 2D:2, 3D:3 - coords = [np.unique(xyzArray[:, i]) for i in xrange(dim)] + coords = [np.unique(xyzArray[:, i]) for i in range(dim)] if mode == 'cell': # since x, y, z might now have the same number of elements, # we have to deal with them individually - for ri in xrange(dim): + for ri in range(dim): vctr_pt = coords[ri] vctr_cell = np.empty(len(vctr_pt)+1) # calculate first and last end point vctr_cell[0] = vctr_pt[0] - 0.5*abs(vctr_pt[1] - vctr_pt[0]) vctr_cell[-1] = vctr_pt[-1] + 0.5*abs(vctr_pt[-2] - vctr_pt[-1]) - for cj in xrange(1, len(vctr_cell)-1): + for cj in range(1, len(vctr_cell)-1): vctr_cell[cj] = 0.5*(vctr_pt[cj-1] + vctr_pt[cj]) # update the coords coords[ri] = vctr_cell diff --git a/processing/post/imageDataDeformed.py b/processing/post/imageDataDeformed.py index 14c4df7c2..5436e1fbd 100755 --- a/processing/post/imageDataDeformed.py +++ b/processing/post/imageDataDeformed.py @@ -168,8 +168,8 @@ for name in filenames: im = Image.new('RGBA',imagesize) draw = ImageDraw.Draw(im) - for y in xrange(options.dimension[1]): - for x in xrange(options.dimension[0]): + for y in range(options.dimension[1]): + for x in range(options.dimension[0]): draw.polygon([nodes[0,x ,y ,options.z], nodes[1,x ,y ,options.z], nodes[0,x+1,y ,options.z], diff --git a/processing/post/mentat_colorMap.py b/processing/post/mentat_colorMap.py index d412890b6..4fad5cd8f 100755 --- a/processing/post/mentat_colorMap.py +++ b/processing/post/mentat_colorMap.py @@ -27,9 +27,9 @@ def outStdout(cmd,locals): exec(cmd[3:]) elif cmd[0:3] == '(?)': cmd = eval(cmd[3:]) - print cmd + print(cmd) else: - print cmd + print(cmd) return @@ -121,17 +121,17 @@ if options.inverse: theMap = theMap.invert() if options.palettef: - print theMap.export(format='raw',steps=options.colorcount) + print(theMap.export(format='raw',steps=options.colorcount)) elif options.palette: for theColor in theMap.export(format='list',steps=options.colorcount): - print '\t'.join(map(lambda x: str(int(255*x)),theColor)) + print('\t'.join(map(lambda x: str(int(255*x)),theColor))) else: # connect to Mentat and change colorMap sys.path.append(damask.solver.Marc().libraryPath()) try: import py_mentat - print 'waiting to connect...' + print('waiting to connect...') py_mentat.py_connect('',options.port) - print 'connected...' + print('connected...') mentat = True except: sys.stderr.write('warning: no valid Mentat release found\n') diff --git a/processing/post/postResults.py b/processing/post/postResults.py index fea63fdb2..a3501bc81 100755 --- a/processing/post/postResults.py +++ b/processing/post/postResults.py @@ -150,7 +150,7 @@ class MPIEspectral_result: # mimic py_post result object self.expectedFileSize = self.dataOffset+self.N_increments*(self.tagLen+self.N_elements*self.N_element_scalars*8) if options.legacy: self.expectedFileSize+=self.expectedFileSize//self.fourByteLimit*8 # add extra 8 bytes for additional headers at 4 GB limits if self.expectedFileSize != self.filesize: - print '\n**\n* Unexpected file size. Incomplete simulation or file corrupted!\n**' + print('\n**\n* Unexpected file size. Incomplete simulation or file corrupted!\n**') def __str__(self): """Summary of results file""" @@ -288,8 +288,8 @@ class MPIEspectral_result: # mimic py_post result object self.file.seek(incStart+where) value = struct.unpack('d',self.file.read(8))[0] except: - print 'seeking',incStart+where - print 'e',e,'idx',idx + print('seeking {}'.format(incStart+where)) + print('e {} idx {}'.format(e,idx)) sys.exit(1) else: @@ -304,7 +304,7 @@ class MPIEspectral_result: # mimic py_post result object try: if where%self.fourByteLimit + 8 >= self.fourByteLimit: # danger of reading into fortran record footer at 4 byte limit data='' - for i in xrange(8): + for i in range(8): self.file.seek(incStart+where+(where//self.fourByteLimit)*8+4) data += self.file.read(1) where += 1 @@ -313,8 +313,8 @@ class MPIEspectral_result: # mimic py_post result object self.file.seek(incStart+where+(where//self.fourByteLimit)*8+4) value = struct.unpack('d',self.file.read(8))[0] except: - print 'seeking',incStart+where+(where//self.fourByteLimit)*8+4 - print 'e',e,'idx',idx + print('seeking {}'.format(incStart+where+(where//self.fourByteLimit)*8+4)) + print('e {} idx {}'.format(e,idx)) sys.exit(1) return [elemental_scalar(node,value) for node in self.element(e).items] @@ -327,7 +327,7 @@ class MPIEspectral_result: # mimic py_post result object # ----------------------------- def ipCoords(elemType, nodalCoordinates): - """returns IP coordinates for a given element""" + """Returns IP coordinates for a given element""" nodeWeightsPerNode = { 7: [ [27.0, 9.0, 3.0, 9.0, 9.0, 3.0, 1.0, 3.0], [ 9.0, 27.0, 9.0, 3.0, 3.0, 9.0, 3.0, 1.0], @@ -376,7 +376,7 @@ def ipCoords(elemType, nodalCoordinates): # ----------------------------- def ipIDs(elemType): - """returns IP numbers for given element type""" + """Returns IP numbers for given element type""" ipPerNode = { 7: [ 1, 2, 4, 3, 5, 6, 8, 7 ], 57: [ 1, 2, 4, 3, 5, 6, 8, 7 ], @@ -392,7 +392,7 @@ def ipIDs(elemType): # ----------------------------- def substituteLocation(string, mesh, coords): - """do variable interpolation in group and filter strings""" + """Do variable interpolation in group and filter strings""" substitute = string substitute = substitute.replace('elem', str(mesh[0])) substitute = substitute.replace('node', str(mesh[1])) @@ -407,7 +407,7 @@ def substituteLocation(string, mesh, coords): # ----------------------------- def heading(glue,parts): - """joins pieces from parts by glue. second to last entry in pieces tells multiplicity""" + """Joins pieces from parts by glue. second to last entry in pieces tells multiplicity""" header = [] for pieces in parts: if pieces[-2] == 0: @@ -420,7 +420,7 @@ def heading(glue,parts): # ----------------------------- def mapIncremental(label, mapping, N, base, new): """ - applies the function defined by "mapping" + Applies the function defined by "mapping" (can be either 'min','max','avg', 'sum', or user specified) to a list of data @@ -450,7 +450,7 @@ def mapIncremental(label, mapping, N, base, new): # ----------------------------- def OpenPostfile(name,type,nodal = False): - """open postfile with extrapolation mode 'translate'""" + """Open postfile with extrapolation mode 'translate'""" p = {\ 'spectral': MPIEspectral_result,\ 'marc': post_open,\ @@ -463,7 +463,7 @@ def OpenPostfile(name,type,nodal = False): # ----------------------------- def ParseOutputFormat(filename,what,me): - """parse .output* files in order to get a list of outputs""" + """Parse .output* files in order to get a list of outputs""" content = [] format = {'outputs':{},'specials':{'brothers':[]}} for prefix in ['']+map(str,range(1,17)): @@ -508,7 +508,7 @@ def ParseOutputFormat(filename,what,me): # ----------------------------- def ParsePostfile(p,filename, outputFormat): """ - parse postfile in order to get position and labels of outputs + Parse postfile in order to get position and labels of outputs needs "outputFormat" for mapping of output names to postfile output indices """ @@ -592,7 +592,7 @@ def ParsePostfile(p,filename, outputFormat): try: stat['LabelOfElementalScalar'][startIndex + offset] = label except IndexError: - print 'trying to assign %s at position %i+%i'%(label,startIndex,offset) + print('trying to assign {} at position {}+{}'.format(label,startIndex,offset)) sys.exit(1) offset += 1 @@ -821,8 +821,8 @@ bg.set_message('parsing .output files...') for what in me: outputFormat[what] = ParseOutputFormat(filename, what, me[what]) if '_id' not in outputFormat[what]['specials']: - print "\nsection '%s' not found in <%s>"%(me[what], what) - print '\n'.join(map(lambda x:' [%s]'%x, outputFormat[what]['specials']['brothers'])) + print("\nsection '{}' not found in <{}>".format(me[what], what)) + print('\n'.join(map(lambda x:' [%s]'%x, outputFormat[what]['specials']['brothers']))) bg.set_message('opening result file...') p = OpenPostfile(filename+extension,options.filetype,options.nodal) @@ -851,17 +851,17 @@ for opt in ['nodalScalar','elemScalar','elemTensor','homogenizationResult','crys if options.info: if options.filetype == 'marc': - print '\n\nMentat release %s'%damask.solver.Marc().version('../../') + print('\n\nMentat release {}'.format(damask.solver.Marc().version('../../'))) if options.filetype == 'spectral': - print '\n\n',p + print('\n\n{}'.format(p)) SummarizePostfile(stat) - print '\nUser Defined Outputs' + print('\nUser Defined Outputs') for what in me: - print '\n ',what,':' + print('\n {}:'.format(what)) for output in outputFormat[what]['outputs']: - print ' ',output + print(' {}'.format(output)) sys.exit(0) @@ -869,7 +869,7 @@ if options.info: # --- build connectivity maps elementsOfNode = {} -for e in xrange(stat['NumberOfElements']): +for e in range(stat['NumberOfElements']): if e%1000 == 0: bg.set_message('connect elem %i...'%e) for n in map(p.node_sequence,p.element(e).items): @@ -892,7 +892,7 @@ groupCount = 0 memberCount = 0 if options.nodalScalar: - for n in xrange(stat['NumberOfNodes']): + for n in range(stat['NumberOfNodes']): if n%1000 == 0: bg.set_message('scan node %i...'%n) myNodeID = p.node_id(n) @@ -927,7 +927,7 @@ if options.nodalScalar: memberCount += 1 else: - for e in xrange(stat['NumberOfElements']): + for e in range(stat['NumberOfElements']): if e%1000 == 0: bg.set_message('scan elem %i...'%e) myElemID = p.element_id(e) @@ -947,27 +947,27 @@ else: # --- filter valid locations # generates an expression that is only true for the locations specified by options.filter filter = substituteLocation(options.filter, [myElemID,myNodeID,myIpID,myGrainID], myIpCoordinates[n]) - if filter != '' and not eval(filter): # for all filter expressions that are not true:... - continue # ... ignore this data point and continue with next + if filter != '' and not eval(filter): # for all filter expressions that are not true:... + continue # ... ignore this data point and continue with next # --- group data locations # generates a unique key for a group of separated data based on the separation criterium for the location grp = substituteLocation('#'.join(options.sep), [myElemID,myNodeID,myIpID,myGrainID], myIpCoordinates[n]) - if grp not in index: # create a new group if not yet present + if grp not in index: # create a new group if not yet present index[grp] = groupCount - groups.append([[0,0,0,0,0.0,0.0,0.0]]) # initialize with avg location + groups.append([[0,0,0,0,0.0,0.0,0.0]]) # initialize with avg location groupCount += 1 groups[index[grp]][0][:4] = mapIncremental('','unique', len(groups[index[grp]])-1, groups[index[grp]][0][:4], - [myElemID,myNodeID,myIpID,myGrainID]) # keep only if unique average location + [myElemID,myNodeID,myIpID,myGrainID]) # keep only if unique average location groups[index[grp]][0][4:] = mapIncremental('','avg', len(groups[index[grp]])-1, groups[index[grp]][0][4:], - myIpCoordinates[n]) # incrementally update average location - groups[index[grp]].append([myElemID,myNodeID,myIpID,myGrainID,n]) # append a new list defining each group member + myIpCoordinates[n]) # incrementally update average location + groups[index[grp]].append([myElemID,myNodeID,myIpID,myGrainID,n]) # append a new list defining each group member memberCount += 1 @@ -996,14 +996,14 @@ if 'none' not in map(str.lower, options.sort): sortKeys = eval('lambda x:(%s)'%(','.join(theKeys))) bg.set_message('sorting groups...') -groups.sort(key = sortKeys) # in-place sorting to save mem +groups.sort(key = sortKeys) # in-place sorting to save mem # --------------------------- create output dir -------------------------------- dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): - os.mkdir(dirname,0755) + os.mkdir(dirname,0o755) fileOpen = False assembleHeader = True @@ -1049,7 +1049,7 @@ for incCount,position in enumerate(locations): # walk through locations if options.separateFiles: if fileOpen: - file.close() + file.close() # noqa fileOpen = False outFilename = eval('"'+eval("'%%s_inc%%0%ii%%s.txt'%(math.log10(max(increments+[1]))+1)")\ +'"%(dirname + os.sep + options.prefix + os.path.split(filename)[1],increments[incCount],options.suffix)') @@ -1070,15 +1070,15 @@ for incCount,position in enumerate(locations): # walk through locations member = 0 for group in groups: - N = 0 # group member counter - for (e,n,i,g,n_local) in group[1:]: # loop over group members + N = 0 # group member counter + for (e,n,i,g,n_local) in group[1:]: # loop over group members member += 1 if member%1000 == 0: time_delta = ((len(locations)*memberCount)/float(member+incCount*memberCount)-1.0)*(time.time()-time_start) bg.set_message('(%02i:%02i:%02i) processing point %i of %i from increment %i (position %i)...' %(time_delta//3600,time_delta%3600//60,time_delta%60,member,memberCount,increments[incCount],position)) - newby = [] # current member's data + newby = [] # current member's data if options.nodalScalar: for label in options.nodalScalar: @@ -1126,7 +1126,7 @@ for incCount,position in enumerate(locations): # walk through locations ['Crystallite']*len(options.crystalliteResult) + ['Constitutive']*len(options.constitutiveResult) ): - outputIndex = list(zip(*outputFormat[resultType]['outputs'])[0]).index(label) # find the position of this output in the outputFormat + outputIndex = list(zip(*outputFormat[resultType]['outputs'])[0]).index(label) # find the position of this output in the outputFormat length = int(outputFormat[resultType]['outputs'][outputIndex][1]) thisHead = heading('_',[[component,''.join( label.split() )] for component in range(int(length>1),length+int(length>1))]) if assembleHeader: header += thisHead @@ -1138,13 +1138,13 @@ for incCount,position in enumerate(locations): # walk through locations 'content':[ p.element_scalar(p.element_sequence(e),stat['IndexOfLabel'][head])[n_local].value for head in thisHead ]}) except KeyError: - print '\nDAMASK outputs seem missing from "post" section of the *.dat file!' + print('\nDAMASK outputs seem missing from "post" section of the *.dat file!') sys.exit() assembleHeader = False if N == 0: - mappedResult = [float(x) for x in xrange(len(header))] # initialize with debug data (should get deleted by *N at N=0) + mappedResult = [float(x) for x in range(len(header))] # init with debug data (should get deleted by *N at N=0) pos = 0 for chunk in newby: diff --git a/processing/post/reLabel.py b/processing/post/reLabel.py index e5979122e..753e1bc1e 100755 --- a/processing/post/reLabel.py +++ b/processing/post/reLabel.py @@ -67,7 +67,7 @@ for name in filenames: if index == -1: remarks.append('label "{}" not present...'.format(options.label[i])) else: m = pattern[dimensions[i]>1].match(table.tags[index]) # isolate label name - for j in xrange(dimensions[i]): + for j in range(dimensions[i]): table.tags[index+j] = table.tags[index+j].replace(m.group(2),options.substitute[i]) # replace name with substitute if remarks != []: damask.util.croak(remarks) diff --git a/processing/post/vtk2ang.py b/processing/post/vtk2ang.py index c315902ef..d38e92fa5 100755 --- a/processing/post/vtk2ang.py +++ b/processing/post/vtk2ang.py @@ -12,7 +12,7 @@ scriptID = ' '.join([scriptName,damask.version]) # ----------------------------- def getHeader(filename,sizeFastIndex,sizeSlowIndex,stepsize): - """returns header for ang file step size in micrometer""" + """Returns header for ang file step size in micrometer""" return '\n'.join([ \ '# TEM_PIXperUM 1.000000', \ '# x-star 1.000000', \ @@ -48,7 +48,7 @@ def getHeader(filename,sizeFastIndex,sizeSlowIndex,stepsize): # ----------------------------- def positiveRadians(angle): - """returns positive angle in radians from angle in degrees""" + """Returns positive angle in radians from angle in degrees""" angle = math.radians(float(angle)) while angle < 0.0: angle += 2.0 * math.pi @@ -59,7 +59,7 @@ def positiveRadians(angle): # ----------------------------- def getDataLine(angles,x,y,validData=True): """ - returns string of one line in ang file + Returns string of one line in ang file convention in ang file: y coordinate comes first and is fastest index positions in micrometer @@ -295,13 +295,13 @@ for filename in filenames: if options.verbose: sys.stdout.write("\nGENERATING POINTS FOR POINT GRID") points = vtk.vtkPoints() - for k in xrange(Npoints[2]): - for j in xrange(Npoints[0]): - for i in xrange(Npoints[1]): # y is fastest index + for k in range(Npoints[2]): + for j in range(Npoints[0]): + for i in range(Npoints[1]): # y is fastest index rotatedpoint = np.array([rotatedbox[0][0] + (float(j) + 0.5) * options.resolution, rotatedbox[1][0] + (float(i) + 0.5) * options.resolution, - rotatedbox[2][0] + (float(k) + 0.5) * options.distance ]) # point in rotated system - point = np.dot(R.T,rotatedpoint) # point in mesh system + rotatedbox[2][0] + (float(k) + 0.5) * options.distance ]) # point in rotated system + point = np.dot(R.T,rotatedpoint) # point in mesh system points.InsertNextPoint(list(point)) if options.verbose: sys.stdout.write("\rGENERATING POINTS FOR POINT GRID %d%%" %(100*(Npoints[1]*(k*Npoints[0]+j)+i+1)/totalNpoints)) @@ -315,7 +315,7 @@ for filename in filenames: if options.verbose: sys.stdout.write("\nGENERATING VERTICES FOR POINT GRID") vertices = vtk.vtkCellArray() - for i in xrange(totalNpoints): + for i in range(totalNpoints): vertex = vtk.vtkVertex() vertex.GetPointIds().SetId(0,i) # each vertex consists of exactly one (index 0) point with ID "i" vertices.InsertNextCell(vertex) @@ -378,7 +378,7 @@ for filename in filenames: with open(angfilename,'w') as angfile: if options.verbose: sys.stdout.write(" %s\n"%angfilename) angfile.write(getHeader(filename,Npoints[1],Npoints[0],options.resolution*options.scale)) - for i in xrange(sliceN*NpointsPerSlice,(sliceN+1)*NpointsPerSlice): # Iterate over points on slice + for i in range(sliceN*NpointsPerSlice,(sliceN+1)*NpointsPerSlice): # Iterate over points on slice # Get euler angles of closest IDs diff --git a/processing/post/vtk_rectilinearGrid.py b/processing/post/vtk_rectilinearGrid.py index dfe376b3f..cc6c01711 100755 --- a/processing/post/vtk_rectilinearGrid.py +++ b/processing/post/vtk_rectilinearGrid.py @@ -76,12 +76,12 @@ for name in filenames: np.zeros((table.data.shape[0], 3-table.data.shape[1]),dtype='f'))) # fill coords up to 3D with zeros - coords = [np.unique(table.data[:,i]) for i in xrange(3)] + coords = [np.unique(table.data[:,i]) for i in range(3)] if options.mode == 'cell': coords = [0.5 * np.array([3.0 * coords[i][0] - coords[i][0 + int(len(coords[i]) > 1)]] + \ - [coords[i][j-1] + coords[i][j] for j in xrange(1,len(coords[i]))] + \ - [3.0 * coords[i][-1] - coords[i][-1 - int(len(coords[i]) > 1)]]) for i in xrange(3)] + [coords[i][j-1] + coords[i][j] for j in range(1,len(coords[i]))] + \ + [3.0 * coords[i][-1] - coords[i][-1 - int(len(coords[i]) > 1)]]) for i in range(3)] grid = np.array(map(len,coords),'i') N = grid.prod() if options.mode == 'point' else (grid-1).prod() diff --git a/processing/pre/abq_addUserOutput.py b/processing/pre/abq_addUserOutput.py index fea8d57b4..80b31f15b 100755 --- a/processing/pre/abq_addUserOutput.py +++ b/processing/pre/abq_addUserOutput.py @@ -3,7 +3,7 @@ import sys,os,re from optparse import OptionParser -import damask +import damask scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) @@ -14,13 +14,13 @@ def ParseOutputFormat(filename,what,me): outputmetafile = filename+'.output'+what try: - file = open(outputmetafile) + myFile = open(outputmetafile) except: print('Could not open file %s'%outputmetafile) raise else: - content = file.readlines() - file.close() + content = myFile.readlines() + myFile.close() tag = '' tagID = 0 @@ -60,7 +60,7 @@ that are written during the first run of the model. Specify which user block format you want to apply by stating the homogenization, crystallite, and phase identifiers. Or have an existing set of user variables copied over from another *.inp file. -""", version= scriptID) +""", version = scriptID) parser.add_option('-m', dest='number', type='int', metavar = 'int', help='maximum requested User Defined Variable [%default]') @@ -92,15 +92,15 @@ me = { 'Homogenization': options.homog, } -for file in files: - print '\033[1m'+scriptName+'\033[0m: '+file+'\n' +for myFile in files: + print('\033[1m'+scriptName+'\033[0m: '+myFile+'\n') if options.useFile: formatFile = os.path.splitext(options.useFile)[0] else: - formatFile = os.path.splitext(file)[0] - file = os.path.splitext(file)[0]+'.inp' - if not os.path.lexists(file): - print file,'not found' + formatFile = os.path.splitext(myFile)[0] + myFile = os.path.splitext(myFile)[0]+'.inp' + if not os.path.lexists(myFile): + print('{} not found'.format(myFile)) continue print('Scanning format files of: %s'%formatFile) @@ -111,8 +111,8 @@ for file in files: for what in me: outputFormat[what] = ParseOutputFormat(formatFile,what,me[what]) if '_id' not in outputFormat[what]['specials']: - print "'%s' not found in <%s>"%(me[what],what) - print '\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers'])) + print("'{}' not found in <{}>".format(me[what],what)) + print('\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers']))) sys.exit(1) UserVars = ['HomogenizationCount'] @@ -140,11 +140,11 @@ for file in files: UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] # Now change *.inp file(s) - print('Adding labels to: %s'%file) - inFile = open(file) + print('Adding labels to: %s'%myFile) + inFile = open(myFile) input = inFile.readlines() inFile.close() - output = open(file,'w') + output = open(myFile,'w') thisSection = '' if options.damaskOption: output.write('$damask {0}\n'.format(options.damaskOption)) @@ -165,3 +165,4 @@ for file in files: if (thisSection.upper() != '*DEPVAR' or not re.match('\s*\d',line)): output.write(line) output.close() + diff --git a/processing/pre/geom_canvas.py b/processing/pre/geom_canvas.py index 831a2b251..427ab8cad 100755 --- a/processing/pre/geom_canvas.py +++ b/processing/pre/geom_canvas.py @@ -93,12 +93,12 @@ for name in filenames: microstructure_cropped = np.zeros(newInfo['grid'],datatype) microstructure_cropped.fill(options.fill if options.real or options.fill > 0 else microstructure.max()+1) - xindex = list(set(xrange(options.offset[0],options.offset[0]+newInfo['grid'][0])) & \ - set(xrange(info['grid'][0]))) - yindex = list(set(xrange(options.offset[1],options.offset[1]+newInfo['grid'][1])) & \ - set(xrange(info['grid'][1]))) - zindex = list(set(xrange(options.offset[2],options.offset[2]+newInfo['grid'][2])) & \ - set(xrange(info['grid'][2]))) + xindex = list(set(range(options.offset[0],options.offset[0]+newInfo['grid'][0])) & \ + set(range(info['grid'][0]))) + yindex = list(set(range(options.offset[1],options.offset[1]+newInfo['grid'][1])) & \ + set(range(info['grid'][1]))) + zindex = list(set(range(options.offset[2],options.offset[2]+newInfo['grid'][2])) & \ + set(range(info['grid'][2]))) translate_x = [i - options.offset[0] for i in xindex] translate_y = [i - options.offset[1] for i in yindex] translate_z = [i - options.offset[2] for i in zindex] diff --git a/processing/pre/geom_fromMinimalSurface.py b/processing/pre/geom_fromMinimalSurface.py index a346aa11d..22ab2f53d 100755 --- a/processing/pre/geom_fromMinimalSurface.py +++ b/processing/pre/geom_fromMinimalSurface.py @@ -125,10 +125,10 @@ for name in filenames: Y = options.periods*2.0*math.pi*(np.arange(options.grid[1])+0.5)/options.grid[1] Z = options.periods*2.0*math.pi*(np.arange(options.grid[2])+0.5)/options.grid[2] - for z in xrange(options.grid[2]): - for y in xrange(options.grid[1]): + for z in range(options.grid[2]): + for y in range(options.grid[1]): table.data_clear() - for x in xrange(options.grid[0]): + for x in range(options.grid[0]): table.data_append(options.microstructure[options.threshold < surface[options.type](X[x],Y[y],Z[z])]) table.data_write() diff --git a/processing/pre/geom_fromOsteonGeometry.py b/processing/pre/geom_fromOsteonGeometry.py index 9f85f99aa..716a43615 100755 --- a/processing/pre/geom_fromOsteonGeometry.py +++ b/processing/pre/geom_fromOsteonGeometry.py @@ -105,8 +105,8 @@ microstructure = np.where(radius < float(options.canal),1,0) + np.where(radius > alphaOfGrain = np.zeros(info['grid'][0]*info['grid'][1],'d') betaOfGrain = np.zeros(info['grid'][0]*info['grid'][1],'d') -for y in xrange(info['grid'][1]): - for x in xrange(info['grid'][0]): +for y in range(info['grid'][1]): + for x in range(info['grid'][0]): if microstructure[y,x] == 0: microstructure[y,x] = info['microstructures'] alphaOfGrain[info['microstructures']] = alpha[y,x] @@ -129,7 +129,7 @@ header.append('(constituent)\tphase 1\ttexture 1\tfraction 1.0') header.append('[interstitial]') header.append('crystallite %i'%options.crystallite) header.append('(constituent)\tphase 2\ttexture 2\tfraction 1.0') -for i in xrange(3,info['microstructures']): +for i in range(3,info['microstructures']): header.append('[Grain%s]'%(str(i).zfill(formatwidth))) header.append('crystallite %i'%options.crystallite) header.append('(constituent)\tphase 3\ttexture %s\tfraction 1.0'%(str(i).rjust(formatwidth))) @@ -137,7 +137,7 @@ for i in xrange(3,info['microstructures']): header.append('') header.append('[canal]') header.append('[interstitial]') -for i in xrange(3,info['microstructures']): +for i in range(3,info['microstructures']): header.append('[Grain%s]'%(str(i).zfill(formatwidth))) header.append('(gauss)\tphi1 %g\tPhi %g\tphi2 0\tscatter 0.0\tfraction 1.0'\ %(alphaOfGrain[i],betaOfGrain[i])) diff --git a/processing/pre/geom_fromTable.py b/processing/pre/geom_fromTable.py index 4f786af9e..9af92888d 100755 --- a/processing/pre/geom_fromTable.py +++ b/processing/pre/geom_fromTable.py @@ -163,7 +163,7 @@ for name in filenames: # --------------- figure out size and grid --------------------------------------------------------- - coords = [np.unique(table.data[:,i]) for i in xrange(3)] + coords = [np.unique(table.data[:,i]) for i in range(3)] mincorner = np.array(map(min,coords)) maxcorner = np.array(map(max,coords)) grid = np.array(map(len,coords),'i') @@ -217,9 +217,9 @@ for name in filenames: tick = time.clock() if options.verbose: bg.set_message('assigning grain IDs...') - for z in xrange(grid[2]): - for y in xrange(grid[1]): - for x in xrange(grid[0]): + for z in range(grid[2]): + for y in range(grid[1]): + for x in range(grid[0]): if (myPos+1)%(N/500.) < 1: time_delta = (time.clock()-tick) * (N - myPos) / myPos if options.verbose: bg.set_message('(%02i:%02i:%02i) processing point %i of %i (grain count %i)...' diff --git a/processing/pre/geom_fromVoronoiTessellation.py b/processing/pre/geom_fromVoronoiTessellation.py index d18e38b9c..dfb68d896 100755 --- a/processing/pre/geom_fromVoronoiTessellation.py +++ b/processing/pre/geom_fromVoronoiTessellation.py @@ -13,7 +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)) @@ -240,7 +240,7 @@ for name in filenames: if np.any(info['size'] <= 0.0) \ and np.all(info['grid'] < 1): errors.append('invalid size x y z.') else: - for i in xrange(3): + for i in range(3): if info['size'][i] <= 0.0: # any invalid size? info['size'][i] = float(info['grid'][i])/max(info['grid']) # normalize to grid remarks.append('rescaling size {} to {}...'.format({0:'x',1:'y',2:'z'}[i],info['size'][i])) diff --git a/processing/pre/geom_grainGrowth.py b/processing/pre/geom_grainGrowth.py index 55b98e627..b6c1953c4 100755 --- a/processing/pre/geom_grainGrowth.py +++ b/processing/pre/geom_grainGrowth.py @@ -95,7 +95,7 @@ for name in filenames: struc = ndimage.generate_binary_structure(3,1) # 3D von Neumann neighborhood - for smoothIter in xrange(options.N): + for smoothIter in range(options.N): periodic_microstructure = np.tile(microstructure,(3,3,3))[grid[0]/2:-grid[0]/2, grid[1]/2:-grid[1]/2, grid[2]/2:-grid[2]/2] # periodically extend the microstructure diff --git a/processing/pre/geom_pack.py b/processing/pre/geom_pack.py index cfa329698..0ade124e7 100755 --- a/processing/pre/geom_pack.py +++ b/processing/pre/geom_pack.py @@ -76,7 +76,7 @@ for name in filenames: items = table.data if len(items) > 2: if items[1].lower() == 'of': items = [int(items[2])]*int(items[0]) - elif items[1].lower() == 'to': items = xrange(int(items[0]),1+int(items[2])) + elif items[1].lower() == 'to': items = range(int(items[0]),1+int(items[2])) else: items = map(int,items) else: items = map(int,items) diff --git a/processing/pre/geom_rescale.py b/processing/pre/geom_rescale.py index f2d9966d6..976db9d5c 100755 --- a/processing/pre/geom_rescale.py +++ b/processing/pre/geom_rescale.py @@ -92,10 +92,10 @@ for name in filenames: newInfo['size'] = np.where(newInfo['size'] <= 0.0, info['size'],newInfo['size']) multiplicity = [] - for j in xrange(3): + for j in range(3): multiplicity.append([]) last = 0 - for i in xrange(info['grid'][j]): + for i in range(info['grid'][j]): this = int((i+1)*float(newInfo['grid'][j])/info['grid'][j]) multiplicity[j].append(this-last) last = this diff --git a/processing/pre/geom_toTable.py b/processing/pre/geom_toTable.py index d34d101e0..beb4987d8 100755 --- a/processing/pre/geom_toTable.py +++ b/processing/pre/geom_toTable.py @@ -63,7 +63,7 @@ for name in filenames: table.info_clear() table.info_append(extra_header + [scriptID + '\t' + ' '.join(sys.argv[1:])]) table.labels_clear() - table.labels_append(['{}_{}'.format(1+i,'pos') for i in xrange(3)]+['microstructure']) + table.labels_append(['{}_{}'.format(1+i,'pos') for i in range(3)]+['microstructure']) table.head_write() table.output_flush() diff --git a/processing/pre/geom_translate.py b/processing/pre/geom_translate.py index f0d39e66f..260f8326f 100755 --- a/processing/pre/geom_translate.py +++ b/processing/pre/geom_translate.py @@ -46,7 +46,7 @@ parser.set_defaults(origin = (0.0,0.0,0.0), datatype = 'f' if options.real else 'i' sub = {} -for i in xrange(len(options.substitute)/2): # split substitution list into "from" -> "to" +for i in range(len(options.substitute)/2): # split substitution list into "from" -> "to" sub[int(options.substitute[i*2])] = int(options.substitute[i*2+1]) # --- loop over input files ---------------------------------------------------------------------- @@ -82,7 +82,7 @@ for name in filenames: # --- read data ---------------------------------------------------------------------------------- - microstructure = table.microstructure_read(info['grid'],datatype) # read microstructure + microstructure = table.microstructure_read(info['grid'],datatype) # read microstructure # --- do work ------------------------------------------------------------------------------------ diff --git a/processing/pre/hybridIA_linODFsampling.py b/processing/pre/hybridIA_linODFsampling.py index a04b28e38..128d054e1 100755 --- a/processing/pre/hybridIA_linODFsampling.py +++ b/processing/pre/hybridIA_linODFsampling.py @@ -19,7 +19,7 @@ def integerFactorization(i): return j def binAsBins(bin,intervals): - """explode compound bin into 3D bins list""" + """Explode compound bin into 3D bins list""" bins = [0]*3 bins[0] = (bin//(intervals[1] * intervals[2])) % intervals[0] bins[1] = (bin//intervals[2]) % intervals[1] @@ -27,17 +27,17 @@ def binAsBins(bin,intervals): return bins def binsAsBin(bins,intervals): - """implode 3D bins into compound bin""" + """Implode 3D bins into compound bin""" return (bins[0]*intervals[1] + bins[1])*intervals[2] + bins[2] def EulersAsBins(Eulers,intervals,deltas,center): - """return list of Eulers translated into 3D bins list""" + """Return list of Eulers translated into 3D bins list""" return [int((euler+(0.5-center)*delta)//delta)%interval \ for euler,delta,interval in zip(Eulers,deltas,intervals) \ ] def binAsEulers(bin,intervals,deltas,center): - """compound bin number translated into list of Eulers""" + """Compound bin number translated into list of Eulers""" Eulers = [0.0]*3 Eulers[2] = (bin%intervals[2] + center)*deltas[2] Eulers[1] = (bin//intervals[2]%intervals[1] + center)*deltas[1] @@ -45,7 +45,7 @@ def binAsEulers(bin,intervals,deltas,center): return Eulers def directInvRepetitions(probability,scale): - """calculate number of samples drawn by direct inversion""" + """Calculate number of samples drawn by direct inversion""" nDirectInv = 0 for bin in range(len(probability)): # loop over bins nDirectInv += int(round(probability[bin]*scale)) # calc repetition @@ -270,7 +270,7 @@ for name in filenames: ODF['limit'] = np.radians(limits[1,:]) # right hand limits in radians ODF['center'] = 0.0 if all(limits[0,:]<1e-8) else 0.5 # vertex or cell centered - ODF['interval'] = np.array(map(len,[np.unique(table.data[:,i]) for i in xrange(3)]),'i') # steps are number of distict values + ODF['interval'] = np.array(map(len,[np.unique(table.data[:,i]) for i in range(3)]),'i') # steps are number of distict values ODF['nBins'] = ODF['interval'].prod() ODF['delta'] = np.radians(np.array(limits[1,0:3]-limits[0,0:3])/(ODF['interval']-1)) # step size @@ -349,7 +349,7 @@ for name in filenames: '#-------------------#', ] - for i,ID in enumerate(xrange(nSamples)): + for i,ID in enumerate(range(nSamples)): materialConfig += ['[Grain%s]'%(str(ID+1).zfill(formatwidth)), 'crystallite %i'%options.crystallite, '(constituent) phase %i texture %s fraction 1.0'%(options.phase,str(ID+1).rjust(formatwidth)), @@ -361,7 +361,7 @@ for name in filenames: '#-------------------#', ] - for ID in xrange(nSamples): + for ID in range(nSamples): eulers = Orientations[ID] materialConfig += ['[Grain%s]'%(str(ID+1).zfill(formatwidth)), diff --git a/processing/pre/marc_addUserOutput.py b/processing/pre/marc_addUserOutput.py index 9bc336fd6..048f5330a 100755 --- a/processing/pre/marc_addUserOutput.py +++ b/processing/pre/marc_addUserOutput.py @@ -1,13 +1,6 @@ #!/usr/bin/env python2.7 # -*- coding: UTF-8 no BOM -*- -""" -Writes meaningful labels to the marc input file (*.dat) - -output is based on the files -.output -that are written during the first run of the model. -""" import sys,os,re from optparse import OptionParser import damask @@ -21,13 +14,13 @@ def ParseOutputFormat(filename,what,me): outputmetafile = filename+'.output'+what try: - file = open(outputmetafile) + myFile = open(outputmetafile) except: print('Could not open file %s'%outputmetafile) raise else: - content = file.readlines() - file.close() + content = myFile.readlines() + myFile.close() tag = '' tagID = 0 @@ -109,15 +102,15 @@ me = { 'Homogenization': options.homog, } -for file in files: - print '\033[1m'+scriptName+'\033[0m: '+file+'\n' +for myFile in files: + print('\033[1m'+scriptName+'\033[0m: '+myFile+'\n') if options.useFile != '': formatFile = os.path.splitext(options.useFile)[0] else: - formatFile = os.path.splitext(file)[0] - file = os.path.splitext(file)[0]+'.dat' - if not os.path.lexists(file): - print file,'not found' + formatFile = os.path.splitext(myFile)[0] + myFile = os.path.splitext(myFile)[0]+'.dat' + if not os.path.lexists(myFile): + print('{} not found'.format(myFile)) continue print('Scanning format files of: %s'%formatFile) @@ -128,8 +121,8 @@ for file in files: for what in me: outputFormat[what] = ParseOutputFormat(formatFile,what,me[what]) if '_id' not in outputFormat[what]['specials']: - print "'%s' not found in <%s>"%(me[what],what) - print '\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers'])) + print("'{}' not found in <{}>"%(me[what],what)) + print('\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers']))) sys.exit(1) UserVars = ['HomogenizationCount'] @@ -157,11 +150,11 @@ for file in files: UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] # Now change *.dat file(s) - print('Adding labels to: %s'%file) - inFile = open(file) + print('Adding labels to: %s'%myFile) + inFile = open(myFile) input = inFile.readlines() inFile.close() - output = open(file,'w') + output = open(myFile,'w') thisSection = '' if options.damaskOption: output.write('$damask {0}\n'.format(options.damaskOption)) diff --git a/processing/pre/mentat_pbcOnBoxMesh.py b/processing/pre/mentat_pbcOnBoxMesh.py index 07f8e4b70..71bc0d121 100755 --- a/processing/pre/mentat_pbcOnBoxMesh.py +++ b/processing/pre/mentat_pbcOnBoxMesh.py @@ -58,14 +58,14 @@ def servoLink(): } Nnodes = py_mentat.py_get_int("nnodes()") NodeCoords = np.zeros((Nnodes,3),dtype='d') - for node in xrange(Nnodes): + for node in range(Nnodes): NodeCoords[node,0] = py_mentat.py_get_float("node_x(%i)"%(node+1)) NodeCoords[node,1] = py_mentat.py_get_float("node_y(%i)"%(node+1)) NodeCoords[node,2] = py_mentat.py_get_float("node_z(%i)"%(node+1)) - box['min'] = NodeCoords.min(axis=0) # find the bounding box + box['min'] = NodeCoords.min(axis=0) # find the bounding box box['max'] = NodeCoords.max(axis=0) box['delta'] = box['max']-box['min'] - for coord in xrange(3): # calc the dimension of the bounding box + for coord in range(3): # calc the dimension of the bounding box if box['delta'][coord] != 0.0: for extremum in ['min','max']: rounded = round(box[extremum][coord]*1e+15/box['delta'][coord]) * \ @@ -76,12 +76,12 @@ def servoLink(): #------------------------------------------------------------------------------------------------- # loop over all nodes - for node in xrange(Nnodes): + for node in range(Nnodes): key = {} maxFlag = [False, False, False] Nmax = 0 Nmin = 0 - for coord in xrange(3): # for each direction + for coord in range(3): # for each direction if box['delta'][coord] != 0.0: rounded = round(NodeCoords[node,coord]*1e+15/box['delta'][coord]) * \ 1e-15*box['delta'][coord] # rounding to 1e-15 of dimension @@ -102,18 +102,18 @@ def servoLink(): if key['z'] not in baseNode[key['x']][key['y']].keys(): baseNode[key['x']][key['y']][key['z']] = 0 - baseNode[key['x']][key['y']][key['z']] = node+1 # remember the base node id + baseNode[key['x']][key['y']][key['z']] = node+1 # remember the base node id - if Nmax > 0 and Nmax >= Nmin: # node is on at least as many front than back faces - if any([maxFlag[i] and active[i] for i in xrange(3)]): - linkNodes.append({'id': node+1,'coord': NodeCoords[node], 'faceMember': [maxFlag[i] and active[i] for i in xrange(3)]}) + if Nmax > 0 and Nmax >= Nmin: # node is on at least as many front than back faces + if any([maxFlag[i] and active[i] for i in range(3)]): + linkNodes.append({'id': node+1,'coord': NodeCoords[node], 'faceMember': [maxFlag[i] and active[i] for i in range(3)]}) baseCorner = baseNode["%.8e"%box['min'][0]]["%.8e"%box['min'][1]]["%.8e"%box['min'][2]] # detect ultimate base node for node in linkNodes: # loop over all linked nodes linkCoord = [node['coord']] # start list of control node coords with my coords - for dir in xrange(3): # check for each direction + for dir in range(3): # check for each direction if node['faceMember'][dir]: # me on this front face linkCoord[0][dir] = box['min'][dir] # project me onto rear face along dir linkCoord.append(np.array(box['min'])) # append base corner diff --git a/processing/pre/patchFromReconstructedBoundaries.py b/processing/pre/patchFromReconstructedBoundaries.py index 572c929fa..d9861619e 100755 --- a/processing/pre/patchFromReconstructedBoundaries.py +++ b/processing/pre/patchFromReconstructedBoundaries.py @@ -42,9 +42,9 @@ def outStdout(cmd,locals): exec(cmd[3:]) elif cmd[0:3] == '(?)': cmd = eval(cmd[3:]) - print cmd + print(cmd) else: - print cmd + print(cmd) return @@ -84,7 +84,7 @@ def rcbOrientationParser(content,idcolumn): return grains def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn): - """parser for TSL-OIM reconstructed boundary files""" + """Parser for TSL-OIM reconstructed boundary files""" # find bounding box boxX = [1.*sys.maxint,-1.*sys.maxint] boxY = [1.*sys.maxint,-1.*sys.maxint] @@ -333,21 +333,21 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn): for neighbors in grainNeighbors: rcData['neighbors'].append(neighbors) - for legs in grains['legs']: # loop over grains - rcData['grain'].append(legs) # store list of boundary segments + for legs in grains['legs']: # loop over grains + rcData['grain'].append(legs) # store list of boundary segments myNeighbors = {} - for leg in legs: # test each boundary segment - if leg < len(grainNeighbors): # a valid segment index? - for side in range(2): # look at both sides of the segment - if grainNeighbors[leg][side] in myNeighbors: # count occurrence of grain IDs + for leg in legs: # test each boundary segment + if leg < len(grainNeighbors): # a valid segment index? + for side in range(2): # look at both sides of the segment + if grainNeighbors[leg][side] in myNeighbors: # count occurrence of grain IDs myNeighbors[grainNeighbors[leg][side]] += 1 else: myNeighbors[grainNeighbors[leg][side]] = 1 - if myNeighbors: # do I have any neighbors (i.e., non-bounding box segment) - candidateGrains = sorted(myNeighbors.iteritems(), key=lambda (k,v): (v,k), reverse=True) # sort grain counting - # most frequent one not yet seen? + if myNeighbors: # do I have any neighbors (i.e., non-bounding box segment) + candidateGrains = sorted(myNeighbors.items(), key=lambda (k,v): (v,k), reverse=True) # sort grain counting + # most frequent one not yet seen? rcData['grainMapping'].append(candidateGrains[0 if candidateGrains[0][0] not in rcData['grainMapping'] else 1][0]) # must be me then - # special case of bi-crystal situation... + # special case of bi-crystal situation... damask.util.croak(' found {} grains'.format(len(rcData['grain']))) @@ -729,7 +729,7 @@ def image(name,imgsize,marginX,marginY,rcData): # ------------------------- def inside(x,y,points): - """tests whether point(x,y) is within polygon described by points""" + """Tests whether point(x,y) is within polygon described by points""" inside = False npoints=len(points) (x1,y1) = points[npoints-1] # start with last point of points @@ -751,7 +751,7 @@ def inside(x,y,points): # ------------------------- def fftbuild(rcData,height,xframe,yframe,resolution,extrusion): - """build array of grain numbers""" + """Build array of grain numbers""" maxX = -1.*sys.maxint maxY = -1.*sys.maxint for line in rcData['point']: # find data range diff --git a/processing/pre/seeds_fromDistribution.py b/processing/pre/seeds_fromDistribution.py index 18b2712e7..d66f0bedd 100755 --- a/processing/pre/seeds_fromDistribution.py +++ b/processing/pre/seeds_fromDistribution.py @@ -4,7 +4,6 @@ import threading,time,os,sys,random import numpy as np from optparse import OptionParser -from operator import mul from cStringIO import StringIO import damask @@ -65,7 +64,7 @@ class myThread (threading.Thread): NmoveGrains = random.randrange(1,maxSeeds) selectedMs = [] direction = [] - for i in xrange(NmoveGrains): + for i in range(NmoveGrains): selectedMs.append(random.randrange(1,nMicrostructures)) direction.append(np.array(((random.random()-0.5)*delta[0], @@ -110,7 +109,7 @@ class myThread (threading.Thread): currentData=np.bincount(perturbedGeomTable.data.astype(int).ravel())[1:]/points currentError=[] currentHist=[] - for i in xrange(nMicrostructures): # calculate the deviation in all bins per histogram + for i in range(nMicrostructures): # calculate the deviation in all bins per histogram currentHist.append(np.histogram(currentData,bins=target[i]['bins'])[0]) currentError.append(np.sqrt(np.square(np.array(target[i]['histogram']-currentHist[i])).sum())) @@ -122,12 +121,12 @@ class myThread (threading.Thread): bestMatch = match #--- count bin classes with no mismatch ---------------------------------------------------------------------- myMatch=0 - for i in xrange(nMicrostructures): + for i in range(nMicrostructures): if currentError[i] > 0.0: break myMatch = i+1 if myNmicrostructures == nMicrostructures: - for i in xrange(min(nMicrostructures,myMatch+options.bins)): + for i in range(min(nMicrostructures,myMatch+options.bins)): if currentError[i] > target[i]['error']: # worse fitting, next try randReset = True break @@ -146,7 +145,7 @@ class myThread (threading.Thread): for line in perturbedSeedsVFile: currentSeedsFile.write(line) bestSeedsVFile.write(line) - for j in xrange(nMicrostructures): # save new errors for all bins + for j in range(nMicrostructures): # save new errors for all bins target[j]['error'] = currentError[j] if myMatch > match: # one or more new bins have no deviation damask.util.croak( 'Stage {:d} cleared'.format(myMatch)) @@ -160,7 +159,7 @@ class myThread (threading.Thread): bestSeedsVFile = StringIO() for line in perturbedSeedsVFile: bestSeedsVFile.write(line) - for j in xrange(nMicrostructures): + for j in range(nMicrostructures): target[j]['error'] = currentError[j] randReset = True else: #--- not all grains are tessellated @@ -219,8 +218,7 @@ if options.randomSeed is None: damask.util.croak(options.randomSeed) delta = (options.scale/options.grid[0],options.scale/options.grid[1],options.scale/options.grid[2]) baseFile=os.path.splitext(os.path.basename(options.seedFile))[0] -points = float(reduce(mul,options.grid)) - +points = np.array(options.grid).prod().astype('float') # ----------- calculate target distribution and bin edges targetGeomFile = os.path.splitext(os.path.basename(options.target))[0]+'.geom' @@ -231,7 +229,7 @@ nMicrostructures = info['microstructures'] targetVolFrac = np.bincount(targetGeomTable.microstructure_read(info['grid']))[1:nMicrostructures+1]/\ float(info['grid'].prod()) target=[] -for i in xrange(1,nMicrostructures+1): +for i in range(1,nMicrostructures+1): targetHist,targetBins = np.histogram(targetVolFrac,bins=i) #bin boundaries target.append({'histogram':targetHist,'bins':targetBins}) @@ -260,7 +258,7 @@ info,devNull = initialGeomTable.head_getGeom() if info['microstructures'] != nMicrostructures: damask.util.croak('error. Microstructure count mismatch') initialData = np.bincount(initialGeomTable.microstructure_read(info['grid']))/points -for i in xrange(nMicrostructures): +for i in range(nMicrostructures): initialHist = np.histogram(initialData,bins=target[i]['bins'])[0] target[i]['error']=np.sqrt(np.square(np.array(target[i]['histogram']-initialHist)).sum()) @@ -269,7 +267,7 @@ if target[0]['error'] > 0.0: target[0]['error'] *=((target[0]['bins'][0]-np.min(initialData))**2.0+ (target[0]['bins'][1]-np.max(initialData))**2.0)**0.5 match=0 -for i in xrange(nMicrostructures): +for i in range(nMicrostructures): if target[i]['error'] > 0.0: break match = i+1 diff --git a/processing/pre/seeds_fromPokes.py b/processing/pre/seeds_fromPokes.py index 5d2cc212f..d3ea632fc 100755 --- a/processing/pre/seeds_fromPokes.py +++ b/processing/pre/seeds_fromPokes.py @@ -105,12 +105,12 @@ for name in filenames: grid = np.zeros(3,'i') n = 0 - for i in xrange(Nx): - for j in xrange(Ny): + for i in range(Nx): + for j in range(Ny): grid[0] = round((i+0.5)*box[0]*info['grid'][0]/Nx-0.5)+offset[0] grid[1] = round((j+0.5)*box[1]*info['grid'][1]/Ny-0.5)+offset[1] damask.util.croak('x,y coord on surface: {},{}...'.format(*grid[:2])) - for k in xrange(Nz): + for k in range(Nz): grid[2] = k + offset[2] grid %= info['grid'] seeds[n,0:3] = (0.5+grid)/info['grid'] # normalize coordinates to box diff --git a/processing/pre/seeds_fromRandom.py b/processing/pre/seeds_fromRandom.py index f25f210e9..0df292ed2 100755 --- a/processing/pre/seeds_fromRandom.py +++ b/processing/pre/seeds_fromRandom.py @@ -14,12 +14,12 @@ scriptID = ' '.join([scriptName,damask.version]) # ------------------------------------------ aux functions --------------------------------- def kdtree_search(cloud, queryPoints): - """find distances to nearest neighbor among cloud (N,d) for each of the queryPoints (n,d)""" + """Find distances to nearest neighbor among cloud (N,d) for each of the queryPoints (n,d)""" n = queryPoints.shape[0] distances = np.zeros(n,dtype=float) tree = spatial.cKDTree(cloud) - for i in xrange(n): + for i in range(n): distances[i], index = tree.query(queryPoints[i]) return distances @@ -227,8 +227,8 @@ for name in filenames: "randomSeed\t{}".format(options.randomSeed), ]) table.labels_clear() - table.labels_append( ['{dim}_{label}'.format(dim = 1+k,label = 'pos') for k in xrange(3)] + - ['{dim}_{label}'.format(dim = 1+k,label = 'euler') for k in xrange(3)] + + table.labels_append( ['{dim}_{label}'.format(dim = 1+k,label = 'pos') for k in range(3)] + + ['{dim}_{label}'.format(dim = 1+k,label = 'euler') for k in range(3)] + ['microstructure'] + (['weight'] if options.weights else [])) table.head_write() From 95fb50272fc15f1a120367fd60dd61b03b0682c1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 25 Oct 2016 06:51:40 +0200 Subject: [PATCH 03/15] adopted to python 3. for replacement of cmp function, see https://docs.python.org/3.0/whatsnew/3.0.html it's recommended to remove it completely --- lib/damask/orientation.py | 68 ++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/lib/damask/orientation.py b/lib/damask/orientation.py index d5274571b..898a431bb 100644 --- a/lib/damask/orientation.py +++ b/lib/damask/orientation.py @@ -42,7 +42,7 @@ class Quaternion: def __init__(self, quatArray = [1.0,0.0,0.0,0.0]): - """initializes to identity if not given""" + """Initializes to identity if not given""" self.w, \ self.x, \ self.y, \ @@ -50,23 +50,23 @@ class Quaternion: self.homomorph() def __iter__(self): - """components""" + """Components""" return iter([self.w,self.x,self.y,self.z]) def __copy__(self): - """create copy""" + """Create copy""" Q = Quaternion([self.w,self.x,self.y,self.z]) return Q copy = __copy__ def __repr__(self): - """readbable string""" + """Readbable string""" return 'Quaternion(real=%+.6f, imag=<%+.6f, %+.6f, %+.6f>)' % \ (self.w, self.x, self.y, self.z) def __pow__(self, exponent): - """power""" + """Power""" omega = math.acos(self.w) vRescale = math.sin(exponent*omega)/math.sin(omega) Q = Quaternion() @@ -77,7 +77,7 @@ class Quaternion: return Q def __ipow__(self, exponent): - """in place power""" + """In place power""" omega = math.acos(self.w) vRescale = math.sin(exponent*omega)/math.sin(omega) self.w = np.cos(exponent*omega) @@ -87,7 +87,7 @@ class Quaternion: return self def __mul__(self, other): - """multiplication""" + """Multiplication""" try: # quaternion Aw = self.w Ax = self.x @@ -135,7 +135,7 @@ class Quaternion: return self.copy() def __imul__(self, other): - """in place multiplication""" + """In place multiplication""" try: # Quaternion Ax = self.x Ay = self.y @@ -153,7 +153,7 @@ class Quaternion: return self def __div__(self, other): - """division""" + """Division""" if isinstance(other, (int,float)): w = self.w / other x = self.x / other @@ -164,7 +164,7 @@ class Quaternion: return NotImplemented def __idiv__(self, other): - """in place division""" + """In place division""" if isinstance(other, (int,float)): self.w /= other self.x /= other @@ -173,7 +173,7 @@ class Quaternion: return self def __add__(self, other): - """addition""" + """Addition""" if isinstance(other, Quaternion): w = self.w + other.w x = self.x + other.x @@ -184,7 +184,7 @@ class Quaternion: return NotImplemented def __iadd__(self, other): - """in place division""" + """In place division""" if isinstance(other, Quaternion): self.w += other.w self.x += other.x @@ -193,7 +193,7 @@ class Quaternion: return self def __sub__(self, other): - """subtraction""" + """Subtraction""" if isinstance(other, Quaternion): Q = self.copy() Q.w -= other.w @@ -205,7 +205,7 @@ class Quaternion: return self.copy() def __isub__(self, other): - """in place subtraction""" + """In place subtraction""" if isinstance(other, Quaternion): self.w -= other.w self.x -= other.x @@ -214,7 +214,7 @@ class Quaternion: return self def __neg__(self): - """additive inverse""" + """Additive inverse""" self.w = -self.w self.x = -self.x self.y = -self.y @@ -222,7 +222,7 @@ class Quaternion: return self def __abs__(self): - """norm""" + """Norm""" return math.sqrt(self.w ** 2 + \ self.x ** 2 + \ self.y ** 2 + \ @@ -231,7 +231,7 @@ class Quaternion: magnitude = __abs__ def __eq__(self,other): - """equal at e-8 precision""" + """Equal at e-8 precision""" return (abs(self.w-other.w) < 1e-8 and \ abs(self.x-other.x) < 1e-8 and \ abs(self.y-other.y) < 1e-8 and \ @@ -243,12 +243,12 @@ class Quaternion: abs(-self.z-other.z) < 1e-8) def __ne__(self,other): - """not equal at e-8 precision""" + """Not equal at e-8 precision""" return not self.__eq__(self,other) def __cmp__(self,other): - """linear ordering""" - return cmp(self.Rodrigues(),other.Rodrigues()) + """Linear ordering""" + return (self.Rodrigues()>other.Rodrigues()) - (self.Rodrigues() otherOrder) - (myOrder < otherOrder) def symmetryQuats(self,who = []): """List of symmetry operations as quaternions.""" @@ -845,14 +847,14 @@ class Orientation: self.symmetry = Symmetry(symmetry) def __copy__(self): - """copy""" + """Copy""" return self.__class__(quaternion=self.quaternion,symmetry=self.symmetry.lattice) copy = __copy__ def __repr__(self): - """value as all implemented representations""" + """Value as all implemented representations""" return 'Symmetry: %s\n' % (self.symmetry) + \ 'Quaternion: %s\n' % (self.quaternion) + \ 'Matrix:\n%s\n' % ( '\n'.join(['\t'.join(map(str,self.asMatrix()[i,:])) for i in range(3)]) ) + \ @@ -937,7 +939,7 @@ class Orientation: axis, proper = False, SST = True): - """axis rotated according to orientation (using crystal symmetry to ensure location falls into SST)""" + """Axis rotated according to orientation (using crystal symmetry to ensure location falls into SST)""" if SST: # pole requested to be within SST for i,q in enumerate(self.symmetry.equivalentQuaternions(self.quaternion)): # test all symmetric equivalent quaternions pole = q.conjugated()*axis # align crystal direction to axis @@ -963,7 +965,7 @@ class Orientation: orientations, multiplicity = []): """ - average orientation + Average orientation ref: F. Landis Markley, Yang Cheng, John Lucas Crassidis, and Yaakov Oshman. Averaging Quaternions, @@ -996,7 +998,7 @@ class Orientation: direction, targetSymmetry = None): """ - orientation relationship + Orientation relationship positive number: fcc --> bcc negative number: bcc --> fcc From b74db4e3018d0f0883f372dbd02e9e9ced3b45d8 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 25 Oct 2016 19:30:13 +0200 Subject: [PATCH 04/15] bug fix for potentially undefined variable --- lib/damask/colormaps.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/damask/colormaps.py b/lib/damask/colormaps.py index 6e33613e0..f87af676d 100644 --- a/lib/damask/colormaps.py +++ b/lib/damask/colormaps.py @@ -85,7 +85,7 @@ class Color(): def _HSL2RGB(self): """ - convert H(ue) S(aturation) L(uminance) to R(red) G(reen) B(lue) + Convert H(ue) S(aturation) L(uminance) to R(red) G(reen) B(lue) with S,L,H,R,G,B running from 0 to 1 from http://en.wikipedia.org/wiki/HSL_and_HSV @@ -111,7 +111,7 @@ class Color(): def _RGB2HSL(self): """ - convert R(ed) G(reen) B(lue) to H(ue) S(aturation) L(uminance) + Convert R(ed) G(reen) B(lue) to H(ue) S(aturation) L(uminance) with S,L,H,R,G,B running from 0 to 1 from http://130.113.54.154/~monger/hsl-rgb.html @@ -151,7 +151,7 @@ class Color(): def _RGB2XYZ(self): """ - convert R(ed) G(reen) B(lue) to CIE XYZ + Convert R(ed) G(reen) B(lue) to CIE XYZ with all values in the range of 0 to 1 from http://www.cs.rit.edu/~ncs/color/t_convert.html @@ -180,12 +180,13 @@ class Color(): def _XYZ2RGB(self): """ - convert CIE XYZ to R(ed) G(reen) B(lue) + Convert CIE XYZ to R(ed) G(reen) B(lue) with all values in the range of 0 to 1 from http://www.cs.rit.edu/~ncs/color/t_convert.html """ - if self.model != 'XYZ': return + if self.model != 'XYZ': + return convert = np.array([[ 3.240479,-1.537150,-0.498535], [-0.969256, 1.875992, 0.041556], @@ -211,7 +212,7 @@ class Color(): def _CIELAB2XYZ(self): """ - convert CIE Lab to CIE XYZ + Convert CIE Lab to CIE XYZ with XYZ in the range of 0 to 1 from http://www.easyrgb.com/index.php?X=MATH&H=07#text7 @@ -235,7 +236,7 @@ class Color(): def _XYZ2CIELAB(self): """ - convert CIE XYZ to CIE Lab + Convert CIE XYZ to CIE Lab with XYZ in the range of 0 to 1 from http://en.wikipedia.org/wiki/Lab_color_space, http://www.cs.rit.edu/~ncs/color/t_convert.html @@ -258,7 +259,7 @@ class Color(): def _CIELAB2MSH(self): """ - convert CIE Lab to Msh colorspace + Convert CIE Lab to Msh colorspace from http://www.cs.unm.edu/~kmorel/documents/ColorMaps/DivergingColorMapWorkshop.xls """ @@ -278,7 +279,7 @@ class Color(): def _MSH2CIELAB(self): """ - convert Msh colorspace to CIE Lab + Convert Msh colorspace to CIE Lab s,h in radians from http://www.cs.unm.edu/~kmorel/documents/ColorMaps/DivergingColorMapWorkshop.xls @@ -296,7 +297,7 @@ class Color(): class Colormap(): - """perceptually uniform diverging or sequential colormaps.""" + """Perceptually uniform diverging or sequential colormaps.""" __slots__ = [ 'left', @@ -371,7 +372,7 @@ class Colormap(): # ------------------------------------------------------------------ def __repr__(self): - """left and right value of colormap""" + """Left and right value of colormap""" return 'Left: %s Right: %s'%(self.left,self.right) @@ -416,7 +417,7 @@ class Colormap(): def interpolate_linear(lo, hi, frac): """ - linearly interpolate color at given fraction between lower and + Linearly interpolate color at given fraction between lower and higher color in model of lower color """ @@ -456,9 +457,8 @@ class Colormap(): colormap = ['[\n {{\n "ColorSpace" : "RGB", "Name" : "{}",\n "RGBPoints" : ['.format(name)] \ + [' {:4d},{:8.6f},{:8.6f},{:8.6f},'.format(i,color[0],color[1],color[2],) for i,color in enumerate(colors[:-1])]\ - + [' {:4d},{:8.6f},{:8.6f},{:8.6f} '.format(i+1,colors[-1][0],colors[-1][1],colors[-1][2],)]\ + + [' {:4d},{:8.6f},{:8.6f},{:8.6f} '.format(len(colors),colors[-1][0],colors[-1][1],colors[-1][2],)]\ + [' ]\n }\n]'] - elif format == 'gmsh': colormap = ['View.ColorTable = {'] \ + [',\n'.join(['{%s}'%(','.join([str(x*255.0) for x in color])) for color in colors])] \ From ac5f19f1f62c0763cc57f2c10914e7ce5ac1826c Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 25 Oct 2016 21:19:05 +0200 Subject: [PATCH 05/15] docstring fixes --- lib/damask/colormaps.py | 3 ++- lib/damask/h5table.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/damask/colormaps.py b/lib/damask/colormaps.py index f87af676d..4466840cc 100644 --- a/lib/damask/colormaps.py +++ b/lib/damask/colormaps.py @@ -5,7 +5,8 @@ import math,numpy as np ### --- COLOR CLASS -------------------------------------------------- class Color(): - """Conversion of colors between different color-spaces. + """ + Conversion of colors between different color-spaces. Colors should be given in the form Color('model',[vector]).To convert and copy color from one space to other, use the methods diff --git a/lib/damask/h5table.py b/lib/damask/h5table.py index 095146d09..bf8069e37 100644 --- a/lib/damask/h5table.py +++ b/lib/damask/h5table.py @@ -48,7 +48,8 @@ def lables_to_path(label, dsXMLPath=None): class H5Table(object): - """Light weight interface class for h5py + """ + Light weight interface class for h5py DESCRIPTION ----------- From a62ab3b5d4851d905ac2678098da4b4b7b733b60 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 25 Oct 2016 21:52:51 +0200 Subject: [PATCH 06/15] fixes (mainly tuple arguments for functions and lambda functions) --- processing/misc/yieldSurface.py | 103 ++++++++++++++++---------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/processing/misc/yieldSurface.py b/processing/misc/yieldSurface.py index 15f97113a..f3b6f0425 100755 --- a/processing/misc/yieldSurface.py +++ b/processing/misc/yieldSurface.py @@ -28,7 +28,7 @@ def runFit(exponent, eqStress, dimension, criterion): nParas = nParas-nExpo fitCriteria[criterion]['bound'][dDim] = fitCriteria[criterion]['bound'][dDim][:nParas] - for i in xrange(nParas): + for i in range(nParas): temp = fitCriteria[criterion]['bound'][dDim][i] if fitCriteria[criterion]['bound'][dDim][i] == (None,None): Guess.append(1.0) @@ -42,8 +42,8 @@ def runFit(exponent, eqStress, dimension, criterion): myLoad = Loadcase(options.load[0],options.load[1],options.load[2], nSet = 10, dimension = dimension, vegter = options.criterion=='vegter') - stressAll= [np.zeros(0,'d').reshape(0,0) for i in xrange(int(options.yieldValue[2]))] - strainAll= [np.zeros(0,'d').reshape(0,0) for i in xrange(int(options.yieldValue[2]))] + stressAll= [np.zeros(0,'d').reshape(0,0) for i in range(int(options.yieldValue[2]))] + strainAll= [np.zeros(0,'d').reshape(0,0) for i in range(int(options.yieldValue[2]))] myFit = Criterion(exponent,eqStress, dimension, criterion) for t in range(options.threads): @@ -57,12 +57,12 @@ def runFit(exponent, eqStress, dimension, criterion): def principalStresses(sigmas): """ - computes principal stresses (i.e. eigenvalues) for a set of Cauchy stresses. + Computes principal stresses (i.e. eigenvalues) for a set of Cauchy stresses. sorted in descending order. """ lambdas=np.zeros(0,'d') - for i in xrange(np.shape(sigmas)[1]): + for i in range(np.shape(sigmas)[1]): eigenvalues = np.linalg.eigvalsh(sym6toT33(sigmas[:,i])) lambdas = np.append(lambdas,np.sort(eigenvalues)[::-1]) #append eigenvalues in descending order lambdas = np.transpose(lambdas.reshape(np.shape(sigmas)[1],3)) @@ -82,7 +82,7 @@ def principalStress(p): t1 + t2*np.cos(phi+np.pi*2.0/3.0), t1 + t2*np.cos(phi+np.pi*4.0/3.0)]) -def principalStrs_Der(p, (s1, s2, s3, s4, s5, s6), dim, Karafillis=False): +def principalStrs_Der(p, s, dim, Karafillis=False): """Derivative of principal stress with respect to stress""" third = 1.0/3.0 third2 = 2.0*third @@ -111,31 +111,31 @@ def principalStrs_Der(p, (s1, s2, s3, s4, s5, s6), dim, Karafillis=False): dSdI = np.array([dSidIj(phi),dSidIj(phi+np.pi*2.0/3.0),dSidIj(phi+np.pi*4.0/3.0)]) # i=1,2,3; j=1,2,3 # calculate the derivation of principal stress with regards to the anisotropic coefficients - one = np.ones_like(s1); zero = np.zeros_like(s1); num = len(s1) + one = np.ones_like(s); zero = np.zeros_like(s); num = len(s) dIdp = np.array([[one, one, one, zero, zero, zero], [p[1]+p[2], p[2]+p[0], p[0]+p[1], -2.0*p[3], -2.0*p[4], -2.0*p[5]], [p[1]*p[2]-p[4]**2, p[2]*p[0]-p[5]**2, p[0]*p[1]-p[3]**2, -2.0*p[3]*p[2]+2.0*p[4]*p[5], -2.0*p[4]*p[0]+2.0*p[5]*p[3], -2.0*p[5]*p[1]+2.0*p[3]*p[4]] ]) if Karafillis: - dpdc = np.array([[zero,s1-s3,s1-s2], [s2-s3,zero,s2-s1], [s3-s2,s3-s1,zero]])/3.0 - dSdp = np.array([np.dot(dSdI[:,:,i],dIdp[:,:,i]).T for i in xrange(num)]).T + dpdc = np.array([[zero,s[0]-s[2],s[0]-s[1]], [s[1]-s[2],zero,s[1]-s[0]], [s[2]-s[1],s[2]-s[0],zero]])/3.0 + dSdp = np.array([np.dot(dSdI[:,:,i],dIdp[:,:,i]).T for i in range(num)]).T if dim == 2: - temp = np.vstack([dSdp[:,3]*s4]).T.reshape(num,1,3).T + temp = np.vstack([dSdp[:,3]*s[3]]).T.reshape(num,1,3).T else: - temp = np.vstack([dSdp[:,3]*s4,dSdp[:,4]*s5,dSdp[:,5]*s6]).T.reshape(num,3,3).T + temp = np.vstack([dSdp[:,3]*s[3],dSdp[:,4]*s[4],dSdp[:,5]*s[5]]).T.reshape(num,3,3).T - return np.concatenate((np.array([np.dot(dSdp[:,0:3,i], dpdc[:,:,i]).T for i in xrange(num)]).T, + return np.concatenate((np.array([np.dot(dSdp[:,0:3,i], dpdc[:,:,i]).T for i in range(num)]).T, temp), axis=1) else: if dim == 2: - dIdc=np.array([[-dIdp[i,0]*s2, -dIdp[i,1]*s1, -dIdp[i,1]*s3, - -dIdp[i,2]*s2, -dIdp[i,2]*s1, -dIdp[i,0]*s3, - dIdp[i,3]*s4 ] for i in xrange(3)]) + dIdc=np.array([[-dIdp[i,0]*s[1], -dIdp[i,1]*s[0], -dIdp[i,1]*s[2], + -dIdp[i,2]*s[1], -dIdp[i,2]*s[0], -dIdp[i,0]*s[2], + dIdp[i,3]*s[3] ] for i in range(3)]) else: - dIdc=np.array([[-dIdp[i,0]*s2, -dIdp[i,1]*s1, -dIdp[i,1]*s3, - -dIdp[i,2]*s2, -dIdp[i,2]*s1, -dIdp[i,0]*s3, - dIdp[i,3]*s4, dIdp[i,4]*s5, dIdp[i,5]*s6 ] for i in xrange(3)]) - return np.array([np.dot(dSdI[:,:,i],dIdc[:,:,i]).T for i in xrange(num)]).T + dIdc=np.array([[-dIdp[i,0]*s[1], -dIdp[i,1]*s[0], -dIdp[i,1]*s[2], + -dIdp[i,2]*s[1], -dIdp[i,2]*s[0], -dIdp[i,0]*s[2], + dIdp[i,3]*s[3], dIdp[i,4]*s[4], dIdp[i,5]*s[5] ] for i in range(3)]) + return np.array([np.dot(dSdI[:,:,i],dIdc[:,:,i]).T for i in range(num)]).T def invariant(sigmas): I = np.zeros(3) @@ -194,7 +194,7 @@ class Vegter(object): refNormals = np.empty([13,2]) refPts[12] = refPtsQtr[0] refNormals[12] = refNormalsQtr[0] - for i in xrange(3): + for i in range(3): refPts[i] = refPtsQtr[i] refPts[i+3] = refPtsQtr[3-i][::-1] refPts[i+6] =-refPtsQtr[i] @@ -207,7 +207,7 @@ class Vegter(object): def _getHingePoints(self): """ - calculate the hinge point B according to the reference points A,C and the normals n,m + Calculate the hinge point B according to the reference points A,C and the normals n,m refPoints = np.array([[p1_x, p1_y], [p2_x, p2_y]]); refNormals = np.array([[n1_x, n1_y], [n2_x, n2_y]]) @@ -220,7 +220,7 @@ class Vegter(object): B1 = (m2*(n1*A1 + n2*A2) - n2*(m1*C1 + m2*C2))/(n1*m2-m1*n2) B2 = (n1*(m1*C1 + m2*C2) - m1*(n1*A1 + n2*A2))/(n1*m2-m1*n2) return np.array([B1,B2]) - return np.array([hingPoint(self.refPts[i:i+2],self.refNormals[i:i+2]) for i in xrange(len(self.refPts)-1)]) + return np.array([hingPoint(self.refPts[i:i+2],self.refNormals[i:i+2]) for i in range(len(self.refPts)-1)]) def getBezier(self): def bezier(R,H): @@ -228,7 +228,7 @@ class Vegter(object): for mu in np.linspace(0.0,1.0,self.nspace): b.append(np.array(R[0]*np.ones_like(mu) + 2.0*mu*(H - R[0]) + mu**2*(R[0]+R[1] - 2.0*H))) return b - return np.array([bezier(self.refPts[i:i+2],self.hingePts[i]) for i in xrange(len(self.refPts)-1)]) + return np.array([bezier(self.refPts[i:i+2],self.hingePts[i]) for i in range(len(self.refPts)-1)]) def VetgerCriterion(stress,lankford, rhoBi0, theta=0.0): """0-pure shear; 1-uniaxial; 2-plane strain; 3-equi-biaxial""" @@ -238,7 +238,7 @@ def VetgerCriterion(stress,lankford, rhoBi0, theta=0.0): lmatrix = np.empty([nset,nset]) theta = np.linspace(0.0,np.pi/2,nset) for i,th in enumerate(theta): - lmatrix[i] = np.array([np.cos(2*j*th) for j in xrange(nset)]) + lmatrix[i] = np.array([np.cos(2*j*th) for j in range(nset)]) return np.linalg.solve(lmatrix, r) nps = len(stress) @@ -250,10 +250,10 @@ def VetgerCriterion(stress,lankford, rhoBi0, theta=0.0): strsSet = stress.reshape(nset,4,2) refPts = np.empty([4,2]) - fouriercoeffs = np.array([np.cos(2.0*i*theta) for i in xrange(nset)]) - for i in xrange(2): + fouriercoeffs = np.array([np.cos(2.0*i*theta) for i in range(nset)]) + for i in range(2): refPts[3,i] = sum(strsSet[:,3,i])/nset - for j in xrange(3): + for j in range(3): refPts[j,i] = np.dot(getFourierParas(strsSet[:,j,i]), fouriercoeffs) @@ -752,9 +752,9 @@ def Yld2000(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): (4.0*D[0]-4.0*D[2]-4.0*D[1]+ D[3])*s11 + (8.0*D[1]-2.0*D[3]-2.0*D[0]+2.0*D[2])*s22, 9.0*D[4]*s12 ])/9.0 - def priStrs((sx,sy,sxy)): - temp = np.sqrt( (sx-sy)**2 + 4.0*sxy**2 ) - return 0.5*(sx+sy + temp), 0.5*(sx+sy - temp) + def priStrs(s): + temp = np.sqrt( (s[0]-s[1])**2 + 4.0*s[2]**2 ) + return 0.5*(s[0]+s[1] + temp), 0.5*(s[0]+s[1] - temp) m2 = m/2.0; m21 = m2 - 1.0 (X1,X2), (Y1,Y2) = priStrs(X), priStrs(Y) # Principal values of X, Y phi1s, phi21s, phi22s = (X1-X2)**2, (2.0*Y2+Y1)**2, (2.0*Y1+Y2)**2 @@ -768,10 +768,11 @@ def Yld2000(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): drdl, drdm = r/m/left, r*math_ln(0.5*left)*(-1.0/m/m) #/(-m*m) dldm = ( phi1*math_ln(phi1s) + phi21*math_ln(phi21s) + phi22*math_ln(phi22s) )*0.5 zero = np.zeros_like(s11); num = len(s11) - def dPrincipalds((X1,X2,X12)): # derivative of principla with respect to stress - temp = 1.0/np.sqrt( (X1-X2)**2 + 4.0*X12**2 ) - dP1dsi = 0.5*np.array([ 1.0+temp*(X1-X2), 1.0-temp*(X1-X2), temp*4.0*X12]) - dP2dsi = 0.5*np.array([ 1.0-temp*(X1-X2), 1.0+temp*(X1-X2), -temp*4.0*X12]) + def dPrincipalds(X): + """Derivative of principla with respect to stress""" + temp = 1.0/np.sqrt( (X[0]-X[1])**2 + 4.0*X[2]**2 ) + dP1dsi = 0.5*np.array([ 1.0+temp*(X[0]-X[1]), 1.0-temp*(X[0]-X[1]), temp*4.0*X[2]]) + dP2dsi = 0.5*np.array([ 1.0-temp*(X[0]-X[1]), 1.0+temp*(X[0]-X[1]), -temp*4.0*X[2]]) return np.array([dP1dsi, dP2dsi]) dXdXi, dYdYi = dPrincipalds(X), dPrincipalds(Y) @@ -782,14 +783,14 @@ def Yld2000(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): [ 4.0*s11-2.0*s22, -4.0*s11+8.0*s22, -4.0*s11+2.0*s22, s11-2.0*s22, zero ], #dY22dD [ zero, zero, zero, zero, 9.0*s12 ] ])/9.0 #dY12dD - dXdC=np.array([np.dot(dXdXi[:,:,i], dXidC[:,:,i]).T for i in xrange(num)]).T - dYdD=np.array([np.dot(dYdYi[:,:,i], dYidD[:,:,i]).T for i in xrange(num)]).T + dXdC=np.array([np.dot(dXdXi[:,:,i], dXidC[:,:,i]).T for i in range(num)]).T + dYdD=np.array([np.dot(dYdYi[:,:,i], dYidD[:,:,i]).T for i in range(num)]).T dldX = m*np.array([ phi1s**m21*(X1-X2), phi1s**m21*(X2-X1)]) dldY = m*np.array([phi21s**m21*(2.0*Y2+Y1) + 2.0*phi22s**m21*(2.0*Y1+Y2), \ phi22s**m21*(2.0*Y1+Y2) + 2.0*phi21s**m21*(2.0*Y2+Y1) ]) - jC = drdl*np.array([np.dot(dldX[:,i], dXdC[:,:,i]) for i in xrange(num)]).T - jD = drdl*np.array([np.dot(dldY[:,i], dYdD[:,:,i]) for i in xrange(num)]).T + jC = drdl*np.array([np.dot(dldX[:,i], dXdC[:,:,i]) for i in range(num)]).T + jD = drdl*np.array([np.dot(dldY[:,i], dYdD[:,:,i]) for i in range(num)]).T jm = drdl*dldm + drdm if mFix[0]: return np.vstack((jC,jD)).T @@ -817,7 +818,7 @@ def Yld200418p(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): p,q = ys(sdev, C), ys(sdev, D) pLambdas, qLambdas = principalStress(p), principalStress(q) # no sort - m2 = m/2.0; x3 = xrange(3); num = len(sv) + m2 = m/2.0; x3 = range(3); num = len(sv) PiQj = np.array([(pLambdas[i,:]-qLambdas[j,:]) for i in x3 for j in x3]) QiPj = np.array([(qLambdas[i,:]-pLambdas[j,:]) for i in x3 for j in x3]).reshape(3,3,num) PiQjs = PiQj**2 @@ -831,8 +832,8 @@ def Yld200418p(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): dldm = np.sum(PiQjs**m2*math_ln(PiQjs),axis=0)*0.5 dPdc, dQdd = principalStrs_Der(p, sdev, dim), principalStrs_Der(q, sdev, dim) PiQjs3d = ( PiQjs**(m2-1.0) ).reshape(3,3,num) - dldP = -m*np.array([np.diag(np.dot(PiQjs3d[:,:,i], QiPj [:,:,i])) for i in xrange(num)]).T - dldQ = m*np.array([np.diag(np.dot(QiPj [:,:,i], PiQjs3d[:,:,i])) for i in xrange(num)]).T + dldP = -m*np.array([np.diag(np.dot(PiQjs3d[:,:,i], QiPj [:,:,i])) for i in range(num)]).T + dldQ = m*np.array([np.diag(np.dot(QiPj [:,:,i], PiQjs3d[:,:,i])) for i in range(num)]).T jm = drdl*dldm + drdm jc = drdl*np.sum([dldP[i]*dPdc[i] for i in x3],axis=0) @@ -851,9 +852,9 @@ def KarafillisBoyce(eqStress, paras, sigmas, mFix, criteria, dim, Jac=False): 0 Date: Tue, 25 Oct 2016 21:53:32 +0200 Subject: [PATCH 07/15] proper capitalization --- processing/post/vtk2ang.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processing/post/vtk2ang.py b/processing/post/vtk2ang.py index d38e92fa5..6da07bc02 100755 --- a/processing/post/vtk2ang.py +++ b/processing/post/vtk2ang.py @@ -59,9 +59,9 @@ def positiveRadians(angle): # ----------------------------- def getDataLine(angles,x,y,validData=True): """ - Returns string of one line in ang file + Returns string of one line in ang file. - convention in ang file: y coordinate comes first and is fastest index + Convention in ang file: y coordinate comes first and is fastest index positions in micrometer """ info = {True: (9999.9, 1.0, 0,99999,0.0), From 6d9d25ea43ddc26bee3bc80d73ced1554b87184e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 27 Oct 2016 22:41:50 +0200 Subject: [PATCH 08/15] python 3 compatible and modernized --- .../pre/patchFromReconstructedBoundaries.py | 182 +++++++++--------- 1 file changed, 87 insertions(+), 95 deletions(-) diff --git a/processing/pre/patchFromReconstructedBoundaries.py b/processing/pre/patchFromReconstructedBoundaries.py index d9861619e..a43ccc236 100755 --- a/processing/pre/patchFromReconstructedBoundaries.py +++ b/processing/pre/patchFromReconstructedBoundaries.py @@ -13,7 +13,7 @@ scriptID = ' '.join([scriptName,damask.version]) try: # check for Python Image Lib from PIL import Image,ImageDraw ImageCapability = True -except: +except ImportError: ImageCapability = False sys.path.append(damask.solver.Marc().libraryPath()) @@ -21,7 +21,7 @@ sys.path.append(damask.solver.Marc().libraryPath()) try: # check for MSC.Mentat Python interface import py_mentat MentatCapability = True -except: +except ImportError: MentatCapability = False @@ -344,7 +344,7 @@ def rcbParser(content,M,size,tolerance,idcolumn,segmentcolumn): else: myNeighbors[grainNeighbors[leg][side]] = 1 if myNeighbors: # do I have any neighbors (i.e., non-bounding box segment) - candidateGrains = sorted(myNeighbors.items(), key=lambda (k,v): (v,k), reverse=True) # sort grain counting + candidateGrains = sorted(myNeighbors.iteritems(), key=lambda p: (p[1],p[0]), reverse=True) # sort grain counting # most frequent one not yet seen? rcData['grainMapping'].append(candidateGrains[0 if candidateGrains[0][0] not in rcData['grainMapping'] else 1][0]) # must be me then # special case of bi-crystal situation... @@ -647,7 +647,6 @@ def job(grainNumber,grainMapping,twoD): "*job_param univ_gas_const 8.314472", "*job_param planck_radiation_2 1.4387752e-2", "*job_param speed_light_vacuum 299792458", -# "*job_usersub_file /san/%s/FEM/DAMASK/code/mpie_cpfem_marc2010.f90 | subroutine definition"%(pwd.getpwuid(os.geteuid())[0].rpartition("\\")[2]), "*job_option user_source:compile_save", ] @@ -750,7 +749,7 @@ def inside(x,y,points): return inside # ------------------------- -def fftbuild(rcData,height,xframe,yframe,resolution,extrusion): +def fftbuild(rcData,height,xframe,yframe,grid,extrusion): """Build array of grain numbers""" maxX = -1.*sys.maxint maxY = -1.*sys.maxint @@ -760,14 +759,14 @@ def fftbuild(rcData,height,xframe,yframe,resolution,extrusion): maxY = max(maxY, y) xsize = maxX+2*xframe # add framsize ysize = maxY+2*yframe - xres = int(round(resolution/2.0)*2) # use only even resolution - yres = int(round(xres/xsize*ysize/2.0)*2) # calculate other resolutions + xres = int(grid) + yres = int(xres/xsize*ysize) zres = extrusion zsize = extrusion*min([xsize/xres,ysize/yres]) fftdata = {'fftpoints':[], \ - 'resolution':(xres,yres,zres), \ - 'dimension':(xsize,ysize,zsize)} + 'grid':(xres,yres,zres), \ + 'size':(xsize,ysize,zsize)} frameindex=len(rcData['grain'])+1 # calculate frame index as largest grain index plus one dx = xsize/(xres) # calculate step sizes @@ -841,8 +840,8 @@ parser.add_option('-x', '--xmargin', type='float', metavar = 'float', dest='xmargin',help='margin in x in units of patch size [%default]') parser.add_option('-y', '--ymargin', type='float', metavar = 'float', dest='ymargin', help='margin in y in units of patch size [%default]') -parser.add_option('-r', '--resolution', type='int', metavar = 'int', - dest='resolution',help='number of Fourier points/Finite Elements across patch size + x_margin [%default]') +parser.add_option('-g', '--grid', type='int', metavar = 'int', + dest='grid',help='number of Fourier points/Finite Elements across patch size + x_margin [%default]') parser.add_option('-z', '--extrusion', type='int', metavar = 'int', dest='extrusion', help='number of repetitions in z-direction [%default]') parser.add_option('-i', '--imagesize', type='int', metavar = 'int', @@ -861,7 +860,7 @@ parser.set_defaults(output = [], port = 40007, xmargin = 0.0, ymargin = 0.0, - resolution = 64, + grid = 64, extrusion = 2, imgsize = 512, M = (0.0,1.0,1.0,0.0), # M_11, M_12, M_21, M_22. x,y in RCB is y,x of Eulers!! @@ -903,14 +902,14 @@ rcData = rcbParser(boundarySegments,options.M,options.size,options.tolerance,opt Minv = np.linalg.inv(np.array(options.M).reshape(2,2)) if 'rcb' in options.output: - print """# Header: -# -# Column 1-3: right hand average orientation (phi1, PHI, phi2 in radians) -# Column 4-6: left hand average orientation (phi1, PHI, phi2 in radians) -# Column 7: length (in microns) -# Column 8: trace angle (in degrees) -# Column 9-12: x,y coordinates of endpoints (in microns) -# Column 13-14: IDs of right hand and left hand grains""" + print('# Header:\n'+ + '# \n'+ + '# Column 1-3: right hand average orientation (phi1, PHI, phi2 in radians)\n'+ + '# Column 4-6: left hand average orientation (phi1, PHI, phi2 in radians)\n'+ + '# Column 7: length (in microns)\n'+ + '# Column 8: trace angle (in degrees)\n'+ + '# Column 9-12: x,y coordinates of endpoints (in microns)\n'+ + '# Column 13-14: IDs of right hand and left hand grains') for i,(left,right) in enumerate(rcData['neighbors']): if rcData['segment'][i]: first = np.dot(Minv,np.array([rcData['bounds'][0][0]+rcData['point'][rcData['segment'][i][0]][0]/rcData['scale'], @@ -919,12 +918,12 @@ if 'rcb' in options.output: second = np.dot(Minv,np.array([rcData['bounds'][0][0]+rcData['point'][rcData['segment'][i][1]][0]/rcData['scale'], rcData['bounds'][0][1]+rcData['point'][rcData['segment'][i][1]][1]/rcData['scale'], ])) - print ' '.join(map(str,orientationData[left-1]+orientationData[right-1])), - print np.linalg.norm(first-second), - print '0', - print ' '.join(map(str,first)), - print ' '.join(map(str,second)), - print ' '.join(map(str,[left,right])) + print(' '.join(map(str,orientationData[left-1]+orientationData[right-1]))+ + str(np.linalg.norm(first-second))+ + '0'+ + ' '.join(map(str,first))+ + ' '.join(map(str,second))+ + ' '.join(map(str,[left,right]))) # ----- write image ----- @@ -934,28 +933,67 @@ if 'image' in options.output and options.imgsize > 0: else: damask.util.croak('...no image drawing possible (PIL missing)...') +# ----- generate material.config ----- + +if any(output in options.output for output in ['spectral','mentat']): + config = [] + config.append('') + + for i,grain in enumerate(rcData['grainMapping']): + config+=['[grain{}]'.format(grain), + 'crystallite\t1', + '(constituent)\tphase 1\ttexture {}\tfraction 1.0'.format(i+1)] + if (options.xmargin > 0.0): + config+=['[x-margin]', + 'crystallite\t1', + '(constituent)\tphase 2\ttexture {}\tfraction 1.0\n'.format(len(rcData['grainMapping'])+1)] + if (options.ymargin > 0.0): + config+=['[y-margin]', + 'crystallite\t1', + '(constituent)\tphase 2\ttexture {}\tfraction 1.0\n'.format(len(rcData['grainMapping'])+1)] + if (options.xmargin > 0.0 and options.ymargin > 0.0): + config+=['[xy-margin]', + 'crystallite\t1', + '(constituent)\tphase 2\ttexture {}\tfraction 1.0\n'.format(len(rcData['grainMapping'])+1)] + + if (options.xmargin > 0.0 or options.ymargin > 0.0): + config.append('[margin]') + + config.append('') + for grain in rcData['grainMapping']: + config+=['[grain{}]'.format(grain), + '(gauss)\tphi1\t%f\tphi\t%f\tphi2\t%f\tscatter\t%f\tfraction\t1.0'\ + %(math.degrees(orientationData[grain-1][0]),math.degrees(orientationData[grain-1][1]),\ + math.degrees(orientationData[grain-1][2]),options.scatter)] + if (options.xmargin > 0.0 or options.ymargin > 0.0): + config+=['[margin]', + '(random)\t\tscatter\t0.0\tfraction\t1.0'] + # ----- write spectral geom ----- if 'spectral' in options.output: - fftdata = fftbuild(rcData, options.size, options.xmargin, options.ymargin, options.resolution, options.extrusion) - - geomFile = open(myName+'_'+str(int(fftdata['resolution'][0]))+'.geom','w') # open geom file for writing - geomFile.write('3\theader\n') # write header info - geomFile.write('grid a %i b %i c %i\n'%(fftdata['resolution'])) # grid resolution - geomFile.write('size x %f y %f z %f\n'%(fftdata['dimension'])) # size - geomFile.write('homogenization 1\n') # homogenization - for z in xrange(fftdata['resolution'][2]): # z repetions - for y in xrange(fftdata['resolution'][1]): # each x-row separately - geomFile.write('\t'.join(map(str,fftdata['fftpoints'][ y *fftdata['resolution'][0]: - (y+1)*fftdata['resolution'][0]]))+'\n') # grain indexes, x-row per line - geomFile.close() # close geom file - - damask.util.croak('assigned {} out of {} (2D) Fourier points...' - .format(len(fftdata['fftpoints']), - int(fftdata['resolution'][0])*int(fftdata['resolution'][1]))) + fftdata = fftbuild(rcData, options.size, options.xmargin, options.ymargin, options.grid, options.extrusion) + table = damask.ASCIItable(outname = myName+'_'+str(int(fftdata['grid'][0]))+'.geom', + labeled = False, + buffered = False) + table.labels_clear() + table.info_clear() + table.info_append([ + scriptID + ' ' + ' '.join(sys.argv[1:]), + "grid\ta {grid[0]}\tb {grid[1]}\tc {grid[2]}".format(grid=fftdata['grid']), + "size\tx {size[0]}\ty {size[1]}\tz {size[2]}".format(size=fftdata['size']), + "homogenization\t1", + ]) + table.info_append(config) + table.head_write() + + table.data = np.array(fftdata['fftpoints']*options.extrusion).\ + reshape(fftdata['grid'][1]*fftdata['grid'][2],fftdata['grid'][0]) + formatwidth = 1+int(math.log10(np.max(table.data))) + table.data_writeArray('%%%ii'%(formatwidth),delimiter=' ') + table.close() -# ----- write Mentat procedure ----- if 'mentat' in options.output: if MentatCapability: @@ -964,19 +1002,19 @@ if 'mentat' in options.output: cmds = [\ init(), - sample(options.size,rcData['dimension'][1]/rcData['dimension'][0],12,options.xmargin,options.ymargin), - patch(options.size,options.resolution,options.mesh,rcData), + sample(options.size,rcData['dimension'][1]/rcData['size'][0],12,options.xmargin,options.ymargin), + patch(options.size,options.grid,options.mesh,rcData), gage(options.mesh,rcData), ] if not options.twoD: - cmds += [expand3D(options.size*(1.0+2.0*options.xmargin)/options.resolution*options.extrusion,options.extrusion),] + cmds += [expand3D(options.size*(1.0+2.0*options.xmargin)/options.grid*options.extrusion,options.extrusion),] cmds += [\ cleanUp(options.size), materials(), initial_conditions(len(rcData['grain']),rcData['grainMapping']), - boundary_conditions(options.strainrate,options.size*(1.0+2.0*options.xmargin)/options.resolution*options.extrusion,\ + boundary_conditions(options.strainrate,options.size*(1.0+2.0*options.xmargin)/options.grid*options.extrusion,\ options.size,rcData['dimension'][1]/rcData['dimension'][0],options.xmargin,options.ymargin), loadcase(options.strain/options.strainrate,options.increments,0.01), job(len(rcData['grain']),rcData['grainMapping'],options.twoD), @@ -996,51 +1034,5 @@ if 'mentat' in options.output: else: damask.util.croak('...no interaction with Mentat possible...') - -# ----- write config data to file ----- - -if 'mentat' in options.output or 'spectral' in options.output: - output = '' - output += '\n\n\n' + \ - '\n[SX]\n' + \ - 'type\tisostrain\n' + \ - 'Ngrains\t1\n' + \ - '\n\n\n' - - for i,grain in enumerate(rcData['grainMapping']): - output += '\n[grain %i]\n'%grain + \ - 'crystallite\t1\n' + \ - '(constituent)\tphase 1\ttexture %i\tfraction 1.0\n'%(i+1) - if (options.xmargin > 0.0): - output += '\n[x-margin]\n' + \ - 'crystallite\t1\n' + \ - '(constituent)\tphase 2\ttexture %i\tfraction 1.0\n'%(len(rcData['grainMapping'])+1) - if (options.ymargin > 0.0): - output += '\n[y-margin]\n' + \ - 'crystallite\t1\n' + \ - '(constituent)\tphase 2\ttexture %i\tfraction 1.0\n'%(len(rcData['grainMapping'])+1) - if (options.xmargin > 0.0 and options.ymargin > 0.0): - output += '\n[margin edge]\n' + \ - 'crystallite\t1\n' + \ - '(constituent)\tphase 2\ttexture %i\tfraction 1.0\n'%(len(rcData['grainMapping'])+1) - - output += '\n\n\n' + \ - '\n[fillMeIn]\n' + \ - '\n\n\n' + \ - '\n[patch]\n' - if (options.xmargin > 0.0 or options.ymargin > 0.0): - output += '\n[margin]\n' - - output += '\n\n\n\n' - for grain in rcData['grainMapping']: - output += '\n[grain %i]\n'%grain + \ - '(gauss)\tphi1\t%f\tphi\t%f\tphi2\t%f\tscatter\t%f\tfraction\t1.0\n'\ - %(math.degrees(orientationData[grain-1][0]),math.degrees(orientationData[grain-1][1]),\ - math.degrees(orientationData[grain-1][2]),options.scatter) - if (options.xmargin > 0.0 or options.ymargin > 0.0): - output += '\n[margin]\n' + \ - '(random)\t\tscatter\t0.0\tfraction\t1.0\n' - - configFile = open(myName+'.config','w') - configFile.write(output) - configFile.close() + with open(myName+'.config','w') as configFile: + configFile.write('\n'.join(config)) From 3dc5bc4379f39c20cd24bcb9c43f626c018e0654 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Mon, 31 Oct 2016 09:33:23 -0400 Subject: [PATCH 09/15] Fixed some language and syntax --- lib/damask/colormaps.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/damask/colormaps.py b/lib/damask/colormaps.py index 4466840cc..4eec0cd94 100644 --- a/lib/damask/colormaps.py +++ b/lib/damask/colormaps.py @@ -8,9 +8,9 @@ class Color(): """ Conversion of colors between different color-spaces. - Colors should be given in the form - Color('model',[vector]).To convert and copy color from one space to other, use the methods - convertTo('model') and expressAs('model')spectively + Colors should be given in the form Color('model',[vector]). + To convert or copy color from one space to other, use the methods + convertTo('model') or expressAs('model'), respectively. """ __slots__ = [ @@ -88,7 +88,7 @@ class Color(): """ Convert H(ue) S(aturation) L(uminance) to R(red) G(reen) B(lue) - with S,L,H,R,G,B running from 0 to 1 + with all values in the range of 0 to 1 from http://en.wikipedia.org/wiki/HSL_and_HSV """ if self.model != 'HSL': return @@ -114,7 +114,7 @@ class Color(): """ Convert R(ed) G(reen) B(lue) to H(ue) S(aturation) L(uminance) - with S,L,H,R,G,B running from 0 to 1 + with all values in the range of 0 to 1 from http://130.113.54.154/~monger/hsl-rgb.html """ if self.model != 'RGB': return @@ -240,7 +240,8 @@ class Color(): Convert CIE XYZ to CIE Lab with XYZ in the range of 0 to 1 - from http://en.wikipedia.org/wiki/Lab_color_space, http://www.cs.rit.edu/~ncs/color/t_convert.html + from http://en.wikipedia.org/wiki/Lab_color_space, + http://www.cs.rit.edu/~ncs/color/t_convert.html """ if self.model != 'XYZ': return @@ -282,7 +283,7 @@ class Color(): """ Convert Msh colorspace to CIE Lab - s,h in radians + with s,h in radians from http://www.cs.unm.edu/~kmorel/documents/ColorMaps/DivergingColorMapWorkshop.xls """ if self.model != 'MSH': return @@ -419,8 +420,7 @@ class Colormap(): def interpolate_linear(lo, hi, frac): """ Linearly interpolate color at given fraction between lower and - - higher color in model of lower color + higher color using model of lower color. """ interpolation = (1.0 - frac) * np.array(lo.color[:]) \ + frac * np.array(hi.expressAs(lo.model).color[:]) @@ -445,10 +445,10 @@ class Colormap(): """ [RGB] colormap for use in paraview or gmsh, or as raw string, or array. - arguments: name, format, steps, crop. - format is one of (paraview, gmsh, raw, list). - crop selects a (sub)range in [-1.0,1.0]. - generates sequential map if one limiting color is either white or black, + Arguments: name, format, steps, crop. + Format is one of (paraview, gmsh, raw, list). + Crop selects a (sub)range in [-1.0,1.0]. + Generates sequential map if one limiting color is either white or black, diverging map otherwise. """ format = format.lower() # consistent comparison basis @@ -482,4 +482,3 @@ class Colormap(): raise NameError('unknown color export format') return '\n'.join(colormap) + '\n' if type(colormap[0]) is str else colormap - From 94fcc9ad247a69d9f94c3917d87a29a21860f971 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Mon, 31 Oct 2016 10:40:58 -0400 Subject: [PATCH 10/15] fixed language and syntax --- lib/damask/h5table.py | 18 +++---- lib/damask/orientation.py | 74 ++++++++++++++--------------- processing/post/addPK2.py | 2 +- processing/pre/abq_addUserOutput.py | 16 +++---- 4 files changed, 55 insertions(+), 55 deletions(-) diff --git a/lib/damask/h5table.py b/lib/damask/h5table.py index bf8069e37..67d5853b6 100644 --- a/lib/damask/h5table.py +++ b/lib/damask/h5table.py @@ -24,7 +24,7 @@ except(NameError): def lables_to_path(label, dsXMLPath=None): - """Read the xml definition file and return the path.""" + """Read the XML definition file and return the path.""" if dsXMLPath is None: # use the default storage layout in DS_HDF5.xml if "h5table.pyc" in __file__: @@ -49,31 +49,31 @@ def lables_to_path(label, dsXMLPath=None): class H5Table(object): """ - Light weight interface class for h5py + Lightweight interface class for h5py DESCRIPTION ----------- Interface/wrapper class for manipulating data in HDF5 with DAMASK specialized data structure. - -->try to maintain a minimal API design. + --> try to maintain a minimal API design. PARAMETERS ---------- h5f_path: str - Absolute path the HDF5 file + Absolute path of the HDF5 file METHOD ------ - del_entry() -- Force delete attributes/group/datasets (Dangerous) + del_entry() -- Force delete attributes/group/datasets (dangerous) get_attr() -- Return attributes if possible add_attr() -- Add NEW attributes to dataset/group (no force overwrite) get_data() -- Retrieve data in numpy.ndarray add_data() -- Add dataset to H5 file - get_cmdlog() -- Return the command used to generate the data if possible. + get_cmdlog() -- Return the command used to generate the data if possible NOTE ---- 1. As an interface class, it uses the lazy evaluation design - that read the data only when its absolutely necessary. - 2. The command line used to generate new feature is stored with - each dataset as dataset attribute. + that reads the data only when it is absolutely necessary. + 2. The command line used to generate each new feature is stored with + each dataset as dataset attribute. """ diff --git a/lib/damask/orientation.py b/lib/damask/orientation.py index 898a431bb..ef1d8be22 100644 --- a/lib/damask/orientation.py +++ b/lib/damask/orientation.py @@ -28,14 +28,14 @@ class Rodrigues: # ****************************************************************************************** class Quaternion: """ - Orientation represented as unit quaternion + Orientation represented as unit quaternion. - All methods and naming conventions based on http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions + All methods and naming conventions based on http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions. - w is the real part, (x, y, z) are the imaginary parts + w is the real part, (x, y, z) are the imaginary parts. Representation of rotation is in ACTIVE form! - (derived directly or through angleAxis, Euler angles, or active matrix) - vector "a" (defined in coordinate system "A") is actively rotated to new coordinates "b" + (Derived directly or through angleAxis, Euler angles, or active matrix) + Vector "a" (defined in coordinate system "A") is actively rotated to new coordinates "b". b = Q * a b = np.dot(Q.asMatrix(),a) """ @@ -77,7 +77,7 @@ class Quaternion: return Q def __ipow__(self, exponent): - """In place power""" + """In-place power""" omega = math.acos(self.w) vRescale = math.sin(exponent*omega)/math.sin(omega) self.w = np.cos(exponent*omega) @@ -135,7 +135,7 @@ class Quaternion: return self.copy() def __imul__(self, other): - """In place multiplication""" + """In-place multiplication""" try: # Quaternion Ax = self.x Ay = self.y @@ -164,7 +164,7 @@ class Quaternion: return NotImplemented def __idiv__(self, other): - """In place division""" + """In-place division""" if isinstance(other, (int,float)): self.w /= other self.x /= other @@ -184,7 +184,7 @@ class Quaternion: return NotImplemented def __iadd__(self, other): - """In place division""" + """In-place addition""" if isinstance(other, Quaternion): self.w += other.w self.x += other.x @@ -205,7 +205,7 @@ class Quaternion: return self.copy() def __isub__(self, other): - """In place subtraction""" + """In-place subtraction""" if isinstance(other, Quaternion): self.w -= other.w self.x -= other.x @@ -339,12 +339,12 @@ class Quaternion: degrees = False, standardRange = False): """ - Orientation as Bunge-Euler angles + Orientation as Bunge-Euler angles. - conversion of ACTIVE rotation to Euler angles taken from: + Conversion of ACTIVE rotation to Euler angles taken from: Melcher, A.; Unser, A.; Reichhardt, M.; Nestler, B.; Poetschke, M.; Selzer, M. Conversion of EBSD data by a quaternion based algorithm to be used for grain structure simulations - Technische Mechanik 30 (2010) pp 401--413 + Technische Mechanik 30 (2010) pp 401--413. """ angles = [0.0,0.0,0.0] @@ -510,8 +510,8 @@ class Quaternion: """ Interpolation - see http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20070017872_2007014421.pdf - for (another?) way to interpolate quaternions + See http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20070017872_2007014421.pdf + for (another?) way to interpolate quaternions. """ assert isinstance(q1, Quaternion) and isinstance(q2, Quaternion) Q = cls() @@ -744,39 +744,39 @@ class Symmetry: if self.lattice == 'cubic': basis = {'improper':np.array([ [-1. , 0. , 1. ], - [ np.sqrt(2.) , -np.sqrt(2.) , 0. ], - [ 0. , np.sqrt(3.) , 0. ] ]), - 'proper':np.array([ [ 0. , -1. , 1. ], - [-np.sqrt(2.) , np.sqrt(2.) , 0. ], - [ np.sqrt(3.) , 0. , 0. ] ]), + [ np.sqrt(2.) , -np.sqrt(2.) , 0. ], + [ 0. , np.sqrt(3.) , 0. ] ]), + 'proper':np.array([ [ 0. , -1. , 1. ], + [-np.sqrt(2.) , np.sqrt(2.) , 0. ], + [ np.sqrt(3. ) , 0. , 0. ] ]), } elif self.lattice == 'hexagonal': basis = {'improper':np.array([ [ 0. , 0. , 1. ], - [ 1. , -np.sqrt(3.), 0. ], - [ 0. , 2. , 0. ] ]), - 'proper':np.array([ [ 0. , 0. , 1. ], - [-1. , np.sqrt(3.) , 0. ], - [ np.sqrt(3) , -1. , 0. ] ]), + [ 1. , -np.sqrt(3.) , 0. ], + [ 0. , 2. , 0. ] ]), + 'proper':np.array([ [ 0. , 0. , 1. ], + [-1. , np.sqrt(3.) , 0. ], + [ np.sqrt(3) , -1. , 0. ] ]), } elif self.lattice == 'tetragonal': basis = {'improper':np.array([ [ 0. , 0. , 1. ], - [ 1. , -1. , 0. ], - [ 0. , np.sqrt(2.), 0. ] ]), - 'proper':np.array([ [ 0. , 0. , 1. ], - [-1. , 1. , 0. ], - [ np.sqrt(2.) , 0. , 0. ] ]), + [ 1. , -1. , 0. ], + [ 0. , np.sqrt(2.) , 0. ] ]), + 'proper':np.array([ [ 0. , 0. , 1. ], + [-1. , 1. , 0. ], + [ np.sqrt(2.) , 0. , 0. ] ]), } elif self.lattice == 'orthorhombic': basis = {'improper':np.array([ [ 0., 0., 1.], - [ 1., 0., 0.], - [ 0., 1., 0.] ]), - 'proper':np.array([ [ 0., 0., 1.], - [-1., 0., 0.], - [ 0., 1., 0.] ]), + [ 1., 0., 0.], + [ 0., 1., 0.] ]), + 'proper':np.array([ [ 0., 0., 1.], + [-1., 0., 0.], + [ 0., 1., 0.] ]), } else: - basis = {'improper':np.zeros((3,3),dtype=float), - 'proper':np.zeros((3,3),dtype=float), + basis = {'improper': np.zeros((3,3),dtype=float), + 'proper': np.zeros((3,3),dtype=float), } if np.all(basis == 0.0): diff --git a/processing/post/addPK2.py b/processing/post/addPK2.py index 25fb33c3e..9e6308c39 100755 --- a/processing/post/addPK2.py +++ b/processing/post/addPK2.py @@ -69,7 +69,7 @@ for name in filenames: # ------------------------------------------ assemble header -------------------------------------- table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['%i_S'%(i+1) for i in range(9)]) # extend ASCII header with new labels + table.labels_append(['{}_S'.format(i+1) for i in range(9)]) # extend ASCII header with new labels table.head_write() # ------------------------------------------ process data ------------------------------------------ diff --git a/processing/pre/abq_addUserOutput.py b/processing/pre/abq_addUserOutput.py index 80b31f15b..a084fcbed 100755 --- a/processing/pre/abq_addUserOutput.py +++ b/processing/pre/abq_addUserOutput.py @@ -51,7 +51,7 @@ def ParseOutputFormat(filename,what,me): parser = OptionParser(option_class=damask.extendableOption, usage='%prog [option(s)] Abaqus.Inputfile(s)', description = """ Transfer the output variables requested in the material.config to -properly labelled user defined variables within the Abaqus input file (*.inp). +properly labelled user-defined variables within the Abaqus input file (*.inp). Requires the files .output @@ -84,7 +84,7 @@ parser.set_defaults(number = 0, (options, files) = parser.parse_args() if not files: - parser.error('no file(s) specified...') + parser.error('no file(s) specified.') me = { 'Homogenization': options.homog, 'Crystallite': options.cryst, @@ -93,7 +93,7 @@ me = { 'Homogenization': options.homog, for myFile in files: - print('\033[1m'+scriptName+'\033[0m: '+myFile+'\n') + damask.util.report(scriptName,myFile) if options.useFile: formatFile = os.path.splitext(options.useFile)[0] else: @@ -103,7 +103,7 @@ for myFile in files: print('{} not found'.format(myFile)) continue - print('Scanning format files of: %s'%formatFile) + print('Scanning format files of: {}'.format(formatFile)) if options.number < 1: outputFormat = {} @@ -140,7 +140,7 @@ for myFile in files: UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] # Now change *.inp file(s) - print('Adding labels to: %s'%myFile) + print('Adding labels to: {}'.format(myFile)) inFile = open(myFile) input = inFile.readlines() inFile.close() @@ -154,11 +154,11 @@ for myFile in files: if m: lastSection = thisSection thisSection = m.group(1) - if (lastSection.upper() == '*DEPVAR' and thisSection.upper() == '*USER'): #Abaqus keyword can be upper or lower case + if (lastSection.upper() == '*DEPVAR' and thisSection.upper() == '*USER'): # Abaqus keyword can be upper or lower case if options.number > 0: - output.write('%i\n'%options.number) #Abaqus needs total number of SDVs in the line after *Depvar keyword + output.write('{}\n'.format(options.number)) # Abaqus needs total number of SDVs in the line after *Depvar keyword else: - output.write('%i\n'%len(UserVars)) + output.write('{}\n'.format(len(UserVars))) for i in range(len(UserVars)): output.write('%i,"%i%s","%i%s"\n'%(i+1,0,UserVars[i],0,UserVars[i])) #index,output variable key,output variable description From cb26ecb8c2d214c69094476803fae44ea9f5a947 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Mon, 31 Oct 2016 11:07:30 -0400 Subject: [PATCH 11/15] fixed two-line summary --- lib/damask/colormaps.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/damask/colormaps.py b/lib/damask/colormaps.py index 4eec0cd94..646950118 100644 --- a/lib/damask/colormaps.py +++ b/lib/damask/colormaps.py @@ -418,10 +418,7 @@ class Colormap(): return Color('MSH',Msh) def interpolate_linear(lo, hi, frac): - """ - Linearly interpolate color at given fraction between lower and - higher color using model of lower color. - """ + """Linear interpolation between lo and hi color at given fraction; output in model of lo color.""" interpolation = (1.0 - frac) * np.array(lo.color[:]) \ + frac * np.array(hi.expressAs(lo.model).color[:]) From 8593fb3ed75618fe2b7890b4ea5444ae0dcc1cf6 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 31 Oct 2016 22:11:16 +0100 Subject: [PATCH 12/15] unifying scripts --- processing/pre/abq_addUserOutput.py | 5 +-- processing/pre/marc_addUserOutput.py | 65 ++++++++++++---------------- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/processing/pre/abq_addUserOutput.py b/processing/pre/abq_addUserOutput.py index a084fcbed..6df80ee82 100755 --- a/processing/pre/abq_addUserOutput.py +++ b/processing/pre/abq_addUserOutput.py @@ -94,7 +94,7 @@ me = { 'Homogenization': options.homog, for myFile in files: damask.util.report(scriptName,myFile) - if options.useFile: + if options.useFile is not None: formatFile = os.path.splitext(options.useFile)[0] else: formatFile = os.path.splitext(myFile)[0] @@ -146,7 +146,7 @@ for myFile in files: inFile.close() output = open(myFile,'w') thisSection = '' - if options.damaskOption: + if options.damaskOption is not None: output.write('$damask {0}\n'.format(options.damaskOption)) for line in input: #Abaqus keyword line begins with: *keyword, argument1, ... @@ -165,4 +165,3 @@ for myFile in files: if (thisSection.upper() != '*DEPVAR' or not re.match('\s*\d',line)): output.write(line) output.close() - diff --git a/processing/pre/marc_addUserOutput.py b/processing/pre/marc_addUserOutput.py index 048f5330a..bf84b46aa 100755 --- a/processing/pre/marc_addUserOutput.py +++ b/processing/pre/marc_addUserOutput.py @@ -48,9 +48,9 @@ def ParseOutputFormat(filename,what,me): format['outputs'].append([output,length]) return format -parser = OptionParser(option_class=damask.extendableOption, usage='%prog [option(s)] Marc.Inputfile(s)', description=""" +parser = OptionParser(option_class=damask.extendableOption, usage='%prog [option(s)] Marc.Inputfile(s)', description = """ Transfer the output variables requested in the material.config to -properly labelled user defined variables within the Marc input file (*.dat). +properly labelled user-defined variables within the Marc input file (*.dat). Requires the files .output @@ -61,40 +61,29 @@ Or have an existing set of user variables copied over from another *.dat file. """, version = scriptID) - -parser.add_option('-n','--number', dest='number', type='int', \ - metavar='int', - help='maximum requested User Defined Variable [%default]') -parser.add_option('--homogenization', dest='homog', \ - metavar='string', - help='homogenization identifier (as string or integer [%default])') -parser.add_option('--crystallite', dest='cryst', \ - metavar='string', - help='crystallite identifier (as string or integer [%default])') -parser.add_option('--phase', dest='phase', \ - metavar='string', - help='phase identifier (as string or integer [%default])') -parser.add_option('--use', dest='useFile', \ - metavar='string', - help='Optionally parse output descriptors from '+ - 'different .outputZZZ file. Saves the effort '+ - 'to start a calculation for each job)') -parser.add_option('--option', dest='damaskOption', \ - metavar='string', - help='Add damask option to input file '+ - 'for example: "periodic x z"') -parser.set_defaults(number = 0) -parser.set_defaults(homog = '1') -parser.set_defaults(cryst = '1') -parser.set_defaults(phase = '1') -parser.set_defaults(useFile = '') -parser.set_defaults(damaskOption = '') +parser.add_option('-m', dest='number', type='int', metavar = 'int', + help='maximum requested User Defined Variable [%default]') +parser.add_option('--homogenization', dest='homog', metavar = 'string', + help='homogenization name or index [%default]') +parser.add_option('--crystallite', dest='cryst', metavar = 'string', + help='crystallite identifier name or index [%default]') +parser.add_option('--phase', dest='phase', metavar = 'string', + help='phase identifier name or index [%default]') +parser.add_option('--use', dest='useFile', metavar = 'string', + help='optionally parse output descriptors from '+ + 'outputXXX files of given name') +parser.add_option('--option', dest='damaskOption', metavar = 'string', + help='Add DAMASK option to input file, e.g. "periodic x z"') + +parser.set_defaults(number = 0, + homog = '1', + cryst = '1', + phase = '1') (options, files) = parser.parse_args() if not files: - parser.print_help() - parser.error('no file(s) specified...') + parser.error('no file(s) specified.') me = { 'Homogenization': options.homog, 'Crystallite': options.cryst, @@ -103,8 +92,8 @@ me = { 'Homogenization': options.homog, for myFile in files: - print('\033[1m'+scriptName+'\033[0m: '+myFile+'\n') - if options.useFile != '': + damask.util.report(scriptName,myFile) + if options.useFile is not None: formatFile = os.path.splitext(options.useFile)[0] else: formatFile = os.path.splitext(myFile)[0] @@ -113,7 +102,7 @@ for myFile in files: print('{} not found'.format(myFile)) continue - print('Scanning format files of: %s'%formatFile) + print('Scanning format files of: {}'.format(formatFile)) if options.number < 1: outputFormat = {} @@ -121,7 +110,7 @@ for myFile in files: for what in me: outputFormat[what] = ParseOutputFormat(formatFile,what,me[what]) if '_id' not in outputFormat[what]['specials']: - print("'{}' not found in <{}>"%(me[what],what)) + print("'{}' not found in <{}>".format(me[what],what)) print('\n'.join(map(lambda x:' '+x,outputFormat[what]['specials']['brothers']))) sys.exit(1) @@ -150,13 +139,13 @@ for myFile in files: UserVars += ['%i_%s'%(grain+1,var[0]) for i in range(var[1])] # Now change *.dat file(s) - print('Adding labels to: %s'%myFile) + print('Adding labels to: {}'.format(myFile)) inFile = open(myFile) input = inFile.readlines() inFile.close() output = open(myFile,'w') thisSection = '' - if options.damaskOption: + if options.damaskOption is not None: output.write('$damask {0}\n'.format(options.damaskOption)) for line in input: m = re.match('(\w+)\s',line) From 9e76b510148c4998dfe64a8a23e21664c0b1f732 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 31 Oct 2016 22:50:47 +0100 Subject: [PATCH 13/15] fixing global variables handling (need to be defined before being used) --- processing/misc/yieldSurface.py | 71 ++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/processing/misc/yieldSurface.py b/processing/misc/yieldSurface.py index f3b6f0425..28f52062f 100755 --- a/processing/misc/yieldSurface.py +++ b/processing/misc/yieldSurface.py @@ -11,15 +11,10 @@ scriptName = os.path.splitext(os.path.basename(__file__))[0] scriptID = ' '.join([scriptName,damask.version]) def runFit(exponent, eqStress, dimension, criterion): - global s, threads, myFit, myLoad - global fitResults, fitErrors, fitResidual, stressAll, strainAll - global N_simulations, Guess, dDim - - fitResults = [] - fitErrors = [] - fitResidual = [] - Guess = [] - threads=[] + global threads, myFit, myLoad + global fitResidual + global Guess, dDim + dDim = dimension - 3 nParas = len(fitCriteria[criterion]['bound'][dDim]) nExpo = fitCriteria[criterion]['nExpo'] @@ -37,13 +32,9 @@ def runFit(exponent, eqStress, dimension, criterion): if g == 0: g = temp[1]*0.5 Guess.append(g) - N_simulations=0 - s=threading.Semaphore(1) myLoad = Loadcase(options.load[0],options.load[1],options.load[2], nSet = 10, dimension = dimension, vegter = options.criterion=='vegter') - stressAll= [np.zeros(0,'d').reshape(0,0) for i in range(int(options.yieldValue[2]))] - strainAll= [np.zeros(0,'d').reshape(0,0) for i in range(int(options.yieldValue[2]))] myFit = Criterion(exponent,eqStress, dimension, criterion) for t in range(options.threads): @@ -1222,17 +1213,17 @@ class myThread (threading.Thread): threading.Thread.__init__(self) self.threadID = threadID def run(self): - s.acquire() + semaphore.acquire() conv=converged() - s.release() + semaphore.release() while not conv: doSim(self.name) - s.acquire() + semaphore.acquire() conv=converged() - s.release() + semaphore.release() def doSim(thread): - s.acquire() + semaphore.acquire() global myLoad loadNo=loadcaseNo() if not os.path.isfile('%s.load'%loadNo): @@ -1240,22 +1231,22 @@ def doSim(thread): f=open('%s.load'%loadNo,'w') f.write(myLoad.getLoadcase(loadNo)) f.close() - s.release() - else: s.release() + semaphore.release() + else: semaphore.release() # if spectralOut does not exist, run simulation - s.acquire() + semaphore.acquire() if not os.path.isfile('%s_%i.spectralOut'%(options.geometry,loadNo)): damask.util.croak('Starting simulation %i (%s)'%(loadNo,thread)) - s.release() + semaphore.release() damask.util.execute('DAMASK_spectral -g %s -l %i'%(options.geometry,loadNo)) - else: s.release() + else: semaphore.release() # if ASCII tables do not exist, run postprocessing - s.acquire() + semaphore.acquire() if not os.path.isfile('./postProc/%s_%i.txt'%(options.geometry,loadNo)): damask.util.croak('Starting post processing for simulation %i (%s)'%(loadNo,thread)) - s.release() + semaphore.release() try: damask.util.execute('postResults --cr f,p --co totalshear %s_%i.spectralOut'%(options.geometry,loadNo)) except: @@ -1263,10 +1254,10 @@ def doSim(thread): damask.util.execute('addCauchy ./postProc/%s_%i.txt'%(options.geometry,loadNo)) damask.util.execute('addStrainTensors -0 -v ./postProc/%s_%i.txt'%(options.geometry,loadNo)) damask.util.execute('addMises -s Cauchy -e ln(V) ./postProc/%s_%i.txt'%(options.geometry,loadNo)) - else: s.release() + else: semaphore.release() # reading values from ASCII table (including linear interpolation between points) - s.acquire() + semaphore.acquire() damask.util.croak('Reading values from simulation %i (%s)'%(loadNo,thread)) refFile = './postProc/%s_%i.txt'%(options.geometry,loadNo) table = damask.ASCIItable(refFile,readonly=True) @@ -1278,7 +1269,7 @@ def doSim(thread): for l in [thresholdKey,'1_Cauchy']: if l not in table.labels(raw = True): damask.util.croak('%s not found'%l) - s.release() + semaphore.release() table.data_readArray(['%i_Cauchy'%(i+1) for i in range(9)]+[thresholdKey]+['%i_ln(V)'%(i+1) for i in range(9)]) @@ -1303,13 +1294,13 @@ def doSim(thread): else: line+=1 if not validity[i]: - s.acquire() + semaphore.acquire() damask.util.croak('The data of result %i at the threshold %f is invalid,'%(loadNo,threshold)\ +'the fitting at this point is skipped') - s.release() + semaphore.release() # do the actual fitting procedure and write results to file - s.acquire() + semaphore.acquire() global stressAll, strainAll f=open(options.geometry+'_'+options.criterion+'_'+str(time.time())+'.txt','w') f.write(' '.join([options.fitting]+myFit.report_labels())+'\n') @@ -1322,10 +1313,10 @@ def doSim(thread): ' '.join(map(str,myFit.fit(stressAll[i].reshape(len(stressAll[i])//6,6).transpose())))+'\n') except Exception: damask.util.croak('Could not fit results of simulation (%s)'%thread) - s.release() + semaphore.release() return damask.util.croak('\n') - s.release() + semaphore.release() def loadcaseNo(): global N_simulations @@ -1420,6 +1411,20 @@ if options.dimension not in fitCriteria[options.criterion]['dimen']: if options.criterion not in ['vonmises','tresca','drucker','hill1948'] and options.eqStress is None: parser.error('please specify an equivalent stress (e.g. fitting to von Mises)') + +# global variables +fitResults = [] +fitErrors = [] +fitResidual = [] +stressAll= [np.zeros(0,'d').reshape(0,0) for i in range(int(options.yieldValue[2]))] +strainAll= [np.zeros(0,'d').reshape(0,0) for i in range(int(options.yieldValue[2]))] +N_simulations=0 +Guess = [] +threads=[] +semaphore=threading.Semaphore(1) +dDim = None +myLoad = None +myFit = None run = runFit(options.exponent, options.eqStress, options.dimension, options.criterion) From d2b89a16e9464bb7dcff32ffed34ef20afd81974 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 1 Nov 2016 09:34:46 +0100 Subject: [PATCH 14/15] output differs when using dEq0 instead of dEq(x,0.0) revert this change for the moment, even though dEq0 seems to be more safe --- code/plastic_disloUCLA.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/plastic_disloUCLA.f90 b/code/plastic_disloUCLA.f90 index 147be2f54..62d09186f 100644 --- a/code/plastic_disloUCLA.f90 +++ b/code/plastic_disloUCLA.f90 @@ -1174,7 +1174,7 @@ end subroutine plastic_disloUCLA_dotState function plastic_disloUCLA_postResults(Tstar_v,Temperature,ipc,ip,el) use prec, only: & tol_math_check, & - dEq0 + dEq use math, only: & pi use material, only: & @@ -1402,7 +1402,7 @@ function plastic_disloUCLA_postResults(Tstar_v,Temperature,ipc,ip,el) c = c + ns elseif(plastic_disloUCLA_outputID(o,instance) == stress_exponent_ID) then do j = 1_pInt, ns - if (dEq0(gdot_slip_pos(j)+gdot_slip_neg(j))) then + if (dEq(gdot_slip_pos(j)+gdot_slip_neg(j),0.0_pReal)) then plastic_disloUCLA_postResults(c+j) = 0.0_pReal else plastic_disloUCLA_postResults(c+j) = (tau_slip_pos(j)+tau_slip_neg(j))/& From fef05621c4ade59593a391461a760f5ebdea1987 Mon Sep 17 00:00:00 2001 From: Test User Date: Tue, 1 Nov 2016 16:39:44 +0100 Subject: [PATCH 15/15] updated version information after successful test of v2.0.1-284-gd2b89a1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 83bd5fe58..f981c9349 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.1-263-gb34a60d +v2.0.1-284-gd2b89a1