From 01a92905676f8d36cb24eda4ed785ea2f371e2e2 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Wed, 20 Jun 2012 16:00:48 +0000 Subject: [PATCH] deleted old incarnation... new script follows established option parsing. can rescale (increase only) the number of grid points in any dimension (with or without concurrent dimension scaling). --- processing/pre/spectral_geomMultiply.py | 154 ++++++++++++++++++++++++ processing/pre/spectral_geomScale.py | 54 --------- 2 files changed, 154 insertions(+), 54 deletions(-) create mode 100755 processing/pre/spectral_geomMultiply.py delete mode 100755 processing/pre/spectral_geomScale.py diff --git a/processing/pre/spectral_geomMultiply.py b/processing/pre/spectral_geomMultiply.py new file mode 100755 index 000000000..4dac1dc04 --- /dev/null +++ b/processing/pre/spectral_geomMultiply.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 no BOM -*- + +import os,sys,string,re,math,numpy +from optparse import OptionParser, OptionGroup, Option, SUPPRESS_HELP + + +# ----------------------------- +class extendedOption(Option): +# ----------------------------- +# used for definition of new option parser action 'extend', which enables to take multiple option arguments +# taken from online tutorial http://docs.python.org/library/optparse.html + + ACTIONS = Option.ACTIONS + ("extend",) + STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",) + TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",) + ALWAYS_TYPED_ACTIONS = Option.ALWAYS_TYPED_ACTIONS + ("extend",) + + def take_action(self, action, dest, opt, value, values, parser): + if action == "extend": + lvalue = value.split(",") + values.ensure_value(dest, []).extend(lvalue) + else: + Option.take_action(self, action, dest, opt, value, values, parser) + + +# ----------------------- MAIN ------------------------------- + +identifiers = { + 'resolution': ['a','b','c'], + 'dimension': ['x','y','z'], + } +mappings = { + 'resolution': lambda x: int(x), + 'dimension': lambda x: float(x), + } + + +parser = OptionParser(option_class=extendedOption, usage='%prog options [file[s]]', description = """ +Multiplies a spectral geometry description independently in x, y, and z direction at fixed dimension. +""" + string.replace('$Id: spectral_geomCrop.py 1449 2012-04-24 11:31:18Z MPIE\t.elachkar $','\n','\\n') +) + +parser.add_option('-f', '--factor', dest='factor', type='int', nargs = 3, \ + help='multiplication factors of a,b,c resolution') +parser.add_option('-2', '--twodimensional', dest='twoD', action='store_true', \ + help='output geom file with two-dimensional data arrangement') +parser.add_option('-k', '--keep', dest='keepDimension', action='store_true', \ + help='keep dimension as before') + +parser.set_defaults(factor = [1,1,1]) +parser.set_defaults(twoD = False) +parser.set_defaults(keepDimension = False) + +(options, filenames) = parser.parse_args() + +prefix = 'mult%ix%ix%i'%(options.factor[0],options.factor[1],options.factor[2]) + +# ------------------------------------------ setup file handles --------------------------------------- + +files = [] +if filenames == []: + files.append({'name':'STDIN', 'input':sys.stdin, 'output':sys.stdout}) +else: + for name in filenames: + if os.path.exists(name): + files.append({'name':name, 'input':open(name), 'output':open(prefix+'_'+name,'w')}) + + +# ------------------------------------------ loop over input files --------------------------------------- + +for file in files: + if file['name'] != 'STDIN': print file['name'] + + # get labels by either read the first row, or - if keyword header is present - the last line of the header + + firstline = file['input'].readline() + m = re.search('(\d+)\s*head', firstline.lower()) + if m: + headerlines = int(m.group(1)) + headers = [firstline]+[file['input'].readline() for i in range(headerlines)] + else: + headerlines = 1 + headers = firstline + + content = file['input'].readlines() + file['input'].close() + + resolution = [0,0,0] + dimension = [0.0,0.0,0.0] + resolution_blown = [0,0,0] + dimension_blown = [0.0,0.0,0.0] + new_header = [] + for header in headers: + headitems = header.split() + if headitems[0] == 'resolution': # located resolution entry + for i in xrange(3): + resolution[i] = mappings['resolution'](headitems[headitems.index(identifiers['resolution'][i])+1]) + resolution_blown[i] = resolution[i]*options.factor[i] + header = "resolution\ta %i\tb %i\tc %i\n"%(resolution_blown[0],resolution_blown[1],resolution_blown[2]) + if headitems[0] == 'dimension': # located dimension entry + for i in xrange(3): + dimension[i] = mappings['dimension'](headitems[headitems.index(identifiers['dimension'][i])+1]) + if options.keepDimension: dimension_blown[i] = dimension[i] + else: dimension_blown[i] = dimension[i]*options.factor[i] + header = "dimension\tx %f\ty %f\tz %f\n"%(dimension_blown[0],dimension_blown[1],dimension_blown[2]) + + new_header.append(header) + + if resolution == [0,0,0]: + print 'no resolution info found.' + sys.exit(1) + if dimension == [0.0,0.0,0.0]: + print 'no dimension info found.' + sys.exit(1) + + if file['name'] != 'STDIN': + print 'resolution: %s'%(' x '.join(map(str,resolution_blown))) + print 'dimension: %s'%(' x '.join(map(str,dimension_blown))) + + microstructure = numpy.zeros(resolution,'i') + i = 0 + for line in content: + for item in map(int,line.split()): + microstructure[i%resolution[0],(i/resolution[0])%resolution[1],i/resolution[0]/resolution[1]] = item + i += 1 + + formatwidth = int(math.floor(math.log10(microstructure.max()))) + + + +# ------------------------------------------ assemble header --------------------------------------- + + output = ''.join(new_header) + +# ------------------------------------- regenerate texture information ---------------------------------- + + for z in xrange(resolution[2]): + for c in xrange(options.factor[2]): + for y in xrange(resolution[1]): + for b in xrange(options.factor[1]): + for x in xrange(resolution[0]): + for a in xrange(options.factor[0]): + output += ('%%%ii'%formatwidth)%microstructure[x,y,z] + {True:' ',False:'\n'}[options.twoD] + output += {True:'\n',False:''}[options.twoD] + +# ------------------------------------------ output result --------------------------------------- + + file['output'].write(output) + + file['input'].close() + if file['name'] != 'STDIN': + file['output'].close() + \ No newline at end of file diff --git a/processing/pre/spectral_geomScale.py b/processing/pre/spectral_geomScale.py deleted file mode 100755 index 1a2cf0dbc..000000000 --- a/processing/pre/spectral_geomScale.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 no BOM -*- -#scale the size of a given .geom file (first argument, without extension) in x y z direction by given commandline argument -#(integer in each direction) -#be carefull, last line should be empty (line break after last number) -import sys, time, re -scale = [0 for i in range(3)] -scale[0] = int(sys.argv[2]) -scale[1] = int(sys.argv[3]) -scale[2] = int(sys.argv[4]) - -resolution = [3 for i in range(3)] -dimension = [0.0 for i in range(3)] - -file_in = open(sys.argv[1]+'.geom','r') -for i in range(3): - input = file_in.readline() - if re.match('resolution',input): - resolution[0] = int(re.findall('\S*',''.join(re.findall('a\s*\S*',input)))[-2]) - resolution[1] = int(re.findall('\S*',''.join(re.findall('b\s*\S*',input)))[-2]) - resolution[2] = int(re.findall('\S*',''.join(re.findall('c\s*\S*',input)))[-2]) - if re.match('dimension',input): - dimension[0] = float(re.findall('\S*',''.join(re.findall('x\s*\S*',input)))[-2]) - dimension[1] = float(re.findall('\S*',''.join(re.findall('y\s*\S*',input)))[-2]) - dimension[2] = float(re.findall('\S*',''.join(re.findall('z\s*\S*',input)))[-2]) - -output = '' -for x in range(resolution[0]*resolution[1]*resolution[2]): - a=file_in.readline() - for i in range(scale[0]): - output += a -output_separated = output.splitlines(True) -resolution[0] = resolution[0]*scale[0] #scale resolution 1 -output = '' -for z in range(resolution[2]): - for y in range(resolution[1]): - for i in range(scale[1]): - output += ''.join(output_separated[z*resolution[0]*resolution[1]+y*resolution[0]:\ - z*resolution[0]*resolution[1]+y*resolution[0]+resolution[0]]) -resolution[1] = resolution[1]*scale[1] #scale resolution 2 -output_separated = output.splitlines(True) -output = '' -for z in range(resolution[2]): - for i in range(scale[2]): - output += ''.join(output_separated[z*resolution[0]*resolution[1]:\ - z*resolution[0]*resolution[1]+resolution[0]*resolution[1]]) -resolution[2] = resolution[2]*scale[2] #scale resolution 2 - -file_out = open(sys.argv[1]+'_scaled_'+str(sys.argv[2])+'-'+str(sys.argv[3])+'-'+str(sys.argv[4])+'.geom','w') - -file_out.write('resolution a '+str(resolution[0])+' b '+str(resolution[1])+' z '+str(resolution[2])+'\n') -file_out.write('dimension x '+str(dimension[0])+' y '+str(dimension[1])+' z '+str(dimension[2])+'\n') -file_out.write('homogenization 1\n') -file_out.write(output) \ No newline at end of file