| clawtools.py.html | clawcode2html |
| Source file: clawtools.py | |
| Directory: /home/rjl/www/pubs/cise08/cise08levequeV2 | |
| Converted: Wed Jul 2 2008 at 13:40:44 | |
| This documentation file will not reflect any later changes in the source file. |
import os,sys,shutil,glob
import string,re
import time
import subprocess
from numpy import *
#===========================================================================
#
#
#================
class ClawData:
#================
"""
Classes and functions for manipulating clawpack input data in files *.data
"""
#=============================
def __init__(self,*datafilelist):
#=============================
self.datafiles = []
for datafile in datafilelist:
self.read(datafile)
#=============================
def read(self,*datafilelist):
#=============================
"""
Read data in from a clawpack style data file.
Any lines of the form
values =: name
is used to set an attribute of self.
"""
verbose = False
if len(datafilelist) == 0:
datafilelist = self.datafiles
for datafile in datafilelist:
if datafile not in self.datafiles:
self.datafiles.append(datafile)
if verbose:
print " Reading data file: ",datafile," "
file = open(datafile,'r')
regexp = re.compile(r"(?P.*)=:(?P.*)")
for line in file:
result = regexp.search(line)
if result:
name = re.split(r'\s+', result.group('name').strip())[0]
values = re.split(r'\s+', result.group('values').strip())
if values[0]=='T':
values = ['True']
if values[0]=='F':
values = ['False']
if len(values) > 0:
setval = "self." + name + " = " + ','.join(values)
else:
print "Error -- empty values for name ", name
exec(setval)
#=============================
def write(self,*datafilelist):
#=============================
"""
Write data out to a clawpack datafile
Any lines of the form
values =: name
are overwritten using the current attribute of self for values.
If datafilelist is empty, all data files in self.datafiles are
overwritten.
"""
verbose = False
if len(datafilelist) == 0:
datafilelist = self.datafiles
if len(datafilelist) == 0:
print "Error - no data files specified"
return
for datafile in datafilelist:
try:
file = open(datafile,'r')
except:
print "Error -- data file does not exist: ",datafile
return
newdatafile = datafile + 'xxxxx'
try:
newfile = open(newdatafile,'wb')
except:
print "Error -- data file does not exist: ",datafile
regexp = re.compile(r"(?P.*)=:(?P.*)")
for line in file:
result = regexp.search(line)
if result:
name = re.split(r'\s+', result.group('name').strip())[0]
values = re.split(r'\s+', result.group('values').strip())
if hasattr(self,name):
newvalues = getattr(self,name)
if isinstance(newvalues,tuple) \
| isinstance(newvalues,list):
# remove brackets or parens:
newstring = repr(newvalues)[1:-1]
# remove commas:
newstring = newstring.replace(',','')
# Need to fix?
#elif isinstance(newvalues,bool):
elif 0:
if newvalues==True:
newstring = 'T'
elif newvalues==False:
newstring = 'F'
else:
newstring = repr(newvalues)
newstart = string.ljust(newstring,25)
line = line.replace(result.group('values')+"=:", \
newstart +" =:")
newfile.write(line)
file.close()
newfile.close()
try:
os.remove(datafile)
os.rename(newdatafile,datafile)
if verbose:
print "Wrote new version of data file: ",datafile," "
except:
print 'could not rename ',newdatafile, ' as ',datafile
#=========================================
def change_data(datafile,param,newstring):
#=========================================
verbose = False
file = open(datafile,'r')
newdatafile = datafile + 'xxxxx'
newfile = open(newdatafile,'wb')
regexp = re.compile(r"(?P.*)=:\s*" + param)
for line in file:
result = regexp.search(line)
if result:
newstart = string.ljust(newstring,25)
line = line.replace(result.group('values')+"=:", \
newstart +" =:")
if verbose:
print "Changed data value ",param," to ", newstring
newfile.write(line)
file.close()
newfile.close()
try:
os.remove(datafile)
os.rename(newdatafile,datafile)
except:
print 'could not rename ',newdatafile, ' as ',datafile
# ----------------------------------------------------------------------
#
# Classes and functions for reading clawpack solutions from files fort.*
#
# Simplest use:
# clawframe = read_clawframe(N,outdir)
# reads data from both fort.t000N and fort.q000N
#
# To read from fort.t but not the bigger fort.q, e.g. if you only need
# to determine ndim:
# clawframe = ClawFrame(N,outdir)
# clawframe.read_fortt()
# ndim = clawframe.ndim
# ----------------------------------------------------------------------
#=========================================================
def read_clawline(inputfile, type='float', filetype='ascii'):
#=========================================================
"""
Reads one line from an input file fort.t* or fort.q*
type is an optional type declaration, understands 'int', 'float'
"""
line = inputfile.readline()
l = line.split()
if type=='int':
return int(l[0])
else:
return float(l[0])
#==============
class ClawGrid:
#==============
"""
ClawGrid - Data structure for a single grid.
One Frame may consist of many grids if AMR is used.
clawframe.grids[m] is of type ClawGrid for m=1..clawframe.ngrids
Members:
Grid Information -
gridno - Current grid number
level - Level of the current grid in AMR structure
Dimension Information -
(mx,my,mz) - Number of grid cells in each dimension
(xlow,ylow,zlow) - Lower bound on the current grid
(dx,dy,dz) - Spatial descretization
Data -
q - Data for this frame of dimension (mx,my,mz,meqn)
Grid Data - Automatically generated grid
(xedge,yedge,zedge) - grid of size (mx+1,my+1,mz+1) with location
of left edge of each cell (including 1 ghost cell on right)
(xcenter,ycenter,zcenter) - grid of size (mx,my,mz) with location
of center of each cell
"""
#==================
def __init__(self):
#==================
# Grid information
self.gridno = []
self.level = []
# Dimension information
self.mx = []
self.xlow = []
self.dx = []
self.my = []
self.ylow = []
self.dy = []
self.mz = []
self.zlow = []
self.dz = []
# Data for this frame
self.q = []
# Grid data
self.xedge = []
self.xcenter = []
self.yedge = []
self.ycenter = []
self.zedge = []
self.zcenter = []
# Viewable members of this class
self.members = ["mx","xlow","dx","my","ylow","dy","mz","zlow","dz","gridno","level"]
self.members.sort()
#==================
def __repr__(self):
#==================
output = ""
for attr in self.members:
output = output+"%s = %s, " % (attr,eval("self.%s" % attr))
return str(output)
#================
class ClawFrame:
#================
"""
ClawFrame - General data structure class for all grids at one output time
Members:
General Frame Information -
frame - Frame number N from fort.q000N for this object
meqn - Number of equations
ngrids - Number of grids
maux - Dimension of the auxillary array
t - Output time for this frame
grids - Array of objects of type ClawGrid of size ngrids
Functions:
__init__ - initialize attributes
read_fortt - read t,meqn,ngrids,ndim,maux from fort.t file
read_fortq - read solution from ascii fort.q file
"""
#=====================================
def __init__(self,frame,outdir='./'):
#=====================================
# General frame information
self.frame = frame
self.outdir = outdir
self.meqn = -1
self.ngrids = -1
self.maux = -1
self.t = -1
self.grids = []
# Viewable members of this class
self.members = ["frame","meqn","ngrids","maux","t","grids"]
self.members.sort()
#==================
def __repr__(self):
#==================
output = ""
for attr in self.members:
output = output+"%s = %s\n" % (attr,eval("self.%s" % attr))
return str(output)
#=======================================
def read_fortt(self):
#=======================================
"""
Reads in clawpack file fort.t000N where N = self.frame
"""
frame = self.frame
if frame < 0:
# Don't construct file names with negative frame values.
print " "
print "Frame " + str(frame) + " does not exist ***"
clawframe = []
return clawframe
# Open fort.t file
outdir = self.outdir
fname = os.path.join(outdir, 'fort.t') + str(frame).zfill(4)
try:
f = open(fname,'r')
except:
print " "
print "File " + fname + " does not exist ***"
sys.exit(1)
# Read in values from fort.t file:
try:
self.t = read_clawline(f)
self.meqn = read_clawline(f,'int')
self.ngrids = read_clawline(f,'int')
self.ndim = read_clawline(f,'int')
self.maux = read_clawline(f,'int')
f.close()
except:
print "File " + fname + " should contain t, meqn, ngrids, ndim, maux"
sys.exit(1)
#=======================================
def read_fortq(self, filetype='ascii'):
#=======================================
"""
Reads in clawpack file fort.q000N where N = self.frame
(currently only works for ascii output files)
"""
if filetype != 'ascii':
print "Only works for filetype = 'ascii'"
sys.exit(1)
frame = self.frame
if frame < 0:
# Don't construct file names with negative frame values.
print " "
print "Frame " + str(frame) + " does not exist ***"
sys.exit(1)
# Open fort.q file
outdir = self.outdir
fname = os.path.join(outdir, 'fort.q') + str(frame).zfill(4)
try:
f = open(fname,'r')
except:
print " "
print "File " + fname + " does not exist ***"
sys.exit(1)
# Read in solution from fort.q file:
for ng in range(self.ngrids):
grid = ClawGrid()
grid.gridno = read_clawline(f,'int')
grid.level = read_clawline(f,'int')
grid.mx = read_clawline(f,'int')
if self.ndim > 1:
grid.my = read_clawline(f,'int')
if self.ndim > 2:
grid.mz = read_clawline(f,'int')
grid.xlow = read_clawline(f)
if self.ndim > 1:
grid.ylow = read_clawline(f)
if self.ndim > 2:
grid.zlow = read_clawline(f)
grid.dx = read_clawline(f)
if self.ndim > 1:
grid.dy = read_clawline(f)
if self.ndim > 2:
grid.dz = read_clawline(f)
blank = f.readline()
# Read the data for this grid and create the grid
if self.ndim == 1:
grid.xedge = empty(grid.mx+1,'d')
grid.xcenter = empty(grid.mx,'d')
grid.q = empty((grid.mx,self.meqn),'d')
for i in range(0,grid.mx):
grid.xedge[i] = grid.xlow + i*grid.dx
grid.xcenter[i] = grid.xlow + (i+0.5)*grid.dx
line = f.readline()
l = line.split()
for m in range(0,self.meqn):
grid.q[i,m] = float(l[m])
# right edge of last cell:
grid.xedge[grid.mx] = grid.xlow + grid.mx*grid.dx
elif self.ndim == 2:
grid.xedge = empty(grid.mx+1,'d')
grid.xcenter = empty(grid.mx,'d')
grid.yedge = empty(grid.my+1,'d')
grid.ycenter = empty(grid.my,'d')
grid.q = empty((grid.mx,grid.my,self.meqn),'d')
for j in range(grid.my):
grid.yedge[j] = grid.ylow + j*grid.dy
grid.ycenter[j] = grid.ylow + (j+0.5)*grid.dy
for i in range(grid.mx):
grid.xedge[i] = grid.xlow + i*grid.dx
grid.xcenter[i] = grid.xlow + (i+0.5)*grid.dx
line = f.readline()
l = line.split()
for m in range(0,self.meqn):
grid.q[i,j,m] = float(l[m])
blank = f.readline()
grid.xedge[grid.mx] = grid.xlow + grid.mx*grid.dx
grid.yedge[grid.my] = grid.ylow + grid.my*grid.dy
else:
print "ERROR: 3D not implemented!"
grid.q = emtpy((grid.mx,grid.my,grid.mz,self.meqn),'d')
# Add grid to the clawframe data object
self.grids.append(grid)
#==================================================
def read_clawframe(frame, outdir='./', filetype='ascii'):
#==================================================
"""
read_clawframe: General function call to read in clawpack data.
Returns an object that is of type ClawFrame.
Arguments:
frame - Frame number N: read files fort.t000N and fort.q000N
outdir - Directory containing fort files, defaults to './'
filetype - Type of file to be read in
(ascii is the only file type currently supported)
Returns:
clawframe - Object of class ClawFrame containing all the information
about the frame requested
"""
clawframe = ClawFrame(frame,outdir)
clawframe.read_fortt()
clawframe.read_fortq(filetype)
return clawframe
#------------------------------------------------------------
#-----------------------------
def current_time(addtz=False):
#-----------------------------
# determine current time and reformat:
time1 = time.asctime()
year = time1[-5:]
day = time1[:-14]
hour = time1[-13:-5]
current_time = day + year + ' at ' + hour
if addtz:
current_time = current_time + ' ' + time.tzname[time.daylight]
return current_time
#------------------------------------------------------------
def runclaw(xdir='.', rundir='.', outdir='.', overwrite=False, \
xclawcmd = 'xclaw', xclawout=None, xclawerr=None, \
savecode=False, runmake=False):
#------------------------------------------------------------
'''
Run the command xdir/xclawcmd, directing the output fort.*
files to outdir, writing unit 6 timestepping info to file xclawout.
Runtime error messages are written to file xclawerr.
If xclawout(xclawerr) is None, then output to stdout(stderr).
If savecode==True, archive a copy of the code into directory outdir.
This function returns the returncode from the process running xclawcmd,
which will be nonzero if a runtime error occurs.
'''
debug = False
if debug:
print "In runclaw... xdir = ",xdir
print "
outdir = ",outdir
print "
xclawout = ",xclawout
print "
"
startdir = os.getcwd()
xdir = os.path.abspath(xdir)
xclawcmd = os.path.join(xdir,xclawcmd)
try:
os.chdir(xdir)
except:
print "Cannot change to directory xdir = ",xdir
return 999
if runmake:
try:
os.system('make')
except:
print 'Warning: no make file in directory xdir = ',xdir
if outdir != '.':
if os.path.isfile(outdir):
print "Error: outdir specified is a file"
return 999
elif (os.path.isdir(outdir) & overwrite):
print "Directory ", outdir, " already exists, "
print " will be removed and recreated..."
try:
shutil.rmtree(outdir)
except:
print "Cannot remove directory ",outdir
return 999
elif (os.path.isdir(outdir) & (not overwrite)):
print "Directory ", outdir, " already exists."
print "Remove directory with 'rm -r ",outdir,"' and try again,"
print " or use overwrite=True in call to runclaw"
return 999
try:
os.mkdir(outdir)
except:
print "Cannot make directory ",outdir
return 999
#print "Created directory ",outdir
try:
os.chdir(rundir)
except:
print "Cannot change to directory ",rundir
return 999
datafiles = glob.glob('*.data')
if datafiles == ():
print "Warning: no data files found in directory ",rundir
else:
if rundir != outdir:
for file in datafiles:
shutil.copy(file,os.path.join(outdir,file))
if xclawout:
xclawout = open(xclawout,'wb')
if xclawerr:
xclawerr = open(xclawerr,'wb')
os.chdir(outdir)
#print "\nIn directory outdir = ",outdir,"\n"
# execute command to run fortran program:
try:
print "\nExecuting ",xclawcmd, " ... "
pclaw = subprocess.Popen(xclawcmd,stdout=xclawout,stderr=xclawerr)
pclaw.wait() # wait for code to run
if pclaw.returncode == 0:
print "\nFinished executing\n"
else:
print "\n *** Runtime error: return code = %s\n " % pclaw.returncode
except:
print "\nError: could not execute command\n"
return 999
os.chdir(startdir)
return pclaw.returncode
#---------------------------------
def svn_revision(dir="CLAW"):
#---------------------------------
"""
Determine the svn revision number of the version of code being used.
If dir="CLAW" it returns the revision number of the claw directory.
This only checks the top most level and assumes this is accurate.
"""
if dir=="CLAW":
dir = os.environ['CLAW']
svn_entries = dir + '/.svn/entries'
try:
f = open(svn_entries,'r')
lines = f.readlines()
revision = int(lines[3]) # fourth line of file, converted to int
f.close()
except:
revision = None
return revision