%% File : sfun_directlook.tlc %% Abstract: %% Level-2 S-function sfun_directlook block target file. %% It is using direct lookup algorithm without interpolation %% %% Copyright 1990-2000 The MathWorks, Inc. %% $Revision: 1.5 $ %implements "sfun_directlook" "C" %% Function: BlockTypeSetup ==================================================== %% Abstract: %% Place include and function prototype in the model's header file. %% %function BlockTypeSetup(block, system) void %% To add this external function's prototype in the header of the generated %% file. %% %openfile buffer extern int_T GetDirectLookupIndex(const real_T *x, int_T xlen, real_T u); %closefile buffer % %endfunction %% Function: mdlOutputs ======================================================== %% Abstract: %% Direct 1-D lookup table S-function example. %% Here we are trying to compute an approximate solution, p(x) to an %% unknown function f(x) at x=x0, given data point pairs (x,y) in the %% form of a x data vector and a y data vector. For a given data pair %% (say the i'th pair), we have y_i = f(x_i). It is assumed that the x %% data values are monotonically increasing. If the first or last x is %% outside of the range of the x data vector, then the first or last %% point will be returned. %% %% This function returns the "nearest" y0 point for a given x0. %% No interpolation is performed. %% %% The S-function parameters are: %% XData %% YData %% XEvenlySpaced: 0 or 1 %% The third parameter cannot be changed during execution and is %% written to the model.rtw file in XSpacing filed of the SFcnParamSettings %% record as "EvenlySpaced" or "UnEvenlySpaced". The first two parameters %% can change during execution and show up in the parameter vector. %% %function Outputs(block, system) Output /* % Block: % */ { %assign rollVars = ["U", "Y"] %% %% Load XData and YData as local variables %% real_T *xData = %; real_T *yData = %; %assign xDataLen = SIZE(XData.Value, 1) %% %% When the XData is evenly spaced, we use the direct lookup algorithm %% to locate the lookup index. %% %if SFcnParamSettings.XSpacing == "EvenlySpaced" real_T spacing = xData[1] - xData[0]; %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars %assign u = LibBlockInputSignal(0, "", lcv, idx) %assign y = LibBlockOutputSignal(0, "", lcv, idx) if ( % <= xData[0] ) { % = yData[0]; } else if ( % >= yData[%] ) { % = yData[%]; } else { int_T idx = (int_T)( ( % - xData[0] ) / spacing ); % = yData[idx]; } %% %% Generate an empty line if we are not rolling, %% so that it looks nice in the generated code. %% %if lcv == "" %endif %endroll %else %% When the XData is unevenly spaced, we use a bisection search to %% locate the lookup index. int_T idx; %assign xDataAddr = LibBlockParameterAddr(XData, "", "", 0) %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars %assign u = LibBlockInputSignal(0, "", lcv, idx) idx = GetDirectLookupIndex(xData, %, %); %assign y = LibBlockOutputSignal(0, "", lcv, idx) % = yData[idx]; %% %% Generate an empty line if we are not rolling, %% so that it looks nice in the generated code. %% %if lcv == "" %endif %endroll %endif } %endfunction %% EOF: sfun_directlook.tlc