a2clcd.c

来自「一个simulink中调用m函数的例子」· C语言 代码 · 共 229 行

C
229
字号
/*
 * MATLAB Compiler: 2.0.1
 * Date: Wed Oct 17 15:45:46 2001
 * Arguments: "-h" "-x" "vxdot.m" 
 */
#include "a2clcd.h"

/*
 * The function "Ma2clcd" is the implementation version of the "a2clcd"
 * M-function from file "E:\RTW\NEW3\A2CLCD.M" (lines 1-39). It contains the
 * actual compiled code for that M-function. It is a static function and must
 * only be called from one of the interface functions, appearing below.
 */
/*
 * function [Cl, Cd] = a2clcd(alfa)
 */
static mxArray * Ma2clcd(mxArray * * Cd, int nargout_, mxArray * alfa) {
    mxArray * Cl = mclGetUninitializedArray();
    mxArray * ALFA1 = mclGetUninitializedArray();
    mxArray * ALFA2 = mclGetUninitializedArray();
    mxArray * C1 = mclGetUninitializedArray();
    mxArray * C2 = mclGetUninitializedArray();
    mxArray * C3 = mclGetUninitializedArray();
    mxArray * C4 = mclGetUninitializedArray();
    mxArray * CDmin = mclGetUninitializedArray();
    mxArray * CLa = mclGetUninitializedArray();
    mxArray * CT = mclGetUninitializedArray();
    mxArray * K = mclGetUninitializedArray();
    mxArray * mod_alfa = mclGetUninitializedArray();
    mclValidateInputs("a2clcd", 1, &alfa);
    /*
     * 
     * % [Cl, Cd] = a2clcd(alfa) computes hydrodynamic coefficients Cl and Cd
     * % for the fins
     * 
     * % Costants
     * CLa = 2.865;               % CLalfa [rad^-1]
     */
    mlfAssign(&CLa, mlfScalar(2.865));
    /*
     * CDmin = 0.0115;            % CDmin
     */
    mlfAssign(&CDmin, mlfScalar(0.0115));
    /*
     * K = 0.1309;                % K
     */
    mlfAssign(&K, mlfScalar(0.1309));
    /*
     * ALFA1 = 0.419;             % alfa_stall [rad]
     */
    mlfAssign(&ALFA1, mlfScalar(0.419));
    /*
     * ALFA2 = 0.7854;            % alfa45 [rad]
     */
    mlfAssign(&ALFA2, mlfScalar(0.7854));
    /*
     * 
     * C1 = -1.0572;              % interpolating coefficients
     */
    mlfAssign(&C1, mlfScalar(-1.0572));
    /*
     * C2 = 1.6434;               % between zone 1 and 3 
     */
    mlfAssign(&C2, mlfScalar(1.6434));
    /*
     * C3 = 1.6759;
     */
    mlfAssign(&C3, mlfScalar(1.6759));
    /*
     * C4 = -0.5021;
     */
    mlfAssign(&C4, mlfScalar(-0.5021));
    /*
     * 
     * CT = 1.15;                 
     */
    mlfAssign(&CT, mlfScalar(1.15));
    /*
     * 
     * % sign correction
     * mod_alfa=abs(alfa-sign(alfa)*(abs(alfa)>pi/2)*pi);
     */
    mlfAssign(
      &mod_alfa,
      mlfAbs(
        mlfMinus(
          alfa,
          mlfMtimes(
            mlfMtimes(
              mlfSign(alfa),
              mlfGt(mlfAbs(alfa), mlfMrdivide(mlfPi(), mlfScalar(2.0)))),
            mlfPi()))));
    /*
     * 
     * if mod_alfa < ALFA1
     */
    if (mlfTobool(mlfLt(mod_alfa, ALFA1))) {
        /*
         * % zone 1
         * Cl = CLa * mod_alfa ;
         */
        mlfAssign(&Cl, mlfMtimes(CLa, mod_alfa));
        /*
         * Cd = CDmin + K * Cl^2 ;
         */
        mlfAssign(
          Cd, mlfPlus(CDmin, mlfMtimes(K, mlfMpower(Cl, mlfScalar(2.0)))));
    /*
     * elseif  mod_alfa < ALFA2
     */
    } else if (mlfTobool(mlfLt(mod_alfa, ALFA2))) {
        /*
         * % zone2 
         * Cl = C1 * mod_alfa + C2;
         */
        mlfAssign(&Cl, mlfPlus(mlfMtimes(C1, mod_alfa), C2));
        /*
         * Cd = C3 * mod_alfa + C4;
         */
        mlfAssign(Cd, mlfPlus(mlfMtimes(C3, mod_alfa), C4));
    /*
     * else
     */
    } else {
        /*
         * % zone 3 , piastra
         * Cl = CT*cos(mod_alfa);
         */
        mlfAssign(&Cl, mlfMtimes(CT, mlfCos(mod_alfa)));
        /*
         * Cd = CT*sin(mod_alfa);
         */
        mlfAssign(Cd, mlfMtimes(CT, mlfSin(mod_alfa)));
    /*
     * end;
     */
    }
    /*
     * 
     * % sign correction
     * Cl = Cl*sign(sin(2*alfa));
     */
    mlfAssign(
      &Cl, mlfMtimes(Cl, mlfSign(mlfSin(mlfMtimes(mlfScalar(2.0), alfa)))));
    mclValidateOutputs("a2clcd", 2, nargout_, &Cl, Cd);
    mxDestroyArray(ALFA1);
    mxDestroyArray(ALFA2);
    mxDestroyArray(C1);
    mxDestroyArray(C2);
    mxDestroyArray(C3);
    mxDestroyArray(C4);
    mxDestroyArray(CDmin);
    mxDestroyArray(CLa);
    mxDestroyArray(CT);
    mxDestroyArray(K);
    mxDestroyArray(mod_alfa);
    return Cl;
}

/*
 * The function "mlfA2clcd" contains the normal interface for the "a2clcd"
 * M-function from file "E:\RTW\NEW3\A2CLCD.M" (lines 1-39). This function
 * processes any input arguments and passes them to the implementation version
 * of the function, appearing above.
 */
mxArray * mlfA2clcd(mxArray * * Cd, mxArray * alfa) {
    int nargout = 1;
    mxArray * Cl = mclGetUninitializedArray();
    mxArray * Cd__ = mclGetUninitializedArray();
    mlfEnterNewContext(1, 1, Cd, alfa);
    if (Cd != NULL) {
        ++nargout;
    }
    Cl = Ma2clcd(&Cd__, nargout, alfa);
    mlfRestorePreviousContext(1, 1, Cd, alfa);
    if (Cd != NULL) {
        mclCopyOutputArg(Cd, Cd__);
    } else {
        mxDestroyArray(Cd__);
    }
    return mlfReturnValue(Cl);
}

/*
 * The function "mlxA2clcd" contains the feval interface for the "a2clcd"
 * M-function from file "E:\RTW\NEW3\A2CLCD.M" (lines 1-39). The feval function
 * calls the implementation version of a2clcd through this function. This
 * function processes any input arguments and passes them to the implementation
 * version of the function, appearing above.
 */
void mlxA2clcd(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) {
    mxArray * mprhs[1];
    mxArray * mplhs[2];
    int i;
    if (nlhs > 2) {
        mlfError(
          mxCreateString(
            "Run-time Error: File: a2clcd Line: 1 Column: "
            "0 The function \"a2clcd\" was called with mor"
            "e than the declared number of outputs (2)"));
    }
    if (nrhs > 1) {
        mlfError(
          mxCreateString(
            "Run-time Error: File: a2clcd Line: 1 Column: "
            "0 The function \"a2clcd\" was called with mor"
            "e than the declared number of inputs (1)"));
    }
    for (i = 0; i < 2; ++i) {
        mplhs[i] = NULL;
    }
    for (i = 0; i < 1 && i < nrhs; ++i) {
        mprhs[i] = prhs[i];
    }
    for (; i < 1; ++i) {
        mprhs[i] = NULL;
    }
    mlfEnterNewContext(0, 1, mprhs[0]);
    mplhs[0] = Ma2clcd(&mplhs[1], nlhs, mprhs[0]);
    mlfRestorePreviousContext(0, 1, mprhs[0]);
    plhs[0] = mplhs[0];
    for (i = 1; i < 2 && i < nlhs; ++i) {
        plhs[i] = mplhs[i];
    }
    for (; i < 2; ++i) {
        mxDestroyArray(mplhs[i]);
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?