File mttroot/mtt/bin/trans/mtt_r2m artifact 28abfd9a50 part of check-in 773866be10


#! /bin/sh

     ###################################### 
     ##### Model Transformation Tools #####
     ######################################

# Bourne shell script: mtt_r2m
# Reduce to octave conversion
# Based on obsolete ode_r2m  and ode_r2lang
# P.J.Gawthrop 14 June 1991, 12 Jan 1994, April 1994, Jan 95, May 1998
# July 1998
# Copyright (c) P.J.Gawthrop 1991, 1994, 1995, 1996, 1998

###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
## Revision 1.7  1999/03/16 00:38:06  peterg
## Done some more tidying up
##
## Revision 1.6  1999/03/15 07:29:25  peterg
## Fixed various obscure reduce bugs
## THIS NEEDS A MAJOR REWRITE!!!!
##
## Revision 1.5  1998/08/13 16:25:07  peterg
## Removed some documentation form odeo.m
##
## Revision 1.4  1998/08/13 15:10:47  peterg
## Change temp var name to mtt_t1 etc
##
## Revision 1.3  1998/08/13 12:43:19  peterg
## Cahnged tmp variable to mtt_1 etc
##
## Revision 1.2  1998/07/27 20:26:44  peterg
## Put in correct N and M values for dm rep
##
## Revision 1.1  1998/07/27 16:30:26  peterg
## Initial revision
##
###############################################################


# Set up the language specific stuff
rep=$2
ext='m';
codegenerator='PASCAL'
Lc='#';
Rc='#';
Lb='(';
Rb=')';

outfile=$1"_"$rep

#Set up gentran
cat <<EOF >mtt_setreduce.r
% Set up the code generator
% Load the general translator package
LOAD GENTRAN;
GENTRANLANG!* := '$codegenerator;
ON GENTRANSEG;
MAXEXPPRINTLEN!* := 80;
TEMPVARNUM!* := 1;
TEMPVARNAME!* := 'mtt_t;

% Matrix output function
in"$MTTPATH/trans/lang_matrix.r";


%Read the reduce definitions file
in "$1_def.r";

%Read the reduce  $REP   file
in "$1_$rep.r";

EOF

#Inform user
echo Creating $outfile.m



# Remove the old log file
rm -f mtt_r2m.log

#Remove the temporary files

if [ "$rep" = "ode" ]; then
  #echo Creating $1_odea.$ext
  outfileo=$outfile"o"
  echo Creating $outfileo.m

  #rm -f $1_odea.$ext.1;

  #Header
  lang_header $1 $rep $ext 'mttx,mttu,t' mttdx > $1_ode.p
  lang_header $1 odeo $ext 'mttx,mttu,t' mtty  > $1_odeo.p

rm -f mtt_ode mtt_odeo
  # Use reduce to accomplish the transformation
$SYMBOLIC  > mtt_r2m.log <<EOF
  %Set up the code generator
  in"mtt_setreduce.r";
      
  % The body of the ode function
    GENTRANOUT "mtt_ode";
    mtt_matrix := MTTdX$
    mtt_matrix_n := MTTNx$
    mtt_matrix_m := 1$
    lang_matrix();
    GENTRANSHUT "mtt_ode";
    
 
      % The body of the odeo function
     GENTRANOUT "mtt_odeo";
     mtt_matrix := MTTy$
     mtt_matrix_n := MTTNy$
     mtt_matrix_m := 1$
     lang_matrix(); 
     GENTRANSHUT "mtt_odeo";

END;;


EOF

     
#  cat $1_odeo.$ext.1

##  # Algebraic bits
##  $MATRIX -q  <<EOF  >> $1_ode.$ext
##    %System structure
##    [nx,ny,nu,nz,nyz] = $1_def;
##  if nyz>0
##    printf("global mttxx mttt;\n");
##    printf("mttxx = mttx; mttt=t;\n");
##  
##    printf("$Lc====== Extract the internal input variables ======$Rc\n");
##    for i = 1:nyz
##      printf("  mttui$Lb%i$Rb = mttx$Lb%i$Rb;\n",i,i+nx);
##    end;
##    printf("\n");
##  
##    printf("[mttui,info] = fsolve('$1_odea',mttui);\n");
##    printf("if (info!=1)\n"); 
##    printf("  error('fsolve has not converged')\n");
##    printf("end\n");
##    printf("\n");
##  
##    printf("$Lc====== Set up the internal input variables ======$Rc\n");
##    for i = 1:nyz
##      printf("  mttui%i = mttui$Lb%i$Rb;\n",i,i);
##    end;
##    printf("\n");
##  
##    printf("$Lc====== Put internal input variables at end of state derivative ======$Rc\n");
##    for i = 1:nyz
##      printf(" mttdx$Lb%i$Rb = mttui%i;\n",i+nx,i);
##    end;
##    printf("\n");
##  end;
##  
##EOF
##  
  
  
##  # Create the odea.$ext function
##  lang_header $1 odea $ext 'mttui' mttyz 'global mttxx mttt; mttx = mttxx; t=mttt;' > $1_odea.$ext
##  
##  $MATRIX -q  <<EOF  >> $1_odea.$ext
##    %System structure
##    [nx,ny,nu,nz,nyz] = $1_def;
##  if nyz>0
##    printf("$Lc====== Set up the internal input variables ======$Rc\n");
##    for i = 1:nyz
##      printf("  mttui%i = mttui$Lb%i$Rb;\n",i,i);
##    end;
##    printf("\n");
##  end;
##EOF
##  
##  cat <<EOF >> $1_odea.$ext
##  
##  % The algebraic equations
##EOF
##  sed 's/mtt_matrix/mttyz/' $1_odea.$ext.1 >> $1_odea.$ext
  
  
  # Create the odeo function
  
##$MATRIX -q  <<EOF  >> $1_odeo.p
##    %System structure
##    [nx,ny,nu,nz,nyz] = $1_def;
##  if nyz>0
##    printf("$Lc====== Extract the internal input variables ======$Rc\n");
##    for i = 1:nyz
##      printf("  mttui$Lb%i$Rb = mttx$Lb%i$Rb;\n",i,i+nx);
##    end;
##    printf("\n");
##  
##    printf("$Lc====== Set up the internal input variables ======$Rc\n");
##    for i = 1:nyz
##      printf("  mttui%i = mttui$Lb%i$Rb;\n",i,i);
##    end;
##    printf("\n");
##  end;
##EOF

sed 's/mtt_matrix/mttdx/' <mtt_ode  >> $1_ode.p
sed 's/mtt_matrix/mtty/'  <mtt_odeo >> $1_odeo.p

rm -f mtt_odeo mtt_ode

# Convert from Pascal syntax to Octave syntax 
 mtt_p2m<$1_odeo.p > $1_odeo.m 

 rm -f    $1_odeo.p
fi
  
if [ "$rep" = "sm" ]||[ "$rep" = "dm" ]; then

if [ "$rep" = "sm" ]; then
   #Header
  lang_header $1 $rep $ext '' [mtta,mttb,mttc,mttd] > $outfile.p
  Symbols='a b c d'    
fi

if [ "$rep" = "dm" ]; then
   #Header
  lang_header $1 $rep $ext '' [mtta,mttb,mttc,mttd,mtte] > $outfile.p
  Symbols='a b c d e'    
fi

for Symbol in $Symbols; do
  rm -f $outfile.1


if [ "$rep" = "sm" ]; then
      case $Symbol in
    a)
	N=MTTNx; M=MTTNx
	;;
    b)
	N=MTTNx; M=MTTNu
	;;
    c)
	N=MTTNy; M=MTTNx
	;;
    d)
	N=MTTNy; M=MTTNu
	;;
    e)
	N=MTTNx; M=MTTNx
	;;
    *)
	
     esac
else
  NN=MTTNx+2*MTTNz+MTTNyz
  case $Symbol in
    a)
	N=$NN; M=$NN
	;;
    b)
	N=$NN; M=MTTNu
	;;
    c)
	N=MTTNy; M=$NN
	;;
    d)
	N=MTTNy; M=MTTNu
	;;
    e)
	N=$NN; M=$NN
	;;
    *)
  esac
    
fi

# Set up the matrices

    rm -f mtt_zero.m

 $SYMBOLIC  << EOF >mtt_r2m.log

    %Set up the code generator
    in"mtt_setreduce.r";
    
   OUT "mtt_zero.m";
     write  "mtt$Symbol = zeros(", $N, ",", $M , ");" ;
  SHUT  "mtt_zero.m";

    GENTRANOUT "$outfile.1";
    mtt_matrix := MTT$Symbol;
    mtt_matrix_n := $N;
    mtt_matrix_m := $M;
    lang_matrix();
    GENTRANSHUT "$outfile.1";
EOF


echo "%$Symbol matrix#" >> $outfile.p
cat mtt_zero.m >> $outfile.p

sed "s/mtt_matrix/mtt$Symbol/" < $outfile.1 |\
grep -v '=0\.0;'  >> $outfile.p

done


fi 

# Convert from Pascal syntax to Octave syntax
 mtt_p2m <$outfile.p > $outfile.m

rm -f $outfile.p  
rm -f mtt_zero.m
rm -f $outfile.1  
  






MTT: Model Transformation Tools
GitHub | SourceHut | Sourceforge | Fossil RSS ]