Index: mttroot/mtt/bin/mtt ================================================================== --- mttroot/mtt/bin/mtt +++ mttroot/mtt/bin/mtt @@ -14,10 +14,13 @@ ############################################################### ## Version control history ############################################################### ## $Header$ ## $Log$ +## 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. ## ## Revision 1.307 2001/04/15 21:15:41 geraint ## Added interface definition rep: _ICD.(txt|c|cc|m). @@ -1427,10 +1430,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 @@ -1463,10 +1467,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 @@ -2192,18 +2197,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 @@ -2400,10 +2405,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) Index: mttroot/mtt/bin/trans/cse2ode_r ================================================================== --- mttroot/mtt/bin/trans/cse2ode_r +++ mttroot/mtt/bin/trans/cse2ode_r @@ -12,10 +12,13 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## 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 +48,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,13 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## 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,12 +284,22 @@ 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 +IF (MTTNyz>0) THEN % not $solve (or perhaps solution failed?) +BEGIN + OUT "$1_ae.r"; + WRITE "MATRIX MTTyz(",MTTNyz,",1)"; + WRITE "%file $1_ae.r"; + FOR i := 1:MTTNyz DO + WRITE "MTTyz(",i,",1) := ",MTTyz(i,1); + WRITE ";END;"; + SHUT "$1_ae.r"; +END; % if MTTNyz>0 (and !$solve) % Create the matrix declarations OUT "$1_cse.r1"; write "MATRIX MTTEdx(", MTTNx, ",", 1, ")$"; write "MATRIX MTTE(", MTTNx, ",", MTTNx, ")$"; Index: mttroot/mtt/bin/trans/def2write_r ================================================================== --- mttroot/mtt/bin/trans/def2write_r +++ mttroot/mtt/bin/trans/def2write_r @@ -11,10 +11,15 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## 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 +83,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,14 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## 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 ## Rationalised simulation modes to each return mtt_data ## ## Revision 1.55 2001/03/27 13:21:59 geraint ## Octave version compatibility for save_ascii_data(_for_plotting). @@ -342,13 +346,14 @@ ;; esac cat < $filename #include -#include #include #include +#include +#include #include #ifndef STANDALONE #include #endif @@ -357,10 +362,16 @@ #include "${sys}_sympar.h" #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, @@ -428,21 +439,134 @@ ColumnVector &par); EOF fi cat <> $filename + +void set_signal_handlers (void); + #endif // STANDALONE +class Solver +{ +public: + Solver (void) { + solve_errors.input = 0; + solve_errors.user = 0; + solve_errors.converge = 0; + solve_errors.progress = 0; + solve_errors.limit = 0; + solve_errors.unknown = 0; + } + ColumnVector solve (const ColumnVector &x, + const ColumnVector &u, + const double &t, + const ColumnVector &par) + { + initialise(x,u,t,par); + NLFunc fcn(&Solver::evaluate); + NLEqn eqn(Ui,fcn); + Ui = eqn.solve(info); + switch (info) + { + case -2: + solve_errors.input++; + write_stats(); + break; + case -1: + solve_errors.user++; + write_stats(); + break; + case 1: + solve_errors.converge++; + break; + case 3: + solve_errors.progress++; + write_stats(); + break; + case 4: + solve_errors.limit++; + write_stats(); + break; + default: + solve_errors.unknown++; + write_stats(); + break;; + } + U.insert (Ui,MTTNU); + return U; + } + void write_stats (void) + { + cerr << "input error (" << solve_errors.input << ") " + << ", user (" << solve_errors.user << ") " + << ", converge (" << solve_errors.converge << ") " + << ", progress (" << solve_errors.progress << ") " + << ", limit (" << solve_errors.limit << ") " + << ", unknown (" << solve_errors.unknown << ") " + << endl; + } +private: + static ColumnVector evaluate (const ColumnVector &tryUi) + { + U.insert(tryUi,MTTNU); + return F${sys}_ae(X,U,T,P); + } + void initialise (const ColumnVector &x, + const ColumnVector &u, + const double &t, + const ColumnVector &par) + { + X = x; + T = t; + P = par; + U.insert(u,0); + Ui = ColumnVector(MTTNYZ,0.0); + } +private: + struct { + long int input; + long int user; + long int converge; + long int progress; + long int limit; + long int unknown; + } solve_errors; + static double T; + static ColumnVector X; + static ColumnVector P; + static ColumnVector U; + static ColumnVector Ui; + int info; +}; +double Solver::T = 0.0; +ColumnVector Solver::U(MTTNU+MTTNYZ,0.0); +ColumnVector Solver::X(MTTNX,0.0); +ColumnVector Solver::P(MTTNPAR,0.0); +ColumnVector Solver::Ui(MTTNYZ,0.0); inline ColumnVector mtt_input (ColumnVector &x, ColumnVector &y, const double &t, ColumnVector &par) { #ifdef STANDALONE - return F${sys}_input (x, y, t, par); + static ColumnVector u (MTTNU); + static ColumnVector ui (MTTNYZ); + static ColumnVector U (MTTNU+MTTNYZ); + static Solver ae; + + u = F${sys}_input (x, y, t, par); + if (MTTNYZ == 0) + { + return u; + } + else + { + return ae.solve(x,u,t,par); + } #else static octave_value_list args, f; args (0) = octave_value (x); args (1) = octave_value (y); args (2) = octave_value (t); @@ -659,12 +783,15 @@ 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; @@ -698,12 +825,10 @@ { ColumnVector null (0.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"); @@ -710,11 +835,11 @@ 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); Index: mttroot/mtt/bin/trans/mtt_header ================================================================== --- mttroot/mtt/bin/trans/mtt_header +++ mttroot/mtt/bin/trans/mtt_header @@ -10,10 +10,14 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## 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 ## Rationalised simulation modes to each return mtt_data ## ## Revision 1.29 2001/03/27 13:10:23 geraint ## Improved determination of Octave version. @@ -162,10 +166,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' @@ -203,10 +214,11 @@ declareinputs=no; else states=yes; parameters=yes; declareinputs=yes + declarestates=yes fi ;; logic) states=no; inputs=no; @@ -471,10 +483,19 @@ N=`n2m 1 $Nu` for i in $N; do echo $constant_declaration 'mttu'$i' = mttu('$i$minusone');' done +cat <