%% $RCSFile:$ %% File : sfun_idxsearch.tlc generated from sfun_idxsearch.ttlc revsion 1.4 %% $Date: 2000/03/02 22:39:23 $ %% %% Rob Aberg, 14-Aug-1999 %% Copyright 1990-2000 The MathWorks, Inc. %% %% Abstract: Index search and fraction calculation for breakpoint set. %implements sfun_idxsearch "C" %% Start ====================================================================== %% Abstract: %% Initialize the state information (first input & time) %% %function Start(block, system) Output /* PreLook-Up Index Search Block: % */ %assign rollVars = ["Mode"] %assign rollRegion = [0:%] %roll idx = rollRegion, lcv = RollThreshold, block, "Roller", rollVars %assign m = LibBlockMode("", lcv, idx) % = 0; %endroll %endfunction %% Function: Outputs ========================================================== %% Abstract: %% Set up to perform linear, binary search or direct calculation. %% Determines index of lower side of interval plus distance fraction %% into the interval [0,1) %% %function Outputs(block, system) Output /* PreLook-Up Index Search Block: % */ %assign otype = LibBlockOutputSignalDataTypeName(0,"") %assign wtype = LibBlockParameterDataTypeName(bpData,"") %if SFcnParamSettings.outputMode == 0 %assign itype = "uint_T" %else %assign itype = otype %endif %assign numEl = DataInputPort[0].Width { %if numEl > 1 %assign bpSize = LibBlockParameterSize(bpData) %assign declbpData = "const % *bpData" % = %; uint_T maxIdx = %; %if ( SFcnParamSettings.outputMode == 0 && ... SFcnParamSettings.searchMode == 3 ) || ... SFcnParamSettings.searchMode == 2 || ... SFcnParamSettings.extrapMethod != 1 % lambda; %endif uint_T i; for (i=0; i < %; i++) { %assign istr = "i" %assign istr2 = "2*i" %assign istr21 = "2*i+1" %else %assign istr = "0" %assign istr2 = "0" %assign istr21 = "1" %endif %assign u = LibBlockInputSignal(0, istr, "", "") %if SFcnParamSettings.outputMode == 0 %assign y0 = LibBlockOutputSignal(0, istr2, "", "") %assign py0 = LibBlockOutputSignalAddr(0, istr2, "", "") %assign y1 = LibBlockOutputSignal(0, istr21, "", "") %else %assign y0 = LibBlockOutputSignal(0, istr, "", "") %endif %% %if SFcnParamSettings.rangeErrorMode < 3 || ... SFcnParamSettings.searchMode > 1 %if numEl == 1 %assign bpSize = LibBlockParameterSize(bpData) %assign declbpData = "const % *bpData" % = %; uint_T maxIdx = %; %if ( SFcnParamSettings.outputMode == 0 && ... SFcnParamSettings.searchMode == 3 ) || ... SFcnParamSettings.searchMode == 2 || ... SFcnParamSettings.extrapMethod != 1 % lambda; %endif %endif %if SFcnParamSettings.searchMode != 1 || ... SFcnParamSettings.extrapMethod != 1 boolean_T bpFound = false; %endif % u = %; %if SFcnParamSettings.searchMode > 1 %% an actual search? %if SFcnParamSettings.cacheBpFlag == 1 % index = %; \ /* get previous index */ %else % index = 0; %endif %else % index; %endif %endif %if SFcnParamSettings.extrapMethod == 1 /* clipping */ %if SFcnParamSettings.rangeErrorMode != 3 %if SFcnParamSettings.searchMode == 1 u = (u < bpData[0]) ? bpData[0] : ((u > bpData[maxIdx]) ? bpData[maxIdx] : u); %else if (u < bpData[0]) { index = 0; %if SFcnParamSettings.outputMode == 0 lambda = 0.0; %endif bpFound = true; } else if (u > bpData[maxIdx]) { %if SFcnParamSettings.outputMode == 0 index = maxIdx - 1; lambda = 1.0; %else index = maxIdx; %endif bpFound = true; } %endif %endif %else %% %% possible only if outputting index and fraction /* extrapolate input if needed (linear) */ if (u < bpData[0]) { index = 0; lambda = (u - bpData[0]) / (bpData[1] - bpData[0]); bpFound = true; } else if (u > bpData[maxIdx]) { index = maxIdx - 1; lambda = (u - bpData[maxIdx-1]) / ... (bpData[maxIdx] - bpData[maxIdx-1]); bpFound = true; } %endif %% %switch (SFcnParamSettings.searchMode) %case 1 %if SFcnParamSettings.extrapMethod > 1 if (bpFound == false) { %endif /* directly calculate index and fraction */ %if SFcnParamSettings.outputMode == 0 %if wtype == "real32_T" || wtype == "const real32_T *" %% no single version of modf(), use casts % = (u - %) / (% - ... %); %if SFcnParamSettings.extrapMethod == 1 index = (%)%; if ( index == maxIdx ) { % = (%)(index-1); % = 1.0F; } else { % = (%)index; % -= %; } %else % = (%)(%)%; % -= %; %endif %else % = modf((u - %) / (% - ... %), %); index = (%)%; if ( index == maxIdx ) { % = (%)(index-1); % = 1.0; } %endif %else %% want index only % = %((u - %) / (% - ... %)); %endif %if SFcnParamSettings.extrapMethod > 1 } else { %if SFcnParamSettings.outputMode == 0 if ( index == maxIdx ) { % = (%)(index-1); % = 1.0; } else { % = (%)index; % = lambda; } %else % = index; %endif } %endif %break %case 2 %% lambda is always part of the algorithm, even if %% it isn't part of the output /* perform in-range linear search for [ u ) */ while (bpFound == false) { lambda = (u - bpData[index]) / (bpData[index+1] - bpData[index]); /* check result */ if (lambda >= 0.0 && lambda < 1.0 ) { bpFound = true; } else if (lambda > 1.0) { index++; } else if (lambda < 0.0) { index--; } else if (lambda == 1.0) { bpFound = true; if ( index < (maxIdx-1) ) { index++; lambda = 0.0; } } } % = (%)index; %if SFcnParamSettings.outputMode == 0 % = lambda; %endif %break %case 3 /* perform in-range binary search for [ u ) */ if (bpFound == false) { uint_T bottom = 0; uint_T top = maxIdx; while (bpFound == false) { if (u < bpData[index]) { top = index - 1; index = (top + bottom) / 2; } else if (u <= bpData[index+1]) { bpFound = true; if ( u == bpData[index+1] ) { index++; } } else { bottom = index + 1; index = (top + bottom) / 2; } } %if SFcnParamSettings.outputMode == 0 if ( index == maxIdx ) { index--; lambda = 1.0; } else { lambda = (u - bpData[index]) / (bpData[index+1] - bpData[index]); } %endif } %if SFcnParamSettings.outputMode == 0 % = (%)index; % = lambda; %else % = index; %endif %endswitch %% %if SFcnParamSettings.searchMode > 1 && ... SFcnParamSettings.cacheBpFlag == 1 % = index; %endif %% %if numEl > 1 } %endif } %endfunction