/[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 3388 - (show annotations)
Mon Nov 29 06:07:07 2010 UTC (8 years, 1 month ago) by caltinay
Original Path: trunk/bin/run-escript
File size: 15209 byte(s)
Added quotes around some variables to fix running scripts located in a
directory whose name contains spaces.

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 ../../pkg 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.$USER.$$
26 HOSTFILE2=/tmp/escript2.$USER.$$
27
28 #Begin finding ESCRIPT_ROOT
29 if [ $STDLOCATION -ne 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 [ $? -ne 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
62
63 PYTHON_MPI_NULL="$ESCRIPT_ROOT/lib/pythonMPI"
64 PYTHON_MPI_REDIRECT="$ESCRIPT_ROOT/lib/pythonMPIredirect"
65 PYTHON_CMD=python
66
67 # if possible please express paths relative to $ESCRIPT_ROOT unless
68 # they are in an unrelated location
69
70 EXTRA_DYLD_LIBRARY_PATH=""
71 EXTRA_PATH=$ESCRIPT_ROOT/bin
72 EXTRA_PYTHONPATH=$ESCRIPT_ROOT
73 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_ROOT/lib
74
75 if [ $STANDALONE -eq 1 ]
76 then
77 EXTRA_PATH=$ESCRIPT_PARENT/pkg/python/bin:$ESCRIPT_PARENT/pkg/scons/bin:$EXTRA_PATH
78 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/pkg/boost/lib:$ESCRIPT_PARENT/pkg/netcdf/lib/:$EXTRA_LD_LIBRARY_PATH
79 EXTRA_LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH
80 EXTRA_LD_LIBRARY_PATH=$ESCRIPT_PARENT/pkg/python/lib:$EXTRA_LD_LIBRARY_PATH
81 EXTRA_PYTHONPATH=$ESCRIPT_PARENT/pkg/numpy/lib/python2.6/site-packages:$ESCRIPT_PARENT/pkg/matplotlib/lib/python2.6/site-packages:$EXTRA_PYTHONPATH
82 fi
83
84
85 BUILDINFO_FILE=$ESCRIPT_ROOT/lib/buildvars
86 if [ ! -r $BUILDINFO_FILE ]; then
87 if [ "$1" = "-e" ];then
88 echo "export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:\$LD_LIBRARY_PATH"
89 echo "export PYTHONPATH=$EXTRA_PYTHONPATH:\$PYTHONPATH"
90 echo "export PATH=$EXTRA_PATH:\$PATH"
91 if [ "`uname`" = "Darwin" ]
92 then
93 echo "export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:\$DYLD_LIBRARY_PATH"
94 fi
95 exit 0
96 fi
97 echo "Error! Unable to read escript build information. Exiting."
98 exit 1
99 fi
100
101 function get_buildvar {
102 echo `grep "^$1=" $BUILDINFO_FILE |cut -d= -f2`
103 }
104
105 #
106 # Add VisIt paths if required
107 #
108 WITH_VISIT=`get_buildvar visit`
109 if [ "$WITH_VISIT" = "1" ]; then
110 VISIT_BIN=`which visit`
111 if [ $? -eq 0 ]; then
112 VISIT_PY_PATH=`$VISIT_BIN -env | grep LIBPATH | cut -d= -f2`
113 EXTRA_PYTHONPATH=$EXTRA_PYTHONPATH:$VISIT_PY_PATH
114 EXTRA_LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:$VISIT_PY_PATH
115 elif [ ! -z $ESCRIPT_VERBOSE ]; then
116 echo "VisIt module enabled but VisIt not in path!"
117 fi
118 fi
119
120 HELP_TEXT="
121 Usage: escript [options] script.py [arguments...]
122 -n nn number of nodes to use
123 -p np number of MPI processes to spawn per node
124 -t nt number of OpenMP threads to use
125 -f file name of MPI hostfile
126 -c print compile information for escript and exit
127 -V print escript version and exit
128 -i interactive mode
129 -b do not invoke python (run non-python programs)
130 -e print export statements for environment and exit
131 -o redirect output from MPI to files
132 -v print diagnostics
133 -x ..reserved for future use ..
134 script.py Your python script
135 arguments... The optional command-line arguments to your script
136 "
137
138 if [ "$1" = "--help" ]; then
139 echo "$HELP_TEXT"
140 exit 0
141 fi
142 #=======================================================================================
143
144 # Avoid bug in hybrid runs with MPT MPI
145
146
147 # Parse the command-line options
148 # option e should not be followed by a :
149 while getopts 'bn:p:t:f:h:ecVviox' option
150 do
151 case "$option" in
152 "b") DOBINARY=yes
153 ;;
154 "n") ESCRIPT_NUM_NODES=$OPTARG
155 ;;
156 "p") ESCRIPT_NUM_PROCS=$OPTARG
157 ;;
158 "t") ESCRIPT_NUM_THREADS=$OPTARG
159 ;;
160 "f") ESCRIPT_HOSTFILE=$OPTARG
161 ;;
162 "c") cat $ESCRIPT_ROOT/lib/buildvars
163 exit 0
164 ;;
165 "V") echo "escript-development(build "`get_buildvar svn_revision`")"
166 exit 0
167 ;;
168 "h") echo "$HELPTEXT"
169 exit 0
170 ;;
171 "i") DOINTERACTIVE=yes
172 ;;
173 "e") echo "export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:\$LD_LIBRARY_PATH"
174 echo "export PYTHONPATH=$EXTRA_PYTHONPATH:\$PYTHONPATH"
175 echo "export PATH=$EXTRA_PATH:\$PATH"
176 if [ "`uname`" = "Darwin" ]
177 then
178 echo "export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:\$DYLD_LIBRARY_PATH"
179 fi
180 exit 0
181 ;;
182 "o") ESCRIPT_CREATESTDFILES="yes"
183 ;;
184 "v") ESCRIPT_VERBOSE="yes"
185 ;;
186 "x") echo "-x not implemented yet"
187 exit 1
188 ;;
189 ?) echo "$HELP_TEXT"
190 exit 1
191 ;;
192 esac
193 done
194 shift `expr $OPTIND - 1`
195 #==============================================
196 #
197 # Read MPI_FLAVOUR and WITH_OPENMP from the buildvars
198 #
199 MPI_FLAVOUR=`get_buildvar mpi`
200 WITH_OPENMP=`get_buildvar openmp`
201
202 if [ ! -z $ESCRIPT_VERBOSE ]; then
203 echo "MPI flavour is $MPI_FLAVOUR."
204 if [ "$WITH_OPENMP" = "1" ]; then echo "OpenMP enabled."; fi
205 fi
206
207 #
208 # extend path variables
209 #
210 export PATH=$EXTRA_PATH:$PATH
211 export LD_LIBRARY_PATH=$EXTRA_LD_LIBRARY_PATH:$LD_LIBRARY_PATH
212 export PYTHONPATH=$EXTRA_PYTHONPATH:$PYTHONPATH
213 EXPORT_ENV="PATH,LD_LIBRARY_PATH,PYTHONPATH"
214 if [ "`uname`" = "Darwin" ]
215 then
216 export DYLD_LIBRARY_PATH=$EXTRA_DYLD_LIBRARY_PATH:$EXTRA_LD_LIBRARY_PATH:$DYLD_LIBRARY_PATH
217 EXPORT_ENV="$EXPORT_ENV,DYLD_LIBRARY_PATH"
218 fi
219 if [ ! -z $ESCRIPT_VERBOSE ]
220 then
221 echo "PATH = $PATH "
222 echo "LD_LIBRARY_PATH = $LD_LIBRARY_PATH "
223 echo "PYTHONPATH = $PYTHONPATH "
224 if [ ! -z $DYLD_LIBRARY_PATH ]; then echo "DYLD_LIBRARY_PATH = $DYLD_LIBRARY_PATH "; fi
225 fi
226 #==============================================
227 #
228 # Ensure the variables have sensible values
229 #
230 if [ "$MPI_FLAVOUR" = "none" ]
231 then
232 if [ ! -z $ESCRIPT_NUM_NODES ]
233 then
234 echo "Warning: MPI disabled but number of nodes set. Option ignored."
235 fi
236 if [ ! -z $ESCRIPT_NUM_PROCS ]
237 then
238 echo "Warning: MPI disabled but number of processors per node set. Option ignored."
239 fi
240 if [ ! -z $ESCRIPT_HOSTFILE ]
241 then
242 echo "Warning: MPI disabled but host file is given. Option ignored."
243 fi
244 ESCRIPT_NUM_NODES=1
245 ESCRIPT_NUM_PROCS=1
246 else
247 # use the PBS_NODEFILE if not otherwise specified
248 if [[ ( ! -z $PBS_NODEFILE ) && ( -z $ESCRIPT_HOSTFILE ) ]]
249 then
250 ESCRIPT_HOSTFILE=$PBS_NODEFILE
251 fi
252
253 if [ ! -z $ESCRIPT_HOSTFILE ]
254 then
255 if [ -f $ESCRIPT_HOSTFILE ]
256 then
257 cat $ESCRIPT_HOSTFILE | sort -u > $HOSTFILE
258 NUM_HOSTS=`cat $HOSTFILE | wc -l`
259 if [ ! -z $ESCRIPT_NUM_NODES ]
260 then
261 if [ $NUM_HOSTS -ne $ESCRIPT_NUM_NODES ]
262 then
263 echo "number of hosts selected in the host file $ESCRIPT_HOSTFILE needs to match the requested number of nodes $ESCRIPT_NUM_NODES."
264 exit 1
265 fi
266 else
267 ESCRIPT_NUM_NODES=$NUM_HOSTS
268 fi
269 else
270 echo "cannot find hostfile $ESCRIPT_HOSTFILE."
271 exit 1
272 fi
273 else
274 HOSTFILE=''
275 fi
276
277 if [ -z $ESCRIPT_NUM_NODES ]
278 then
279 ESCRIPT_NUM_NODES=1
280 fi
281
282 if [ -z $ESCRIPT_NUM_PROCS ]
283 then
284 ESCRIPT_NUM_PROCS=1
285 fi
286
287 if [ ! -z $ESCRIPT_VERBOSE ]
288 then
289 echo "ESCRIPT_NUM_NODES = $ESCRIPT_NUM_NODES "
290 echo "ESCRIPT_NUM_PROCS = $ESCRIPT_NUM_PROCS "
291 fi
292 fi
293
294 if [ "$WITH_OPENMP" = "1" ]
295 then
296 if [ -z $ESCRIPT_NUM_THREADS ]
297 then
298 ESCRIPT_NUM_THREADS=$OMP_NUM_THREADS
299 if [ -z $ESCRIPT_NUM_THREADS ]
300 then
301 ESCRIPT_NUM_THREADS=1
302 fi
303 fi
304 if [ ! -z $ESCRIPT_VERBOSE ]
305 then
306 echo "ESCRIPT_NUM_THREADS is $ESCRIPT_NUM_THREADS."
307 fi
308 else
309 if [[ ( ! -z $ESCRIPT_NUM_THREADS ) && ( $ESCRIPT_NUM_THREADS != 1 ) ]]
310 then
311 echo "Warning: OpenMP is disabled but number of threads requested is $ESCRIPT_NUM_THREADS!=1. Running without threads."
312 fi
313 ESCRIPT_NUM_THREADS=1
314 fi
315 #
316 # Now we compute total number of Processes
317 #
318 (( TOTPROC=$ESCRIPT_NUM_NODES * $ESCRIPT_NUM_PROCS))
319 if [ $? -ne 0 ] #Some compute error
320 then #This could happen if the args were not a number
321 echo "expression of total number of processors = $ESCRIPT_NUM_NODES * $ESCRIPT_NUM_PROCS is not numerical."
322 exit 1
323 fi
324
325 #
326 # Test to ensure people aren't trying to combine interactive and multi-process
327 #
328 if [[ ( ( ! -z $DOINTERACTIVE ) || ( $# -eq 0 ) ) && ( $TOTPROC -gt 1) ]]
329 then
330 echo "Interactive mode cannot be used with more than one process"
331 exit 1
332 fi
333
334 if [ $TOTPROC -gt 1 ]
335 then
336 if [ "$ESCRIPT_CREATESTDFILES" = "yes" ]
337 then
338 PYTHON_MPI=$PYTHON_MPI_REDIRECT
339 else
340 PYTHON_MPI=$PYTHON_MPI_NULL
341 fi
342 else
343 PYTHON_MPI=$PYTHON_MPI_NULL
344 fi
345 #=========================================================================================================
346 # Must have at least one command-line arg: the python script
347 if [ $# -eq 0 ]
348 then
349 if [ ! -z $DOBINARY ]
350 then
351 echo "No program to run was specified. Exiting."
352 exit 1
353 else
354 DOINTERACTIVE="yes"
355 fi
356 fi
357
358 #=========================================================================================================
359 if [ ! -z $DOBINARY ]
360 then
361 EXEC_CMD="$@"
362 else
363 # Check to see if the python version we were compiled with matches the
364 # one of PYTHON_CMD.
365 compversion=`get_buildvar python_version | cut -d. -f1,2`
366 intversion=`$PYTHON_CMD -c 'import sys;print "%d.%d"%(sys.version_info[0], sys.version_info[1])'`
367 if [ "$compversion" != "$intversion" ]
368 then
369 echo "Python versions do not match. Escript was compiled for "$compversion"."
370 echo "Current version of Python appears to be "$intversion"."
371 exit 1
372 fi
373 if [ "$MPI_FLAVOUR" = "none" ]
374 then
375 if [ ! -z $DOINTERACTIVE ]
376 then
377 EXEC_CMD="$PYTHON_CMD -i $@"
378 else
379 EXEC_CMD="$PYTHON_CMD $@"
380 fi
381 else
382 if [ ! -z $DOINTERACTIVE ]
383 then
384 EXEC_CMD="$PYTHON_MPI -i $@"
385 else
386 EXEC_CMD="$PYTHON_MPI $@"
387 fi
388 fi
389 fi
390 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "Command to be executed is \"$EXEC_CMD\"."; fi
391 #===============================================================================================
392 #
393 # now we start to spwan things:
394 #
395 if [ "$WITH_OPENMP" = "1" ]
396 then
397 export OMP_NUM_THREADS=$ESCRIPT_NUM_THREADS
398 EXPORT_ENV="$EXPORT_ENV,OMP_NUM_THREADS"
399 fi
400 EXIT_CODE=1
401 #=============== no MPI ===================================
402 if [ "$MPI_FLAVOUR" = "none" ]
403 then
404 $EXEC_CMD
405 EXIT_CODE=$?
406 #=============== OpenMPI ===================================
407 elif [ "$MPI_FLAVOUR" = "OPENMPI" ]
408 then
409 if [ ! -z $HOSTFILE ]
410 then
411 HOST_LIST=`awk 'BEGIN{S=""}{if (S == "") { S = $0 } else {S = S "," $0}}END{print S}' $HOSTFILE`
412 CMD="mpirun --gmca mpi_warn_on_fork 0 -x ${EXPORT_ENV//,/ -x } --bynode -np $TOTPROC --host $HOST_LIST $EXEC_CMD"
413 else
414 CMD="mpirun --gmca mpi_warn_on_fork 0 -x ${EXPORT_ENV//,/ -x } -np $TOTPROC $EXEC_CMD"
415 fi
416 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
417 $CMD
418 EXIT_CODE=$?
419
420 #=============== Intel MPI ===================================
421 elif [ "$MPI_FLAVOUR" = "INTELMPI" ]
422 then
423
424 if [ "$WITH_OPENMP" = "1" ]
425 then
426 export I_MPI_PIN_DOMAIN=omp
427 EXPORT_ENV="$EXPORT_ENV, I_MPI_PIN_DOMAIN"
428 fi
429
430 if [ ! -z $HOSTFILE ]
431 then
432 mpdboot -n $ESCRIPT_NUM_NODES -r ssh -f $HOSTFILE
433 if [ $? -ne 0 ]
434 then
435 echo "mpdboot with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes failed."
436 exit 1
437 else
438 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes."; fi
439 fi
440 else
441 mpdboot -n 1 -r ssh
442 if [ $? -ne 0 ]
443 then
444 echo "mpdboot failed."
445 exit 1
446 else
447 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started."; fi
448 fi
449 fi
450 CMD="mpiexec -perhost $ESCRIPT_NUM_PROCS -envall -n $TOTPROC $EXEC_CMD"
451 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
452 $CMD
453 EXIT_CODE=$?
454 mpdallexit
455 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdallexit executed."; fi
456 #=============== SGI's MPIMPT ===================================
457 elif [ "$MPI_FLAVOUR" = "MPT" ]
458 then
459 export MPI_NUM_MEMORY_REGIONS=0
460 EXPORT_ENV="$EXPORT_ENV,MPI_NUM_MEMORY_REGIONS"
461 if [ ! -z $HOSTFILE ]
462 then
463 HOST_LIST=`awk 'BEGIN{S=""}{if (S == "") { S = $0 } else {S = S "," $0}}END{print S}' $HOSTFILE`
464 CMD="mpirun $HOST_LIST -np $ESCRIPT_NUM_PROCS $EXEC_CMD"
465 else
466 CMD="mpirun -np $TOTPROC $EXEC_CMD"
467 fi
468 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
469 $CMD
470 EXIT_CODE=$?
471 #=============== MPICH ===================================
472 elif [ "$MPI_FLAVOUR" = "MPICH" ]
473 then
474 if [ ! -z $HOSTFILE ]
475 then
476 touch $HOSTFILE2
477 for (( i=1;i<=$ESCRIPT_NUM_PROCS;i+=1 )) ; do cat $HOSTFILE >> $HOSTFILE2 ; done
478 CMD="mpirun -machinefile $HOSTFILE2 -np $TOTPROC $EXEC_CMD"
479 else
480 CMD="mpirun -np $TOTPROC $EXEC_CMD"
481 fi
482 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
483 $CMD
484 EXIT_CODE=$?
485 #=============== MPICH2 ===================================
486 elif [ "$MPI_FLAVOUR" = "MPICH2" ]
487 then
488 if [ ! -z $HOSTFILE ]
489 then
490 mpdboot -n $ESCRIPT_NUM_NODES -r ssh -f $HOSTFILE
491 if [ $? -ne 0 ]
492 then
493 echo "mpdboot with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes failed."
494 exit 1
495 else
496 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started with host file $ESCRIPT_HOSTFILE for $ESCRIPT_NUM_NODES nodes."; fi
497 fi
498 else
499 mpdboot -n 1 -r ssh
500 if [ $? -ne 0 ]
501 then
502 echo "mpdboot failed."
503 exit 1
504 else
505 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdboot was started."; fi
506 fi
507 fi
508 CMD="mpiexec -genvlist $EXPORT_ENV -np $TOTPROC $EXEC_CMD"
509 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "MPI command is \"$CMD\"."; fi
510 $CMD
511 EXIT_CODE=$?
512 mpdallexit
513 if [ ! -z $ESCRIPT_VERBOSE ]; then echo "mpdallexit executed."; fi
514 else
515 echo "unknown MPI flavour '$MPI_FLAVOUR'."
516 fi
517 exit $EXIT_CODE

Properties

Name Value
svn:executable *
svn:mergeinfo /branches/lapack2681/bin/escript:2682-2741 /branches/restext/bin/escript:2610-2624 /branches/stage3.0/bin/escript:2569-2590 /release/3.0/bin/escript:2591-2601

  ViewVC Help
Powered by ViewVC 1.1.26