added capability to deal with (Marc, spectral) output files that have less than every increment stored.

This commit is contained in:
Philip Eisenlohr 2011-06-15 17:49:59 +00:00
parent 314adae1bb
commit dd11ef3072
1 changed files with 89 additions and 37 deletions

View File

@ -54,8 +54,13 @@ class MPIEspectral_result: # mimic py_post result object
wd = ''
geometry = ''
extrapolate = ''
N_loadcases = 0
N_increments = 0
_frequencies = []
_increments = []
_times = []
increment = 0
position = 0
time = 0.0 # this is a dummy at the moment, we need to parse the load file and figure out what time a particular increment corresponds to
N_nodes = 0
N_node_scalars = 0
@ -70,24 +75,37 @@ class MPIEspectral_result: # mimic py_post result object
self.theTitle = self._keyedString('load')
self.wd = self._keyedString('workingdir')
self.geometry = self._keyedString('geometry')
self.N_increments = self._keyedInt('increments')
self.N_element_scalars = self._keyedInt('materialpoint_sizeResults')
self.N_loadcases = self._keyedInt('loadcases',default=1)
self._frequencies = self._keyedInts('frequencies',self.N_loadcases,1)
self._increments = self._keyedInts('increments',self.N_loadcases)
self._increments[0] -= 1 # delete zero'th entry
self._times = self._keyedFloats('times',self.N_loadcases,0.0)
self.dimension = self._keyedPackedArray('dimension',3,'d')
self.resolution = self._keyedPackedArray('resolution',3,'i')
self.N_nodes = (self.resolution[0]+1)*(self.resolution[1]+1)*(self.resolution[2]+1)
self.N_elements = self.resolution[0] * self.resolution[1] * self.resolution[2]
self.dimension = self._keyedPackedArray('dimension',3,'d')
self.N_element_scalars = self._keyedInt('materialpoint_sizeResults')
self.file.seek(0)
self.dataOffset = self.file.read(2048).find('eoh')+7
self.N_increments = 1 # add zero'th entry
for i in range(self.N_loadcases):
self.N_increments += self._increments[i]//self._frequencies[i]
def __str__(self):
return '\n'.join([
'title: %s'%self.theTitle,
'workdir: %s'%self.wd,
'geometry: %s'%self.geometry,
'extrapolation: %s'%self.extrapolate,
'loadcases: %i'%self.N_loadcases,
'increments: %i'%self.N_increments,
'increment: %i'%self.increment,
'position: %i'%self.position,
'time: %i'%self.time,
'nodes: %i'%self.N_nodes,
'resolution: %s'%(','.join(map(str,self.resolution))),
'dimension: %s'%(','.join(map(str,self.dimension))),
@ -108,16 +126,34 @@ class MPIEspectral_result: # mimic py_post result object
values.append(struct.unpack(type,i)[0])
return values
def _keyedInt(self,identifier):
value = None
def _keyedInt(self,identifier,default=None):
value = default
self.file.seek(0)
m = re.search('%s%s'%(identifier,'(.{4})'),self.file.read(2048),re.DOTALL)
if m:
value = struct.unpack('i',m.group(1))[0]
return value
def _keyedString(self,identifier):
value = None
def _keyedInts(self,identifier,number=1,default=None):
values = [default]*number
self.file.seek(0)
m = re.search('%s%s'%(identifier,'(.{4})'*number),self.file.read(2048),re.DOTALL)
if m:
for i in range(number):
values[i] = struct.unpack('i',m.group(1+i))[0]
return values
def _keyedFloats(self,identifier,number=1,default=None):
values = [default]*number
self.file.seek(0)
m = re.search('%s%s'%(identifier,'(.{8})'*number),self.file.read(2048),re.DOTALL)
if m:
for i in range(number):
values[i] = struct.unpack('d',m.group(1+i))[0]
return values
def _keyedString(self,identifier,default=None):
value = default
self.file.seek(0)
m = re.search(r'(.{4})%s(.*?)\1'%identifier,self.file.read(2048),re.DOTALL)
if m:
@ -127,8 +163,20 @@ class MPIEspectral_result: # mimic py_post result object
def title(self):
return self.theTitle
def moveto(self,inc):
self.increment = inc
def moveto(self,pos):
self.position = pos
self.increment = 0
self.time = 0.0
p = pos
for l in range(self.N_loadcases):
if p <= self._increments[l]//self._frequencies[l]:
break
else:
self.increment += self._increments[l]
self.time += self._times[l]
p -= self._increments[l]//self._frequencies[l]
self.increment += self._frequencies[l] * p
self.time += self._times[l]/self._increments[l] * self._frequencies[l] * p
def extrapolation(self,value):
self.extrapolate = value
@ -180,7 +228,7 @@ class MPIEspectral_result: # mimic py_post result object
return self.N_element_scalars
def element_scalar(self,e,idx):
self.file.seek(self.dataOffset+(self.increment*(4+self.N_elements*self.N_element_scalars*8+4) + 4+(e*self.N_element_scalars + idx)*8))
self.file.seek(self.dataOffset+(self.position*(4+self.N_elements*self.N_element_scalars*8+4) + 4+(e*self.N_element_scalars + idx)*8))
value = struct.unpack('d',self.file.read(8))[0]
return [elemental_scalar(node,value) for node in self.element(e).items]
@ -405,16 +453,19 @@ def ParseOutputFormat(filename,what,me):
# parse .output* files in order to get a list of outputs
# -----------------------------
content = []
format = {'outputs':{},'specials':{'brothers':[]}}
for prefix in ['']+map(str,range(1,17)):
if os.path.exists(prefix+filename+'.output'+what):
break
try:
file = open(prefix+filename+'.output'+what)
content = file.readlines()
file.close()
break
except:
return format
pass
if content == []: return format # nothing found...
tag = ''
tagID = 0
@ -714,9 +765,6 @@ bg.start()
# --- parse .output and .t16 files
filename = os.path.splitext(files[0])[0]
dirname = os.path.abspath(os.path.dirname(filename))+os.sep+options.directory
if not os.path.isdir(dirname):
os.mkdir(dirname,0755)
outputFormat = {}
me = {
@ -732,7 +780,6 @@ for what in me:
if not '_id' in outputFormat[what]['specials']:
print "'%s' not found in <%s>"%(me[what], what)
print '\n'.join(map(lambda x:' '+x, outputFormat[what]['specials']['brothers']))
sys.exit(1)
bg.set_message('opening result file...')
p = OpenPostfile(filename,options.filetype)
@ -919,6 +966,12 @@ bg.set_message('sorting groups...')
groups.sort(key = sortKeys) # in-place sorting to save mem
# --------------------------- create output directory --------------------------------
dirname = os.path.abspath(os.path.dirname(filename))+os.sep+options.directory
if not os.path.isdir(dirname):
os.mkdir(dirname,0755)
fileOpen = False
assembleHeader = True
header = []
@ -935,7 +988,6 @@ time_start = time.time()
for incCount,increment in enumerate(increments):
p.moveto(increment+offset_inc)
# --------------------------- file management --------------------------------
if options.separateFiles:
@ -1043,7 +1095,7 @@ for incCount,increment in enumerate(increments):
file.write('\t'.join(standard + header) + '\n')
headerWritten = True
file.write('\t'.join(map(str,[increment] + \
file.write('\t'.join(map(str,[p.increment] + \
{True:[p.time],False:[]}[options.time] + \
group[0] + \
mappedResult)