Skip to content

Commit

Permalink
[Template] add linearize dumping options
Browse files Browse the repository at this point in the history
- ticket 5626
- basic matlab dumping option
  • Loading branch information
kabdelhak authored and adrpo committed Sep 7, 2019
1 parent 13274ae commit bc1d4b8
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 5 deletions.
71 changes: 69 additions & 2 deletions OMCompiler/Compiler/Template/CodegenC.tpl
Expand Up @@ -831,8 +831,12 @@ template simulationFile_lnz(SimCode simCode)
#if defined(__cplusplus)
extern "C" {
#endif
<%functionlinearmodel(modelInfo, modelNamePrefix(simCode))%>
<%
if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"modelica")
then functionlinearmodel(modelInfo, modelNamePrefix(simCode))
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"matlab")
then functionlinearmodelMatlab(modelInfo, modelNamePrefix(simCode))
%>
#if defined(__cplusplus)
}
#endif
Expand Down Expand Up @@ -4669,6 +4673,53 @@ template functionlinearmodel(ModelInfo modelInfo, String modelNamePrefix) "templ
end match
end functionlinearmodel;

template functionlinearmodelMatlab(ModelInfo modelInfo, String modelNamePrefix) "template functionlinearmodelMatlab
Generates matlab functions in simulation file."
::=
match modelInfo
case MODELINFO(varInfo=VARINFO(__), vars=SIMVARS(__)) then
let matrixA = genMatrixMatlab("A", "n", "n", varInfo.numStateVars, varInfo.numStateVars)
let matrixB = genMatrixMatlab("B", "n", "p", varInfo.numStateVars, varInfo.numInVars)
let matrixC = genMatrixMatlab("C", "q", "n", varInfo.numOutVars, varInfo.numStateVars)
let matrixD = genMatrixMatlab("D", "q", "p", varInfo.numOutVars, varInfo.numInVars)
let matrixCz = genMatrixMatlab("Cz", "nz", "n", varInfo.numAlgVars, varInfo.numStateVars)
let matrixDz = genMatrixMatlab("Dz", "nz", "p", varInfo.numAlgVars, varInfo.numInVars)
//string def_proctedpart("\n Real x[<%varInfo.numStateVars%>](start=x0);\n Real u[<%varInfo.numInVars%>](start=u0);\n output Real y[<%varInfo.numOutVars%>];\n");
<<
const char *<%symbolName(modelNamePrefix,"linear_model_frame")%>()
{
return "function [n, p, q, x0, u0, A, B, C, D] = <%symbolName(modelNamePrefix,"GetLinearModel")%>()\n"
"%% der(x) = A * x + B * u\n%% y = C * x + D * u \n"
" n = <%varInfo.numStateVars%>; %% number of states \n p = <%varInfo.numInVars%>; %% number of inputs \n q = <%varInfo.numOutVars%>; %% number of outputs \n"
"\n"
" x0 = %s;\n"
" u0 = %s;\n"
"\n"
<%matrixA%>
<%matrixB%>
<%matrixC%>
<%matrixD%>
"end";
}
const char *<%symbolName(modelNamePrefix,"linear_model_datarecovery_frame")%>()
{
return "function [n, p, q, x0, u0, A, B, C, D] = <%symbolName(modelNamePrefix,"GetLinearModel")%>()\n"
"%% der(x) = A * x + B * u\n%% y = C * x + D * u \n"
" n = <%varInfo.numStateVars%>; %% number of states \n p = <%varInfo.numInVars%>; %% number of inputs \n q = <%varInfo.numOutVars%>; %% number of outputs \n"
"\n"
" x0 = %s;\n"
" u0 = %s;\n"
"\n"
<%matrixA%>
<%matrixB%>
<%matrixC%>
<%matrixD%>
"end";
}
>>
end match
end functionlinearmodelMatlab;

template getVarName(list<SimVar> simVars, String arrayName) "template getVarName
Generates name for a varables."
::=
Expand Down Expand Up @@ -4696,6 +4747,22 @@ template genMatrix(String name, String row, String col, Integer rowI, Integer co
end match
end genMatrix;

template genMatrixMatlab(String name, String row, String col, Integer rowI, Integer colI) "template genMatrixMatlab
Generates Matrix for linear model in Matlab code"
::=
match rowI
case 0 then
<<" <%name%> = zeros(<%row%>, <%col%>);%s\n">>
case _ then
match colI
case 0 then
<<" <%name%> = zeros(<%row%>, <%col%>);%s\n">>
case _ then
<<" <%name%> = [%s];\n">>
end match
end match
end genMatrixMatlab;

template genVector(String name, String num, Integer numI, Integer flag) "template genVector
Generates variables Vectors for linear model"
::=
Expand Down
5 changes: 3 additions & 2 deletions OMCompiler/Compiler/Template/SimCodeTV.mo
Expand Up @@ -3717,12 +3717,13 @@ package Flags
constant ConfigFlag EQUATIONS_PER_FILE;
constant ConfigFlag GENERATE_SYMBOLIC_JACOBIAN;
constant ConfigFlag HOMOTOPY_APPROACH;
constant ConfigFlag GENERATE_LABELED_SIMCODE;
constant ConfigFlag GENERATE_LABELED_SIMCODE;
constant ConfigFlag REDUCE_TERMS;
constant ConfigFlag LABELED_REDUCTION;
constant ConfigFlag LOAD_MSL_MODEL;
constant ConfigFlag Load_PACKAGE_FILE;
constant ConfigFlag SINGLE_INSTANCE_AGLSOLVER;
constant ConfigFlag SINGLE_INSTANCE_AGLSOLVER;
constant ConfigFlag LINEARIZATION_DUMP_LANGUAGE;
function set
input DebugFlag inFlag;
input Boolean inValue;
Expand Down
8 changes: 7 additions & 1 deletion OMCompiler/Compiler/Util/Flags.mo
Expand Up @@ -1495,6 +1495,11 @@ constant ConfigFlag STRICT = CONFIG_FLAG(130, "strict",
NONE(), EXTERNAL(), BOOL_FLAG(false), NONE(),
Util.gettext("Enables stricter enforcement of Modelica language rules."));

constant ConfigFlag LINEARIZATION_DUMP_LANGUAGE = CONFIG_FLAG(131, "linearizationDumpLanguage",
NONE(), EXTERNAL(), STRING_FLAG("modelica"),
SOME(STRING_OPTION({"modelica","matlab"})),
Util.gettext("Sets the target language for the produced code of linearization. Only works with '--generateSymbolicLinearization' and 'linearize(modelName)'."));

protected
// This is a list of all configuration flags. A flag can not be used unless it's
// in this list, and the list is checked at initialization so that all flags are
Expand Down Expand Up @@ -1629,7 +1634,8 @@ constant list<ConfigFlag> allConfigFlags = {
SINGLE_INSTANCE_AGLSOLVER,
SHOW_STRUCTURAL_ANNOTATIONS,
INITIAL_STATE_SELECTION,
STRICT
STRICT,
LINEARIZATION_DUMP_LANGUAGE
};

public function new
Expand Down

0 comments on commit bc1d4b8

Please sign in to comment.