/[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 3335 - (show annotations)
Wed Nov 3 05:02:57 2010 UTC (8 years, 5 months ago) by jfenwick
Original Path: trunk/bin/run-escript
File size: 15209 byte(s)
Fix the launcher so that it can give an environment even if buildvars is not present.
Environment now includes scons for standalone builds.
Fixes and cleanup for the install documentation.
scons TEMPLATES updated to define the optionfile version by default.

...mumble
   finley no longer imports escript into the default namespace
...
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`
366 intversion=`$PYTHON_CMD -c 'import sys;print "%d.%d.%d"%(sys.version_info[0], sys.version_info[1], sys.version_info[2])'`
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