0001 function getInstructions(obj, cppobj, get)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
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
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
0178 if (get == 'F')
0179 fprintf(cppobj.fileMEX,sprintf(' clearAllGlobals%d( ); \n', obj.matlablinkcount));
0180 end
0181
0182 end
0183
0184
0185 if (~isempty(obj.matlabODE_fcnHandle))
0186
0187
0188
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
0294 if (~isempty(obj.matlabDAE_fcnHandle))
0295
0296
0297
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
0333 if (~isempty(obj.cfunction_file))
0334
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
0373 if (~isempty(obj.differentialList))
0374
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
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