#! /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$
###############################################################
# Language
if [ -n "$2" ]; then
lang=$2
else
lang="r"
fi
# Inform user
echo Creating $1_smx.$lang
# Remove the old log file
rm -f ode2smx_r.log
# Use reduce to accomplish the transformation
reduce << EOF >ode2smx_lang.log
lang := $lang;
in "$1_def.r";
in "$1_ode.r";
OFF Echo;
%Procedure to write out the result according to the language used.
PROCEDURE WriteElement(name, i, j, element);
BEGIN
IF (element NEQ 0) THEN
BEGIN
IF (lang = r) THEN
write name, "(", i, ",", j, ") := ", element;
IF (lang = m) THEN
write name, "(", i, ",", j, ") = ", element;
END
END;
%Set up output according to the language.
OFF NAT;
OUT "$1_smx.$lang";
LineLength 1000;
% 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;
IF (lang = m) THEN
BEGIN
write "mtta = zeros(", mttnx, ",", mttnx, ");";
write "mttb = zeros(", mttnx, ",", mttnu, ");";
write "mttc = zeros(", mttny, ",", mttnx, ");";
write "mttd = zeros(", mttny, ",", mttnu, ");";
end;
% find MTTA : the A matrix
FOR j := 1:MTTNx DO
BEGIN
xj := MTTX(j,1);
FOR i := 1:MTTNx DO
WriteElement("mtta",i,j,df(MTTdx(i,1), xj, 1));
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.
SHUT "$1_smx.$lang";
EOF
if [ "$lang" = "m" ]; then
mv $1_smx.$lang mtt_junk
lang_header $1 smx m 'mttx,mttu' '[mtta,mttb,mttc,mttd]' > $1_smx.m
cat mtt_junk >> $1_smx.m
rm -f mtt_junk
fi
# Now invoke the standard error handling.
mtt_error_r ode2smx_lang.log