function [t,y,y_theta,x,x_last] = mtt_stime(system_name,theta,free);
  ## usage: [t,y,y_theta,x,x_last] = mtt_stime(system_name,theta);
  ##
  ## Simulate system with name system_name and parameter vector theta
  ## The order of components in theta is determined in system_numpar.txt:
  ## y_theta contains the corresponding sensitivity functions
  ## Assumes system generated by the sBG approach
  ## Copyright (C) 1999 by Peter J. Gawthrop

  ## 	$Id$	

  ## Simulate using mtt-generated function

  N = length(theta);

  eval(sprintf("[nx,ny,nu,nz,nyz] = %s_def;", system_name));
  if nargin<3
    free = 1;
  endif
  
  y_theta = [];

  if length(free)==0
    free=1;			# Make the loop happen once to get y and X
  endif
  
  [n,m]  = size(free);
  if m==1
    free = free';
  endif
  
  for i=free
    args=sprintf("%i",i);
    for j=1:length(theta)
      args = sprintf("%s %g",args, theta(j));
    endfor

    ## Run system and replace NaN by 1e30 -- easier to handle
    file_name = sprintf("%s_input.dat", system_name);
    if exist(file_name)==2	# Then use data from this file ...
      command = sprintf("./%s_ode2odes.out %s < %s | sed \'s/NAN/Inf/g\' >mtt_out_data.dat\n", ...
			system_name, args, file_name);
    else
      command = sprintf("./%s_ode2odes.out %s | sed \'s/NAN/Inf/g\' >mtt_out_data.dat\n", ...
			system_name, args);
    endif
      
   system(command);

    ## Retrieve out_data
    load -force mtt_out_data.dat
    y_theta = [y_theta mtt_out_data(:,3:2:1+ny)];
  endfor

  ## System out_data
  [n,m]=size(mtt_out_data);
  t = mtt_out_data(:,1);
  y = mtt_out_data(:,2:2:ny);
  x = mtt_out_data(:,3+ny:m);
  x_last = mtt_out_data(n,3+ny:m);
endfunction



