move to common gemini arch directory
[charm.git] / src / arch / elan / charmrun
1 #!/bin/sh
2 #
3 # Conv-host for HP/Compaq prun-style Supercomputers:
4 #  Translates +pN-style charmrun options into prun options
5
6 args=""
7 pes=1
8
9 while [ $# -gt 0 ]
10 do
11         case $1 in
12         +p)
13                 pes=$2
14                 shift
15                 ;;
16         +p*)
17                 pes=`echo $1 | awk '{print substr($1,3)}'`
18                 ;;
19         *) 
20                 args=$args"$1 "
21                 ;;
22         esac
23         shift
24 done
25
26 # Try to guess the number of nodes
27 nodes=$pes
28 ppn=0
29 if [ ! "$RMS_NODES" = "" ] 
30 then
31   ppn=`expr $RMS_PROCS / $RMS_NODES`
32   test $pes -gt $RMS_NODES && nodes=$RMS_NODES
33 fi
34 for i in 4 2 3
35 do
36   [ $ppn -ne 0 -a $i -gt $ppn ] && continue
37   if [ `expr $pes / $i '*' $i` -eq $pes ]
38   then
39         nodes=`expr $pes / $i`
40         break
41   fi
42 done
43
44 extra="-N $nodes -n $pes "
45
46 # Prepend path to executable
47 args=`pwd`/"$args"
48
49 if [ ! "$RMS_NODES" = "" ]
50 then
51 # Running from a batch script: just use prun
52         if test $pes -gt $RMS_PROCS
53         then
54           echo "Charmrun> too many processors requested!"
55         fi
56         echo "Charmrun running> prun $extra $args"
57         prun $extra $args       
58 else
59 # Interactive mode: create, and submit a batch job
60         script="charmrun_script.$$.sh"
61         indir=`pwd`
62         output="./charmrun_script.$$.stdout"
63         echo "Submitting batch job for> prun $extra $args"
64         echo " using the command> qsub $script"
65         cat > $script << EOF
66 #!/bin/sh
67 # This is a charmrun-generated PBS batch job script.
68 # The lines starting with #PBS are queuing system flags:
69
70 # This determines the number of nodes and pes (here $nodes and $pes):
71 #PBS -l rmsnodes=$nodes:$pes
72
73 # This determines the wall-clock time limit (here 5 minutes):
74 #PBS -l walltime=10:00
75
76 # This specifies we don't want e-mail info. on this job:
77 #PBS -m n
78
79 # This combines stdout and stderr into one file:
80 #PBS -j oe
81
82 # This specifies the file to write stdout information to:
83 #PBS -o $output
84
85 # Change to the directory where charmrun was run:
86 cd $indir
87
88 # This is the actual command to run the job:
89 prun $extra $args > $output 2>&1
90 EOF
91         chmod 755 $script
92         jobid=`qsub $script`
93         echo "Job enqueued under job ID $jobid"
94
95 End() {
96         echo "autobuild> qdel $jobid ..."
97         qdel $jobid
98         rm -f $script
99         exit $1
100 }
101
102         trap 'End 1' 2 3
103         retry=0
104 # Wait for the job to complete, by checking its status
105         while [ true ]
106         do
107                 qstat $jobid > tmp.$$
108                 exitstatus=$?
109                 if [ -f $output ]
110                 then
111 # The job is done-- print its output                    
112                         rm tmp.$$ $script
113                         if `grep 'End of program' $output > /dev/null 2>&1`
114                         then
115                                 exec cat $output
116                         else
117                                 cat $output
118                                 rm $output
119                                 exit 1
120                         fi
121                 fi
122 # The job is still queued or running-- print status and wait
123                 tail -1 tmp.$$
124                 rm tmp.$$
125                 if test $exitstatus -ne 0
126                 then
127 # retry a few times when error occurs
128                         retry=`expr $retry + 1`
129                         if test $retry -gt 6
130                         then
131                                 echo "Charmrun> too many errors, abort!"
132                                 exit 1
133                         else
134                                 sleep 15
135                         fi
136                 else
137 # job still in queue
138                         retry=0
139                         sleep 20
140                 fi
141         done
142 fi