Newer
Older
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 10 18:47:32 2015
@author: dave
"""
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
import os
import copy
class PBSScript(object):
"""
Generate a PBS script that includes commands such as copying model files
to the node and copying back the results
"""
template = """
### Standard Output
#PBS -N [jobname]
#PBS -o [path_pbs_o]
### Standard Error
#PBS -e [path_pbs_e]
#PBS -W umask=[umask]
### Maximum wallclock time format HOURS:MINUTES:SECONDS
#PBS -l walltime=[walltime]
#PBS -lnodes=[lnodes]:ppn=[ppn]
### Queue name
#PBS -q [queue]
### #PBS -a [start_time]
### #PBS -W depend=afterany:[job_id]
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
### Browse to current working dir
echo ""
cd $PBS_O_WORKDIR
echo "current working dir:"
pwd
echo ""
### ===========================================================================
echo "------------------------------------------------------------------------"
echo "PRELUDE"
echo "------------------------------------------------------------------------"
[prelude]
echo ""
echo "------------------------------------------------------------------------"
echo "EXECUTION"
echo "------------------------------------------------------------------------"
[execution]
### wait for jobs to finish
wait
echo ""
echo "------------------------------------------------------------------------"
echo "CODA"
echo "------------------------------------------------------------------------"
[coda]
echo ""
### ===========================================================================
exit
"""
def __init__(self):
# PBS configuration
self.jobname = 'no_name_job'
# relative paths with respect to PBS working directory
self.path_pbs_o = 'pbs_out/dummy.out'
self.path_pbs_e = 'pbs_out/dummy.err'
self.path_pbs_i = 'pbs_in/dummy.pbs'
# absolute path of the PBS working directory
self.pbsworkdir = './'
self.umask = '003'
self.walltime = '00:59:59'
self.queue = 'workq'
self.lnodes = '1'
self.ppn = '1'
# regarding the job
# source2node = [ [/abs/src/base/a/b/c, a/b/c.mod] ]
self.source2node = [] # copy from the source to the node
# node2source = [ [a/b/d, /abs/src/base/a/b/d.mod] ]
self.node2source = [] # what to copy back from the node
self.ziparchives = []
self.prelude = ''
self.execution = ''
self.coda = ''
self.scratchdir = '/scratch/$USER/$PBS_JOBID/'
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
def check_dirs(self):
"""Create the directories of std out, std error and pbs file if they
do not exist"""
dnames = set([os.path.dirname(self.path_pbs_o),
os.path.dirname(self.path_pbs_e),
os.path.dirname(self.path_pbs_i)])
for dname in dnames:
if not os.path.exists(os.path.join(self.pbsworkdir, dname)):
os.makedirs(os.path.join(self.pbsworkdir, dname))
def create(self, **kwargs):
"""
path_pbs_e, path_pbs_o, and path_pbs are relative with respect to
the working dir
Parameters
----------
template : str, default=PBSSCript.template
"""
pbs = kwargs.get('template', copy.copy(self.template))
jobname = kwargs.get('jobname', self.jobname)
path_pbs_o = kwargs.get('path_pbs_o', self.path_pbs_o)
path_pbs_e = kwargs.get('path_pbs_e', self.path_pbs_e)
path_pbs_i = kwargs.get('path_pbs_i', self.path_pbs_i)
pbsworkdir = kwargs.get('pbsworkdir', self.pbsworkdir)
umask = kwargs.get('umask', self.umask)
walltime = kwargs.get('walltime', self.walltime)
queue = kwargs.get('queue', self.queue)
lnodes = kwargs.get('lnodes', self.lnodes)
ppn = kwargs.get('ppn', self.ppn)
# source2node = kwargs.get('source2node', self.source2node)
# node2source = kwargs.get('node2source', self.node2source)
# ziparchives = kwargs.get('ziparchives', self.ziparchives)
prelude = kwargs.get('prelude', self.prelude)
execution = kwargs.get('execution', self.execution)
coda = kwargs.get('coda', self.coda)
check_dirs = kwargs.get('check_dirs', False)
if not os.path.isabs(path_pbs_o):
path_pbs_o = './' + path_pbs_o
if not os.path.isabs(path_pbs_e):
path_pbs_e = './' + path_pbs_e
pbs = pbs.replace('[jobname]', jobname)
pbs = pbs.replace('[path_pbs_o]', path_pbs_o)
pbs = pbs.replace('[path_pbs_e]', path_pbs_e)
pbs = pbs.replace('[umask]', umask)
pbs = pbs.replace('[walltime]', walltime)
pbs = pbs.replace('[queue]', queue)
pbs = pbs.replace('[lnodes]', lnodes)
pbs = pbs.replace('[ppn]', ppn)
pbs = pbs.replace('[prelude]', prelude)
pbs = pbs.replace('[execution]', execution)
pbs = pbs.replace('[coda]', coda)
if check_dirs:
self.check_dirs()
# write the pbs_script
with open(os.path.join(pbsworkdir, path_pbs_i), 'w') as f:
f.write(pbs)
if __name__ == '__main__':
pass