#!/bin/ksh # SETUP SET UP General Circulation Model run 2007/06/06 # OMDIR=$HOME ; IFDIR=$HOME/IFDIR ; OPDIR=$HOME # Rundeck (runID.R) is assumed to reside in Present Working Directory. # Compiled object modules are assumed to reside in Present Working # Directory or else in the directory OMDIR. # Input files are assumed to be an absolute path or else to reside in # the directory IFDIR. # Run will be executed and output files will be saved in the directory # OPDIR/RUNID . if [[ $# -eq 0 ]] then echo " Usage: SETUP runID 2007/06/06" echo " SETUP Fortran-90 Model run" echo " Default directory of compiled object modules: $OMDIR" echo " Default directory of input files: $IFDIR" echo " Output parent directory: $OPDIR" exit ; fi RUNID=$1 ; RFILE=$RUNID.R ; OUTPUT=$OPDIR/$RUNID if ps -e | grep $RUNID[.]exe > /dev/null ; then echo "$RUNID is already running." ; exit 1 ; fi if [[ ! -s $RFILE ]] then echo "File does not exist: $RFILE" ; exit 2 ; fi echo "Setting up run: $RUNID" echo "Output files are saved in: $OUTPUT" export XLFRTEOPTS=namelist=old:nlwidth=133 ## needed for IBM xlf # Make RFILE the standard input exec < $RFILE # Create the run directory, OUTPUT, if it does not already exist umask 002 if [[ ! -d $OUTPUT ]] ; then mkdir $OUTPUT ; fi echo "0Run $RUNID" > $OUTPUT/$RUNID.PRT # First token of RFILE should contain this file's name read VAR1 VAR2 if [[ ! $VAR1 = $RFILE ]] then echo "The first token in runID.R file should be the file's name." echo "Filename: $RFILE , first token: $VAR1" ; exit 3 ; fi echo " $VAR1 $VAR2" >> $OUTPUT/$RUNID.PRT # Read RFILE until "Object modules:" is encountered until [[ $VAR1 = 'Object' && $VAR2 = 'modules:' ]] ; do read VAR1 VAR2 if [[ $? -ne 0 ]] then echo "'"Object modules:"' not found in $RFILE" ; exit 4 ; fi echo " $VAR1 $VAR2" >> $OUTPUT/$RUNID.PRT ; done # Set beginning of link command that creates executable module LINK=" f90 -o $OUTPUT/$RUNID.exe -O3 -64 -mips4" ## SGI # LINK=" f90 -o $OUTPUT/$RUNID.exe -O4 -convert big_endian" ## Compaq # LINK="xlf90 -o $OUTPUT/$RUNID.exe -O2" ## IBM xlf # LINK="ifort -o $OUTPUT/$RUNID.exe -O3 -xN -ipo -fpconstant -pc80 \ # -openmp -fpp -parallel -ansi_alias -convert big_endian" ## Intel 8.1 # LINK="ifort -o $OUTPUT/$RUNID.exe -O3 -xN -ipo -static \ # -openmp -fpp -parallel -ansi_alias -convert big_endian" ## Pent4 9.0 # Add the names of all object modules to LINK command while true ; do read VAR1 VAR2 VAR3 if [[ $? -ne 0 ]] then echo "'"Data input files:"' not found in $RFILE" ; exit 5 ; fi echo " $VAR1 $VAR2 $VAR3" >> $OUTPUT/$RUNID.PRT if [[ $VAR1 = 'Data' && $VAR2 = 'input' && $VAR3 = 'files:' ]] then break ; fi if [[ $VAR1 != '' ]] then for VAR in $VAR1 $VAR2 $VAR3 ; do if [[ $VAR = '!' ]] ; then break ; fi OM=$VAR.o if [[ ! -r $OM ]] then OM=$OMDIR/$VAR.o ; fi if [[ ! -r $OM ]] then echo "Neither $VAR.o nor $OM exists." ; exit 6 ; fi LINK="$LINK $OM" ; done ; fi ; done # Create the executable module OUTPUT/RUNID.exe rm -f $OUTPUT/$RUNID.exe WARN.f90 $LINK 2> WARN.f90 if [[ -s WARN.f90 ]] then echo "Compiler warnings saved in: WARN.f90 . Inspect them." ; fi if [[ ! -s $OUTPUT/$RUNID.exe ]] then echo "Link errors. SETUP terminated." ; exit 7 ; fi # Change directory to model run directory where output will go cd $OUTPUT # Remove any old link and unlink files after switching to run directory if [[ -a $RUNID.ln ]] then rm $RUNID.ln ; fi if [[ -a $RUNID.uln ]] then rm $RUNID.uln ; fi # Use the subsequent information to create the link and unlink files echo "#!/bin/ksh" > $RUNID.ln echo "#!/bin/ksh" > $RUNID.uln while true ; do read VAR1 VAR2 VAR3 if [[ $? -ne 0 ]] then echo "'"Label and Namelist:"' not found in $RFILE" ; exit 8 ; fi if [[ $VAR1 = 'Label' && $VAR2 = 'and' && $VAR3 = 'Namelist:' ]] then break ; fi echo " $VAR1 $VAR2 $VAR3" >> $RUNID.PRT if [[ $VAR1 != '' ]] then for VAR in $VAR1 $VAR2 $VAR3 ; do if [[ $VAR = '!'* ]] then break ; fi UN=${VAR%%'='*} FN=${VAR##*'='} IFN=$FN if [[ ! -r $IFN ]] then IFN=$IFDIR/$FN ; fi if [[ ! -r $IFN ]] then echo "Neither file $FN nor $IFN exists." ; exit 9 ; fi echo "ln -s $IFN fort.$UN" >> $RUNID.ln echo "rm fort.$UN" >> $RUNID.uln ; done ; fi ; done echo "chmod ugo+rw *" >> $RUNID.uln # Copy Label and Namelist to RUNID.I. rm -f I # Check that beginning of Label is RUNID read VAR1 VAR2 echo "$VAR1 $VAR2" > I if [[ ! $VAR1 = $RUNID ]] then echo "Beginning of Label ($VAR1) is not equal to runID ($RUNID)." exit 10 ; fi read LINE echo "$LINE" >> I # Remaining lines need a leading blank read LINE until [[ $? -ne 0 ]] ; do echo " $LINE" >> I read LINE ; done # Make initial run chmod ugo+x $RUNID.ln chmod ugo+x $RUNID.uln $RUNID.ln $RUNID.exe < I >> $RUNID.PRT RETC=$? $RUNID.uln # if [[ $RETC -ne 13 && $retc -ne 12 ]] then # echo "Problem encountered during initial run." ; exit 11 ; fi # Create executable script file E echo "$RUNID.ln" > E # echo "export XLFRTEOPTS=namelist=old:nlwidth=133" >> E ## for IBM echo "$RUNID.exe < I > $RUNID.PRT" >> E echo "$RUNID.uln" >> E chmod ugo+x E # Overwrite I file omitting lines with "ISTART=" in them exec < I read LINE echo "$LINE" > $RUNID.tmp read LINE echo "$LINE" >> $RUNID.tmp read LINE until [[ $? -ne 0 ]] ; do if [[ $LINE != *'ISTART='* ]] then echo " $LINE" >> $RUNID.tmp ; fi read LINE ; done mv $RUNID.tmp I chmod go+rw fort.* *.PRT QRSF $RUNID