Code covered by the BSD License  

Highlights from
Solving Index-1 DAEs in Simulink using Level-2 M S-functions

from Solving Index-1 DAEs in Simulink using Level-2 M S-functions by Atul Bhargav
This example illustrates the use of Simulink Level-2 S-functions to solve Index-I DAEs

HB1_DAE_sfun(block)
function HB1_DAE_sfun(block)
% Level-2 M file S-Function for times two demo.
%   Copyright 1990-2004 The MathWorks, Inc.
%   $Revision: 1.1.6.1 $ 

  setup(block);
  
%endfunction

function setup(block)
  
  %% Register number of dialog parameters
  block.NumdialogPrms = 2;

  %% Register number of input and output ports
  block.NumInputPorts  = 1;
  block.NumOutputPorts = 3;

  %% Setup functional port properties to dynamically
  %% inherited.
  block.SetPreCompInpPortInfoToDynamic;
  block.SetPreCompOutPortInfoToDynamic;
 
  block.InputPort(1).Dimensions        = 1;
  block.InputPort(1).DirectFeedthrough = true;
  
  block.OutputPort(1).Dimensions       = 1;
  block.OutputPort(2).Dimensions       = 1;
  block.OutputPort(3).Dimensions       = 1;
  
  block.NumContStates = 2;
  
  block.RegBlockMethod('InitializeConditions',    @InitConditions);  
  block.RegBlockMethod('Outputs',                 @Output);  
  block.RegBlockMethod('Derivatives',             @Derivative);  
  
  block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
  
%endfunction

function InitConditions(block)

  %% Initialize Dwork
  block.ContStates.Data(1) = block.DialogPrm(1).Data;
  block.ContStates.Data(2) = block.DialogPrm(2).Data;
  
%endfunction

function Output(block)

y1 = block.ContStates.Data(1);
y2 = block.ContStates.Data(2);
y3 = block.InputPort(1).Data;

block.OutputPort(1).Data = y1;
block.OutputPort(2).Data = y2;
block.OutputPort(3).Data = y1 + y2 + y3 - 1;
%endfunction

function Derivative(block)

y1 = block.ContStates.Data(1);
y2 = block.ContStates.Data(2);
y3 = block.InputPort(1).Data;

block.Derivatives.Data = [-0.04 * y1 + 1e4 * y2 * y3;
    0.04 * y1 - 1e4 * y2 * y3 - 3e7 * y2^2];
  
%endfunction

function SetInpPortFrameData(block, idx, fd)
  
  block.InputPort(idx).SamplingMode = fd;
  block.OutputPort(1).SamplingMode  = fd;
  block.OutputPort(2).SamplingMode  = fd;
  block.OutputPort(3).SamplingMode  = fd;
  
%endfunction

Contact us at files@mathworks.com