#! /bin/sh

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

# Bourne shell script: cse2smx_r
# Constrained-state equation to state matrices with x vector
# Used for implicit integration
# Copyright (C) 2000 by Peter J. Gawthrop
## Modified from eailier version


# Args
## Now default to matrix form
matrix='yes'
while [ -n "`echo $1 | grep '^-'`" ]; do
  case $1 in
    -noglobals)
	noglobals='-noglobals';
	;;
    -parameters)
	parameters='-parameters';
	;;
    -matrix)
	matrix='yes';
	;;
    *)
	echo $1 is an unknown option
        exit;;
  esac
  shift
done

# Language
if [ -n "$3" ]; then
    lang=$3
else
    lang="m"
fi

## Representation
if [ -z $2 ]; then
    rep=smx;
else
    rep=$2
fi

case $rep in
    smx)
	nrep=0;
        out='[mtta,mttax]';
        nmatrix=1;
	;;
    smxa)
        nrep=1;
	if [ -n "$matrix" ]; then
          blurb="in matrix form";
          nmatrix=1;
	else
          blurb="in vector form";
          nmatrix=0;
	fi
        out='mtta';
	;;
    smxax)
	nrep=2
        out='mttax';
        nmatrix=0;
	;;
    *) echo Representation $2 not recognised;
       exit;;
esac


# Inform user
echo Creating $1_$rep.$lang $blurb
#echo Creating $1_smxx.$lang
#echo Creating $1_smxtx.$lang

# Remove the old log file
rm -f cse2smx_r.log
rm -f $1_smx.$lang
rm -f $1_smxx.$lang
rm -f $1_smxtx.$lang
rm -f $1_$rep.body

# Use reduce to accomplish the transformation
$SYMBOLIC << EOF  >cse2smx_lang.log

lang := $lang;

in "$1_subs.r";
in "$1_def.r";
in "$1_cse.r";
in "$1_cr.r";

clear mttx; % Dont need this now - use mkid instead

OFF Echo;

% Load the general translator package
LOAD GENTRAN;
LOAD SCOPE;
GENTRANLANG!* := 'Pascal;
ON GENTRANSEG; % Segmentation
ON GENTRANOPT; % Code optimise using scope
OFF GENDECS;  % No declarations
MAXEXPPRINTLEN!* := 80;
TEMPVARNUM!* := 1;
TEMPVARNAME!* := 'mtt_s;

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


%Set up output according to the language.
 OFF NAT;
 GENTRANOUT "$1_$rep.body";

% Set up output according to the language.
    IF (lang = r) THEN 
    BEGIN
      write "matrix mtta(", mttnx, ",", mttnx, ");";    
      write "matrix mttb(", mttnx, ",", mttnu, ");";    
      write "matrix mttc(", mttny, ",", mttnx, ");";    
      write "matrix mttd(", mttny, ",", mttnu, ");";    
    END;

% find MTTA : the A matrix
  FOR i := 1:MTTNx DO
  BEGIN
    mttAAx_i := 0;
    FOR j := 1:MTTNx DO
    BEGIN
      ij := i + MTTNx*(j-1);
      xj := mkid(mttx,j);
      a_ij := df(MTTEdx(i,1), xj, 1);
      aa_ij := MTTE(i,j) - mttt*a_ij;
      IF (aa_ij NEQ 0) THEN
        IF ($nmatrix EQ 1) THEN
        BEGIN
          %% Write a  with full indexing
          INAME(mtt_o); % Set temp name
          GENTRAN mtta(i,j) ::=: aa_ij;
        END;
        IF (($nmatrix EQ 0) AND ($nrep EQ 1)) THEN
        BEGIN
          %% Write a  with vector indexing
          INAME(mtt_o); % Set temp name
          GENTRAN mtta(ij) ::=: aa_ij;
        END;
        mttAAx_i := mttAAx_i + aa_ij*xj;
      END;
      IF (mttAAx_i NEQ 0) THEN
        IF (($nrep EQ 0) OR ($nrep EQ 2)) THEN
        BEGIN
          INAME(mtt_o); % Set temp name
          GENTRAN mttax(i) ::=: mttAAx_i;
        END;
  END;

%Shut the  output according to the language.
 GENTRANSHUT "$1_$rep.body";
EOF

if [ "$lang" = "m" ]; then
  lang_header $noglobals $parameters $1 $rep m 'mttx,mttu,mttt,mttpar' $out > $1_$rep.m

  echo '#====== Start of code ======#' >> $1_$rep.m

  cat $1_$rep.body | mtt_p2m >> $1_$rep.m
fi
 
# Now invoke the standard error handling.
mtt_error_r cse2smx_lang.log




