82 lines
2.3 KiB
C++
82 lines
2.3 KiB
C++
/*
|
|
* look1_pbinlxpw.cpp
|
|
*
|
|
* Academic License - for use in teaching, academic research, and meeting
|
|
* course requirements at degree granting institutions only. Not for
|
|
* government, commercial, or other organizational use.
|
|
*
|
|
* Code generation for model "VFControl".
|
|
*
|
|
* Model version : 1.1
|
|
* Simulink Coder version : 24.1 (R2024a) 19-Nov-2023
|
|
* C++ source code generated on : Wed Oct 16 10:45:53 2024
|
|
* Created for block: VFControl
|
|
*/
|
|
|
|
#include "look1_pbinlxpw.h"
|
|
#include "rtwtypes.h"
|
|
|
|
real_T look1_pbinlxpw(real_T u0, const real_T bp0[], const real_T table[],
|
|
uint32_T prevIndex[], uint32_T maxIndex)
|
|
{
|
|
real_T frac;
|
|
real_T yL_0d0;
|
|
uint32_T bpIdx;
|
|
|
|
/* Column-major Lookup 1-D
|
|
Search method: 'binary'
|
|
Use previous index: 'on'
|
|
Interpolation method: 'Linear point-slope'
|
|
Extrapolation method: 'Linear'
|
|
Use last breakpoint for index at or above upper limit: 'off'
|
|
Remove protection against out-of-range input in generated code: 'off'
|
|
*/
|
|
/* Prelookup - Index and Fraction
|
|
Index Search method: 'binary'
|
|
Extrapolation method: 'Linear'
|
|
Use previous index: 'on'
|
|
Use last breakpoint for index at or above upper limit: 'off'
|
|
Remove protection against out-of-range input in generated code: 'off'
|
|
*/
|
|
if (u0 <= bp0[0U]) {
|
|
bpIdx = 0U;
|
|
frac = (u0 - bp0[0U]) / (bp0[1U] - bp0[0U]);
|
|
} else if (u0 < bp0[maxIndex]) {
|
|
uint32_T found;
|
|
uint32_T iLeft;
|
|
uint32_T iRght;
|
|
|
|
/* Binary Search using Previous Index */
|
|
bpIdx = prevIndex[0U];
|
|
iLeft = 0U;
|
|
iRght = maxIndex;
|
|
found = 0U;
|
|
while (found == 0U) {
|
|
if (u0 < bp0[bpIdx]) {
|
|
iRght = bpIdx - 1U;
|
|
bpIdx = ((bpIdx + iLeft) - 1U) >> 1U;
|
|
} else if (u0 < bp0[bpIdx + 1U]) {
|
|
found = 1U;
|
|
} else {
|
|
iLeft = bpIdx + 1U;
|
|
bpIdx = ((bpIdx + iRght) + 1U) >> 1U;
|
|
}
|
|
}
|
|
|
|
frac = (u0 - bp0[bpIdx]) / (bp0[bpIdx + 1U] - bp0[bpIdx]);
|
|
} else {
|
|
bpIdx = maxIndex - 1U;
|
|
frac = (u0 - bp0[maxIndex - 1U]) / (bp0[maxIndex] - bp0[maxIndex - 1U]);
|
|
}
|
|
|
|
prevIndex[0U] = bpIdx;
|
|
|
|
/* Column-major Interpolation 1-D
|
|
Interpolation method: 'Linear point-slope'
|
|
Use last breakpoint for index at or above upper limit: 'off'
|
|
Overflow mode: 'portable wrapping'
|
|
*/
|
|
yL_0d0 = table[bpIdx];
|
|
return (table[bpIdx + 1U] - yL_0d0) * frac + yL_0d0;
|
|
}
|