#! /bin/sh

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

# Bourne shell script: ode2smx_lang
# ODE to state matrix (with explicit state values) conversion
# P.J.Gawthrop  6th September 1991, May 1994, July 1998
# Copyright (c) P.J.Gawthrop, 1991, 1994, 1998

###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
## Revision 1.7  1998/08/27 06:48:20  peterg
## Changed mttxx to mttx - in implicit integration smx is called once
## with x in the linearisation the same as x in the current state
##
## Revision 1.6  1998/08/26 18:25:45  peterg
## SMX now generates both A and Ax
##
## Revision 1.5  1998/08/15 13:51:56  peterg
## smx is now I-Adt NOT A
##
## Revision 1.4  1998/08/13 09:03:35  peterg
## *** empty log message ***
##
## Revision 1.3  1998/07/30 10:49:55  peterg
## Removed zeroing.
##
## Revision 1.2  1998/07/30 10:49:02  peterg
## Put [] round output of zeros.
##
## Revision 1.1  1998/07/19 16:59:56  peterg
## Initial revision
##
###############################################################

# Language
if [ -n "$2" ]; then
    lang=$2
else
    lang="r"
fi


# Inform user
echo Creating $1_smx.$lang
#echo Creating $1_smxx.$lang
#echo Creating $1_smxtx.$lang

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

rm -f $1_smx.$lang
rm -f $1_smxx.$lang
rm -f $1_smxtx.$lang

# Use reduce to accomplish the transformation
reduce << EOF  >ode2smx_lang.log

lang := $lang;

in "$1_def.r";
in "$1_ode.r";

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

OFF Echo;

% Load the general translator package
LOAD GENTRAN;
GENTRANLANG!* := 'Pascal;
ON GENTRANSEG;
MAXEXPPRINTLEN!* := 80;
TEMPVARNUM!* := 1;
TEMPVARNAME!* := 'mtt_t;

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


%Set up output according to the language.
 OFF NAT;
 GENTRANOUT "$1_smx.$lang";

% 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;
%%    xi := mkid(mttx,i);
    FOR j := 1:MTTNx DO
    BEGIN
      xj := mkid(mttx,j);
      a_ij := df(MTTdx(i,1), xj, 1);
%%      a_ji := df(MTTdx(j,1), xi, 1);
      IF i=j THEN
      BEGIN
        aa_ij := 1 - mttdt*a_ij;
%%        aa_ji := aa_ij;
      END
      ELSE
      BEGIN
        aa_ij := -mttdt*a_ij;
%%        aa_ji := -mttdt*a_ji;
      END;
      IF (aa_ij NEQ 0) THEN
        GENTRAN mtta(i,j) ::=: aa_ij;
      mttAAx_i := mttAAx_i + aa_ij*mkid(mttx,j);
      %%%mttAAtx(i,1) := mttAAtx(i,1) + aa_ji*mkid(mttx,j);
    END;
    IF (mttAAx_i NEQ 0) THEN
      GENTRAN mttax(i) ::=: mttAAx_i;
  END;



%% Find MTTB : the B matrix
%  FOR j := 1:MTTNu DO
%    BEGIN
%    uj := MTTU(j,1);
%    FOR i := 1:MTTNx DO
%      WriteElement("mttb",i,j,df(MTTdx(i,1), uj, 1));
%    END;
%
%% Find MTTC : the C matrix
%  FOR i := 1:MTTNy DO
%    FOR j := 1:MTTNx DO
%    BEGIN
%      xj := MTTX(j,1);
%      WriteElement("mttc",i,j,df(MTTY(i,1), xj, 1));
%    END;
%
%% Find MTTD : the D matrix
%  FOR i := 1:MTTNy DO
%    FOR j := 1:MTTNu DO
%    BEGIN
%      xj := MTTU(j,1);
%      WriteElement("mttd",i,j,df(MTTY(i,1), xj, 1));
%    END;

%Shut the  output according to the language.
 GENTRANSHUT "$1_smx.$lang";


%% The AAx matrix;
%GENTRANOUT "$1_smxx.$lang";
%FOR i := 1:MTTNx DO
%BEGIN
%  ax_i := mttAAx(i,1);
%  IF (ax_i NEQ 0) THEN
%    GENTRAN mttax(i) ::=: ax_i;
%END
%GENTRANSHUT "$1_smxx.$lang";
%
%% The AAtx matrix;
%GENTRANOUT "$1_smxtx.$lang";
%FOR i := 1:MTTNx DO
%BEGIN
%  atx_i := mttAAtx(i,1);
%  IF (atx_i NEQ 0) THEN
%    GENTRAN mttax(i) ::=: atx_i;
%END
%GENTRANSHUT "$1_smxtx.$lang";

EOF

if [ "$lang" = "m" ]; then
  mv $1_smx.$lang  mtt_junk
  lang_header $1 smx m 'mttx,mttu,mttdt' '[mtta,mttax]' > $1_smx.m
  cat mtt_junk | mtt_p2m >> $1_smx.m
  rm -f mtt_junk

#  mv $1_smxx.$lang  mtt_junk
#  lang_header $1 smxx m 'mttx,mttu,mttxx,mttdt' '[mttax]' > $1_smxx.m
#  cat mtt_junk | mtt_p2m >> $1_smxx.m
#  rm -f mtt_junk
#
#  mv $1_smxtx.$lang  mtt_junk
#  lang_header $1 smxtx m 'mttx,mttu,mttxx,mttdt' '[mttax]' > $1_smxtx.m
#  cat mtt_junk | mtt_p2m >> $1_smxtx.m
#  rm -f mtt_junk
#
#
fi

# Now invoke the standard error handling.
mtt_error_r ode2smx_lang.log




