Dolyapunov.sh

From DftWiki

Revision as of 17:02, 14 September 2010 by Thiebaut (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

--D. Thiebaut 17:04, 14 September 2010 (UTC)


Example of a bash script illustrating many features of the bash shell.


#! /bin/bash
# dolyapunov.sh
# D. Thiebaut
# syntax:  dolyapunov.sh Dim delta interval tau
#
# Display syntax in case user didn't specify any
#
if [ "$#" -eq "0" ]
  then
   echo "Syntax:  dolyapunov.sh Dim delta interval tau"
   echo "         Dim      -- dimension of embedding"
   echo "         delta    -- when creating embedding, specifies distance"
   echo "                     separating data used for coordinates"
   echo "         interval -- interval used in sampling. Use 4."
   echo "         tau      -- distance separating successive x-value of"
   echo "                     points, when embedding is performed"
   exit 1
fi
#
# Record command line
#
DIM=$1
DELTA=$2
#IVAL=$3
IVAL=4
TAU=$4       
echo dolaypunov Dim=$DIM delta=$DELTA interval=$IVAL tau=$TAU
echo "===================================================" >> ~/log
date >> ~/log
echo dolyapunov Dim=$DIM delta=$DELTA interval=$IVAL tau=$TAU >> ~/log
echo "===================================================" >> ~/log

FILENAME=laser_"$DIM"_"$DELTA"_"$TAU"
if [ ! -e $FILENAME ]; then	
   echo embed -f laser.dat -D $DIM -delta $DELTA -tau $TAU \> $FILENAME
   echo embed -f laser.dat -D $DIM -delta $DELTA -tau $TAU \> $FILENAME >> ~/log
   embed -f laser.dat -D $DIM -delta $DELTA -tau $TAU > $FILENAME
fi
#
# This next part will loop and splines two dimensions of the embeded
# file at a time
#
NUM=3
COUNT1=1
COUNT2=2
if [ ! -e "$FILENAME"."$COUNT1"."$COUNT2"_"$IVAL".al ]; then
  while [ "$COUNT2" -lt "$DIM" ]; do
     echo "{ print "$"$COUNT1, "$"$COUNT2, "$"$COUNT2 }" > script.lyapunov
     # remember than Junheng's spline program assumes 3-dim files
     # treat only 2 columns at a time
     DUMMY=`cat script.lyapunov`
     echo "awk $DUMMY  \> "$FILENAME"."$COUNT1"."$COUNT2"" >> ~/log
     awk -f script.lyapunov $FILENAME > "$FILENAME"."$COUNT1"."$COUNT2"

     # Call Junheng's SamNAl shell
     if [ ! -e "$FILENAME"."$COUNT1"."$COUNT2"_"$IVAL".al ]; then
        echo SamNAl "$FILENAME"."$COUNT1"."$COUNT2" $IVAL
        echo SamNAl "$FILENAME"."$COUNT1"."$COUNT2"  $IVAL >> ~/log
        SamNAl "$FILENAME"."$COUNT1"."$COUNT2"  $IVAL
     fi

     # update counters
     COUNT1=`expr $COUNT1 + 2`
     COUNT2=`expr $COUNT2 + 2`
  done

  #
  # if the Dimension specified was odd, treat last 2 columns together
  #
  if [ "$COUNT1" -le "$DIM" ]; then
    if [ "$COUNT2" -ge "$DIM" ]; then
       COUNT1=`expr $DIM - 1`
       COUNT2=$DIM
       echo "{ print "$"$COUNT1, "$"$COUNT2, "$"$COUNT2 }" > script.lyapunov
       DUMMY=`cat script.lyapunov`
       echo "awk $DUMMY  \> "$FILENAME"."$COUNT1"."$COUNT2"" >> ~/log
       awk -f script.lyapunov $FILENAME > "$FILENAME"."$COUNT1"."$COUNT2"

       # Call Junheng's SamNAl shell
       if [ ! -e "$FILENAME"."$COUNT1"."$COUNT2"_"$IVAL".al ]; then
          echo SamNAl "$FILENAME"."$COUNT1"."$COUNT2" $IVAL 
          echo SamNAl "$FILENAME"."$COUNT1"."$COUNT2" $IVAL >> ~/log
          SamNAl "$FILENAME"."$COUNT1"."$COUNT2" $IVAL
       fi
    fi
  fi
fi


#
# merge the files generated
# To do so, create a variable equal to the command 
#   merge file1 n1 n2 file2 n3 n4 ...
#
if [ ! -e "$FILENAME"_"$IVAL".al ]; then
  COUNT1=1
  COUNT2=2
  COMMANDSTRING="merge "
  while [ "$COUNT2" -lt "$DIM" ]; do
     COMMANDSTRING=`echo $COMMANDSTRING "$FILENAME"."$COUNT1"."$COUNT2"_"$IVAL".al $COUNT1 $COUNT2`
  
    COUNT1=`expr $COUNT1 + 2`
    COUNT2=`expr $COUNT2 + 2`
    done

  if [ "$COUNT1" -le "$DIM" ]; then
    if [ "$COUNT2" -ge "$DIM" ]; then
       COUNT1=`expr $DIM - 1`
       COUNT2=$DIM

       #COMMANDSTRING=`echo $COMMANDSTRING "$FILENAME"."$COUNT1"."$COUNT2"_"$IVAL".al $COUNT1 $COUNT2`
       COMMANDSTRING=`echo $COMMANDSTRING "$FILENAME"."$COUNT1"."$COUNT2"_"$IVAL".al 0 $COUNT2`
       fi
    fi
fi

#
# Now we can do the merge  
#
echo $COMMANDSTRING \> "$FILENAME"_"$IVAL".al >> ~/log
echo $COMMANDSTRING \> "$FILENAME"_"$IVAL".al
$COMMANDSTRING > "$FILENAME"_"$IVAL".al

if [ ! -s "$FILENAME"_"$IVAL".al ]; then
  echo "$FILENAME"_"$IVAL".al has length 0
  echo COMMANDSTRING = $COMMANDSTRING
  echo "$FILENAME"_"$IVAL".al has length 0 >> ~/log
  echo COMMANDSTRING = $COMMANDSTRING     >> ~/log
  exit
fi

if [ ! -e "$FILENAME"_"$IVAL".al.bin ]; then
   echo  d2i \< "$FILENAME"_"$IVAL".al \> "$FILENAME"_"$IVAL".al.bin >> ~/log
   echo  d2i \< "$FILENAME"_"$IVAL".al \> "$FILENAME"_"$IVAL".al.bin
   d2i < "$FILENAME"_"$IVAL".al > "$FILENAME"_"$IVAL".al.bin
fi

#
# 
#
NUM=10000
LAMBDA="lambda = -Infinity"
while [ "$LAMBDA" = "lambda = -Infinity" ]; do
   echo lyapunov -f "$FILENAME"_"$IVAL".al.bin -N $NUM -D $DIM -T $TAU 
   LAMBDA=`lyapunov -f "$FILENAME"_"$IVAL".al.bin -N $NUM -D $DIM -T $TAU`
   echo %%% Dim $DIM delta $DELTA interval $IVAL tau $TAU  lambda $LAMBDA >> ~/log
   echo Dim $DIM delta $DELTA interval $IVAL tau $TAU  lambda $LAMBDA
   NUM=`expr $NUM \/ 2 `
   if [ "$NUM" -lt 50 ]; then
      exit
   fi
   done