/[escript]/branches/py3_attempt2/bin/run-escript
ViewVC logotype

Contents of /branches/py3_attempt2/bin/run-escript

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2409 - (show annotations)
Tue May 5 06:22:11 2009 UTC (9 years, 6 months ago) by jfenwick
Original Path: trunk/bin/escript
File size: 13442 byte(s)
bin/escript is now under version control.
The wrapper template is no longer used.
Extraneous output doc removed from scons during build.

note: finleypython is no longer built (it was deprecated anyway).
1 #!/bin/bash
2
3 # Escript/Finley wrapper for python
4 # Sets LD_LIBRARY_PATH and PYTHONPATH and then runs either python or the MPI launcher
5
6 #Extra paths can be configured about a page further down
7 #Search for EXTRA_PATH=""
8
9 #set to 1 if performing this is a standalone build and /packages contains the relevant tools
10 STANDALONE=0
11
12 #set to 1 if this is part of a packaged build (.deb) and files will be installed in standard locations
13 #rather than everything in a single directory
14 #Do not use this together with $STANDALONE
15 STDLOCATION=0
16
17 #Now we find the location of this script
18 #Note that this location should be absolute but does not need to be unique
19 scriptdir=""
20 CURDIR=`pwd`
21
22 #Environment vars which control operations:
23 # ESCRIPT_NUM_NODES, ESCRIPT_NUM_PROCS, ESCRIPT_NUM_THREADS, ESCRIPT_HOSTFILE, ESCRIPT_CREATESTDFILES
24
25 HOSTFILE=/tmp/escript.$$
26 HOSTFILE2=/tmp/escript2.$$
27
28 #Begin finding ESCRIPT_ROOT
29 if [ $STDLOCATION != 0 ]
30 then
31 ESCRIPT_ROOT=/usr/lib/escript
32 else
33 #We don't know the escript root so we need to work it out from the invocation
34 #Need to match if the name contains /
35 if [[ $0 =~ / ]]
36 then
37 # We are not using the PATH to find the script
38 cd `dirname $0`
39 scriptdir=`pwd`
40 cd $CURDIR
41 else
42 # name does not contain / therefore we are using
43 tscriptdir=`which $0`
44 if [ $? != 0 ]
45 then
46 echo "Error unable to determine script directory. Exiting."
47 exit 1
48 fi
49 scriptdir=`dirname $tscriptdir`
50 fi
51
52 cd $scriptdir/..
53 ESCRIPT_ROOT=`pwd`
54 cd ..
55 ESCRIPT_PARENT=`pwd`
56 cd $CURDIR
57
58 fi
59 ##### End finding ESCRIPT_ROOT ########
60
61 PYTHON_MPI_NULL="$ESCRIPT_ROOT/lib/pythonMPI"
62 PYTHON_MPI_REDIRECT="$ESCRIPT_ROOT/lib/pythonMPIredirect"
63 PYTHON_CMD=python
64
65 # if possible please express paths relative to $ESCRIPT_ROOT unless
66 # they are in an unrelated location
67
68 EXTRA_DYLD_LIBRARY_PATH=""
69 EXTRA_PATH=$ESCRIPT_ROOT/bin
70 EXTRA_PYTHONPATH=$ESCRIPT_ROOT
71 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_ROOT/lib
72
73 if [ $STANDALONE == 1 ]
74 then
75 EXTRA_PATH=$ESCRIPT_PARENT/packages/python/bin:$EXTRA_PATH
76 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/packages/boost/lib:$ESCRIPT_PARENT/packages/netcdf/lib/:$EXTRA_LD_LIBRARY_PATH
77 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/packages/vtk/lib/vtk-5.2:$ESCRIPT_PARENT/packages/mesa/lib:$EXTRA_LD_LIBRARY_PATH
78 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/packages/python/lib:$EXTRA_LD_LIBRARY_PATH
79 EXTRA_PYTHONPATH=$ESCRIPT_PARENT/packages/numarray/lib:$ESCRIPT_PARENT/packages/vtk/lib/python2.6/site-packages:$EXTRA_PYTHONPATH
80 fi
81
82
83
84 HELP_TEXT="
85 Usage: escript [options] script.py [arguments...]
86 -n nn number of nodes to use
87 -p np number of MPI processes to spawn
88 -t nt number of OpenMP threads to use
89 -f file name of MPI hostfile
90 -c print compile information for escript and exit
91 -V print escript version and exit
92 -i interactive mode
93 -b do not invoke python (run non-python programs)
94 -e print export statements for environment and exit
95 -o redirect output from MPI to files
96 -v print diagnostics
97 -x ..reserved for future use ..
98 script.py Your python script
99 arguments... The optional command-line arguments to your script
100 "
101
102 if [ "$1" = "--help" ]; then
103 echo "$HELP_TEXT"
104 exit 0
105 fi
106 #=======================================================================================
107
108 # Avoid bug in hybrid runs with MPT MPI
109
110
111 # Parse the command-line options
112 # option e should not be followed by a :
113 while getopts 'bn:p:t:f:h:ecVviox' option
114 do
115 case "$option" in
116 "b") DOBINARY=yes
117 ;;
118 "n") ESCRIPT_NUM_NODES=$OPTARG
119 ;;
120 "p") ESCRIPT_NUM_PROCS=$OPTARG
121 ;;
122 "t") ESCRIPT_NUM_THREADS=$OPTARG
123 ;;
124 "f") ESCRIPT_HOSTFILE=$OPTARG
125 ;;
126 "c") cat $ESCRIPT_ROOT/lib/buildvars
127 exit 0
128 ;;
129 "V") echo "escript-pre2.0(build "`grep svn_revision $ESCRIPT_ROOT/lib/buildvars |cut -d= -f2`")"
130 exit 0
131 ;;
132 "h") echo "$HELPTEXT"
133 exit 0
134 ;;
135 "i") DOINTERACTIVE=yes
136 ;;
137 "e") echo "export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:\$LD_LIBRARY_PATH"
138 echo "export PYTHONPATH=$EXTRA_PYTHONPATH:\$PYTHONPATH"
139 echo "export PATH=$EXTRA_PATH:\$PATH"
140 if [ `uname` == Darwin ]
141 then
142 echo "export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:\$DYLD_LIBRARY_PATH"
143 fi
144 exit 0
145 ;;
146 "o") ESCRIPT_CREATESTDFILES="yes"
147 ;;
148 "v") ESCRIPT_VERBOSE="yes"
149 ;;
150 "x") echo "-x not implemented yet"
151 exit 1
152 ;;
153 ?) echo "$HELP_TEXT"
154 exit 1
155 ;;
156 esac
157 done
158 shift `expr $OPTIND - 1`
159 #==============================================
160 #
161 # Read the MPI_FLAVOUR from the buildvars
162 #
163 MPI_FLAVOUR=`grep mpi_flavour $ESCRIPT_ROOT/lib/buildvars |cut -d= -f2`
164 WITH_OPENMP=`grep useopenmp $ESCRIPT_ROOT/lib/buildvars |cut -d= -f2`
165
166 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI flavor is $MPI_FLAVOUR."; fi
167 if [ ! -z $ESCRIPT_VERBOSE ] && [ $WITH_OPENMP == "y" ]; then echo "OpenMP enabled."; fi
168 #
169 # extend path variables
170 #
171 export PATH=$EXTRA_PATH:$PATH
172 export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:$LD_LIBRARY_PATH
173 export PYTHONPATH=$EXTRA_PYTHONPATH:$PYTHONPATH
174 EXPORT_ENV="PATH,LD_LIBRARY_PATH,PYTHONPATH"
175 if [ `uname` == Darwin ]
176 then
177 export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:$DYLD_LIBRARY_PATH
178 EXPORT_ENV="$EXPORT_ENV,DYLD_LIBRARY_PATH"
179 fi
180 if [ ! -z $ESCRIPT_VERBOSE ]
181 then
182 echo "PATH = $PATH "
183 echo "LD_LIBRARY_PATH = $LD_LIBRARY_PATH "
184 echo "PYTHONPATH = $PYTHONPATH "
185 if [ ! -z $DYLD_LIBRARY_PATH ]; then echo "DYLD_LIBRARY_PATH = $DYLD_LIBRARY_PATH "; fi
186 fi
187 #==============================================
188 #
189 # Ensure the variables have sensible values
190 #
191 if [ $MPI_FLAVOUR == "none" ]
192 then
193 if [ ! -z $ESCRIPT_NUM_NODES ]
194 then
195 echo "Warning: MPI disabled but number of nodes set. Option ignored."
196 fi
197 if [ ! -z $ESCRIPT_NUM_PROCS ]
198 then
199 echo "Warning: MPI disabled but number of processors per node set. Option ignored."
200 fi
201 if [ ! -z $ESCRIPT_HOSTFILE ]
202 then
203 echo "Warning: MPI disabled but host file is given. Option ignored."
204 fi
205 ESCRIPT_NUM_NODES=1
206 ESCRIPT_NUM_PROCS=1
207 else
208 if [ ! -z $ESCRIPT_HOSTFILE ]
209 then
210 if [ -f $ESCRIPT_HOSTFILE ]
211 then
212 cat $ESCRIPT_HOSTFILE | sort -u > $HOSTFILE
213 NUM_HOSTS=`cat $HOSTFILE | wc -l`
214 if [ ! -z $ESCRIPT_NUM_NODES ]
215 then
216 if [ $NUM_HOSTS -ne $ESCRIPT_NUM_NODES ]
217 then
218 echo "number of hosts selected in the host file $ESCRIPT_HOSTFILE needs to match the requested number of nodes $ESCRIPT_NUM_NODES."
219 exit 1
220 fi
221 else
222 ESCRIPT_NUM_NODES=$NUM_HOSTS
223 fi
224 else
225 echo "cannot find hostfile $ESCRIPT_HOSTFILE."
226 exit 1
227 fi
228 else
229 HOSTFILE=''
230 fi
231
232 if [ -z $ESCRIPT_NUM_NODES ]
233 then
234 ESCRIPT_NUM_NODES=1
235 fi
236
237 if [ -z $ESCRIPT_NUM_PROCS ]
238 then
239 ESCRIPT_NUM_PROCS=1
240 fi
241
242 if [ ! -z $ESCRIPT_VERBOSE ]
243 then
244 echo "ESCRIPT_NUM_NODES = $ESCRIPT_NUM_NODES "
245 echo "ESCRIPT_NUM_PROCS = $ESCRIPT_NUM_PROCS "
246 fi
247 fi
248
249 if [ $WITH_OPENMP == "y" ]
250 then
251 if [ -z $ESCRIPT_NUM_THREADS ]
252 then
253 ESCRIPT_NUM_THREADS=$OMP_NUM_THREADS
254 if [ -z $ESCRIPT_NUM_THREADS ]
255 then
256 ESCRIPT_NUM_THREADS=1
257 fi
258 fi
259 if [ ! -z $ESCRIPT_VERBOSE ]
260 then
261 echo "ESCRIPT_NUM_THREADS is $ESCRIPT_NUM_THREADS."
262 fi
263 else
264 if [[ ( ! -z $ESCRIPT_NUM_THREADS ) && ( $ESCRIPT_NUM_THREADS != 1 ) ]]
265 then
266 echo "Warning: OpenMP is disabled but number of threads requested is $ESCRIPT_NUM_THREADS!=1. Running without threads."
267 fi
268 ESCRIPT_NUM_THREADS=1
269 fi
270 #
271 # Now we compute total number of Processes
272 #
273 (( TOTPROC=$ESCRIPT_NUM_NODES * $ESCRIPT_NUM_PROCS))
274 if [ $? -ne 0 ] #Some compute error
275 then #This could happen if the args were not a number
276 echo "expression of total number of processors = $ESCRIPT_NUM_NODES * $ESCRIPT_NUM_PROCS is not numerical."
277 exit 1
278 fi
279
280 #
281 # Test to ensure people aren't trying to combine interactive and multi-process
282 #
283 if [[ ( ( ! -z $DOINTERACTIVE ) || ( $# -eq 0 ) ) && ( $TOTPROC -gt 1) ]]
284 then
285 echo "Interactive mode cannot be used with more than one process"
286 exit 1
287 fi
288
289 if [ $TOTPROC -gt 1 ]
290 then
291 if [ "$ESCRIPT_CREATESTDFILES" == "yes" ]
292 then
293 PYTHON_MPI=$PYTHON_MPI_REDIRECT
294 else
295 PYTHON_MPI=$PYTHON_MPI_NULL
296 fi
297 else
298 PYTHON_MPI=$PYTHON_MPI_NULL
299 fi
300 #=========================================================================================================
301 # Must have at least one command-line arg: the python script
302 if [ $# -eq 0 ]
303 then
304 if [ ! -z $DOBINARY ]
305 then
306 echo "No program to run was specified. Exiting."
307 exit 1
308 fi
309 fi
310
311 #=========================================================================================================
312 if [ ! -z $DOBINARY ]
313 then
314 EXEC_CMD="$@"
315 else
316 if [ $MPI_FLAVOUR == "none" ]
317 then
318 # Check to see if the python version we were compiled with matches the one of EXEC_CMD
319 # We should only do this check if they are running a python script
320 if [ -f $ESCRIPT_ROOT/lib/pyversion ]
321 then
322 compversion=`cat $ESCRIPT_ROOT/lib/pyversion`
323 intversion=`$PYTHON_CMD -V 2>&1`
324 if [ "$compversion" != "$intversion" ]
325 then
326 echo "Python versions do not match. Escript was compiled for "$compversion"."
327 echo "Current version of Python appears to be "$intversion"."
328 exit 1
329 fi
330 fi
331 if [ ! -z $DOINTERACTIVE ]
332 then
333 EXEC_CMD="$PYTHON_CMD -i $@"
334 else
335 EXEC_CMD="$PYTHON_CMD $@"
336 fi
337 else
338 EXEC_CMD="$PYTHON_MPI $@"
339 fi
340 fi
341 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "Command to be executed is \"$EXEC_CMD\"."; fi
342 #===============================================================================================
343 #
344 # now we start to spwan things:
345 #
346 if [ $WITH_OPENMP == "y" ]
347 then
348 export OMP_NUM_THREADS=$ESCRIPT_NUM_THREADS
349 EXPORT_ENV="$EXPORT_ENV,OMP_NUM_THREADS"
350 fi
351 EXIT_CODE=1
352 #=============== no MPI ===================================
353 if [ $MPI_FLAVOUR == "none" ]
354 then
355 $EXEC_CMD
356 EXIT_CODE=$?
357 #=============== OpenMPI ===================================
358 elif [ $MPI_FLAVOUR == "OPENMPI" ]
359 then
360 if [ ! -z $HOSTFILE ]
361 then
362 HOST_LIST=`awk 'BEGIN{S=""}{if (S == "") { S = $0 } else {S = S "," $0}}END{print S}' $HOSTFILE`
363 CMD="mpirun --bynode -np $TOTPROC --host $HOST_LIST $EXEC_CMD"
364 else
365 CMD="mpirun -np $TOTPROC $EXEC_CMD"
366 fi
367 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
368 $CMD
369 EXIT_CODE=$?
370
371 #=============== Intel MPI ===================================
372 elif [ $MPI_FLAVOUR == "INTELMPI" ]
373 then
374 if [ ! -z $HOSTFILE ]
375 then
376 mpdboot -n $ESCRIPT_NUM_NODES -r ssh -f $HOSTFILE
377 if [ $? -ne 0 ]
378 then
379 echo "mpdboot with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes failed."
380 exit 1
381 else
382 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes."; fi
383 fi
384 fi
385 CMD="mpiexec -perhost $ESCRIPT_NUM_PROCS -envall -n $TOTPROC $EXEC_CMD"
386 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
387 $CMD
388 EXIT_CODE=$?
389 if [ ! -z $HOSTFILE ]
390 then
391 mpdallexit
392 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdallexit executed."; fi
393 fi
394 #=============== SGI's MPIMPT ===================================
395 elif [ $MPI_FLAVOUR == "MPT" ]
396 then
397 export MPI_NUM_MEMORY_REGIONS=0
398 EXPORT_ENV="$EXPORT_ENV,MPI_NUM_MEMORY_REGIONS"
399 if [ ! -z $HOSTFILE ]
400 then
401 HOST_LIST=`awk 'BEGIN{S=""}{if (S == "") { S = $0 } else {S = S "," $0}}END{print S}' $HOSTFILE`
402 CMD="mpirun $HOST_LIST $ESCRIPT_NUM_PROCS $EXEC_CMD"
403 else
404 CMD="mpirun -np $TOTPROC $EXEC_CMD"
405 fi
406 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
407 $CMD
408 EXIT_CODE=$?
409 #=============== MPICH ===================================
410 elif [ $MPI_FLAVOUR == "MPICH" ]
411 then
412 if [ ! -z $HOSTFILE ]
413 then
414 touch $HOSTFILE2
415 for (( i=1;i<=$ESCRIPT_NUM_PROCS;i+=1 )) ; do cat $HOSTFILE >> $HOSTFILE2 ; done
416 CMD="mpirun -machinefile $HOSTFILE2 -np $TOTPROC $EXEC_CMD"
417 else
418 CMD="mpirun -np $TOTPROC $EXEC_CMD"
419 fi
420 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
421 $CMD
422 EXIT_CODE=$?
423 #=============== MPICH2 ===================================
424 elif [ $MPI_FLAVOUR == "MPICH2" ]
425 then
426 if [ ! -z $HOSTFILE ]
427 then
428 mpdboot -n $ESCRIPT_NUM_NODES -r ssh -f $HOSTFILE
429 if [ $? -ne 0 ]
430 then
431 echo "mpdboot with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes failed."
432 exit 1
433 else
434 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes."; fi
435 fi
436 fi
437 CMD="mpiexec -genvlist $EXPORT_ENV -np $TOTPROC $EXEC_CMD"
438 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
439 $CMD
440 EXIT_CODE=$?
441 if [ ! -z $HOSTFILE ]
442 then
443 mpdallexit
444 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdallexit executed."; fi
445 fi
446 else
447 echo "unknown MPI falvour $MPI_FLAVOUR."
448 fi
449 exit $EXIT_CODE

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26