/* * File: fuc.c * * Code generated for Simulink model 'fuc'. * * Model version : 1.18 * Simulink Coder version : 9.8 (R2022b) 13-May-2022 * C/C++ source code generated on : Sat Jan 6 10:24:46 2024 * * Target selection: ert.tlc * Embedded hardware selection: ARM Compatible->ARM 64-bit (LP64) * Code generation objectives: Unspecified * Validation result: Not run */ #include "fuc.h" #include "rtwtypes.h" #include #include "fuc_private.h" #include "rt_nonfinite.h" /* Block signals (default storage) */ B_fuc_T fuc_B; /* Continuous states */ X_fuc_T fuc_X; /* Real-time model */ static RT_MODEL_fuc_T fuc_M_; RT_MODEL_fuc_T *const fuc_M = &fuc_M_; /* * This function updates continuous states using the ODE3 fixed-step * solver algorithm */ static void rt_ertODEUpdateContinuousStates(RTWSolverInfo *si ) { /* Solver Matrices */ static const real_T rt_ODE3_A[3] = { 1.0/2.0, 3.0/4.0, 1.0 }; static const real_T rt_ODE3_B[3][3] = { { 1.0/2.0, 0.0, 0.0 }, { 0.0, 3.0/4.0, 0.0 }, { 2.0/9.0, 1.0/3.0, 4.0/9.0 } }; time_T t = rtsiGetT(si); time_T tnew = rtsiGetSolverStopTime(si); time_T h = rtsiGetStepSize(si); real_T *x = rtsiGetContStates(si); ODE3_IntgData *id = (ODE3_IntgData *)rtsiGetSolverData(si); real_T *y = id->y; real_T *f0 = id->f[0]; real_T *f1 = id->f[1]; real_T *f2 = id->f[2]; real_T hB[3]; int_T i; int_T nXc = 3; rtsiSetSimTimeStep(si,MINOR_TIME_STEP); /* Save the state values at time t in y, we'll use x as ynew. */ (void) memcpy(y, x, (uint_T)nXc*sizeof(real_T)); /* Assumes that rtsiSetT and ModelOutputs are up-to-date */ /* f0 = f(t,y) */ rtsiSetdX(si, f0); fuc_derivatives(); /* f(:,2) = feval(odefile, t + hA(1), y + f*hB(:,1), args(:)(*)); */ hB[0] = h * rt_ODE3_B[0][0]; for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0]); } rtsiSetT(si, t + h*rt_ODE3_A[0]); rtsiSetdX(si, f1); fuc_step(); fuc_derivatives(); /* f(:,3) = feval(odefile, t + hA(2), y + f*hB(:,2), args(:)(*)); */ for (i = 0; i <= 1; i++) { hB[i] = h * rt_ODE3_B[1][i]; } for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1]); } rtsiSetT(si, t + h*rt_ODE3_A[1]); rtsiSetdX(si, f2); fuc_step(); fuc_derivatives(); /* tnew = t + hA(3); ynew = y + f*hB(:,3); */ for (i = 0; i <= 2; i++) { hB[i] = h * rt_ODE3_B[2][i]; } for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1] + f2[i]*hB[2]); } rtsiSetT(si, tnew); rtsiSetSimTimeStep(si,MAJOR_TIME_STEP); } real_T rt_powd_snf(real_T u0, real_T u1) { real_T y; if (rtIsNaN(u0) || rtIsNaN(u1)) { y = (rtNaN); } else { real_T tmp; real_T tmp_0; tmp = fabs(u0); tmp_0 = fabs(u1); if (rtIsInf(u1)) { if (tmp == 1.0) { y = 1.0; } else if (tmp > 1.0) { if (u1 > 0.0) { y = (rtInf); } else { y = 0.0; } } else if (u1 > 0.0) { y = 0.0; } else { y = (rtInf); } } else if (tmp_0 == 0.0) { y = 1.0; } else if (tmp_0 == 1.0) { if (u1 > 0.0) { y = u0; } else { y = 1.0 / u0; } } else if (u1 == 2.0) { y = u0 * u0; } else if ((u1 == 0.5) && (u0 >= 0.0)) { y = sqrt(u0); } else if ((u0 < 0.0) && (u1 > floor(u1))) { y = (rtNaN); } else { y = pow(u0, u1); } } return y; } /* Model step function */ void fuc_step(void) { real_T rtb_Sum; real_T rtb_Sum_tmp; real_T rtb_y; real_T rtb_y_c; real_T y_j_tmp; if (rtmIsMajorTimeStep(fuc_M)) { /* set solver stop time */ rtsiSetSolverStopTime(&fuc_M->solverInfo,((fuc_M->Timing.clockTick0+1)* fuc_M->Timing.stepSize0)); } /* end MajorTimeStep */ /* Update absolute time of base rate at minor time step */ if (rtmIsMinorTimeStep(fuc_M)) { fuc_M->Timing.t[0] = rtsiGetT(&fuc_M->solverInfo); } /* Clock: '/t' */ rtb_y = fuc_M->Timing.t[0]; /* MATLAB Function: '/sint' incorporates: * Clock: '/t' * MATLAB Function: '/ddsint' * SignalConversion generated from: '/ SFunction ' */ rtb_Sum_tmp = sin(0.20943951023931953 * rtb_y); /* Sum: '/Sum' incorporates: * Integrator: '/sys' * MATLAB Function: '/sint' * SignalConversion generated from: '/ SFunction ' */ rtb_Sum = rtb_Sum_tmp * 0.0 - fuc_X.sys_CSTATE; /* MATLAB Function: '/dsint' incorporates: * Clock: '/t' * SignalConversion generated from: '/ SFunction ' */ rtb_y_c = cos(0.20943951023931953 * rtb_y) * 0.0; /* Integrator: '/Integrator' */ fuc_B.x2 = fuc_X.Integrator_CSTATE; /* MATLAB Function: '/u(2)+u(1)*u(3)-u(4)' incorporates: * SignalConversion generated from: '/ SFunction ' */ rtb_y = (rtb_y_c + rtb_Sum) - fuc_B.x2; /* MATLAB Function: '/u' incorporates: * Integrator: '/sys' * MATLAB Function: '/-u(3)//u(2)*u(1)^3+u(4)//u(2)' * MATLAB Function: '/u(1)//u(3)*u(2)^3' */ y_j_tmp = rt_powd_snf(fuc_X.sys_CSTATE, 3.0); /* MATLAB Function: '/-u(3)//u(2)*u(1)^3+u(4)//u(2)' incorporates: * Integrator: '/Integrator1' * MATLAB Function: '/u' * MATLAB Function: '/ddsint' * SignalConversion generated from: '/ SFunction ' * SignalConversion generated from: '/ SFunction ' */ fuc_B.y_j = ((((rtb_Sum_tmp * -0.0 + rtb_Sum) + (rtb_y_c - fuc_B.x2)) + fuc_X.Integrator1_CSTATE * y_j_tmp) + rtb_y) - y_j_tmp; /* MATLAB Function: '/u(1)//u(3)*u(2)^3' incorporates: * SignalConversion generated from: '/ SFunction ' */ fuc_B.y = rtb_y * y_j_tmp; if (rtmIsMajorTimeStep(fuc_M)) { rt_ertODEUpdateContinuousStates(&fuc_M->solverInfo); /* Update absolute time for base rate */ /* The "clockTick0" counts the number of times the code of this task has * been executed. The absolute time is the multiplication of "clockTick0" * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not * overflow during the application lifespan selected. */ ++fuc_M->Timing.clockTick0; fuc_M->Timing.t[0] = rtsiGetSolverStopTime(&fuc_M->solverInfo); { /* Update absolute timer for sample time: [10.0s, 0.0s] */ /* The "clockTick1" counts the number of times the code of this task has * been executed. The resolution of this integer timer is 10.0, which is the step size * of the task. Size of "clockTick1" ensures timer will not overflow during the * application lifespan selected. */ fuc_M->Timing.clockTick1++; } } /* end MajorTimeStep */ } /* Derivatives for root system: '' */ void fuc_derivatives(void) { XDot_fuc_T *_rtXdot; _rtXdot = ((XDot_fuc_T *) fuc_M->derivs); /* Derivatives for Integrator: '/sys' */ _rtXdot->sys_CSTATE = fuc_B.x2; /* Derivatives for Integrator: '/Integrator' */ _rtXdot->Integrator_CSTATE = fuc_B.y_j; /* Derivatives for Integrator: '/Integrator1' */ _rtXdot->Integrator1_CSTATE = fuc_B.y; } /* Model initialize function */ void fuc_initialize(void) { /* Registration code */ /* initialize non-finites */ rt_InitInfAndNaN(sizeof(real_T)); { /* Setup solver object */ rtsiSetSimTimeStepPtr(&fuc_M->solverInfo, &fuc_M->Timing.simTimeStep); rtsiSetTPtr(&fuc_M->solverInfo, &rtmGetTPtr(fuc_M)); rtsiSetStepSizePtr(&fuc_M->solverInfo, &fuc_M->Timing.stepSize0); rtsiSetdXPtr(&fuc_M->solverInfo, &fuc_M->derivs); rtsiSetContStatesPtr(&fuc_M->solverInfo, (real_T **) &fuc_M->contStates); rtsiSetNumContStatesPtr(&fuc_M->solverInfo, &fuc_M->Sizes.numContStates); rtsiSetNumPeriodicContStatesPtr(&fuc_M->solverInfo, &fuc_M->Sizes.numPeriodicContStates); rtsiSetPeriodicContStateIndicesPtr(&fuc_M->solverInfo, &fuc_M->periodicContStateIndices); rtsiSetPeriodicContStateRangesPtr(&fuc_M->solverInfo, &fuc_M->periodicContStateRanges); rtsiSetErrorStatusPtr(&fuc_M->solverInfo, (&rtmGetErrorStatus(fuc_M))); rtsiSetRTModelPtr(&fuc_M->solverInfo, fuc_M); } rtsiSetSimTimeStep(&fuc_M->solverInfo, MAJOR_TIME_STEP); fuc_M->intgData.y = fuc_M->odeY; fuc_M->intgData.f[0] = fuc_M->odeF[0]; fuc_M->intgData.f[1] = fuc_M->odeF[1]; fuc_M->intgData.f[2] = fuc_M->odeF[2]; fuc_M->contStates = ((X_fuc_T *) &fuc_X); rtsiSetSolverData(&fuc_M->solverInfo, (void *)&fuc_M->intgData); rtsiSetIsMinorTimeStepWithModeChange(&fuc_M->solverInfo, false); rtsiSetSolverName(&fuc_M->solverInfo,"ode3"); rtmSetTPtr(fuc_M, &fuc_M->Timing.tArray[0]); fuc_M->Timing.stepSize0 = 10.0; /* InitializeConditions for Integrator: '/sys' */ fuc_X.sys_CSTATE = 0.0; /* InitializeConditions for Integrator: '/Integrator' */ fuc_X.Integrator_CSTATE = 0.0; /* InitializeConditions for Integrator: '/Integrator1' */ fuc_X.Integrator1_CSTATE = 0.0; } /* Model terminate function */ void fuc_terminate(void) { /* (no terminate code required) */ } /* * File trailer for generated code. * * [EOF] */