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).
This commit is contained in:
Philip Eisenlohr 2012-06-20 16:00:48 +00:00
parent 1105824562
commit 01a9290567
2 changed files with 154 additions and 54 deletions

View File

@ -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()

View File

@ -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)