make sure that 2nd and 3rd order derivatives that haven't been computed are not taken to be zero.
parent
f2e21ca0a6
commit
6c0a0969f6
|
@ -1146,7 +1146,7 @@ DynamicModel::writeDynamicMFile(const string &dynamic_basename) const
|
|||
}
|
||||
|
||||
void
|
||||
DynamicModel::writeDynamicCFile(const string &dynamic_basename) const
|
||||
DynamicModel::writeDynamicCFile(const string &dynamic_basename, const int order) const
|
||||
{
|
||||
string filename = dynamic_basename + ".c";
|
||||
ofstream mDynamicModelFile;
|
||||
|
@ -1181,6 +1181,9 @@ DynamicModel::writeDynamicCFile(const string &dynamic_basename) const
|
|||
<< " double *residual, *g1, *v2, *v3;" << endl
|
||||
<< " int nb_row_x, it_;" << endl
|
||||
<< endl
|
||||
<< " /* Check that no derivatives of higher order than computed are being requested */ " << endl
|
||||
<< " if (nlhs > " << order + 1 << ") " << endl
|
||||
<< " mexErrMsgTxt(\"Derivatives of higher order than computed have been requested\"); " << endl
|
||||
<< " /* Create a pointer to the input matrix y. */" << endl
|
||||
<< " y = mxGetPr(prhs[0]);" << endl
|
||||
<< endl
|
||||
|
@ -1868,7 +1871,7 @@ DynamicModel::writeDynamicModel(ostream &DynamicOutput, bool use_dll) const
|
|||
}
|
||||
|
||||
void
|
||||
DynamicModel::writeOutput(ostream &output, const string &basename, bool block_decomposition, bool byte_code, bool use_dll) const
|
||||
DynamicModel::writeOutput(ostream &output, const string &basename, bool block_decomposition, bool byte_code, bool use_dll, int order) const
|
||||
{
|
||||
/* Writing initialisation for M_.lead_lag_incidence matrix
|
||||
M_.lead_lag_incidence is a matrix with as many columns as there are
|
||||
|
@ -2062,10 +2065,21 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de
|
|||
output << "M_.params = repmat(NaN," << symbol_table.param_nbr() << ", 1);" << endl;
|
||||
|
||||
// Write number of non-zero derivatives
|
||||
// Use -1 if the derivatives have not been computed
|
||||
output << "M_.NNZDerivatives = zeros(3, 1);" << endl
|
||||
<< "M_.NNZDerivatives(1) = " << NNZDerivatives[0] << ";" << endl
|
||||
<< "M_.NNZDerivatives(2) = " << NNZDerivatives[1] << ";" << endl
|
||||
<< "M_.NNZDerivatives(3) = " << NNZDerivatives[2] << ";" << endl;
|
||||
<< "M_.NNZDerivatives(1) = " << NNZDerivatives[0] << ";" << endl;
|
||||
if (order > 1)
|
||||
{
|
||||
output << "M_.NNZDerivatives(2) = " << NNZDerivatives[1] << ";" << endl;
|
||||
if (order > 2)
|
||||
output << "M_.NNZDerivatives(3) = " << NNZDerivatives[2] << ";" << endl;
|
||||
else
|
||||
output << "M_.NNZDerivatives(3) = -1;" << endl;
|
||||
}
|
||||
else
|
||||
output << "M_.NNZDerivatives(2) = -1;" << endl
|
||||
<< "M_.NNZDerivatives(3) = -1;" << endl;
|
||||
|
||||
}
|
||||
|
||||
map<pair<int, pair<int, int > >, NodeID>
|
||||
|
@ -2422,7 +2436,7 @@ DynamicModel::collect_block_first_order_derivatives()
|
|||
}
|
||||
|
||||
void
|
||||
DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode, bool use_dll) const
|
||||
DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode, bool use_dll, int order) const
|
||||
{
|
||||
int r;
|
||||
string t_basename = basename + "_dynamic";
|
||||
|
@ -2445,7 +2459,7 @@ DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode
|
|||
writeSparseDynamicMFile(t_basename, basename);
|
||||
}
|
||||
else if (use_dll)
|
||||
writeDynamicCFile(t_basename);
|
||||
writeDynamicCFile(t_basename, order);
|
||||
else
|
||||
writeDynamicMFile(t_basename);
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ private:
|
|||
void writeDynamicMFile(const string &dynamic_basename) const;
|
||||
//! Writes dynamic model file (C version)
|
||||
/*! \todo add third derivatives handling */
|
||||
void writeDynamicCFile(const string &dynamic_basename) const;
|
||||
void writeDynamicCFile(const string &dynamic_basename, const int order) const;
|
||||
//! Writes dynamic model file when SparseDLL option is on
|
||||
void writeSparseDynamicMFile(const string &dynamic_basename, const string &basename) const;
|
||||
//! Writes the dynamic model equations and its derivatives
|
||||
|
@ -247,13 +247,13 @@ public:
|
|||
void computingPass(bool jacobianExo, bool hessian, bool thirdDerivatives, bool paramsDerivatives,
|
||||
const eval_context_type &eval_context, bool no_tmp_terms, bool block, bool use_dll, bool bytecode);
|
||||
//! Writes model initialization and lead/lag incidence matrix to output
|
||||
void writeOutput(ostream &output, const string &basename, bool block, bool byte_code, bool use_dll) const;
|
||||
void writeOutput(ostream &output, const string &basename, bool block, bool byte_code, bool use_dll, int order) const;
|
||||
|
||||
//! Adds informations for simulation in a binary file
|
||||
void Write_Inf_To_Bin_File_Block(const string &dynamic_basename, const string &bin_basename,
|
||||
const int &num, int &u_count_int, bool &file_open, bool is_two_boundaries) const;
|
||||
//! Writes dynamic model file
|
||||
void writeDynamicFile(const string &basename, bool block, bool bytecode, bool use_dll) const;
|
||||
void writeDynamicFile(const string &basename, bool block, bool bytecode, bool use_dll, int order) const;
|
||||
//! Writes file containing parameters derivatives
|
||||
void writeParamsDerivativesFile(const string &basename) const;
|
||||
//! Converts to static model (only the equations)
|
||||
|
|
|
@ -482,9 +482,9 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all
|
|||
if (dynamic_model.equation_number() > 0)
|
||||
{
|
||||
if (dynamic_model_needed)
|
||||
dynamic_model.writeOutput(mOutputFile, basename, block, byte_code, use_dll);
|
||||
dynamic_model.writeOutput(mOutputFile, basename, block, byte_code, use_dll, mod_file_struct.order_option);
|
||||
else
|
||||
dynamic_model.writeOutput(mOutputFile, basename, false, false, false);
|
||||
dynamic_model.writeOutput(mOutputFile, basename, false, false, false, mod_file_struct.order_option);
|
||||
if (!byte_code && !no_static)
|
||||
static_model.writeOutput(mOutputFile, block);
|
||||
}
|
||||
|
@ -527,12 +527,12 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all
|
|||
|
||||
if (dynamic_model_needed)
|
||||
{
|
||||
dynamic_model.writeDynamicFile(basename, block, byte_code, use_dll);
|
||||
dynamic_model.writeDynamicFile(basename, block, byte_code, use_dll, mod_file_struct.order_option);
|
||||
dynamic_model.writeParamsDerivativesFile(basename);
|
||||
}
|
||||
else
|
||||
{
|
||||
dynamic_model.writeDynamicFile(basename, false, false, false);
|
||||
dynamic_model.writeDynamicFile(basename, false, false, false, mod_file_struct.order_option);
|
||||
dynamic_model.writeParamsDerivativesFile(basename);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue