Index: mttroot/mtt/bin/mtt ================================================================== --- mttroot/mtt/bin/mtt +++ mttroot/mtt/bin/mtt @@ -13,10 +13,38 @@ ############################################################### ## Version control history ############################################################### ## $Header$ ## $Log$ +## Revision 1.293.2.8 2001/03/19 01:35:31 geraint +## Reverted forced update check to main branch form, ready for merge. +## +## Revision 1.293.2.7 2001/03/17 09:51:06 geraint +## Implemented Runge-Kutta IV fixed-step method (-i rk4). +## +## Revision 1.293.2.6 2001/03/03 06:50:38 geraint +## Added #SUMMARY lines for ode2odes. +## +## Revision 1.293.2.5 2001/03/03 00:27:14 geraint +## Fixed ar options to work with GNU ar. Allow mtt to create dependencies for mtt_%.cc when making mtt_%.oct. +## +## Revision 1.293.2.4 2001/03/02 00:45:21 geraint +## Separated Euler and Implicit methods in .cc code and dependencies. +## +## Revision 1.293.2.3 2001/03/01 05:05:53 geraint +## Minor revisions. +## +## Revision 1.293.2.2 2001/02/23 03:53:53 geraint +## Minor revisions. (ode2odes.exe works on GNU/Linux and ~GNU/Irix) +## +## Revision 1.293.2.1 2001/02/22 06:41:40 geraint +## Initial merge of ode2odes.exe into main mtt. +## standalone_rep.make deleted: rules moved to mtt, variables to mttrc. +## +## Revision 1.293 2001/02/06 04:39:08 geraint +## Added _standalone.exe representation. +## ## Revision 1.292 2001/02/05 17:27:40 gawthrop ## Make sure _def.r exists before creating _state.txt ## ## Revision 1.291 2000/12/27 14:50:40 peterg ## This is the first CVS version (4.9). @@ -1062,12 +1090,16 @@ ;; implicit) integration_method=implicit; mtt_switches="$mtt_switches implicit"; ;; + rk4) + integration_method=rk4; + mtt_switches="$mtt_switches rk4"; + ;; *) - echo $1 is an unknown integration method - use euler or implicit; + echo $1 is an unknown integration method - use euler, rk4 or implicit; exit;; esac;; -s ) mtt_switches="$mtt_switches $1"; sensitivity=sensitivity ;; @@ -1200,11 +1232,11 @@ echo ' -abg start at abg.m representation' echo ' -c c-code generation' echo ' -d use directory ' echo ' -dc Maximise derivative (not integral) causality' echo ' -dc Maximise derivative (not integral) causality' - echo ' -i Use implicit or euler integration' + echo ' -i Use implicit, euler or rk4 integration' 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' @@ -1792,10 +1824,17 @@ if [ -n "$sensitivity" ]; then sys=`echo $1 | cut -c 2-` sys_abg=$sys"_abg" fi + +## Check octave version +if [ `octave --version | awk -F\. '{print $2}'` ]; then + define_octave_dev="-DOCTAVE_DEV" +else + define_octave_dev="" +fi ################################ # This is the main mtt programme ################################ @@ -1806,22 +1845,36 @@ # Cancel implicit rules I don't want %.dvi: %.tex # MTT implicit rules ## .oct files -ifneq ($2,ode2odes) -%.oct: %.cc $1_def.h $1_sympar.h $1_cr.h - echo Creating $1_$2.oct; $MKOCTFILE $< -endif +$1_%.oct: $1_%.cc $1_def.h $1_sympar.h $1_cr.h + echo Creating $1_\$*.oct; $MKOCTFILE $1_\$*.cc +.PRECIOUS: mtt_%.oct +mtt_%.oct: mtt_%.cc + echo Compiling \$< + ${MKOCTFILE} $define_octave_dev \$< ## .cc files .PRECIOUS: %.cc # Don't let mtt delete them -ifneq ($2,ode2odes) -%.cc: %.m - mtt_m2cc.sh $1 $2 cat -endif +$1_%.cc: $1_%.m + mtt_m2cc.sh $1 \$* cat + +mtt_%.cc: ${MTT_LIB}/cc/mtt_%.cc + cp ${MTT_LIB}/cc/mtt_\$*.cc mtt_\$*.cc + +## .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 + +.PRECIOUS: mtt_%.o +mtt_%.o: mtt_%.cc + echo Compiling mtt_\$*.cc + ${MTT_CXX} ${MTT_CXXFLAGS} ${MTT_CXXINCS} -c $< -DSTANDALONE $define_octave_dev # Generates code to write reduce code $1_ode_write.r: $1_def.m def2write_r $1 $2 @@ -2053,10 +2106,41 @@ mtt_update $1 logic endif # Dummy target FORCE: + +$1_ode2odes_common.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 + @echo > /dev/null +$1_ode2odes_common.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 + @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 + @echo > /dev/null +$1_ode2odes_euler.o $1_ode2odes_rk4.o : $1_ode.o $1_odeo.o mtt_euler.o + @echo "Creating \$@" + ar -cr \$@ \$^ +$1_ode2odes_euler.oct : $1_ode.oct $1_odeo.oct mtt_euler.oct + @echo > /dev/null + +$1_ode2odes_implicit.m : $1_cseo.m $1_csex.m $1_smxa.m $1_smxax.m + @echo > /dev/null +$1_ode2odes_implicit.cc : $1_cseo.cc $1_csex.cc $1_smxa.cc $1_smxax.cc + @echo > /dev/null +$1_ode2odes_implicit.o : $1_cseo.o $1_csex.o $1_smxa.o $1_smxax.o mtt_implicit.o + @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 + #SUMMARY numpar numerical parameter declaration (m) $1_numpar.m: $1_numpar.txt $1_sympars.txt mtt_txt2m $1 numpar @@ -2198,11 +2282,11 @@ struc_txt2tex $1 $1_struc.m: $1_struc.txt struc_txt2m $1 $1_def.m: $1_def.r def_r2m $1; matlab_tidy $1_def.m; -$1_def.h: $1_def.m +$1_def.h: $1_def.m $1_sympar.txt def_m2h.sh $1 #SUMMARY rdae raw differential-algebraic equations (r) #SUMMARY dae differential-algebraic equations (r) #SUMMARY dae* differential-algebraic equations (m) @@ -2346,49 +2430,55 @@ $1_ode2odes.m : $1_def.r $1_sympars.txt \ $1_smxa.m $1_smxax.m\ $1_simpar.m $1_numpar.m $1_state.m $1_input.m \ $1_csex.m $1_cseo.m $1_logic.m ifeq ($using_oct,yes) - mtt $mtt_switches -q -u $1 smxa oct - mtt $mtt_switches -q -u $1 smxax oct - mtt $mtt_switches -q -u $1 simpar oct - mtt $mtt_switches -q -u $1 numpar oct - mtt $mtt_switches -q -u $1 state oct - mtt $mtt_switches -q -u $1 input oct - mtt $mtt_switches -q -u $1 csex oct - mtt $mtt_switches -q -u $1 cseo oct - mtt $mtt_switches -q -u $1 logic oct - make_ode2odes $1 cc $integration_method - echo Creating $1_ode2odes.oct - mkoctfile $1_ode2odes.cc 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 endif endif -ifeq ($integration_method,euler) +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 \ $1_ode.m $1_odeo.m $1_logic.m ifeq ($using_oct,yes) - mtt $mtt_switches -q -u $1 simpar oct - mtt $mtt_switches -q -u $1 numpar oct - mtt $mtt_switches -q -u $1 state oct - mtt $mtt_switches -q -u $1 input oct - mtt $mtt_switches -q -u $1 ode oct - mtt $mtt_switches -q -u $1 odeo oct - mtt $mtt_switches -q -u $1 logic oct - make_ode2odes $1 cc $integration_method - echo Creating $1_ode2odes.oct - mkoctfile $1_ode2odes.cc + 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 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 + 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\ + ${MTT_LDFLAGS} ${MTT_CXXLIBS} + +$1_ode2odes.o: $1_ode2odes.cc $1_ode2odes_common.o $1_ode2odes_${integration_method}.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 + touch $1_ode2odes.m + echo Creating $1_ode2odes.oct + $MKOCTFILE $1_ode2odes.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 + touch $1_ode2odes.m + make_ode2odes $1 cc $integration_method #Conversion of m to p to c #SUMMARY ode ordinary differential equations (c) #SUMMARY ode ordinary differential equations (p) #SUMMARY state state declaration (c) @@ -2429,11 +2519,11 @@ $1_ode2odes.p : $1_ode2odes.m $1_def.r $1_smxa.p $1_smxax.p\ $1_simpar.p $1_numpar.p $1_state.p $1_input.p \ $1_csex.p $1_cseo.p $1_logic.p mtt_m2p $1_ode2odes.m $integration_method $stdin endif -ifeq ($integration_method,euler) +ifneq ($integration_method,implicit) $1_ode2odes.p : $1_ode2odes.m $1_def.r\ $1_simpar.p $1_numpar.p $1_state.p $1_input.p \ $1_ode.p $1_odeo.p $1_logic.p mtt_m2p $1_ode2odes.m $integration_method $stdin endif @@ -2730,12 +2820,17 @@ ode2odes_r2c $1 $1_sms.c: $1_sm.c $1_def.r $1_sympar.r sm2sms_r2c $1 ifeq ($computation,octave) +ifeq ($using_oct,yes) +$1_odes.dat2: $1_ode2odes.oct + time octave_ode2odes $1 +else $1_odes.dat2: $1_ode2odes.m time octave_ode2odes $1 +endif endif ifeq ($computation,c) $1_ode2odes.out: $1_ode2odes.c echo Creating $1_odes.out Index: mttroot/mtt/bin/mtt_check_vars ================================================================== --- mttroot/mtt/bin/mtt_check_vars +++ mttroot/mtt/bin/mtt_check_vars @@ -13,10 +13,17 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## Revision 1.8.2.1 2001/03/06 03:48:43 geraint +## Print additional environment variable for "mtt -p". +## MTT_LDFLAGS defaults to " " to avoid installation warning. +## +## Revision 1.8 2000/12/27 13:11:42 peterg +## *** empty log message *** +## ## Revision 1.7 2000/08/04 15:48:30 peterg ## Added PDF ## ## Revision 1.6 2000/05/22 12:37:24 peterg ## *** empty log message *** @@ -73,8 +80,13 @@ mtt_check_var "$PDFVIEW" "PDFVIEW" "$print" "MTT" mtt_check_var "$HTMLVIEW" "HTMLVIEW" "$print" "MTT" mtt_check_var "$DVIVIEW" "DVIVIEW" "$print" "MTT" mtt_check_var "$CC" "CC" "$print" "MTT" mtt_check_var "$LATEX2HTML" "LATEX2HTML" "$print" "MTT" - +mtt_check_var "$MKOCTFILE" "MKOCTFILE" "$print" "MTT" +mtt_check_var "$MTT_CXX" "MTT_CXX" "$print" "MTT" +mtt_check_var "$MTT_CXXFLAGS" "MTT_CXXFLAGS" "$print" "MTT" +mtt_check_var "$MTT_CXXLIBS" "MTT_CXXLIBS" "$print" "MTT" +mtt_check_var "$MTT_CXXINCS" "MTT_CXXINCS" "$print" "MTT" +mtt_check_var "$MTT_LDFLAGS" "MTT_LDFLAGS" "$print" "MTT" Index: mttroot/mtt/bin/mttrc ================================================================== --- mttroot/mtt/bin/mttrc +++ mttroot/mtt/bin/mttrc @@ -13,10 +13,27 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## Revision 1.17.2.4 2001/03/06 03:48:43 geraint +## Print additional environment variable for "mtt -p". +## MTT_LDFLAGS defaults to " " to avoid installation warning. +## +## Revision 1.17.2.3 2001/03/01 05:05:53 geraint +## Minor revisions. +## +## Revision 1.17.2.2 2001/02/23 03:53:53 geraint +## Minor revisions. (ode2odes.exe works on GNU/Linux and ~GNU/Irix) +## +## Revision 1.17.2.1 2001/02/22 06:41:40 geraint +## Initial merge of ode2odes.exe into main mtt. +## standalone_rep.make deleted: rules moved to mtt, variables to mttrc. +## +## Revision 1.17 2000/12/27 16:46:13 peterg +## Stripped the mtt- from paths +## ## Revision 1.16 2000/12/27 15:16:44 peterg ## If then else format ## ## Revision 1.15 2000/12/27 14:57:43 peterg ## Now takes the base path as an argument @@ -132,6 +149,46 @@ # Ascend stuff export ASCENDLIBRARY=$MTTPATH/ascend/lib # Oct file generation - use version with no optimisation. export MKOCTFILE=$MTT_LIB/octave/mkoctfile + + # ode2odes.exe stuff + + # local system + + PLAT="i686-pc-linux-gnu" + PREFIX="/usr/local" + GCCVERS="2.95.2" + SRCOCTAVE="/cvs/octave" + +# PLAT="mips-sgi-irix6.5" +# PREFIX="/usr/people/bevangp/GNU" +# GCCVERS="2.95.2" +# SRCOCTAVE="${PREFIX}/../build/octave-2.1.33" + + # include paths + + IOCTAVE="-I${PREFIX}/include/octave" + + # library paths + + LOCTAVE="-L${PREFIX}/lib/octave -loctave -lcruft -loctinterp" + LKPATHSEA="-L${SRCOCTAVE}/kpathsea -lkpathsea" + LREADLINE=" -L${SRCOCTAVE}/readline -lreadline" + LSYSTEM="-ldl -lm -lncurses" + LF2C="-L${PREFIX}/lib/gcc-lib/${PLAT}/${GCCVERS} -lg2c" + + # compiler options + + DEBUG="-g" + OPTIM="-O3" + FLAGS="-fno-rtti -fno-exceptions -fno-implicit-templates" + + # exported variables + + export MTT_CXX="g++" + export MTT_CXXFLAGS="${DEBUG} ${OPTIM} ${FLAGS}" + export MTT_CXXLIBS="${LOCTAVE} ${LKPATHSEA} ${LREADLINE} ${LF2C} ${LSYSTEM}" + export MTT_CXXINCS="-I. ${IOCTAVE}" + export MTT_LDFLAGS=" " fi Index: mttroot/mtt/bin/trans/dae2cse_r ================================================================== --- mttroot/mtt/bin/trans/dae2cse_r +++ mttroot/mtt/bin/trans/dae2cse_r @@ -13,10 +13,17 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## 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 +## *** empty log message *** +## ## Revision 1.13 2000/10/11 08:52:46 peterg ## Creates csex (cse with dxe only) rep. ## ## Revision 1.12 2000/10/10 21:00:58 peterg ## New code genration @@ -69,15 +76,10 @@ ## Revision 1.1 1996/08/15 16:47:02 peter ## Initial revision ## ############################################################### -# Create the reduce output code -def2write_r $1 cse -def2write_r $1 csex # Version without E matrix -def2write_r $1 cseo - #Explicit solution option solve=0 while [ -n "`echo $1 | grep '^-'`" ]; do case $1 in -A ) @@ -85,10 +87,15 @@ *) echo "$1 is an invalid argument - ignoring" ;; esac shift done + +# Create the reduce output code +def2write_r $1 cse +def2write_r $1 csex # Version without E matrix +def2write_r $1 cseo if [ "$solve" = "1" ]; then echo "Creating $1_cse.r (with explicit solution of algebraic equations)" else echo "Creating $1_cse.r" @@ -377,21 +384,26 @@ cat $1_cse.r1 $1_cse.r2 > $1_cse.r cat $1_csex.r1 $1_csex.r2 > $1_csex.r cat $1_cseo.r1 $1_cseo.r2 > $1_cseo.r if [ "$solve" = "1" ]; then - echo "Setting MTTNyz=0 in $1_def.r and removing other $1_def files" + echo "Setting MTTNyz=0 in $1_def.r and updating other $1_def files" awk '{ if ($1=="MTTNyz") print "MTTNyz := 0;" else print $0 }' $1_def.r > mtt_junk # Make sure it preserves the time stamp!! # and remove dependent reps touch -r $1_def.r mtt_junk - rm $1_def.* mv mtt_junk $1_def.r + for file in `ls $1_def.*`; do + if [ $file != $1_def.r ]; then + ext=`echo $file|awk -F\. '{print $2}'` + mtt -q $1 def $ext + fi + done fi # Now invoke the standard error handling. mtt_error_r dae2cse_r.log Index: mttroot/mtt/bin/trans/make_ode2odes ================================================================== --- mttroot/mtt/bin/trans/make_ode2odes +++ mttroot/mtt/bin/trans/make_ode2odes @@ -7,10 +7,37 @@ ############################################################### ## Version control history ############################################################### ## $Id$ ## $Log$ +## Revision 1.51.2.7 2001/03/17 09:51:07 geraint +## Implemented Runge-Kutta IV fixed-step method (-i rk4). +## +## Revision 1.51.2.6 2001/03/16 03:56:13 geraint +## Removed psignal/siginfo.h - problematic and unnecessary. +## +## Revision 1.51.2.5 2001/03/12 23:16:37 geraint +## Minor improvements to signal handling (.exe). +## +## Revision 1.51.2.4 2001/03/12 03:59:30 geraint +## SIGINT (C-c C-c) now causes simulation data to be dumped to MTT.core. +## SIGQUIT (C-c C-\) as for SIGINT, then raises default SIGQUIT. +## SIGFPE as for SIGINT, then raises default SIGABRT. +## +## Revision 1.51.2.3 2001/03/07 04:06:55 geraint +## Irix: catch SIGFPE and write data before aborting (.exe). +## GNU/Linux: nada. +## +## Revision 1.51.2.2 2001/03/02 00:45:21 geraint +## Separated Euler and Implicit methods in .cc code and dependencies. +## +## Revision 1.51.2.1 2001/03/01 05:05:53 geraint +## Minor revisions. +## +## Revision 1.51 2001/02/19 06:33:19 geraint +## Removed operation form loop. +## ## Revision 1.50 2001/02/18 09:18:49 geraint ## Removed temporary Matrices from mtt_implicit.cc ## ## Revision 1.49 2001/02/14 06:06:34 geraint ## Removed octave_value_list wrappers from standalone.exe - speed improvements @@ -233,12 +260,25 @@ [u] = ${sys}_input(x,y,t,par); # Input [y] = ${sys}_$odeo(x,u,t,par); # Output if mttj==0 mtt_write(t,x,y,$Nx,$Ny); # Write it out endif +EOF + +if [ "$method" = "rk4" ]; then +cat << EOF >> $filename + [k1] = ddt * ${sys}_${ode}(x,u,t,par); + [k2] = ddt * ${sys}_${ode}(x+k1/2,u,t+ddt/2,par); + [k3] = ddt * ${sys}_${ode}(x+k2/2,u,t+ddt/2,par); + [k4] = ddt * ${sys}_${ode}(x+k3,u,t+ddt,par); + [dx] = [k1 + 2.0 * [k2 + k3] + k4] / (6.0 * ddt); +EOF +else +cat << EOF >> $filename [dx] = ${sys}_$ode(x,u,t,par); # State derivative EOF +fi if [ "$method" = "implicit" ]; then cat<< EOF >> $filename [AA] = ${sys}_smxa(x,u,ddt,par); # (I-Adt) and (I-Adt)x @@ -280,11 +320,11 @@ fi cat < $filename #include #include -#include +#include #include #include #ifndef STANDALONE #include @@ -292,25 +332,33 @@ #include "${sys}_def.h" #include "${sys}_sympar.h" #ifdef STANDALONE -extern ColumnVector Fmtt_euler ( - ColumnVector &x, - const ColumnVector &dx, - const double &ddt, - const int &nx, - const ColumnVector &open_switches); - -extern ColumnVector Fmtt_implicit ( - ColumnVector &x, - ColumnVector &dx, - Matrix &AA, - ColumnVector &AAx, - const double &ddt, - const int &nx, - const ColumnVector &open_switches); +#include +#include + +extern ColumnVector F${sys}_input ( + ColumnVector &x, + ColumnVector &y, + const double &t, + ColumnVector &par); + +extern ColumnVector F${sys}_logic ( + ColumnVector &x, + ColumnVector &u, + const double &t, + ColumnVector &par); + +extern ColumnVector F${sys}_numpar ( + void); + +extern Octave_map F${sys}_simpar ( + void); + +extern ColumnVector F${sys}_state ( + ColumnVector &x); extern ColumnVector F${sys}_${ode} ( ColumnVector &x, ColumnVector &u, const double &t, @@ -320,21 +368,31 @@ ColumnVector &x, ColumnVector &u, const double &t, ColumnVector &par); -extern ColumnVector F${sys}_input ( +EOF +if [ "$method" != "implicit" ]; then +cat <> $filename +extern ColumnVector Fmtt_euler ( + ColumnVector &x, + const ColumnVector &dx, + const double &ddt, + const int &nx, + const ColumnVector &open_switches); + +EOF +else +cat <> $filename +extern ColumnVector Fmtt_implicit ( ColumnVector &x, - ColumnVector &y, - const double &t, - ColumnVector &par); - -extern ColumnVector F${sys}_numpar ( - void); - -extern Octave_map F${sys}_simpar ( - void); + ColumnVector &dx, + Matrix &AA, + ColumnVector &AAx, + const double &ddt, + const int &nx, + const ColumnVector &open_switches); extern Matrix F${sys}_smxa ( ColumnVector &x, ColumnVector &u, const double &t, @@ -344,20 +402,98 @@ ColumnVector &x, ColumnVector &u, const double &t, ColumnVector &par); -extern ColumnVector F${sys}_state ( - ColumnVector &x); - -extern ColumnVector F${sys}_logic ( - ColumnVector &x, - ColumnVector &u, - const double &t, - ColumnVector &par); +EOF +fi +cat <> $filename #endif // STANDALONE + +inline ColumnVector +mtt_input (ColumnVector &x, + ColumnVector &y, + const double &t, + ColumnVector &par) +{ +#ifdef STANDALONE + return 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} (); +#endif +} + +inline ColumnVector +mtt_logic (ColumnVector &x, + ColumnVector &u, + const double &t, + ColumnVector &par) +{ +#ifdef STANDALONE + return F${sys}_logic (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}_logic", args, 1); + return f(0).${vector_value} (); +#endif +} + +inline ColumnVector +mtt_numpar (void) +{ +#ifdef STANDALONE + return F${sys}_numpar (); +#else + static octave_value_list args, f; + f = feval ("${sys}_numpar", args, 1); + return f(0).${vector_value} (); +#endif +} + +inline Octave_map +mtt_simpar (void) +{ +#ifdef STANDALONE + return F${sys}_simpar (); +#else + static octave_value_list args; + static Octave_map f; + f["first"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["first"]; + f["dt"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["dt"]; + f["last"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["last"]; + f["stepfactor"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["stepfactor"]; + f["wmin"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["wmin"]; + f["wmax"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["wmax"]; + f["wsteps"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["wsteps"]; + f["input"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["input"]; + return (f); +#endif +} + +inline ColumnVector +mtt_state (ColumnVector &x) +{ +#ifdef STANDALONE + return F${sys}_state (x); +#else + static octave_value_list args, f; + args (0) = octave_value (x); + f = feval ("${sys}_state", args, 1); + return f(0).${vector_value} (); +#endif +} inline ColumnVector mtt_${ode} (ColumnVector &x, ColumnVector &u, const double &t, @@ -393,10 +529,37 @@ f = feval ("${sys}_${odeo}", args, 1); return f(0).${vector_value} (); #endif } +EOF +if [ "$method" != "implicit" ];then +cat <> $filename +inline ColumnVector +mtt_euler (ColumnVector &x, + const ColumnVector &dx, + const double &ddt, + const int &nx, + const ColumnVector &open_switches) +{ +#ifdef STANDALONE + return Fmtt_euler (x, dx, ddt, nx, open_switches); +#else + static octave_value_list args, f; + args (0) = octave_value (x); + args (1) = octave_value (dx); + args (2) = octave_value (ddt); + args (3) = octave_value ((double)nx); + args (4) = octave_value (open_switches); + f = feval ("mtt_euler", args, 1); + return f(0).${vector_value} (); +#endif +} + +EOF +else +cat <> $filename inline ColumnVector mtt_implicit (ColumnVector &x, ColumnVector &dx, Matrix &AA, ColumnVector &AAx, @@ -418,82 +581,10 @@ f = feval ("mtt_implicit", args, 1); return f(0).${vector_value} (); #endif } -inline ColumnVector -mtt_euler (ColumnVector &x, - const ColumnVector &dx, - const double &ddt, - const int &nx, - const ColumnVector &open_switches) -{ -#ifdef STANDALONE - return Fmtt_euler (x, dx, ddt, nx, open_switches); -#else - static octave_value_list args, f; - args (0) = octave_value (x); - args (1) = octave_value (dx); - args (2) = octave_value (ddt); - args (3) = octave_value ((double)nx); - args (4) = octave_value (open_switches); - f = feval ("mtt_euler", args, 1); - return f(0).${vector_value} (); -#endif -} - -inline ColumnVector -mtt_input (ColumnVector &x, - ColumnVector &y, - const double &t, - ColumnVector &par) -{ -#ifdef STANDALONE - return 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} (); -#endif -} - -inline ColumnVector -mtt_numpar (void) -{ -#ifdef STANDALONE - return F${sys}_numpar (); -#else - static octave_value_list args, f; - f = feval ("${sys}_numpar", args, 1); - return f(0).${vector_value} (); -#endif -} - -inline Octave_map -mtt_simpar (void) -{ -#ifdef STANDALONE - return F${sys}_simpar (); -#else - static octave_value_list args; - static Octave_map f; - f["first"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["first"]; - f["dt"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["dt"]; - f["last"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["last"]; - f["stepfactor"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["stepfactor"]; - f["wmin"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["wmin"]; - f["wmax"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["wmax"]; - f["wsteps"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["wsteps"]; - f["input"] = feval ("${sys}_simpar", args, 1)(0).map_value ()["input"]; - return (f); -#endif -} - inline Matrix mtt_smxa (ColumnVector &x, ColumnVector &u, const double &t, ColumnVector &par) @@ -528,51 +619,32 @@ f = feval ("${sys}_smxax", args, 1); return f(0).${vector_value} (); #endif } -inline ColumnVector -mtt_state (ColumnVector &x) -{ -#ifdef STANDALONE - return F${sys}_state (x); -#else - static octave_value_list args, f; - args (0) = octave_value (x); - f = feval ("${sys}_state", args, 1); - return f(0).${vector_value} (); -#endif -} - -inline ColumnVector -mtt_logic (ColumnVector &x, - ColumnVector &u, - const double &t, - ColumnVector &par) -{ -#ifdef STANDALONE - return F${sys}_logic (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}_logic", args, 1); - return f(0).${vector_value} (); -#endif -} - +EOF +fi +cat <> $filename inline void mtt_write (const double &t, ColumnVector &x, ColumnVector &y, - const int &nrows) + const int &nrows, + const bool dump_data = false, + ostream &file = 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_for_plotting (file, written_data, "MTT_data"); + return; + } + const int nx = x.length (), ny = y.length (); register int col = 0; if (0 == row) data = Matrix (nrows, 1+ny+1+nx, 0.0); @@ -585,23 +657,69 @@ data.elem (row, ++col) = x.elem (i); row++; if (nrows == row) + { #ifdef STANDALONE - cout << data << endl; + save_ascii_data_for_plotting (file, data, "MTT_data"); +// cout << data << endl; #else // ! STANDALONE set_global_value ("MTT_data", data); #endif - + } } #ifdef STANDALONE +void dump_data (ostream &file) +{ + 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"); + dump_data (corefile); + switch (signum) + { + case SIGFPE: + // Intel chips do not raise SIGFPE for DIVZERO :-( + raise (SIGABRT); + break; + case SIGINT: + break; + case SIGQUIT: + signal (SIGQUIT, SIG_DFL); + raise (SIGQUIT); + break; + default: + cerr << "# Warning: make_ode2odes needs updating!" << endl; + signal (signum, SIG_DFL); + raise (signum); + break; + } + corefile.close (); + set_signal_handlers (); +} + +void set_signal_handlers (void) +{ + signal (SIGFPE, handle_signal); + signal (SIGINT, handle_signal); + signal (SIGQUIT, handle_signal); +} + int main (void) { + set_signal_handlers (); #else DEFUN_DLD (${sys}_ode2odes, args, , -"Octave ode2odes representation of system +"Octave ode2odes representation of system with $method integration method Usage: ${sys}_ode2odes (x, par, simpar) ") { static octave_value_list retval; #endif // STANDALONE @@ -669,21 +787,55 @@ register double t = 0.0; const double ddt = dt / stepfactor; const int ilast = static_cast (round ((last - first) / ddt)) + 1; const int nrows = static_cast (round ((last - first) / dt)) + 1; + + for (register int i = 0; i < MTTNU; i++) + { + u (i) = 0.0; + } for (register int j = 0, i = 1; i <= ilast; i++) { y = mtt_${odeo} (x, u, t, par); u = mtt_input (x, y, t, par); if (0 == j) { mtt_write (t, x, y, nrows); } +EOF +if [ "$method" = "rk4" ]; then +cat << EOF >> $filename + { + static ColumnVector + k1 (MTTNX,0.0), + k2 (MTTNX,0.0), + k3 (MTTNX,0.0), + k4 (MTTNX,0.0); + + const double + t1 = t + ddt/2.0, + t2 = t + ddt; + + 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); + dx = (k1 + 2.0 * (k2 + k3) + k4) / (6.0 * ddt); + } +EOF +else +cat << EOF >> $filename dx = mtt_${ode} (x, u, t, par); EOF +fi if [ "$method" = "implicit" ]; then cat <> $filename AA = mtt_smxa (x, u, ddt, par); ADDED mttroot/mtt/bin/trans/struc_txt2m Index: mttroot/mtt/bin/trans/struc_txt2m ================================================================== --- /dev/null +++ mttroot/mtt/bin/trans/struc_txt2m @@ -0,0 +1,65 @@ +#! /bin/sh + + ###################################### + ##### Model Transformation Tools ##### + ###################################### + +# Bourne shell script: struc_txt2m + +# Structure file - txt to m conversion +# P.J.Gawthrop April 1997 +# Copyright (c) P.J.Gawthrop, 1997. + +############################################################### +## Version control history +############################################################### +## $Id$ +## $Log$ +## Revision 1.1.2.1 2001/03/06 03:52:15 geraint +## Put back struc_txt2m - required by mtt2sys. +## +############################################################### + + + +# Inform user +echo "Creating $1_struc.m" + +rm -f mtt_error + +#Write some file headers +echo "function [input_name,output_name,state_name] = $1_struc" > $1_struc.m +echo "%% Structure file ($1_struc.m)" >> $1_struc.m +echo "%% Generated by MTT at `date`" >> $1_struc.m + +# This is the main transformation using awk +awk ' +function header(what){ + print what "_name = ["; +} + +function footer(what){ + print "];"; +} + +BEGIN{ +Which=""; +apostrophe = "\047"; +} +{ + if ($1!=Which) { + if (Which!="") footer(Which); + header($1); + } + print apostrophe $4 "_" $3 apostrophe; + Which = $1; +} +END{ + footer(Which) +} +' SYSTEM=$1 < $1_struc.txt >> $1_struc.m 2>mtt_error.txt + +# Now invoke the standard error handling. +mtt_error mtt_error.txt + + Index: mttroot/mtt/cc/Makefile ================================================================== --- mttroot/mtt/cc/Makefile +++ mttroot/mtt/cc/Makefile @@ -17,12 +17,12 @@ all: $(sys)_$(rep).cc -parser: parse_m2cc.cc - g++ $< $(CFLAGS) -o parser +parser.exe: parse_m2cc.cc + g++ $< $(CFLAGS) -o ${MTTPATH}/trans/parser.exe -I${MTTPATH}/../cc/include ifeq ($(rep),ode2odes) $(sys)_ode2odes.cc: ode2odes.cc cat ode2odes.cc | sed 's/\$$/$(sys)/' > $(sys)_ode2odes.cc else Index: mttroot/mtt/cc/include/useful-functions.hh ================================================================== --- mttroot/mtt/cc/include/useful-functions.hh +++ mttroot/mtt/cc/include/useful-functions.hh @@ -1,26 +1,48 @@ - -template -inline T max (const T &x1, const T &x2) -{ - return (x1 >= x2) ? x1 : (x2 < x1) ? x2 : 0; -} - -template -inline T min (const T &x1, const T &x2) -{ - return (x1 <= x2) ? x1 : (x2 > x1) ? x2 : 0; +#ifndef HAVE_USEFUL_FUNCTIONS_HH +#define HAVE_USEFUL_FUNCTIONS_HH + + +#ifdef __CPLUSPLUS +template +#else +#define inline // strip from pre-processed file +#define class_t double +#endif // __CPLUSPLUS + + +// == Template functions == + +static inline class_t +max (const class_t &x1, const class_t &x2) +{ + return ((x1 >= x2) ? x1 : (x1 < x2) ? x2 : 0); +} + +static inline class_t +min (const class_t &x1, const class_t &x2) +{ + return ((x1 <= x2) ? x1 : (x1 > x2) ? x2 : 0); +} + +static inline class_t +sign (const class_t &x) +{ + return ((x > 0) ? +1 : (x < 0) ? -1 : 0); } -inline Matrix + +// == Octave functions == + +static inline Matrix ones (const int r = 1, const int c = 1) { Matrix m (r, c, 1.0); return m; } -inline ColumnVector +static inline ColumnVector 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++) @@ -37,28 +59,20 @@ { return (v.extract (0, --j)); } } -inline ColumnVector +static inline ColumnVector zeros (const int r) { ColumnVector v (r, 0.0); return v; } -inline Matrix +static inline Matrix zeros (const int r, const int c) { Matrix m (r, c, 0.0); return m; } -template -inline int -sign (T x) -{ - return - (0 < x) ? +1 : - (0 > x) ? -1 : - 0; -} +#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,16 @@ /* $Id$ * $Log$ + * 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. + * + * Revision 1.1 2000/12/28 09:46:05 peterg + * put under RCS + * * Revision 1.1 2000/10/31 04:29:50 geraint * Initial revision * */ @@ -199,15 +208,13 @@ * get remainder of line in case there are any commented keywords */ char c; cout << " // "; cin >> c; - while (c != '\n' && c != EOF) - { - cout << c; - cin >> c; - } + do { + cout << c; + } while (c != '\n' && cin >> c); cout << endl << indent () << ';' << endl << indent (); } @@ -309,10 +316,22 @@ */ << indent () << ';' << endl << indent (); } buf = ""; + break; + case '\\': + cin >> c; + if ('\n' == c) + { + buf += '\n'; + } + else + { + buf += '\\'; + buf += c; + } break; default: buf += c; } if (lbrace->get_nesting_depth ()) Index: mttroot/mtt/cc/sympar_txt2h.sh ================================================================== --- mttroot/mtt/cc/sympar_txt2h.sh +++ mttroot/mtt/cc/sympar_txt2h.sh @@ -1,8 +1,15 @@ #! /bin/sh # $Id$ # $Log$ +# Revision 1.2.2.1 2001/03/16 03:56:54 geraint +# Convert variable names to lower case. +# +# Revision 1.2 2001/02/05 13:03:19 geraint +# Restrict scope of variables to file (static). +# Warn GCC that variables may be unused. +# # Revision 1.7 2001/01/09 15:43:50 geraint # Warn gcc that variables may be unused. # # Revision 1.6 2001/01/08 05:47:56 geraint # Restrict scope of variables to file (static) @@ -41,11 +48,11 @@ IN=${SYS}_sympar.txt OUT=${SYS}_sympar.h declare_sys_param () { -cat ${IN} | awk '{printf ("static double %s MTT_UNUSED;\t// %s\n", $1, $2)}' +cat ${IN} | awk '{printf ("static double %s MTT_UNUSED;\t// %s\n", tolower($1), $2)}' } declare_temp_vars () { for name in ${TMP_VAR_NAMES} Index: mttroot/mtt/lib/cc/mtt_implicit.cc ================================================================== --- mttroot/mtt/lib/cc/mtt_implicit.cc +++ mttroot/mtt/lib/cc/mtt_implicit.cc @@ -14,47 +14,48 @@ DEFUN_DLD (mtt_implicit, args, , "implicit integration method") { #ifdef OCTAVE_DEV static ColumnVector x = args(0).column_vector_value (); - const ColumnVector dx = args(1).column_vector_value (); - const Matrix AA = args(2).matrix_value (); - const ColumnVector AAx = args(3).column_vector_value (); - const double t = args(4).double_value (); - const int Nx = (int) (args(5).double_value ()); - const ColumnVector openx = args(6).column_vector_value (); + static ColumnVector dx = args(1).column_vector_value (); + static Matrix AA = args(2).matrix_value (); + static ColumnVector AAx = args(3).column_vector_value (); + const double t = args(4).double_value (); + const int Nx = (int) (args(5).double_value ()); + const ColumnVector openx = args(6).column_vector_value (); #else // !OCTAVE_DEV static ColumnVector x = args(0).vector_value (); - const ColumnVector dx = args(1).vector_value (); - const Matrix AA = args(2).matrix_value (); - const ColumnVector AAx = args(3).vector_value (); - const double t = args(4).double_value (); - const int Nx = (int) (args(5).double_value ()); - const ColumnVector openx = args(6).vector_value (); + static ColumnVector dx = args(1).vector_value (); + static Matrix AA = args(2).matrix_value (); + static ColumnVector AAx = args(3).vector_value (); + const double t = args(4).double_value (); + const int Nx = (int) (args(5).double_value ()); + const ColumnVector openx = args(6).vector_value (); #endif // OCTAVE_DEV #endif // STANDALONE register int row, col; for (row = 0; row < Nx; row++) { - if (0 != openx (row)) + if (openx (row) > 0.5) { AAx (row) = 0.0; dx (row) = 0.0; for (col = 0; col < Nx; col++) { AA (row,col) = 0.0; + AA (col,row) = 0.0; } } } x = static_cast (xleftdiv (AA, static_cast(AAx + dx * t))); for (row = 0; row < Nx; row++) { - if (0 != openx (row)) + if (openx (row) > 0.5) { x (row) = 0.0; } } DELETED mttroot/mtt/lib/rep/standalone_rep.make Index: mttroot/mtt/lib/rep/standalone_rep.make ================================================================== --- mttroot/mtt/lib/rep/standalone_rep.make +++ /dev/null @@ -1,59 +0,0 @@ -# -*-makefile-*- - -.POSIX: - -MTTFLAGS = -q -u -oct $(OPTS) - -# Adapt according to local set-up and mkoctfile -CXX = g++ -CXXFLAGS = $(DEBUG) $(OPTIM) $(DEFINES) $(ARCHFLAGS) -fno-rtti -fno-exceptions -fno-implicit-templates - -DEBUG = -g -OPTIM = -O3 - -PREFIX = /usr/local - -INCLUDES = -I$(PREFIX)/include/octave - -OCTAVE_SRC_PATH = /cvs/octave - -LIBOCTAVE = -L$(PREFIX)/lib/octave -loctave -lcruft -loctinterp -LIBKPATHSEA = -L$(OCTAVE_SRC_PATH)/kpathsea -lkpathsea -LIBREADLINE = -L$(OCTAVE_SRC_PATH)/readline -lreadline -#LIBBLAS = -L/usr/local/src/ATLAS/lib/Linux_PIII -lcblas -lf77blas -llapack -latlas -ltstatlas -#LIBBLAS = -lblas -llapack -LIBF2C = -lg2c -LIBRARIES = -ldl -lm -lncurses - -ARCHFLAGS = $(i386FLAGS) -i386FLAGS = -mieee-fp - -# Define -DOCTAVE_DEV for octave 2.1.x -ifeq (0, $(shell octave --version | awk -F\. '{print $2}')) -DEFINES = -DSTANDALONE -else -DEFINES = -DSTANDALONE -DOCTAVE_DEV -endif - -all: $(SYS)_standalone.$(LANG) - -$(SYS)_standalone.exe: $(SYS)_ode2odes.cc $(SYS)_def.h $(SYS)_sympar.h - cp $(MTT_LIB)/cc/*.cc . - echo Creating $(SYS)_standalone.exe - $(CXX) *.cc -o $@ $(CXXFLAGS) $(INCLUDES) $(LIBOCTAVE) $(LIBKPATHSEA) $(LIBREADLINE) $(LIBBLAS) $(LIBF2C) $(LIBRARIES) - -.PHONY: $(SYS)_standalone.clean - -$(SYS)_ode2odes.cc: - mtt $(MTTFLAGS) $(SYS) ode2odes m - -$(SYS)_def.h: - mtt $(MTTFLAGS) $(SYS) def h - -$(SYS)_sympar.h: - mtt $(MTTFLAGS) $(SYS) sympar h - - -$(SYS)_standalone.clean: - cd .. ; mtt Clean - rm -f ../$(SYS)_standalone.exe