#! /bin/sh

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

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

###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
## Revision 1.3  1998/07/19 16:22:29  peterg
## Changed header to inculde mttu
##
## Revision 1.2  1998/06/21 10:40:58  peterg
## Added fsolve error message.
##
## Revision 1.1  1998/05/23 16:17:14  peterg
## Initial revision
##
###############################################################

# Set up the language specific stuff
language=$2

case $language in
    m)
	ext='m';
	codegenerator='PASCAL'
	Lc='#';
	Rc='#';
	Lb='(';
	Rb=')';
	;;
    c)
	ext='c';
	codegenerator='C'
	Lc='/*';
	Rc='*/';
	Lb='[';
	Rb=']';
	;;
    java)
	ext='java';
	codegenerator='C'
	Lc='/*';
	Rc='*/';
	Lb='[';
	Rb=']';
	;;
       *)
       echo Language $2 not supported - sorry; exit 1
esac

#Inform user
echo Creating $1_ode.$ext
echo Creating $1_odea.$ext
echo Creating $1_odeo.$ext


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

#Remove the temporary files
rm -f $1_ode.$ext.1
rm -f $1_odea.$ext.1
rm -f $1_odeo.$ext.1

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

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

%Read the reduce  ODE   file
in "$1_ode.r";


% Set up the code generator
% Load the general translator package
LOAD GENTRAN;
GENTRANLANG!* := '$codegenerator;
ON GENTRANSEG;
MAXEXPPRINTLEN!* := 80;
TEMPVARNUM!* := 1;
TEMPVARNAME!* := 'mtt_temp;

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

%Set up the number of argument variables to zero in case the user has forgotten
MTTNVar := 0;

%Read the parameter file
in "$1_sympar.r";

% The body of the ode function
  GENTRANOUT "$1_ode.$ext.1";
  mtt_matrix := MTTdX$
  mtt_matrix_n := MTTNx$
  mtt_matrix_m := 1$
  mtt_matrix_name := 'MTTdX$
  lang_matrix()$ 
  GENTRANSHUT "$1_ode.$ext.1";
  
% The algebraic equations (if any)
  GENTRANOUT "$1_odea.$ext.1";
  mtt_matrix := MTTYz$
  mtt_matrix_n := MTTNYz$
  mtt_matrix_m := 1$
  mtt_matrix_name := MTTYz$
  lang_matrix()$ 
  GENTRANSHUT "$1_odea.$ext.1";


% Now do the y = g(x,t) function.
% The body of the odeo function
  GENTRANOUT "$1_odeo.$ext.1";
  mtt_matrix := MTTy$
  mtt_matrix_n := MTTNy$
  mtt_matrix_m := 1$
  mtt_matrix_name := MTTy$
  lang_matrix()$ 
  GENTRANSHUT "$1_odeo.$ext.1";

EOF

# Create the ode.$ext function
lang_header $1 ode $ext 'mttx,mttu,t' mttdx > $1_ode.$ext

# 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

cat <<EOF >> $1_ode.$ext

$Lc The differential equations $Rc
EOF

sed 's/mtt_matrix/mttdx/' $1_ode.$ext.1 >> $1_ode.$ext

# Java terminating }
if [ "$language" = "java" ]; then
cat <<EOF     >> $1_ode.$ext
}
EOF
fi


# 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.$ext function
lang_header $1 odeo $ext 'mttx,mttu,t' mtty > $1_odeo.$ext

$MATRIX -q  <<EOF  >> $1_odeo.$ext
  %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


cat <<EOF >> $1_odeo.$ext

% The output equations
EOF
sed 's/mtt_matrix/mtty/' $1_odeo.$ext.1 >> $1_odeo.$ext

# Convert from Pascal syntax to Octave syntax
mv $1_ode.m mtt_junk; mtt_p2m<mtt_junk > $1_ode.m
mv $1_odeo.m mtt_junk; mtt_p2m<mtt_junk > $1_odeo.m
mv $1_odea.m mtt_junk; mtt_p2m<mtt_junk > $1_odea.m




