#! /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.9 1999/10/26 23:47:58 peterg
## Now does cse.m file
##
## Revision 1.8 1999/07/26 06:07:19 peterg
## Reinstated removal of the odeo.p file
##
## 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
## Find som constants
Nx=`grep "MTTNx " <$1_def.r | awk '{print $3}' | sed 's/;//'`
#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" ]||[ "$rep" = "cse" ]; 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_$2.p
lang_header $1 $2o $ext 'mttx,mttu,t' mtty > $1_$2o.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 odeo function
GENTRANOUT "mtt_odeo";
mtt_matrix := MTTy$
mtt_matrix_n := MTTNy$
mtt_matrix_m := 1$
lang_matrix();
GENTRANSHUT "mtt_odeo";
END;;
EOF
if [ "$rep" = "ode" ]; then
# 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";
END;;
EOF
else
## cse represnetation
echo doing cse
$SYMBOLIC > mtt_r2m.log <<EOF
%Set up the code generator
in"mtt_setreduce.r";
% The body of the cse function
GENTRANOUT "mtt_ode";
mtt_matrix := MTTEdX$
mtt_matrix_n := MTTNx$
mtt_matrix_m := 1$
lang_matrix();
GENTRANSHUT "mtt_ode";
GENTRANOUT "mtt_odee";
mtt_matrix := MTTE$
mtt_matrix_n := MTTNx$
mtt_matrix_m := MTTNx$
lang_matrix();
GENTRANSHUT "mtt_odee";
END;;
EOF
fi
if [ "$rep" = "cse" ]; then
touch mtt_odee
touch mtt_odee
fi
sed 's/mtt_matrix/mttdx/' <mtt_ode >> $1_$2.p
sed 's/mtt_matrix/mtte/' <mtt_odee >> $1_$2.p
sed 's/mtt_matrix/mtty/' <mtt_odeo >> $1_$2o.p
if [ "$rep" = "cse" ]; then
cat <<EOF >>$1_$2.p
## Solve E dx = dxe;;
mtt_solve(mttdx,mttE,mttdx,$Nx);;
EOF
fi
rm -f mtt_odeo mtt_ode mtt_odee
# Convert from Pascal syntax to Octave syntax
mtt_p2m<$1_$2o.p > $1_$2o.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