Home > matlab > acado > packages > +acado > @DifferentialEquation > getInstructions.m

getInstructions

PURPOSE ^

Used to generate CPP file

SYNOPSIS ^

function getInstructions(obj, cppobj, get)

DESCRIPTION ^

Used to generate CPP file

  Licence:
    This file is part of ACADO Toolkit  - (http://www.acadotoolkit.org/)

    ACADO Toolkit -- A Toolkit for Automatic Control and Dynamic Optimization.
    Copyright (C) 2008-2009 by Boris Houska and Hans Joachim Ferreau, K.U.Leuven.
    Developed within the Optimization in Engineering Center (OPTEC) under
    supervision of Moritz Diehl. All rights reserved.

    ACADO Toolkit is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 3 of the License, or (at your option) any later version.

    ACADO Toolkit is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with ACADO Toolkit; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

    Author: David Ariens
    Date: 2010

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function getInstructions(obj, cppobj, get)
0002 %Used to generate CPP file
0003 %
0004 %  Licence:
0005 %    This file is part of ACADO Toolkit  - (http://www.acadotoolkit.org/)
0006 %
0007 %    ACADO Toolkit -- A Toolkit for Automatic Control and Dynamic Optimization.
0008 %    Copyright (C) 2008-2009 by Boris Houska and Hans Joachim Ferreau, K.U.Leuven.
0009 %    Developed within the Optimization in Engineering Center (OPTEC) under
0010 %    supervision of Moritz Diehl. All rights reserved.
0011 %
0012 %    ACADO Toolkit is free software; you can redistribute it and/or
0013 %    modify it under the terms of the GNU Lesser General Public
0014 %    License as published by the Free Software Foundation; either
0015 %    version 3 of the License, or (at your option) any later version.
0016 %
0017 %    ACADO Toolkit is distributed in the hope that it will be useful,
0018 %    but WITHOUT ANY WARRANTY; without even the implied warranty of
0019 %    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0020 %    Lesser General Public License for more details.
0021 %
0022 %    You should have received a copy of the GNU Lesser General Public
0023 %    License along with ACADO Toolkit; if not, write to the Free Software
0024 %    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
0025 %
0026 %    Author: David Ariens
0027 %    Date: 2010
0028 %
0029 
0030 
0031 %% ODE + DAE together  (shared code)
0032     if (~isempty(obj.matlabODE_fcnHandle) || ~isempty(obj.matlabDAE_fcnHandle))
0033         if (get == 'H')
0034             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%d_f = NULL;\n', obj.matlablinkcount));
0035             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%d_jac = NULL;\n', obj.matlablinkcount));
0036             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dT  = NULL;\n', obj.matlablinkcount));
0037             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dX  = NULL;\n', obj.matlablinkcount));
0038             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dXA = NULL;\n', obj.matlablinkcount));
0039             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dU  = NULL;\n', obj.matlablinkcount));
0040             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dP  = NULL;\n', obj.matlablinkcount));
0041             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dW  = NULL;\n', obj.matlablinkcount));
0042             fprintf(cppobj.fileMEX,sprintf('mxArray* ModelFcn_%dDX = NULL;\n', obj.matlablinkcount));
0043             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNT  = 0;\n', obj.matlablinkcount));
0044             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNX  = 0;\n', obj.matlablinkcount));
0045             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNXA = 0;\n', obj.matlablinkcount));
0046             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNU  = 0;\n', obj.matlablinkcount));
0047             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNP  = 0;\n', obj.matlablinkcount));
0048             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNW  = 0;\n', obj.matlablinkcount));
0049             fprintf(cppobj.fileMEX,sprintf('unsigned int ModelFcn_%dNDX = 0;\n', obj.matlablinkcount));
0050             fprintf(cppobj.fileMEX,sprintf('unsigned int jacobianNumber_%d = -1;\n', obj.matlablinkcount));
0051             fprintf(cppobj.fileMEX,sprintf('double* f_store_%d             = NULL;\n', obj.matlablinkcount));
0052             fprintf(cppobj.fileMEX,sprintf('double* J_store_%d             = NULL;\n\n', obj.matlablinkcount));
0053 
0054             fprintf(cppobj.fileMEX,sprintf('void clearAllGlobals%d( ){ \n', obj.matlablinkcount));
0055             fprintf(cppobj.fileMEX,sprintf('    if ( f_store_%d != NULL ){\n', obj.matlablinkcount));
0056             fprintf(cppobj.fileMEX,sprintf('        f_store_%d = NULL;\n', obj.matlablinkcount));
0057             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0058             fprintf(cppobj.fileMEX,sprintf('    if ( J_store_%d != NULL ){\n', obj.matlablinkcount));
0059             fprintf(cppobj.fileMEX,sprintf('        J_store_%d = NULL;\n', obj.matlablinkcount));
0060             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0061             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%d_f != NULL ){\n', obj.matlablinkcount));
0062             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%d_f );\n', obj.matlablinkcount));
0063             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%d_f = NULL;\n', obj.matlablinkcount));
0064             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0065             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dT != NULL ){\n', obj.matlablinkcount));
0066             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dT );\n', obj.matlablinkcount));
0067             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dT = NULL;\n', obj.matlablinkcount));
0068             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0069             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dX != NULL ){\n', obj.matlablinkcount));
0070             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dX );\n', obj.matlablinkcount));
0071             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dX = NULL;\n', obj.matlablinkcount));
0072             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0073             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dXA != NULL ){\n', obj.matlablinkcount));
0074             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dXA );\n', obj.matlablinkcount));
0075             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dXA = NULL;\n', obj.matlablinkcount));
0076             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0077             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dU != NULL ){\n', obj.matlablinkcount));
0078             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dU );\n', obj.matlablinkcount));
0079             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dU = NULL;\n', obj.matlablinkcount));
0080             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0081             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dP != NULL ){\n', obj.matlablinkcount));
0082             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dP );\n', obj.matlablinkcount));
0083             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dP = NULL;\n', obj.matlablinkcount));
0084             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0085             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dW != NULL ){\n', obj.matlablinkcount));
0086             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dW );\n', obj.matlablinkcount));
0087             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dW = NULL;\n', obj.matlablinkcount));
0088             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0089             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%dDX != NULL ){\n', obj.matlablinkcount));
0090             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%dDX );\n', obj.matlablinkcount));
0091             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%dDX = NULL;\n', obj.matlablinkcount));
0092             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0093             fprintf(cppobj.fileMEX,sprintf('    if ( ModelFcn_%d_jac != NULL ){\n', obj.matlablinkcount));
0094             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( ModelFcn_%d_jac );\n', obj.matlablinkcount));
0095             fprintf(cppobj.fileMEX,sprintf('        ModelFcn_%d_jac = NULL;\n', obj.matlablinkcount));
0096             fprintf(cppobj.fileMEX,sprintf('    }\n\n'));
0097             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNT  = 0;\n', obj.matlablinkcount));
0098             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNX  = 0;\n', obj.matlablinkcount));
0099             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNXA = 0;\n', obj.matlablinkcount));
0100             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNU  = 0;\n', obj.matlablinkcount));
0101             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNP  = 0;\n', obj.matlablinkcount));
0102             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNW  = 0;\n', obj.matlablinkcount));
0103             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNDX = 0;\n', obj.matlablinkcount));
0104             fprintf(cppobj.fileMEX,sprintf('    jacobianNumber_%d = -1;\n', obj.matlablinkcount));
0105             fprintf(cppobj.fileMEX,sprintf('}\n\n'));
0106             
0107         end
0108         
0109         % BODY
0110         if (get == 'B')
0111             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dT  = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.t)));
0112             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dX  = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.x)));
0113             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dXA = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.z)));
0114             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dDX = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.x)));
0115             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dU  = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.u)));
0116             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dP  = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.p)));
0117             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dW  = mxCreateDoubleMatrix( %d, 1,mxREAL );\n', obj.matlablinkcount, length(cppobj.w)));
0118 
0119             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNT  = %d;\n', obj.matlablinkcount, length(cppobj.t)));
0120             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNX  = %d;\n', obj.matlablinkcount, length(cppobj.x)));
0121             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNXA = %d;\n', obj.matlablinkcount, length(cppobj.z)));
0122             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNDX = %d;\n', obj.matlablinkcount, length(cppobj.x)));
0123             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNP  = %d;\n', obj.matlablinkcount, length(cppobj.p)));
0124             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNU  = %d;\n', obj.matlablinkcount, length(cppobj.u)));
0125             fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%dNW  = %d;\n', obj.matlablinkcount, length(cppobj.w)));
0126 
0127             fprintf(cppobj.fileMEX,sprintf('    %s;\n',  obj.getHeader));
0128             
0129             if (~isempty(obj.matlabODE_fcnHandle))
0130                 fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%d_f = mxCreateString("%s");\n', obj.matlablinkcount, obj.matlabODE_fcnHandle));
0131             else
0132                 fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%d_f = mxCreateString("%s");\n', obj.matlablinkcount, obj.matlabDAE_fcnHandle));
0133             end
0134                
0135             fprintf(cppobj.fileMEX,sprintf('    IntermediateState setc_is_%d(%d);\n', obj.matlablinkcount, length(cppobj.t)+length(cppobj.x)+length(cppobj.z)+length(cppobj.u)+length(cppobj.p)+length(cppobj.w)));
0136 
0137             count_is = 0;
0138             fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.t{1}.name)); count_is = count_is+1;
0139 
0140             for i=1:length(cppobj.x)
0141                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.x{i}.name)); count_is = count_is+1;
0142             end
0143             for i=1:length(cppobj.z)
0144                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.z{i}.name)); count_is = count_is+1;
0145             end
0146             for i=1:length(cppobj.u)
0147                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.u{i}.name)); count_is = count_is+1;
0148             end
0149             for i=1:length(cppobj.p)
0150                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.p{i}.name)); count_is = count_is+1;
0151             end
0152             for i=1:length(cppobj.w)
0153                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.w{i}.name)); count_is = count_is+1;
0154             end
0155 
0156             
0157             if (~isempty(obj.matlabODE_fcnHandle))
0158                 if (isempty(obj.matlabJacobian_fcnHandle))
0159                     fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%d_jac = %s;\n', obj.matlablinkcount, 'NULL'));
0160                     fprintf(cppobj.fileMEX,sprintf('    CFunction cLinkModel_%d( ModelFcn_%dNX, genericODE%d ); \n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));     
0161 
0162                 else
0163                     fprintf(cppobj.fileMEX,sprintf('    ModelFcn_%d_jac = mxCreateString("%s");\n', obj.matlablinkcount, obj.matlabJacobian_fcnHandle));
0164                     fprintf(cppobj.fileMEX,sprintf('    CFunction cLinkModel_%d( ModelFcn_%dNX, genericODE%d, genericJacobian%d, genericJacobian%d ); \n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));                
0165 
0166                 end               
0167                 
0168             elseif (~isempty(obj.matlabDAE_fcnHandle))
0169                 fprintf(cppobj.fileMEX,sprintf('    CFunction cLinkModel_%d( ModelFcn_%dNX+ModelFcn_%dNXA, genericDAE%d ); \n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));                
0170 
0171             end
0172 
0173             fprintf(cppobj.fileMEX,sprintf('    %s << cLinkModel_%d(setc_is_%d); \n\n', obj.name, obj.matlablinkcount, obj.matlablinkcount));
0174         end    
0175         
0176         
0177         %FOOTER
0178         if (get == 'F')
0179             fprintf(cppobj.fileMEX,sprintf('    clearAllGlobals%d( ); \n', obj.matlablinkcount));
0180         end
0181 
0182     end
0183 
0184 %% ODE
0185     if (~isempty(obj.matlabODE_fcnHandle))
0186         % MATLAB LINK
0187         
0188         % HEADER
0189         if (get == 'H')
0190             fprintf(cppobj.fileMEX,sprintf('void genericODE%d( double* x, double* f, void *userData ){\n', obj.matlablinkcount));
0191             fprintf(cppobj.fileMEX,sprintf('    unsigned int i;\n'));
0192             fprintf(cppobj.fileMEX,sprintf('    double* tt = mxGetPr( ModelFcn_%dT );\n', obj.matlablinkcount));
0193             fprintf(cppobj.fileMEX,sprintf('    tt[0] = x[0];\n'));
0194             fprintf(cppobj.fileMEX,sprintf('    double* xx = mxGetPr( ModelFcn_%dX );\n', obj.matlablinkcount));
0195             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNX; ++i )\n', obj.matlablinkcount));
0196             fprintf(cppobj.fileMEX,sprintf('        xx[i] = x[i+1];\n'));
0197             fprintf(cppobj.fileMEX,sprintf('    double* uu = mxGetPr( ModelFcn_%dU );\n', obj.matlablinkcount));
0198             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNU; ++i )\n', obj.matlablinkcount));
0199             fprintf(cppobj.fileMEX,sprintf('        uu[i] = x[i+1+ModelFcn_%dNX];\n', obj.matlablinkcount));
0200             fprintf(cppobj.fileMEX,sprintf('    double* pp = mxGetPr( ModelFcn_%dP );\n', obj.matlablinkcount));
0201             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNP; ++i )\n', obj.matlablinkcount));
0202             fprintf(cppobj.fileMEX,sprintf('        pp[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNU];\n', obj.matlablinkcount, obj.matlablinkcount));
0203             fprintf(cppobj.fileMEX,sprintf('    double* ww = mxGetPr( ModelFcn_%dW );\n', obj.matlablinkcount));
0204             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNW; ++i )\n', obj.matlablinkcount));
0205             fprintf(cppobj.fileMEX,sprintf('        ww[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP];\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0206             fprintf(cppobj.fileMEX,sprintf('    mxArray* FF = NULL;\n'));
0207             fprintf(cppobj.fileMEX,sprintf('    mxArray* argIn[]  = { ModelFcn_%d_f,ModelFcn_%dT,ModelFcn_%dX,ModelFcn_%dU,ModelFcn_%dP,ModelFcn_%dW };\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0208             fprintf(cppobj.fileMEX,sprintf('    mxArray* argOut[] = { FF };\n\n'));
0209             fprintf(cppobj.fileMEX,sprintf('    mexCallMATLAB( 1,argOut, 6,argIn,"generic_ode" );\n'));
0210             fprintf(cppobj.fileMEX,sprintf('    double* ff = mxGetPr( *argOut );\n'));
0211             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNX; ++i ){\n', obj.matlablinkcount));
0212             fprintf(cppobj.fileMEX,sprintf('        f[i] = ff[i];\n'));
0213             fprintf(cppobj.fileMEX,sprintf('    }\n'));
0214             fprintf(cppobj.fileMEX,sprintf('    mxDestroyArray( *argOut );\n'));
0215             fprintf(cppobj.fileMEX,sprintf('}\n\n'));
0216 
0217             fprintf(cppobj.fileMEX,sprintf('void genericJacobian%d( int number, double* x, double* seed, double* f, double* df, void *userData  ){\n', obj.matlablinkcount));
0218             fprintf(cppobj.fileMEX,sprintf('    unsigned int i, j;\n'));
0219             fprintf(cppobj.fileMEX,sprintf('    double* ff;\n'));
0220             fprintf(cppobj.fileMEX,sprintf('    double* J;\n'));
0221             fprintf(cppobj.fileMEX,sprintf('    if (J_store_%d == NULL){\n', obj.matlablinkcount));
0222             fprintf(cppobj.fileMEX,sprintf('        J_store_%d = (double*) calloc ((ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP+ModelFcn_%dNW)*(ModelFcn_%dNX),sizeof(double));\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0223             fprintf(cppobj.fileMEX,sprintf('        f_store_%d = (double*) calloc (ModelFcn_%dNX,sizeof(double));\n', obj.matlablinkcount, obj.matlablinkcount));
0224             fprintf(cppobj.fileMEX,sprintf('    }\n'));
0225             fprintf(cppobj.fileMEX,sprintf('    if ( (int) jacobianNumber_%d == number){\n', obj.matlablinkcount));
0226             fprintf(cppobj.fileMEX,sprintf('        J = J_store_%d;\n', obj.matlablinkcount));
0227             fprintf(cppobj.fileMEX,sprintf('        ff = f_store_%d;\n', obj.matlablinkcount));
0228             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNX; ++i ) {\n', obj.matlablinkcount));
0229             fprintf(cppobj.fileMEX,sprintf('            df[i] = 0;\n'));
0230             fprintf(cppobj.fileMEX,sprintf('            f[i] = 0;\n'));
0231             fprintf(cppobj.fileMEX,sprintf('            for (j=0; j < ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP+ModelFcn_%dNW; ++j){\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0232             fprintf(cppobj.fileMEX,sprintf('                df[i] += J[(j*(ModelFcn_%dNX))+i]*seed[j+1]; \n', obj.matlablinkcount));
0233             fprintf(cppobj.fileMEX,sprintf('            }\n'));
0234             fprintf(cppobj.fileMEX,sprintf('        }\n'));
0235             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNX; ++i ){\n', obj.matlablinkcount));
0236             fprintf(cppobj.fileMEX,sprintf('            f[i] = ff[i];\n'));
0237             fprintf(cppobj.fileMEX,sprintf('        }\n'));
0238             fprintf(cppobj.fileMEX,sprintf('    }else{\n'));
0239             fprintf(cppobj.fileMEX,sprintf('        jacobianNumber_%d = number; \n', obj.matlablinkcount));
0240             fprintf(cppobj.fileMEX,sprintf('        double* tt = mxGetPr( ModelFcn_%dT );\n', obj.matlablinkcount));
0241             fprintf(cppobj.fileMEX,sprintf('        tt[0] = x[0];\n'));
0242             fprintf(cppobj.fileMEX,sprintf('        double* xx = mxGetPr( ModelFcn_%dX );\n', obj.matlablinkcount));
0243             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNX; ++i )\n', obj.matlablinkcount));
0244             fprintf(cppobj.fileMEX,sprintf('            xx[i] = x[i+1];\n'));
0245             fprintf(cppobj.fileMEX,sprintf('        double* uu = mxGetPr( ModelFcn_%dU );\n', obj.matlablinkcount));
0246             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNU; ++i )\n', obj.matlablinkcount));
0247             fprintf(cppobj.fileMEX,sprintf('            uu[i] = x[i+1+ModelFcn_%dNX];\n', obj.matlablinkcount));
0248             fprintf(cppobj.fileMEX,sprintf('        double* pp = mxGetPr( ModelFcn_%dP );\n', obj.matlablinkcount));
0249             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNP; ++i )\n', obj.matlablinkcount));
0250             fprintf(cppobj.fileMEX,sprintf('            pp[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNU];\n', obj.matlablinkcount, obj.matlablinkcount));
0251             fprintf(cppobj.fileMEX,sprintf('        double* ww = mxGetPr( ModelFcn_%dW );\n', obj.matlablinkcount));
0252             fprintf(cppobj.fileMEX,sprintf('            for( i=0; i<ModelFcn_%dNW; ++i )\n', obj.matlablinkcount));
0253             fprintf(cppobj.fileMEX,sprintf('        ww[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP];\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0254             fprintf(cppobj.fileMEX,sprintf('        mxArray* FF = NULL;\n'));
0255             fprintf(cppobj.fileMEX,sprintf('        mxArray* argIn[]  = { ModelFcn_%d_jac,ModelFcn_%dT,ModelFcn_%dX,ModelFcn_%dU,ModelFcn_%dP,ModelFcn_%dW };\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0256             fprintf(cppobj.fileMEX,sprintf('        mxArray* argOut[] = { FF };\n'));
0257             fprintf(cppobj.fileMEX,sprintf('        mexCallMATLAB( 1,argOut, 6,argIn,"generic_jacobian" );\n'));
0258             fprintf(cppobj.fileMEX,sprintf('        unsigned int rowLen = mxGetM(*argOut);\n'));
0259             fprintf(cppobj.fileMEX,sprintf('        unsigned int colLen = mxGetN(*argOut);\n'));
0260             fprintf(cppobj.fileMEX,sprintf('        if (rowLen != ModelFcn_%dNX){\n', obj.matlablinkcount));
0261             fprintf(cppobj.fileMEX,sprintf('            mexErrMsgTxt( "ERROR: Jacobian matrix rows do not match (should be ModelFcn_%dNX). " );\n', obj.matlablinkcount));
0262             fprintf(cppobj.fileMEX,sprintf('        }\n'));
0263             fprintf(cppobj.fileMEX,sprintf('        if (colLen != ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP+ModelFcn_%dNW){\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0264             fprintf(cppobj.fileMEX,sprintf('            mexErrMsgTxt( "ERROR: Jacobian matrix columns do not match (should be ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP+ModelFcn_%dNW). " );\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0265             fprintf(cppobj.fileMEX,sprintf('        }\n'));
0266             fprintf(cppobj.fileMEX,sprintf('        J = mxGetPr( *argOut );\n'));
0267             fprintf(cppobj.fileMEX,sprintf('        memcpy(J_store_%d, J, (ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP+ModelFcn_%dNW)*(ModelFcn_%dNX) * sizeof ( double ));\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0268             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNX; ++i ) {\n', obj.matlablinkcount));
0269             fprintf(cppobj.fileMEX,sprintf('            df[i] = 0;\n'));
0270             fprintf(cppobj.fileMEX,sprintf('            f[i] = 0;\n'));
0271             fprintf(cppobj.fileMEX,sprintf('            for (j=0; j < ModelFcn_%dNX+ModelFcn_%dNU+ModelFcn_%dNP+ModelFcn_%dNW; ++j){\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0272             fprintf(cppobj.fileMEX,sprintf('                df[i] += J[(j*(ModelFcn_%dNX))+i]*seed[j+1];\n', obj.matlablinkcount));
0273             fprintf(cppobj.fileMEX,sprintf('            }\n'));
0274             fprintf(cppobj.fileMEX,sprintf('        }\n'));
0275             fprintf(cppobj.fileMEX,sprintf('        mxArray* FF2 = NULL;\n'));
0276             fprintf(cppobj.fileMEX,sprintf('        mxArray* argIn2[]  = { ModelFcn_%d_f,ModelFcn_%dT,ModelFcn_%dX,ModelFcn_%dU,ModelFcn_%dP,ModelFcn_%dW };\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0277             fprintf(cppobj.fileMEX,sprintf('        mxArray* argOut2[] = { FF2 };\n'));
0278             fprintf(cppobj.fileMEX,sprintf('        mexCallMATLAB( 1,argOut2, 6,argIn2,"generic_ode" );\n'));
0279             fprintf(cppobj.fileMEX,sprintf('        ff = mxGetPr( *argOut2 );\n'));
0280             fprintf(cppobj.fileMEX,sprintf('        memcpy(f_store_%d, ff, (ModelFcn_%dNX) * sizeof ( double ));\n', obj.matlablinkcount, obj.matlablinkcount));
0281             fprintf(cppobj.fileMEX,sprintf('        for( i=0; i<ModelFcn_%dNX; ++i ){\n', obj.matlablinkcount));
0282             fprintf(cppobj.fileMEX,sprintf('            f[i] = ff[i];\n'));
0283             fprintf(cppobj.fileMEX,sprintf('        }\n'));
0284             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( *argOut );\n'));
0285             fprintf(cppobj.fileMEX,sprintf('        mxDestroyArray( *argOut2 );\n'));
0286             fprintf(cppobj.fileMEX,sprintf('    }\n'));
0287             fprintf(cppobj.fileMEX,sprintf('}\n'));
0288         end
0289     
0290 
0291     end     
0292 
0293 %% DAE
0294     if (~isempty(obj.matlabDAE_fcnHandle))
0295         % MATLAB LINK
0296         
0297         % HEADER
0298         if (get == 'H')
0299             fprintf(cppobj.fileMEX,sprintf('void genericDAE%d( double* x, double* f, void *userData ){\n', obj.matlablinkcount));
0300             fprintf(cppobj.fileMEX,sprintf('    unsigned int i;\n\n'));
0301             fprintf(cppobj.fileMEX,sprintf('    double* tt = mxGetPr( ModelFcn_%dT );\n', obj.matlablinkcount));
0302             fprintf(cppobj.fileMEX,sprintf('    tt[0] = x[0];\n\n'));
0303             fprintf(cppobj.fileMEX,sprintf('    double* xx = mxGetPr( ModelFcn_%dX );\n', obj.matlablinkcount));
0304             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNX; ++i )\n', obj.matlablinkcount));
0305             fprintf(cppobj.fileMEX,sprintf('        xx[i] = x[i+1];\n\n'));
0306             fprintf(cppobj.fileMEX,sprintf('    double* xxa = mxGetPr( ModelFcn_%dXA );\n', obj.matlablinkcount));
0307             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNXA; ++i )\n', obj.matlablinkcount));
0308             fprintf(cppobj.fileMEX,sprintf('        xxa[i] = x[i+1+ModelFcn_%dNX];\n\n', obj.matlablinkcount));
0309             fprintf(cppobj.fileMEX,sprintf('    double* uu = mxGetPr( ModelFcn_%dU );\n', obj.matlablinkcount));
0310             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNU; ++i )\n', obj.matlablinkcount));
0311             fprintf(cppobj.fileMEX,sprintf('        uu[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNXA];\n\n', obj.matlablinkcount, obj.matlablinkcount));
0312             fprintf(cppobj.fileMEX,sprintf('    double* pp = mxGetPr( ModelFcn_%dP );\n', obj.matlablinkcount));
0313             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNP; ++i )\n', obj.matlablinkcount));
0314             fprintf(cppobj.fileMEX,sprintf('        pp[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNXA+ModelFcn_%dNU];\n\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0315             fprintf(cppobj.fileMEX,sprintf('    double* ww = mxGetPr( ModelFcn_%dW );\n', obj.matlablinkcount));
0316             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNW; ++i )\n', obj.matlablinkcount));
0317             fprintf(cppobj.fileMEX,sprintf('        ww[i] = x[i+1+ModelFcn_%dNX+ModelFcn_%dNXA+ModelFcn_%dNU+ModelFcn_%dNP];\n\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0318             fprintf(cppobj.fileMEX,sprintf('    mxArray* argIn_f[]  = { ModelFcn_%d_f,ModelFcn_%dT,ModelFcn_%dX,ModelFcn_%dXA,ModelFcn_%dU,ModelFcn_%dP,ModelFcn_%dW }; \n\n', obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount, obj.matlablinkcount));
0319             fprintf(cppobj.fileMEX,sprintf('    mxArray* FF = NULL;\n'));
0320             fprintf(cppobj.fileMEX,sprintf('    double*  ff = NULL;\n'));
0321             fprintf(cppobj.fileMEX,sprintf('    mxArray* argOut[] = { FF };\n'));
0322             fprintf(cppobj.fileMEX,sprintf('    mexCallMATLAB( 1,argOut, 7,argIn_f,"generic_dae" );\n'));
0323             fprintf(cppobj.fileMEX,sprintf('    ff = mxGetPr( *argOut );\n'));
0324             fprintf(cppobj.fileMEX,sprintf('    for( i=0; i<ModelFcn_%dNX+ModelFcn_%dNXA; ++i )\n', obj.matlablinkcount, obj.matlablinkcount));
0325             fprintf(cppobj.fileMEX,sprintf('        f[i] = ff[i];\n'));
0326             fprintf(cppobj.fileMEX,sprintf('    mxDestroyArray( *argOut );\n'));
0327             fprintf(cppobj.fileMEX,sprintf('}\n\n'));
0328         end
0329         
0330     end   
0331         
0332 %% C FILE
0333     if (~isempty(obj.cfunction_file))
0334         % C LINK
0335         
0336         if (get == 'H')
0337             fprintf(cppobj.fileMEX,sprintf('#include "%s"\n', obj.cfunction_file));
0338         end
0339                
0340         if (get == 'B')
0341             fprintf(cppobj.fileMEX,sprintf('    %s;\n', obj.getHeader));
0342             
0343             fprintf(cppobj.fileMEX,sprintf('    IntermediateState setc_is_%d(%d);\n', obj.matlablinkcount, length(cppobj.t)+length(cppobj.x)+length(cppobj.u)+length(cppobj.z)+length(cppobj.p)+length(cppobj.w)));
0344 
0345             count_is = 0;
0346             fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.t{1}.name)); count_is = count_is+1;
0347 
0348             for i=1:length(cppobj.x)
0349                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.x{i}.name)); count_is = count_is+1;
0350             end
0351             for i=1:length(cppobj.z)
0352                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.z{i}.name)); count_is = count_is+1;
0353             end
0354             for i=1:length(cppobj.u)
0355                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.u{i}.name)); count_is = count_is+1;
0356             end
0357             for i=1:length(cppobj.p)
0358                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.p{i}.name)); count_is = count_is+1;
0359             end
0360             for i=1:length(cppobj.w)
0361                 fprintf(cppobj.fileMEX,sprintf('    setc_is_%d(%d) = %s;\n', obj.matlablinkcount, count_is, cppobj.w{i}.name)); count_is = count_is+1;
0362             end      
0363             
0364             
0365             fprintf(cppobj.fileMEX,sprintf('    CFunction cLinkModel_%d( %d, %s ); \n', obj.matlablinkcount, length(cppobj.x)+length(cppobj.z), obj.cfunction_function));
0366             
0367             fprintf(cppobj.fileMEX,sprintf('    %s << cLinkModel_%d(setc_is_%d); \n\n', obj.name, obj.matlablinkcount, obj.matlablinkcount));
0368             
0369         end
0370     end
0371     
0372 %% ACADO FUNCTION
0373     if (~isempty(obj.differentialList))
0374        % FUNCTION DEFINED
0375        if (get == 'B')
0376 
0377             fprintf(cppobj.fileMEX,sprintf('    %s;\n', obj.getHeader));
0378 
0379 
0380             for i=1:length(obj.differentialList)
0381                 fprintf(cppobj.fileMEX,sprintf('    %s << %s;\n', obj.name, obj.differentialList{i}.toString()));
0382             end
0383 
0384             fprintf(cppobj.fileMEX,'\n');
0385        end
0386     end
0387     
0388         
0389 %% ERROR
0390     if (isempty(obj.differentialList) && isempty(obj.cfunction_file) && isempty(obj.matlabODE_fcnHandle) && isempty(obj.matlabDAE_fcnHandle))
0391         error('No differential equation found');
0392     end
0393     
0394 end

www.acadotoolkit.org/matlab
Generated on Tue 01-Jun-2010 20:14:12 by m2html © 2005