Index: mttroot/mtt/bin/mtt
==================================================================
--- mttroot/mtt/bin/mtt
+++ mttroot/mtt/bin/mtt
@@ -15,10 +15,13 @@
###############################################################
## Version control history
###############################################################
## $Header$
## $Log$
+## Revision 1.314 2001/07/13 04:19:03 gawthrop
+## Now loads _subs.r with _cr.r file when using -cr option
+##
## Revision 1.313 2001/06/13 14:53:59 gawthrop
## MTT now gas the double-colon option in the abg.fig file
## eg R:r:a^2+3*b
##
## Revision 1.312 2001/06/11 19:43:49 gawthrop
@@ -34,10 +37,21 @@
##
## Revision 1.310 2001/05/08 08:30:12 gawthrop
## Added line to reverse the x^y --> pow(x,y) in default _simp file to
## prettyfy LaTeX
##
+## Revision 1.309.2.3 2001/07/13 04:02:31 geraint
+## Implemented numerical algebraic solution for _ode2odes.oct.
+##
+## Revision 1.309.2.2 2001/06/05 03:20:39 geraint
+## added -ae option to select algebraic equation solution method.
+##
+## Revision 1.309.2.1 2001/05/04 04:07:24 geraint
+## Numerical solution of algebraic equations.
+## sys_ae.cc written for unsolved inputs.
+## Solution of equations using hybrd from MINPACK (as used by Octave fsolve).
+##
## Revision 1.309 2001/04/28 03:15:03 geraint
## Fixed comment (interfered with "mtt help representations").
##
## Revision 1.308 2001/04/25 22:17:45 geraint
## Fixed icd.txt2 dependency.
@@ -1108,10 +1122,13 @@
verbose=' -s'
# Default integration method
integration_method=implicit;
+# Default algebraic equation solver
+algebraic_solver=Reduce_Solver;
+
# Default no info
info_switch=''
# Default use m, not oct files
m='m';
@@ -1176,10 +1193,33 @@
;;
*)
echo $1 is an unknown integration method - use euler, rk4 or implicit;
exit;;
esac;;
+ -ae )
+ mtt_switches="$mtt_switches $1";
+ case $2 in
+ fsolve | hybrd)
+ mtt_switches="$mtt_switches $2";
+ algebraic_solver=Hybrd_Solver;
+ shift;
+ ;;
+ hooke)
+ mtt_switches="$mtt_switches $2";
+ algebraic_solver=HJ_Solver;
+ shift;
+ ;;
+ reduce)
+ mtt_switches="$mtt_switches $2";
+ algebraic_solver=Reduce_Solver;
+ Solve='-A';
+ shift;
+ ;;
+ *)
+ echo $1 is an unknown solver - use hybrd, hooke or reduce;
+ exit;;
+ esac;;
-s )
sensitivity_switch='-s';
mtt_switches="$mtt_switches $1";
sensitivity=sensitivity ;;
-ss )
@@ -1314,10 +1354,11 @@
echo ' -cr Use cr before resolving equations'
echo ' -d
use directory '
echo ' -dc Maximise derivative (not integral) causality'
echo ' -dc Maximise derivative (not integral) causality'
echo ' -i Use implicit, euler or rk4 integration'
+ echo ' -ae Solve algebraic equations with Reduce, hybrd (fsolve) or "Hooke and Jeeves"'
echo ' -o ode is same as dae'
echo ' -oct use oct files in place of m files where appropriate'
echo ' -opt optimise code generation'
echo ' -p print environment variables'
echo ' -partition partition hierachical system'
@@ -1456,10 +1497,11 @@
rm -f *_logic.m *_logic.cc *_logic.oct
rm -f *_state.m *_state.cc *_state.oct
rm -f *_ode2odes.* *.dat2 MTT.core
rm -f *_modpar.txt *_modpar.r
rm -f *_ICD.txt *_ICD.c *_ICD.cc *_ICD.m
+ rm -f *_ae.r *_ae.m *_ae.cc *_ae.oct
rm -fR *_rep MTT_work
exit
fi
# Clean up named system
@@ -1492,10 +1534,11 @@
rm -f $1_logic.m $1_logic.cc $1_logic.oct
rm -f $1_state.m $1_state.cc $1_state.oct
rm -f $1_ode2odes.* $1.dat2
rm -f $1_modpar.txt $1_modpar.r
rm -f $1_ICD.txt $1_ICD.c $1_ICD.cc $1_ICD.m
+ rm -f $1_ae.r $1_ae.m $1_ae.cc $1_ae.oct
rm -fR $1_rep MTT_work
exit
fi
if [ "$2" = "rep" ]; then
@@ -1949,10 +1992,13 @@
mtt_m2cc.sh $1 \$* cat
mtt_%.cc: ${MTT_LIB}/cc/mtt_%.cc
cp ${MTT_LIB}/cc/mtt_\$*.cc mtt_\$*.cc
+mtt_%.hh: ${MTT_LIB}/cc/mtt_%.hh
+ cp ${MTT_LIB}/cc/mtt_\$*.hh mtt_\$*.hh
+
## .o files
.PRECIOUS: $1_%.o
$1_%.o: $1_%.cc $1_def.h $1_sympar.h $1_cr.h
echo Compiling $1_\$*.cc
${MTT_CXX} ${MTT_CXXFLAGS} ${MTT_CXXINCS} -c $< -DSTANDALONE
@@ -2222,18 +2268,18 @@
endif
# Dummy target
FORCE:
-$1_ode2odes_common.m : $1_input.m $1_logic.m $1_numpar.m $1_simpar.m $1_state.m
+$1_ode2odes_common.m : $1_ae.m $1_input.m $1_logic.m $1_numpar.m $1_simpar.m $1_state.m
@echo > /dev/null
-$1_ode2odes_common.cc : $1_input.cc $1_logic.cc $1_numpar.cc $1_simpar.cc $1_state.cc
+$1_ode2odes_common.cc : $1_ae.cc $1_input.cc $1_logic.cc $1_numpar.cc $1_simpar.cc $1_state.cc
@echo > /dev/null
-$1_ode2odes_common.o : $1_input.o $1_logic.o $1_numpar.o $1_simpar.o $1_state.o
+$1_ode2odes_common.o : $1_ae.o $1_input.o $1_logic.o $1_numpar.o $1_simpar.o $1_state.o
@echo "Creating $1_ode2odes_common.o"
ar -cr \$@ \$^
-$1_ode2odes_common.oct : $1_input.oct $1_logic.oct $1_numpar.oct $1_simpar.oct $1_state.oct
+$1_ode2odes_common.oct : $1_ae.oct $1_input.oct $1_logic.oct $1_numpar.oct $1_simpar.oct $1_state.oct
@echo > /dev/null
$1_ode2odes_euler.m $1_ode2odes_rk4.m : $1_ode.m $1_odeo.m
@echo > /dev/null
$1_ode2odes_euler.cc $1_ode2odes_rk4.cc : $1_ode.cc $1_odeo.cc
@@ -2252,10 +2298,15 @@
@echo "Creating $1_ode2odes_implicit.o"
ar -cr \$@ \$^
$1_ode2odes_implicit.oct: $1_cseo.oct $1_csex.oct $1_smxa.oct $1_smxax.oct mtt_implicit.oct
@echo > /dev/null
+mtt_Solver.cc: mtt_Solver.hh
+$1_ode2odes_${algebraic_solver}.cc: mtt_Solver.cc mtt_${algebraic_solver}.hh mtt_${algebraic_solver}.cc
+$1_ode2odes_${algebraic_solver}.o: mtt_Solver.o mtt_${algebraic_solver}.o
+ @echo "Creating $1_ode2odes_${algebraic_solver}.o"
+ ar -cr \$@ \$^
#SUMMARY numpar numerical parameter declaration (m)
$1_numpar.m: $1_numpar.txt $1_sympars.txt
mtt_txt2m $1 numpar
@@ -2435,10 +2486,19 @@
dae_r2m $1; matlab_tidy $1_dae.m; matlab_tidy $1_daeo.m
$1_dae.c: $1_def.r $1_dae.r $1_sympar.r
dae_r2c $1; c_tidy $1_dae.c
$1_dae.tex: $1_dae.r $1_simp.r
dae_r2tex $partition $1; latex_tidy $1_dae.tex
+
+#SUMMARY ae algebraic equations - unknown inputs (r)
+#SUMMARY ae algebraic equations - unknown inputs (m)
+#SUMMARY ae algebraic equations - unknown inputs (cc)
+
+$1_ae.r: $1_cse.r
+ touch $1_ae.r
+$1_ae.m: $1_ae.r
+ mtt_r2m $1 ae
#SUMMARY cse constrained-state equations (r)
#SUMMARY cse* constrained-state equations (m)
#SUMMARY cse* constrained-state equations (oct)
#SUMMARY cse constrained-state equations (tex)
@@ -2550,11 +2610,11 @@
$1_csex.m $1_cseo.m $1_logic.m
ifeq ($using_oct,yes)
touch $1_ode2odes.m # Create a dummy which wont' be used
mtt $mtt_switches -q -u $1 ode2odes oct
else
- make_ode2odes $1 m $integration_method
+ make_ode2odes $1 m $integration_method $algebraic_solver
endif
endif
ifneq ($integration_method,implicit)
$1_ode2odes.m : $1_def.r $1_sympars.txt\
$1_simpar.m $1_numpar.m $1_state.m $1_input.m \
@@ -2562,40 +2622,40 @@
ifeq ($using_oct,yes)
echo "*** Warning: Shouldn't be here! Creating dummy $1_ode2odes.m"
touch $1_ode2odes.m # Create a dummy which wont' be used
mtt $mtt_switches -q -u $1 ode2odes oct
else
- make_ode2odes $1 m $integration_method
+ make_ode2odes $1 m $integration_method $algebraic_solver
endif
endif
#SUMMARY ode2odes Simulation function (m)
#SUMMARY ode2odes Simulation function (cc)
#SUMMARY ode2odes Simulation function (oct)
#SUMMARY ode2odes Simulation function (exe)
$1_ode2odes.exe: $1_def.h $1_sympar.h\
- $1_ode2odes.o $1_ode2odes_common.o $1_ode2odes_${integration_method}.o
+ $1_ode2odes.o $1_ode2odes_common.o $1_ode2odes_${integration_method}.o $1_ode2odes_${algebraic_solver}.o
echo Creating $1_ode2odes.exe
${MTT_CXX} ${MTT_CXXFLAGS} -o $1_ode2odes.exe\
- $1_ode2odes.o $1_ode2odes_common.o $1_ode2odes_${integration_method}.o\
+ $1_ode2odes.o $1_ode2odes_common.o $1_ode2odes_${integration_method}.o $1_ode2odes_${algebraic_solver}.o\
${MTT_LDFLAGS} ${MTT_CXXLIBS}
-$1_ode2odes.o: $1_ode2odes.cc $1_ode2odes_common.o $1_ode2odes_${integration_method}.o
+$1_ode2odes.o: $1_ode2odes.cc $1_ode2odes_common.o $1_ode2odes_${integration_method}.o $1_ode2odes_${algebraic_solver}.o
echo Creating $1_ode2odes.o
${MTT_CXX} ${MTT_CXXFLAGS} ${MTT_CXXINCS} -c $1_ode2odes.cc -DSTANDALONE
-$1_ode2odes.oct: $1_ode2odes.cc $1_ode2odes_common.oct $1_ode2odes_${integration_method}.oct
+$1_ode2odes.oct: $1_ode2odes.cc $1_ode2odes_common.oct $1_ode2odes_${integration_method}.oct $1_ode2odes_${algebraic_solver}.o
touch $1_ode2odes.m
echo Creating $1_ode2odes.oct
- $MKOCTFILE $1_ode2odes.cc
+ $MKOCTFILE $1_ode2odes.cc mtt_${algebraic_solver}.cc mtt_Solver.cc
$1_ode2odes.cc: $1_def.r $1_sympars.txt\
$1_ode2odes_common.m $1_ode2odes_common.cc\
- $1_ode2odes_${integration_method}.m $1_ode2odes_${integration_method}.cc
+ $1_ode2odes_${integration_method}.m $1_ode2odes_${integration_method}.cc mtt_Solver.cc mtt_${algebraic_solver}.cc mtt_${algebraic_solver}.hh
touch $1_ode2odes.m
- make_ode2odes $1 cc $integration_method
+ make_ode2odes $1 cc $integration_method $algebraic_solver
#Conversion of m to p to c
#SUMMARY ode ordinary differential equations (c)
#SUMMARY ode ordinary differential equations (p)
#SUMMARY state state declaration (c)
ADDED mttroot/mtt/bin/mtt_xargs.sh
Index: mttroot/mtt/bin/mtt_xargs.sh
==================================================================
--- /dev/null
+++ mttroot/mtt/bin/mtt_xargs.sh
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+cmd=$1
+for arg in $2; do
+ eval $cmd $arg
+done
+
Index: mttroot/mtt/bin/trans/cbg2ese_m2r
==================================================================
--- mttroot/mtt/bin/trans/cbg2ese_m2r
+++ mttroot/mtt/bin/trans/cbg2ese_m2r
@@ -14,10 +14,17 @@
## Version control history
###############################################################
## $Id$
##
## $Log$
+## Revision 1.30 2001/07/12 04:02:53 gawthrop
+## Now fixes multiports for input and output as well as state
+##
+## Revision 1.29.2.1 2001/06/26 22:29:05 geraint
+## mtt_xargs.sh eliminates Arg list too long error for large models.
+## (UNIX xargs does not work if the environment is too large).
+##
## Revision 1.29 2001/03/29 19:24:14 gawthrop
## Can now use c representations of crs when using -c option
##
## Revision 1.28 2001/02/05 17:19:52 gawthrop
## Now gives unique names to the states of multiports. Second name
@@ -186,16 +193,16 @@
if [ -z "$partition" ]; then
## Don't partition
# Create the composite ese file
- cat $1_ese.r $1_*_ese.r $1_modpar.r > $1_ese.tmp 2>> /dev/null
+ mtt_xargs.sh cat "$1_ese.r $1_*_ese.r $1_modpar.r" > $1_ese.tmp 2>> /dev/null
mv $1_ese.tmp $1_ese.r
# Zap the sub ese files
- rm -f $1_*_ese.r
+ mtt_xargs.sh "rm -f" "$1_*_ese.r"
echo "END;" >> $1_ese.r
else # Partition the system
@@ -304,11 +311,11 @@
endfor;
EOF
## Subsystems (Only works when no repetitions at this level)
esefile=${subsystem}_ese.r
echo Creating $esefile
- cat ${subsystem}_1_ese.r ${subsystem}_1_*_ese.r > $esefile 2> /dev/null
+ mtt_xargs.sh cat "${subsystem}_1_ese.r ${subsystem}_1_*_ese.r" > $esefile 2> /dev/null
echo "END;" >> $esefile
## Def file for subsystem
makedef ${subsystem}
Index: mttroot/mtt/bin/trans/cse2ode_r
==================================================================
--- mttroot/mtt/bin/trans/cse2ode_r
+++ mttroot/mtt/bin/trans/cse2ode_r
@@ -12,10 +12,18 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.1.4.1 2001/05/04 04:07:24 geraint
+## Numerical solution of algebraic equations.
+## sys_ae.cc written for unsolved inputs.
+## Solution of equations using hybrd from MINPACK (as used by Octave fsolve).
+##
+## Revision 1.1 2000/12/28 12:21:31 peterg
+## Put under RCS
+##
## Revision 1.2 1997/01/06 21:17:10 peterg
## Removed: OFF Exp; OFF GCD;
##
## Revision 1.1 1996/08/25 10:05:45 peter
## Initial revision
@@ -45,10 +53,13 @@
%Read the substitution file
in "$1_subs.r";
%Read the constrained-state equations file
in "$1_cse.r";
+
+%Read the algebraic equations file
+in "$1_ae.r";
IF MTTNx>0 THEN
IF MTTNz>0 THEN
MTTdXX := MTTE^(-1)*MTTEdX
ELSE
Index: mttroot/mtt/bin/trans/dae2cse_r
==================================================================
--- mttroot/mtt/bin/trans/dae2cse_r
+++ mttroot/mtt/bin/trans/dae2cse_r
@@ -13,10 +13,27 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.15.2.4 2001/06/26 00:55:48 geraint
+## Writes algebraic equation Jacobian _aej.r (not used yet).
+##
+## Revision 1.15.2.3 2001/05/09 00:19:22 geraint
+## Fixed EOF error when MTTNYZ=0.
+##
+## Revision 1.15.2.2 2001/05/05 20:50:16 geraint
+## Fixed errors when MTTNx=0.
+##
+## Revision 1.15.2.1 2001/05/04 04:07:24 geraint
+## Numerical solution of algebraic equations.
+## sys_ae.cc written for unsolved inputs.
+## Solution of equations using hybrd from MINPACK (as used by Octave fsolve).
+##
+## Revision 1.15 2001/03/19 02:28:52 geraint
+## Branch merge: merging-ode2odes-exe back to MAIN.
+##
## Revision 1.14.2.1 2001/03/19 00:29:08 geraint
## Parse switches (-A) before calling def2write_r.
## Update $1_def.* instead of removing.
##
## Revision 1.14 2000/12/28 12:24:35 peterg
@@ -281,27 +298,59 @@
set(lhs(MTT_sol_i),rhs(MTT_sol_i));
END;
% No algebraic variables left!
MTTNYz := 0;
-END; % IF MTTNyz>0
+END; % IF MTTNyz>0 and $solve
+
+OUT "$1_ae.r";
+IF (MTTNyz>0) THEN % not $solve (or perhaps solution failed?)
+BEGIN
+ WRITE "MATRIX MTTyz(",MTTNyz,",1)";
+ WRITE "%File: $1_ae.r";
+ FOR i := 1:MTTNyz DO
+ WRITE "MTTyz(",i,",1) := ",MTTyz(i,1);
+END; % if MTTNyz>0 (and !$solve)
+WRITE ";END;";
+SHUT "$1_ae.r";
+OUT "$1_aej.r";
+IF (MTTNyz>0) THEN % as above
+BEGIN
+ WRITE "MATRIX MTTyzj(",MTTNyz,",",MTTNyz,")";
+ WRITE "%File: $1_aej.r";
+ FOR i := 1:MTTNyz DO
+ FOR j := 1:MTTNyz DO
+ BEGIN
+ didj := df(MTTyz(i,1),mkid('mttui,j));
+ IF (didj NEQ 0) THEN
+ WRITE "MTTyzj(",i,",",j,") := ",didj;
+ END;
+END;
+WRITE ";END;";
+SHUT "$1_aej.r";
% Create the matrix declarations
OUT "$1_cse.r1";
-write "MATRIX MTTEdx(", MTTNx, ",", 1, ")$";
-write "MATRIX MTTE(", MTTNx, ",", MTTNx, ")$";
+write "%";
+IF (MTTNx > 0) THEN
+BEGIN
+ write "MATRIX MTTEdx(", MTTNx, ",", 1, ")$";
+ write "MATRIX MTTE(", MTTNx, ",", MTTNx, ")$";
+END;
SHUT "$1_cse.r1";
OUT "$1_csex.r1";
-write "MATRIX MTTEdx(", MTTNx, ",", 1, ")$";
+write "%File:$1_csex.r1";
+IF (MTTNx > 0) THEN
+ write "MATRIX MTTEdx(", MTTNx, ",", 1, ")$";
SHUT "$1_csex.r1";
IF MTTNy>0 THEN
BEGIN
OUT "$1_cseo.r1";
- write "MATRIX MTTY(", MTTNy, ",", MTTNx, ")$";
+ write "MATRIX MTTY(", MTTNy, ",", 1, ")$";
SHUT "$1_cseo.r1";
END;
%%Create the _cse.r file
OUT "$1_cse.r2";
Index: mttroot/mtt/bin/trans/dat2sdat
==================================================================
--- mttroot/mtt/bin/trans/dat2sdat
+++ mttroot/mtt/bin/trans/dat2sdat
@@ -13,10 +13,16 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.1.4.1 2001/06/26 00:57:21 geraint
+## Prints more useful name.
+##
+## Revision 1.1 2000/12/28 12:26:34 peterg
+## Put under RCS
+##
## Revision 1.1 1999/03/28 21:29:40 peterg
## Initial revision
##
###############################################################
@@ -30,11 +36,11 @@
BEGIN{
printf("Time");
}
{
if ($1==which)
- printf(" %s(%s)", $3, $5);
+ printf(" %s(%s)", $4, $5);
}
END{
printf("\n");
}
' SYSTEM=$1 which=$which < $1_struc.txt
Index: mttroot/mtt/bin/trans/def2write_r
==================================================================
--- mttroot/mtt/bin/trans/def2write_r
+++ mttroot/mtt/bin/trans/def2write_r
@@ -11,10 +11,20 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.7.2.1 2001/05/04 04:07:24 geraint
+## Numerical solution of algebraic equations.
+## sys_ae.cc written for unsolved inputs.
+## Solution of equations using hybrd from MINPACK (as used by Octave fsolve).
+##
+## Revision 1.7 2001/04/11 09:44:26 gawthrop
+## Fixed cc and c problems to do with pow(x,y) and integers
+## mtt/lib/reduce/fix_c.r is included in rdae2dae and cse2smx_lang for
+## -c, -cc and -oct options
+##
## Revision 1.6 2000/11/29 20:48:53 peterg
## Zapped unnecessary Npar creation
##
## Revision 1.5 2000/11/09 10:12:24 peterg
## Removed debugging line
@@ -78,12 +88,12 @@
matrices='dX'
ns="$Nx"
ms="1"
;;
odeo)
- matrices='Y Yz'
- ns="$Ny $Nyz"
+ matrices='Y'
+ ns="$Ny"
ms="1 1"
;;
sm)
matrices='A B C D'
ns="$Nx $Nx $Ny $Ny"
Index: mttroot/mtt/bin/trans/make_ode2odes
==================================================================
--- mttroot/mtt/bin/trans/make_ode2odes
+++ mttroot/mtt/bin/trans/make_ode2odes
@@ -7,10 +7,31 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.58 2001/07/13 00:51:39 geraint
+## Fixed generation of odes.sg from .m and .oct simulations.
+## .cc, .m and .oct simulations now all write mtt_data (lower case).
+##
+## Revision 1.57.2.5 2001/07/13 04:02:31 geraint
+## Implemented numerical algebraic solution for _ode2odes.oct.
+##
+## Revision 1.57.2.4 2001/07/02 00:34:56 geraint
+## gcc-3.0 compatibility.
+##
+## Revision 1.57.2.3 2001/06/25 23:28:29 geraint
+## Generic mtt_rate and mtt_output - allows method independent calls.
+##
+## Revision 1.57.2.2 2001/06/05 03:20:40 geraint
+## added -ae option to select algebraic equation solution method.
+##
+## Revision 1.57.2.1 2001/05/04 04:07:24 geraint
+## Numerical solution of algebraic equations.
+## sys_ae.cc written for unsolved inputs.
+## Solution of equations using hybrd from MINPACK (as used by Octave fsolve).
+##
## Revision 1.57 2001/04/01 03:38:54 geraint
## Reset row to zero after write to file, ready for subsequent runs.
## Eliminates SIGSEGV in Octave when _ode2odes called multiple times.
##
## Revision 1.56 2001/03/30 15:13:58 gawthrop
@@ -223,10 +244,16 @@
if [ -n "$3" ]; then
method=$3
else
method=implicit
fi
+
+if [ -n "$4" ]; then
+ algebraic_solver=$4
+else
+ algebraic_solver="Reduce_Solver"
+fi
echo Creating $filename with $method integration method
# Find system constants
Nx=`mtt_getsize $sys x` # States
@@ -346,25 +373,33 @@
;;
esac
cat < $filename
#include
-#include
#include
#include
+#include
#include
#ifndef STANDALONE
#include
#endif
#include "${sys}_def.h"
#include "${sys}_sympar.h"
+#include "mtt_${algebraic_solver}.hh"
+
#ifdef STANDALONE
#include
#include
+
+extern ColumnVector F${sys}_ae (
+ ColumnVector &x,
+ ColumnVector &u,
+ const double &t,
+ ColumnVector &par);
extern ColumnVector F${sys}_input (
ColumnVector &x,
ColumnVector &y,
const double &t,
@@ -432,30 +467,62 @@
ColumnVector &par);
EOF
fi
cat <> $filename
+
+void set_signal_handlers (void);
+
#endif // STANDALONE
+ColumnVector
+mtt_ae (ColumnVector &x,
+ ColumnVector &u,
+ const double &t,
+ ColumnVector &par)
+{
+#ifdef STANDALONE
+ return F${sys}_ae(x,u,t,par);
+#else
+ static octave_value_list args, f;
+ args (0) = octave_value (x);
+ args (1) = octave_value (u);
+ args (2) = octave_value (t);
+ args (3) = octave_value (par);
+ f = feval ("${sys}_ae", args, 1);
+ return f(0).${vector_value} ();
+#endif
+}
inline ColumnVector
mtt_input (ColumnVector &x,
ColumnVector &y,
const double &t,
ColumnVector &par)
{
+ static ${algebraic_solver} ae(mtt_ae,MTTNPAR,MTTNU,MTTNX,MTTNY,MTTNYZ);
+ static ColumnVector u (MTTNU);
+
#ifdef STANDALONE
- return F${sys}_input (x, y, t, par);
+ u = F${sys}_input (x, y, t, par);
#else
static octave_value_list args, f;
args (0) = octave_value (x);
args (1) = octave_value (y);
args (2) = octave_value (t);
args (3) = octave_value (par);
f = feval ("${sys}_input", args, 1);
- return f(0).${vector_value} ();
+ u = f(0).${vector_value} ();
#endif
+ if (MTTNYZ == 0)
+ {
+ return u;
+ }
+ else
+ {
+ return ae.solve(x,u,t,par);
+ }
}
inline ColumnVector
mtt_logic (ColumnVector &x,
ColumnVector &u,
@@ -519,14 +586,14 @@
return f(0).${vector_value} ();
#endif
}
inline ColumnVector
-mtt_${ode} (ColumnVector &x,
- ColumnVector &u,
- const double &t,
- ColumnVector &par)
+mtt_rate (ColumnVector &x,
+ ColumnVector &u,
+ const double &t,
+ ColumnVector &par)
{
#ifdef STANDALONE
return F${sys}_${ode} (x, u, t, par);
#else
static octave_value_list args, f;
@@ -538,11 +605,11 @@
return f(0).${vector_value} ();
#endif
}
inline ColumnVector
-mtt_${odeo} (ColumnVector &x,
+mtt_output (ColumnVector &x,
ColumnVector &u,
const double &t,
ColumnVector &par)
{
#ifdef STANDALONE
@@ -656,19 +723,22 @@
mtt_write (const double &t,
ColumnVector &x,
ColumnVector &y,
const int &nrows,
const bool dump_data = false,
- ostream &file = cout)
+ std::ostream &file = std::cout)
{
static Matrix data;
static int row;
if (dump_data)
{
- Matrix written_data = data.extract (0, 0, row-1, data.cols ()-1);
- $save_ascii_data_function (file, written_data, "mtt_data");
+ if (row > 0)
+ {
+ Matrix written_data = data.extract (0, 0, row-1, data.cols ()-1);
+ $save_ascii_data_function (file, written_data, "mtt_data");
+ }
return;
}
const int nx = x.length (), ny = y.length ();
register int col = 0;
@@ -687,47 +757,45 @@
if (nrows == row)
{
#ifdef STANDALONE
$save_ascii_data_function (file, data, "mtt_data");
-// cout << data << endl;
+// std::cout << data << std::endl;
#else // ! STANDALONE
set_global_value ("MTT_data", data);
#endif
row = 0;
}
}
#ifdef STANDALONE
-void dump_data (ostream &file)
+void dump_data (std::ostream &file)
{
- ColumnVector null (0.0);
+ ColumnVector null (0);
mtt_write (0.0, null, null, 0, true, file);
}
-void set_signal_handlers (void);
-
void handle_signal (int signum)
{
// handle some signals to ensure data is written.
- cerr << "# Writing data to MTT.core (signal " << signum << ")" << endl;
- ofstream corefile ("MTT.core");
+ std::cerr << "# Writing data to MTT.core (signal " << signum << ")" << std::endl;
+ std::ofstream corefile ("MTT.core");
dump_data (corefile);
switch (signum)
{
case SIGFPE:
// Intel chips do not raise SIGFPE for DIVZERO :-(
- raise (SIGABRT);
+// raise (SIGABRT);
break;
case SIGINT:
break;
case SIGQUIT:
signal (SIGQUIT, SIG_DFL);
raise (SIGQUIT);
break;
default:
- cerr << "# Warning: make_ode2odes needs updating!" << endl;
+ std::cerr << "# Warning: make_ode2odes needs updating!" << std::endl;
signal (signum, SIG_DFL);
raise (signum);
break;
}
corefile.close ();
@@ -743,13 +811,11 @@
int main (void) {
set_signal_handlers ();
#else
DEFUN_DLD (${sys}_ode2odes, args, ,
-"Octave ode2odes representation of system with $method integration method
-Usage: mtt_data = ${sys}_ode2odes (x0, par, simpar)
-")
+"Octave ode2odes representation of system with $method integration method\nUsage: mtt_data = ${sys}_ode2odes (x0, par, simpar)\n")
{
static octave_value_list retval;
#endif // STANDALONE
static ColumnVector x0;
static ColumnVector par;
@@ -830,11 +896,11 @@
}
for (register int j = 0, i = 1; i <= ilast; i++)
{
u = mtt_input (x, y, t, par);
- y = mtt_${odeo} (x, u, t, par);
+ y = mtt_output (x, u, t, par);
if (0 == j)
{
mtt_write (t, x, y, nrows);
}
EOF
@@ -854,20 +920,20 @@
ColumnVector
x1 (x),
x2 (x),
x3 (x);
- k1 = ddt * mtt_${ode} (x , u, t , par); x1 += k1 * 0.5;
- k2 = ddt * mtt_${ode} (x1, u, t1, par); x2 += k2 * 0.5;
- k3 = ddt * mtt_${ode} (x2, u, t1, par); x3 += k3;
- k4 = ddt * mtt_${ode} (x3, u, t2, par);
+ k1 = ddt * mtt_rate (x , u, t , par); x1 += k1 * 0.5;
+ k2 = ddt * mtt_rate (x1, u, t1, par); x2 += k2 * 0.5;
+ k3 = ddt * mtt_rate (x2, u, t1, par); x3 += k3;
+ k4 = ddt * mtt_rate (x3, u, t2, par);
dx = (k1 + 2.0 * (k2 + k3) + k4) / (6.0 * ddt);
}
EOF
else
cat << EOF >> $filename
- dx = mtt_${ode} (x, u, t, par);
+ dx = mtt_rate (x, u, t, par);
EOF
fi
if [ "$method" = "implicit" ]; then
cat <> $filename
Index: mttroot/mtt/bin/trans/mtt_header
==================================================================
--- mttroot/mtt/bin/trans/mtt_header
+++ mttroot/mtt/bin/trans/mtt_header
@@ -10,10 +10,13 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.36 2001/07/12 04:00:51 gawthrop
+## Now zeros y correctly - ie Ny NOT Nx elements
+##
## Revision 1.35 2001/06/13 10:39:51 gawthrop
## Zeros output matices in csex and cseo just in case some elements are
## actually zero and not set in code. Works for m and oct.
##
## Revision 1.34 2001/05/26 18:36:43 gawthrop
@@ -26,10 +29,18 @@
## Updated to account for new nonlinear ppp
##
## Revision 1.32 2001/05/24 07:42:12 gawthrop
## Included and updated the missing tf_r2m
##
+## Revision 1.31.2.2 2001/07/02 00:34:56 geraint
+## gcc-3.0 compatibility.
+##
+## Revision 1.31.2.1 2001/05/04 04:07:24 geraint
+## Numerical solution of algebraic equations.
+## sys_ae.cc written for unsolved inputs.
+## Solution of equations using hybrd from MINPACK (as used by Octave fsolve).
+##
## Revision 1.31 2001/04/03 14:49:42 gawthrop
## Revised to incorporate new ssim (sensitivity simulation)
## representation (m only just now).
##
## Revision 1.30 2001/03/30 15:13:58 gawthrop
@@ -182,10 +193,17 @@
# Representation-specific stuff
eqnargs='mttx,mttu,mttt,mttpar'
inputeqnargs='mttx,mtty,mttt,mttpar'
case $rep in
+ ae)
+ states=yes;
+ inputs=yes;
+ parameters=yes;
+ output=mttyz;
+ args=$eqnargs;
+ ;;
cse)
states=yes;
inputs=yes;
parameters=yes;
output='mttdx,mtte'
@@ -225,10 +243,11 @@
declareinputs=no;
else
states=yes;
parameters=yes;
declareinputs=yes
+ declarestates=yes
fi
;;
logic)
states=no;
inputs=no;
@@ -521,10 +540,19 @@
N=`n2m 1 $Nu`
for i in $N; do
echo $constant_declaration 'mttu'$i' = mttu('$i$minusone');'
done
+cat <> $outfile
echo "## Inputs" >> $outfile
mtt_name2array $system input >> $outfile # Set up input by name
echo >> $outfile
+ echo "## States" >>$outfile
+ mtt_name2array $system state >> $outfile # Set up state by name
+fi
+
+## Special for input rep
+if [ "$representation" = "input" ]; then
+ echo >> $outfile
echo "## States" >>$outfile
mtt_name2array $system state >> $outfile # Set up state by name
fi
# Write out the code from the txt file
Index: mttroot/mtt/bin/trans/multi_command
==================================================================
--- mttroot/mtt/bin/trans/multi_command
+++ mttroot/mtt/bin/trans/multi_command
@@ -14,13 +14,19 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.2.4.1 2001/06/28 22:58:27 geraint
+## Using mtt_xargs.sh to prevent Arg list too long error.
+##
+## Revision 1.2 1996/11/09 21:16:06 peterg
+## *** empty log message ***
+##
# Revision 1.1 1996/10/21 12:31:40 peterg
# Initial revision
#
###############################################################
-(ls $2*_$3 \
+(mtt_xargs.sh "ls" "$2*_$3" \
| sed "s/\(.*_*\)$3/$1 \1$3 \&/")
Index: mttroot/mtt/bin/trans/multi_command2
==================================================================
--- mttroot/mtt/bin/trans/multi_command2
+++ mttroot/mtt/bin/trans/multi_command2
@@ -14,12 +14,18 @@
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
+## Revision 1.2.4.1 2001/06/28 22:58:27 geraint
+## Using mtt_xargs.sh to prevent Arg list too long error.
+##
+## Revision 1.2 1996/11/09 21:16:19 peterg
+## *** empty log message ***
+##
# Revision 1.1 1996/10/21 12:34:47 peterg
# Initial revision
#
###############################################################
-(ls $2*_$3 \
+(mtt_xargs.sh "ls" "$2*_$3" \
| sed "s/\(.*_*\)$3/$1 \1$3 > \1$4 /")
Index: mttroot/mtt/cc/include/Bracket.hh
==================================================================
--- mttroot/mtt/cc/include/Bracket.hh
+++ mttroot/mtt/cc/include/Bracket.hh
@@ -1,7 +1,13 @@
/* $Id$
* $Log$
+ * Revision 1.1.4.1 2001/06/30 03:26:20 geraint
+ * gcc-3.0 compatibility.
+ *
+ * Revision 1.1 2000/12/28 09:47:29 peterg
+ * put under RCS
+ *
* Revision 1.1 2000/10/31 04:29:11 geraint
* Initial revision
*
*/
@@ -9,10 +15,11 @@
#include
#include
+using namespace std;
class Bracket
{
public:
friend ostream &operator<< (ostream &str, Bracket *b);
Index: mttroot/mtt/cc/include/useful-functions.hh
==================================================================
--- mttroot/mtt/cc/include/useful-functions.hh
+++ mttroot/mtt/cc/include/useful-functions.hh
@@ -4,36 +4,33 @@
#define HAVE_USEFUL_FUNCTIONS_HH
#ifndef __cplusplus
#define inline /* strip */
-typedef double doubleref_t;
-#else
-typedef double &doubleref_t;
#endif // ! __cplusplus
static inline double
-max (const doubleref_t x1, const doubleref_t x2)
+max (const double x1, const double x2)
{
return static_cast((x1 >= x2) ? x1 : (x1 < x2) ? x2 : 0);
}
static inline double
-min (const doubleref_t x1, const doubleref_t x2)
+min (const double x1, const double x2)
{
return static_cast((x1 <= x2) ? x1 : (x1 > x2) ? x2 : 0);
}
static inline double
-nonsingular (const doubleref_t x)
+nonsingular (const double x)
{
return static_cast((x == 0) ? 1.0e-30 : x);
}
static inline double
-sign (const doubleref_t x)
+sign (const double x)
{
return static_cast((x > 0) ? +1 : (x < 0) ? -1 : 0);
}
@@ -50,11 +47,11 @@
nozeros (const ColumnVector v0, const double tol = 0.0)
{
ColumnVector v (v0.length ());
register int i, j;
for (i = j = 0; i < v.length (); i++)
- if (tol < abs (v0 (i)))
+ if (tol < std::abs (v0 (i)))
{
v (j) = v0 (i);
j++;
}
if (0 == j)
@@ -78,10 +75,10 @@
zeros (const int r, const int c)
{
Matrix m (r, c, 0.0);
return m;
}
-#endif __cplusplus
+#endif // __cplusplus
#endif // HAVE_USEFUL_FUNCTIONS_HH
Index: mttroot/mtt/cc/parse_m2cc.cc
==================================================================
--- mttroot/mtt/cc/parse_m2cc.cc
+++ mttroot/mtt/cc/parse_m2cc.cc
@@ -1,7 +1,13 @@
/* $Id$
* $Log$
+ * Revision 1.2.2.1 2001/06/30 03:26:17 geraint
+ * gcc-3.0 compatibility.
+ *
+ * Revision 1.2 2001/03/19 02:28:53 geraint
+ * Branch merge: merging-ode2odes-exe back to MAIN.
+ *
* Revision 1.1.2.2 2001/03/09 04:01:20 geraint
* \ escapes newline.
*
* Revision 1.1.2.1 2001/03/09 02:59:26 geraint
* got_comment: (char)c no longer compared to (int)EOF.
@@ -28,10 +34,12 @@
* just add Bracket pointer to string / stream
*/
#include "Bracket.hh"
+
+using namespace std;
/*
* use lbrace, etc. in expressions to automate nesting calculations
*/
LeftBrace *lbrace = new LeftBrace;
ADDED mttroot/mtt/lib/cc/mtt_HJ_Solver.hh
Index: mttroot/mtt/lib/cc/mtt_HJ_Solver.hh
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_HJ_Solver.hh
@@ -0,0 +1,53 @@
+
+#include "mtt_Solver.hh"
+
+class HJ_Solver : public Solver {
+
+ // http://www.netlib.org/opt/hooke.c
+ // Hooke and Jeeves solution
+
+public:
+
+ HJ_Solver (sys_ae ae,
+ const int npar,
+ const int nu,
+ const int nx,
+ const int ny,
+ const int nyz)
+ : Solver (ae,npar,nu,nx,ny,nyz)
+ { static_ptr = this; VARS = nyz; };
+
+ static double
+ f (double tryUi[], int nyz);
+
+ ~HJ_Solver (void) {};
+
+protected:
+
+ void
+ Solve (void);
+
+ double
+ best_nearby (double delta[],
+ double point[],
+ double prevbest,
+ int nvars);
+
+ int
+ hooke (int nvars, // MTTNYZ
+ double startpt[], // user's initial guess
+ double endpt[], // result
+ double rho = 0.05, // geometric shrink factor
+ double epsilon = 1e-3, // end value stepsize
+ int itermax = 5000); // max # iterations
+
+private:
+
+ int VARS;
+
+public:
+
+ static HJ_Solver *static_ptr;
+
+};
+
ADDED mttroot/mtt/lib/cc/mtt_Hybrd_Solver.cc
Index: mttroot/mtt/lib/cc/mtt_Hybrd_Solver.cc
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_Hybrd_Solver.cc
@@ -0,0 +1,67 @@
+
+#include "mtt_Hybrd_Solver.hh"
+
+// http://www.netlib.org/minpack/hybrd.f
+// used by Octave's fsolve
+
+Hybrd_Solver *Hybrd_Solver::static_ptr;
+
+ColumnVector
+Hybrd_Solver::f_hybrd (const ColumnVector &tryUi)
+{
+ Hybrd_Solver::static_ptr->_yz = Hybrd_Solver::static_ptr->eval(tryUi);
+ return Hybrd_Solver::static_ptr->_yz;
+}
+
+void
+Hybrd_Solver::Solve (void)
+{
+ int info;
+ static int input_errors;
+ static int user_errors;
+ static int convergences;
+ static int progress_errors;
+ static int limit_errors;
+ static int unknown_errors;
+
+ NLFunc fcn(&Hybrd_Solver::f_hybrd);
+ NLEqn eqn(Solver::_ui,fcn);
+ eqn.set_tolerance(0.000001);
+ Solver::_ui = eqn.solve(info);
+
+ switch (info)
+ {
+ case 1:
+ convergences++;
+ break;
+ case -2:
+ input_errors++;
+ break;
+ case -1:
+ user_errors++;
+ break;
+ case 3:
+ progress_errors++;
+ break;
+ case 4:
+ // if (abs(eval(_ui).max()) > 1.0e-6)
+ limit_errors++;
+ // else
+ // convergences++;
+ break;
+ default:
+ unknown_errors++;
+ break;
+ }
+ if (1 != info)
+ {
+ std::cerr << "input (" << input_errors << ") "
+ << " user (" << user_errors << ") "
+ << " converge (" << convergences << ") "
+ << " progress (" << progress_errors << ") "
+ << " limit (" << limit_errors << ")"
+ << " unknown (" << unknown_errors << ")"
+ << " (max error = " << std::abs(eval(_ui).max()) << ")" << std::endl;
+ }
+}
+
ADDED mttroot/mtt/lib/cc/mtt_Hybrd_Solver.hh
Index: mttroot/mtt/lib/cc/mtt_Hybrd_Solver.hh
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_Hybrd_Solver.hh
@@ -0,0 +1,38 @@
+
+#include "mtt_Solver.hh"
+#include
+
+class Hybrd_Solver : public Solver {
+
+ // http://www.netlib.org/minpack/hybrd.f
+ // used by Octave's fsolve
+
+public:
+
+ Hybrd_Solver (sys_ae ae,
+ const int npar,
+ const int nu,
+ const int nx,
+ const int ny,
+ const int nyz)
+ : Solver (ae,npar,nu,nx,ny,nyz)
+ {
+ static_ptr = this;
+ }
+
+ static ColumnVector
+ f_hybrd (const ColumnVector &tryUi);
+
+ ~Hybrd_Solver (void) {};
+
+protected:
+
+ void
+ Solve (void);
+
+public:
+
+ static Hybrd_Solver *static_ptr;
+
+};
+
ADDED mttroot/mtt/lib/cc/mtt_Reduce_Solver.cc
Index: mttroot/mtt/lib/cc/mtt_Reduce_Solver.cc
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_Reduce_Solver.cc
@@ -0,0 +1,11 @@
+
+#include "mtt_Reduce_Solver.hh"
+
+
+void
+Reduce_Solver::Solve (void)
+{
+ std::cerr << "Error:"
+ << " Symbolic solution of equations failed during model build" << std::endl
+ << " Try using one of the other algebraic solution methods" << std::endl;
+}
ADDED mttroot/mtt/lib/cc/mtt_Reduce_Solver.hh
Index: mttroot/mtt/lib/cc/mtt_Reduce_Solver.hh
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_Reduce_Solver.hh
@@ -0,0 +1,27 @@
+
+#include "mtt_Solver.hh"
+
+class Reduce_Solver : public Solver {
+
+ // Dummy class
+ // This will not be used unless the Reduce solver has failed earlier
+ // in the model build process
+
+public:
+
+ Reduce_Solver (sys_ae ae,
+ const int npar,
+ const int nu,
+ const int nx,
+ const int ny,
+ const int nyz)
+ : Solver (ae,npar,nu,nx,ny,nyz)
+ { ; };
+
+ void
+ Solve (void);
+
+ ~Reduce_Solver (void) {};
+
+};
+
ADDED mttroot/mtt/lib/cc/mtt_Solver.cc
Index: mttroot/mtt/lib/cc/mtt_Solver.cc
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_Solver.cc
@@ -0,0 +1,42 @@
+
+#include "mtt_Solver.hh"
+
+Solver::Solver (sys_ae ae,
+ const int npar,
+ const int nu,
+ const int nx,
+ const int ny,
+ const int nyz)
+{
+ _ae = ae;
+ _np = npar;
+ _nu = nu;
+ _nx = nx;
+ _ny = ny;
+ _nyz = nyz;
+
+ _uui = ColumnVector (_nu+_nyz);
+};
+
+ColumnVector
+Solver::solve (const ColumnVector &x,
+ const ColumnVector &u,
+ const double &t,
+ const ColumnVector &par)
+{
+ _x = x;
+ _uui.insert(u,0);
+ _t = t;
+ _par = par;
+ _ui = ColumnVector(_nyz,1.0);
+ Solve ();
+ _uui.insert(_ui,_nu);
+ return _uui;
+}
+
+ColumnVector
+Solver::eval (const ColumnVector &ui)
+{
+ _uui.insert(ui,_nu);
+ return _ae (_x, _uui, _t, _par);
+}
ADDED mttroot/mtt/lib/cc/mtt_Solver.hh
Index: mttroot/mtt/lib/cc/mtt_Solver.hh
==================================================================
--- /dev/null
+++ mttroot/mtt/lib/cc/mtt_Solver.hh
@@ -0,0 +1,63 @@
+
+#ifndef MTT_SOLVER
+#define MTT_SOLVER
+
+#include
+#include
+#include
+
+#include
+
+class Solver {
+
+protected:
+ typedef ColumnVector (*sys_ae) // pointer to F${sys}_ae function
+ (ColumnVector &,ColumnVector &,const double &t,ColumnVector &);
+
+public:
+
+ Solver (sys_ae ae,
+ const int npar,
+ const int nu,
+ const int nx,
+ const int ny,
+ const int nyz);
+
+ ColumnVector
+ solve (const ColumnVector &x,
+ const ColumnVector &u,
+ const double &t,
+ const ColumnVector &par);
+
+ ColumnVector
+ eval (const ColumnVector &ui);
+
+ virtual ~Solver (void) {};
+
+protected:
+
+ virtual void
+ Solve (void) = 0;
+
+protected:
+
+ ColumnVector _x;
+ ColumnVector _uui;
+ double _t;
+ ColumnVector _par;
+
+ ColumnVector _ui;
+ ColumnVector _yz;
+
+ int _nu;
+ int _np;
+ int _nx;
+ int _ny;
+ int _nyz;
+
+ sys_ae _ae;
+
+};
+
+#endif // MTT_SOLVER
+