#!/usr/bin/env python
import sys, math, os
# default values of input parameters:
m = 1.0; b = 0.7; c = 5.0; func = 'y'; A = 5.0; w = 2*math.pi
y0 = 0.2; tstop = 30.0; dt = 0.05; case = 'tmp1'; screenplot = 1
remote_host = 'login.ifi.uio.no'
user = 'hpl'
# read variables from the command line, one by one:
while len(sys.argv) > 1:
option = sys.argv[1]; del sys.argv[1]
if option == '-m':
m = float(sys.argv[1]); del sys.argv[1]
elif option == '-b':
b = float(sys.argv[1]); del sys.argv[1]
elif option == '-c':
c = float(sys.argv[1]); del sys.argv[1]
elif option == '-func':
func = sys.argv[1]; del sys.argv[1]
elif option == '-A':
A = float(sys.argv[1]); del sys.argv[1]
elif option == '-w':
w = float(sys.argv[1]); del sys.argv[1]
elif option == '-y0':
y0 = float(sys.argv[1]); del sys.argv[1]
elif option == '-tstop':
tstop = float(sys.argv[1]); del sys.argv[1]
elif option == '-dt':
dt = float(sys.argv[1]); del sys.argv[1]
elif option == '-noscreenplot':
screenplot = 0
elif option == '-case':
case = sys.argv[1]; del sys.argv[1]
elif option == '-host':
remote_host = sys.argv[1]; del sys.argv[1]
elif option == '-user':
user = sys.argv[1]; del sys.argv[1]
else:
print sys.argv[0],': invalid option',option
sys.exit(1)
# make input file to the program:
f = open('%s.i' % case, 'w')
# write a multi-line (triple-quoted) string with
# variable interpolation:
f.write("""
%(m)g
%(b)g
%(c)g
%(func)s
%(A)g
%(w)g
%(y0)g
%(tstop)g
%(dt)g
""" % vars())
f.close()
# generate script to be run on the remote machine:
f = open('run_%s.py' % case, 'w')
f.write("""\
#!/usr/bin/env python
import os, shutil, sys
d = '%(case)s'
if os.path.isdir(d):
shutil.rmtree(d)
os.mkdir(d)
os.rename('%(case)s.i', '%(case)s/%(case)s.i') # move .i file
os.chdir(d)
cmd = 'oscillator < %(case)s.i'
failure = os.system(cmd)
if failure:
print 'running the oscillator code failed'
print cmd, '\n', output
sys.exit(1)
""" % vars())
f.close()
# copy files to remote host:
cmd = 'scp %(case)s.i run_%(case)s.py '\
'%(user)s@%(remote_host)s:tmp' % vars()
print cmd; failure = os.system(cmd)
# run application on remote host
cmd = 'ssh %(user)s@%(remote_host)s '\
'"cd tmp; python run_%(case)s.py"' % vars()
print cmd; failure = os.system(cmd)
# copy result file back to local host:
cmd = 'scp %(user)s@%(remote_host)s:tmp/%(case)s/sim.dat .' % vars()
print cmd; failure = os.system(cmd)
if not os.path.isfile('sim.dat'):
print 'no result file sim.dat - script aborted...'
# make file with gnuplot commands:
f = open(case + '.gnuplot', 'w')
f.write("""
set title '%s: m=%g b=%g c=%g f(y)=%s A=%g w=%g y0=%g dt=%g';
""" % (case,m,b,c,func,A,w,y0,dt))
if screenplot:
f.write("plot 'sim.dat' title 'y(t)' with lines;\n")
f.write("""
set size ratio 0.3 1.5, 1.0;
# define the postscript output format:
set term postscript eps monochrome dashed 'Times-Roman' 28;
# output file containing the plot:
set output '%s.ps';
# basic plot command
plot 'sim.dat' title 'y(t)' with lines;
# make a plot in PNG format:
set term png small;
set output '%s.png';
plot 'sim.dat' title 'y(t)' with lines;
""" % (case,case))
f.close()
# make plot on local host:
cmd = 'gnuplot -geometry 800x200 -persist ' + case + '.gnuplot'
failure = os.system(cmd)
if failure:
print 'running gnuplot failed'; sys.exit(1)
# clean up:
import time; time.sleep(3) # let Gnuplot have some time for plotting...
for file in ('run_%s.py' % case, '%s.i' % case, 'sim.dat'):
print 'removing', file; os.remove(file)