Skip to content

Commit

Permalink
[Cruntime] update linearization output report
Browse files Browse the repository at this point in the history
  • Loading branch information
kabdelhak authored and adrpo committed May 11, 2020
1 parent 074bb17 commit 1a324b0
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 14 deletions.
13 changes: 7 additions & 6 deletions OMCompiler/Compiler/Template/CodegenC.tpl
Expand Up @@ -1330,6 +1330,13 @@ template populateModelInfo(ModelInfo modelInfo, String fileNamePrefix, String gu
data->modelData->nSensitivityParamVars = <%varInfo.numSensitivityParameters%>;
data->modelData->nSetcVars = <%varInfo.numSetcVars%>;
data->modelData->ndataReconVars = <%varInfo.numDataReconVars%>;
data->modelData->linearizationDumpLanguage =
<%
if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"modelica") then '0'
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"matlab") then '1'
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"julia") then '2'
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"python") then '3'
%>;
>>
end match
end populateModelInfo;
Expand Down Expand Up @@ -4713,7 +4720,6 @@ template functionlinearmodelMatlab(ModelInfo modelInfo, String modelNamePrefix)
<%getVarNameMatlab(vars.stateVars, "x")%>
<%getVarNameMatlab(vars.inputVars, "u")%>
<%getVarNameMatlab(vars.outputVars, "y")%>
<%getVarNameMatlab(vars.algVars, "z")%>
"end";
}
const char *<%symbolName(modelNamePrefix,"linear_model_datarecovery_frame")%>()
Expand All @@ -4733,7 +4739,6 @@ template functionlinearmodelMatlab(ModelInfo modelInfo, String modelNamePrefix)
<%getVarNameMatlab(vars.stateVars, "x")%>
<%getVarNameMatlab(vars.inputVars, "u")%>
<%getVarNameMatlab(vars.outputVars, "y")%>
<%getVarNameMatlab(vars.algVars, "z")%>
"end";
}
>>
Expand Down Expand Up @@ -4770,7 +4775,6 @@ template functionlinearmodelJulia(ModelInfo modelInfo, String modelNamePrefix) "
<%getVarNameJulia(vars.stateVars, "x")%>
<%getVarNameJulia(vars.inputVars, "u")%>
<%getVarNameJulia(vars.outputVars, "y")%>
<%getVarNameJulia(vars.algVars, "z")%>
"\n"
" (n, p, q, x0, u0, A, B, C, D)\n"
"end";
Expand All @@ -4792,7 +4796,6 @@ template functionlinearmodelJulia(ModelInfo modelInfo, String modelNamePrefix) "
<%getVarNameJulia(vars.stateVars, "x")%>
<%getVarNameJulia(vars.inputVars, "u")%>
<%getVarNameJulia(vars.outputVars, "y")%>
<%getVarNameJulia(vars.algVars, "z")%>
"\n"
" (n, p, q, x0, u0, A, B, C, D)\n"
"end";
Expand Down Expand Up @@ -4831,7 +4834,6 @@ template functionlinearmodelPython(ModelInfo modelInfo, String modelNamePrefix)
<%getVarNameMatlab(vars.stateVars, "x")%>
<%getVarNameMatlab(vars.inputVars, "u")%>
<%getVarNameMatlab(vars.outputVars, "y")%>
<%getVarNameMatlab(vars.algVars, "z")%>
"\n"
" return (n, p, q, x0, u0, A, B, C, D)\n"
"end";
Expand All @@ -4853,7 +4855,6 @@ template functionlinearmodelPython(ModelInfo modelInfo, String modelNamePrefix)
<%getVarNameMatlab(vars.stateVars, "x")%>
<%getVarNameMatlab(vars.inputVars, "u")%>
<%getVarNameMatlab(vars.outputVars, "y")%>
<%getVarNameMatlab(vars.algVars, "z")%>
"\n"
" return (n, p, q, x0, u0, A, B, C, D)\n"
"end";
Expand Down
27 changes: 21 additions & 6 deletions OMCompiler/SimulationRuntime/c/linearization/linearize.cpp
Expand Up @@ -485,7 +485,7 @@ int linearize(DATA* data, threadData_t *threadData)
double* matrixD = (double*)calloc(size_Outputs*size_Inputs,sizeof(double));
double* matrixCz = 0;
double* matrixDz = 0;
string strA, strB, strC, strD, strCz, strDz, strX, strU, strZ0, filename;
string strA, strB, strC, strD, strCz, strDz, strX, strU, strZ0, filename, ext, fullpath;
std::size_t pos, pos1, pos2;

assertStreamPrint(threadData,0!=matrixA,"calloc failed");
Expand Down Expand Up @@ -584,18 +584,23 @@ int linearize(DATA* data, threadData_t *threadData)
free(matrixCz);
free(matrixDz);
}

/* Use the result file name rather than the model name so that the linear file name can be changed with the -r flag, however strip _res.mat from the filename */
filename = string(data->modelData->resultFileName) + ".mo";
switch(data->modelData->linearizationDumpLanguage){
case 0: ext = ".mo"; break;
case 1: ext = ".m"; break;
case 2: ext = ".jl"; break;
case 3: ext = ".py"; break;
}
/* Use the result file name rather than the model name so that the linear file name can be changed with the -r flag, however strip _res.mat from the filename */
filename = string(data->modelData->resultFileName) + string(ext);
pos = filename.rfind("_res.mat");
if (pos != std::string::npos)
{
// not found, use the modelFilePrefix
filename = string(data->modelData->modelFilePrefix) + ".mo";
filename = string(data->modelData->modelFilePrefix) + string(ext);
}
else
{
filename = filename.substr(0, pos) + ".mo";
filename = filename.substr(0, pos) + string(ext);
}
#if defined(__MINGW32__) || defined(_MSC_VER)
pos1 = filename.rfind('\\');
Expand Down Expand Up @@ -623,6 +628,16 @@ int linearize(DATA* data, threadData_t *threadData)

FILE *fout = omc_fopen(filename.c_str(),"wb");
assertStreamPrint(threadData,0!=fout,"Cannot open File %s",filename.c_str());
char* buffer;
if( (buffer=getcwd(NULL, 0)) == NULL) {
fullpath = "";
free(buffer);
} else {
filename = "/" + filename;
}
data->modelData->resultFilePath = buffer;
data->modelData->linFileName = filename.c_str();

if(do_data_recovery > 0){
fprintf(fout, data->callback->linear_model_datarecovery_frame(), strX.c_str(), strU.c_str(), strZ0.c_str(), strA.c_str(), strB.c_str(), strC.c_str(), strD.c_str(), strCz.c_str(), strDz.c_str());
}else{
Expand Down
Expand Up @@ -484,7 +484,7 @@ int startNonInteractiveSimulation(int argc, char**argv, DATA* data, threadData_t
} else {
data->simulationInfo->stopTime = atof(lintime);
}
infoStreamPrint(LOG_STDOUT, 0, "Linearization will performed at point of time: %f", data->simulationInfo->stopTime);
infoStreamPrint(LOG_STDOUT, 0, "Linearization will be performed at point of time: %f", data->simulationInfo->stopTime);
}

/* set delta x for linearization */
Expand Down Expand Up @@ -597,7 +597,9 @@ int startNonInteractiveSimulation(int argc, char**argv, DATA* data, threadData_t
rt_tick(SIM_TIMER_JACOBIAN);
retVal = linearize(data, threadData);
rt_accumulate(SIM_TIMER_JACOBIAN);
infoStreamPrint(LOG_STDOUT, 0, "Linear model is created!");
infoStreamPrint(LOG_STDOUT, 0, "Linear model is created at %s%s", data->modelData->resultFilePath, data->modelData->linFileName);
infoStreamPrint(LOG_STDOUT, 0, "The output format can be changed with the command line option --linearizationDumpLanguage.");
infoStreamPrint(LOG_STDOUT, 0, "The options are: --linearizationDumpLanguage=modelica, matlab, julia, python.");
}

/* Use the saved state of measure_time_flag.
Expand Down
4 changes: 4 additions & 0 deletions OMCompiler/SimulationRuntime/c/simulation_data.h
Expand Up @@ -530,6 +530,10 @@ typedef struct MODEL_DATA
const char* initXMLData;
char* resourcesDir;

const char* linFileName;
char* resultFilePath; /* path to where the linearized model is created */
int linearizationDumpLanguage; /* default is 0-modelica, options: 1-matlab, 2-julia, 3-pythong */

long nSamples; /* number of different sample-calls */
SAMPLE_INFO* samplesInfo; /* array containing each sample-call */

Expand Down

0 comments on commit 1a324b0

Please sign in to comment.