Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit d5e13f9

Browse files
lochelOpenModelica-Hudson
authored andcommitted
Small changes to Modelica export of linearized models
Belonging to [master]: - #2789 - OpenModelica/OpenModelica-testsuite#1076
1 parent a616890 commit d5e13f9

File tree

2 files changed

+68
-52
lines changed

2 files changed

+68
-52
lines changed

Compiler/Template/CodegenC.tpl

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4519,107 +4519,120 @@ template functionlinearmodel(ModelInfo modelInfo, String modelNamePrefix) "templ
45194519
::=
45204520
match modelInfo
45214521
case MODELINFO(varInfo=VARINFO(__), vars=SIMVARS(__)) then
4522-
let matrixA = genMatrix("A", varInfo.numStateVars, varInfo.numStateVars)
4523-
let matrixB = genMatrix("B", varInfo.numStateVars, varInfo.numInVars)
4524-
let matrixC = genMatrix("C", varInfo.numOutVars, varInfo.numStateVars)
4525-
let matrixD = genMatrix("D", varInfo.numOutVars, varInfo.numInVars)
4526-
let matrixCz = genMatrix("Cz", varInfo.numAlgVars, varInfo.numStateVars)
4527-
let matrixDz = genMatrix("Dz", varInfo.numAlgVars, varInfo.numInVars)
4528-
let vectorX = genVector("x", varInfo.numStateVars, 0)
4529-
let vectorU = genVector("u", varInfo.numInVars, 1)
4530-
let vectorY = genVector("y", varInfo.numOutVars, 2)
4531-
let vectorZ = genVector("z", varInfo.numAlgVars, 2)
4522+
let matrixA = genMatrix("A", "n", "n", varInfo.numStateVars, varInfo.numStateVars)
4523+
let matrixB = genMatrix("B", "n", "p", varInfo.numStateVars, varInfo.numInVars)
4524+
let matrixC = genMatrix("C", "q", "n", varInfo.numOutVars, varInfo.numStateVars)
4525+
let matrixD = genMatrix("D", "q", "p", varInfo.numOutVars, varInfo.numInVars)
4526+
let matrixCz = genMatrix("Cz", "nz", "n", varInfo.numAlgVars, varInfo.numStateVars)
4527+
let matrixDz = genMatrix("Dz", "nz", "p", varInfo.numAlgVars, varInfo.numInVars)
4528+
let vectorX = genVector("x", "n", varInfo.numStateVars, 0)
4529+
let vectorU = genVector("u", "p", varInfo.numInVars, 1)
4530+
let vectorY = genVector("y", "q", varInfo.numOutVars, 2)
4531+
let vectorZ = genVector("z", "nz", varInfo.numAlgVars, 2)
45324532
//string def_proctedpart("\n Real x[<%varInfo.numStateVars%>](start=x0);\n Real u[<%varInfo.numInVars%>](start=u0);\n output Real y[<%varInfo.numOutVars%>];\n");
45334533
<<
45344534
const char *<%symbolName(modelNamePrefix,"linear_model_frame")%>()
45354535
{
4536-
return "model linear_<%underscorePath(name)%>\n parameter Integer n = <%varInfo.numStateVars%>; // states\n parameter Integer k = <%varInfo.numInVars%>; // top-level inputs\n parameter Integer l = <%varInfo.numOutVars%>; // top-level outputs\n"
4537-
" parameter Real x0[<%varInfo.numStateVars%>] = {%s};\n"
4538-
" parameter Real u0[<%varInfo.numInVars%>] = {%s};\n"
4536+
return "model linear_<%underscorePath(name)%>\n parameter Integer n = <%varInfo.numStateVars%> \"number of states\";\n parameter Integer p = <%varInfo.numInVars%> \"number of inputs\";\n parameter Integer q = <%varInfo.numOutVars%> \"number of outputs\";\n"
4537+
"\n"
4538+
" parameter Real x0[n] = %s;\n"
4539+
" parameter Real u0[p] = %s;\n"
4540+
"\n"
45394541
<%matrixA%>
45404542
<%matrixB%>
45414543
<%matrixC%>
45424544
<%matrixD%>
4545+
"\n"
45434546
<%vectorX%>
45444547
<%vectorU%>
45454548
<%vectorY%>
4546-
"\n <%getVarName(vars.stateVars, "x", varInfo.numStateVars )%><% getVarName(vars.inputVars, "u", varInfo.numInVars) %><%getVarName(vars.outputVars, "y", varInfo.numOutVars) %>\n"
4549+
"\n"
4550+
<%getVarName(vars.stateVars, "x")%>
4551+
<%getVarName(vars.inputVars, "u")%>
4552+
<%getVarName(vars.outputVars, "y")%>
45474553
"equation\n der(x) = A * x + B * u;\n y = C * x + D * u;\nend linear_<%underscorePath(name)%>;\n";
45484554
}
45494555
const char *<%symbolName(modelNamePrefix,"linear_model_datarecovery_frame")%>()
45504556
{
4551-
return "model linear_<%underscorePath(name)%>\n parameter Integer n = <%varInfo.numStateVars%>; // states\n parameter Integer k = <%varInfo.numInVars%>; // top-level inputs\n parameter Integer l = <%varInfo.numOutVars%>; // top-level outputs\n parameter Integer nz = <%varInfo.numAlgVars%>; // data recovery variables\n"
4552-
" parameter Real x0[<%varInfo.numStateVars%>] = {%s};\n"
4553-
" parameter Real u0[<%varInfo.numInVars%>] = {%s};\n"
4554-
" parameter Real z0[<%varInfo.numAlgVars%>] = {%s};\n"
4557+
return "model linear_<%underscorePath(name)%>\n parameter Integer n = <%varInfo.numStateVars%> \"number of states\";\n parameter Integer p = <%varInfo.numInVars%> \"number of inputs\";\n parameter Integer q = <%varInfo.numOutVars%> \"number of outputs\";\n parameter Integer nz = <%varInfo.numAlgVars%> \"data recovery variables\";\n"
4558+
"\n"
4559+
" parameter Real x0[<%varInfo.numStateVars%>] = %s;\n"
4560+
" parameter Real u0[<%varInfo.numInVars%>] = %s;\n"
4561+
" parameter Real z0[<%varInfo.numAlgVars%>] = %s;\n"
4562+
"\n"
45554563
<%matrixA%>
45564564
<%matrixB%>
45574565
<%matrixC%>
45584566
<%matrixD%>
45594567
<%matrixCz%>
45604568
<%matrixDz%>
4569+
"\n"
45614570
<%vectorX%>
45624571
<%vectorU%>
45634572
<%vectorY%>
45644573
<%vectorZ%>
4565-
"\n<%getVarName(vars.stateVars, "x", varInfo.numStateVars)%><% getVarName(vars.inputVars, "u", varInfo.numInVars)%><%getVarName(vars.outputVars, "y", varInfo.numOutVars)%><%getVarName(vars.algVars, "z", varInfo.numAlgVars)%>\n"
4574+
"\n"
4575+
<%getVarName(vars.stateVars, "x")%>
4576+
<%getVarName(vars.inputVars, "u")%>
4577+
<%getVarName(vars.outputVars, "y")%>
4578+
<%getVarName(vars.algVars, "z")%>
45664579
"equation\n der(x) = A * x + B * u;\n y = C * x + D * u;\n z = Cz * x + Dz * u;\nend linear_<%underscorePath(name)%>;\n";
45674580
}
45684581
>>
45694582
end match
45704583
end functionlinearmodel;
45714584

4572-
template getVarName(list<SimVar> simVars, String arrayName, Integer arraySize) "template getVarName
4585+
template getVarName(list<SimVar> simVars, String arrayName) "template getVarName
45734586
Generates name for a varables."
45744587
::=
45754588
simVars |> var hasindex arrindex fromindex 1 =>
45764589
(match var
45774590
case SIMVAR(__) then
4578-
<< Real '<%arrayName%>_<%crefStrNoUnderscore(name)%>' = <%arrayName%>[<%arrindex%>];\n>>
4591+
<<" Real '<%arrayName%>_<%crefStrNoUnderscore(name)%>' = <%arrayName%>[<%arrindex%>];\n">>
45794592
end match)
45804593
; empty
45814594
end getVarName;
45824595

4583-
template genMatrix(String name, Integer row, Integer col) "template genMatrix
4596+
template genMatrix(String name, String row, String col, Integer rowI, Integer colI) "template genMatrix
45844597
Generates Matrix for linear model"
45854598
::=
4586-
match row
4599+
match rowI
45874600
case 0 then
4588-
<<" parameter Real <%name%>[<%row%>,<%col%>] = zeros(<%row%>,<%col%>);%s\n">>
4601+
<<" parameter Real <%name%>[<%row%>, <%col%>] = zeros(<%row%>, <%col%>);%s\n">>
45894602
case _ then
4590-
match col
4603+
match colI
45914604
case 0 then
4592-
<<" parameter Real <%name%>[<%row%>,<%col%>] = zeros(<%row%>,<%col%>);%s\n">>
4605+
<<" parameter Real <%name%>[<%row%>, <%col%>] = zeros(<%row%>, <%col%>);%s\n">>
45934606
case _ then
4594-
<<" parameter Real <%name%>[<%row%>,<%col%>] = [%s];\n">>
4607+
<<" parameter Real <%name%>[<%row%>, <%col%>] = [%s];\n">>
45954608
end match
45964609
end match
45974610
end genMatrix;
45984611

4599-
template genVector(String name, Integer numIn, Integer flag) "template genVector
4612+
template genVector(String name, String num, Integer numI, Integer flag) "template genVector
46004613
Generates variables Vectors for linear model"
46014614
::=
46024615
match flag
46034616
case 0 then
4604-
match numIn
4617+
match numI
46054618
case 0 then
4606-
<<" Real <%name%>[<%numIn%>];\n">>
4619+
<<" Real <%name%>[<%num%>];\n">>
46074620
case _ then
4608-
<<" Real <%name%>[<%numIn%>](start=<%name%>0);\n">>
4621+
<<" Real <%name%>[<%num%>](start=<%name%>0);\n">>
46094622
end match
46104623
case 1 then
4611-
match numIn
4624+
match numI
46124625
case 0 then
4613-
<<" input Real <%name%>[<%numIn%>];\n">>
4626+
<<" input Real <%name%>[<%num%>];\n">>
46144627
case _ then
4615-
<<" input Real <%name%>[<%numIn%>](start= <%name%>0);\n">>
4628+
<<" input Real <%name%>[<%num%>](start=<%name%>0);\n">>
46164629
end match
46174630
case 2 then
4618-
match numIn
4631+
match numI
46194632
case 0 then
4620-
<<" output Real <%name%>[<%numIn%>];\n">>
4633+
<<" output Real <%name%>[<%num%>];\n">>
46214634
case _ then
4622-
<<" output Real <%name%>[<%numIn%>];\n">>
4635+
<<" output Real <%name%>[<%num%>];\n">>
46234636
end match
46244637
end match
46254638
end genVector;

SimulationRuntime/c/linearization/linearize.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,29 @@
3939
#include <sstream>
4040
#include <string>
4141

42-
4342
using namespace std;
4443

45-
static string array2string(double* array, int row, int col){
46-
44+
static string array2string(double* array, int row, int col)
45+
{
4746
int i=0;
4847
int j=0;
4948
ostringstream retVal(ostringstream::out);
5049
retVal.precision(16);
51-
for(i=0;i<row;i++){
50+
for(i=0; i<row; i++)
51+
{
5252
int k = i;
53-
for(j=0;j<col-1;j++){
54-
retVal << array[k] << ",";
53+
for(j=0; j<col-1; j++)
54+
{
55+
retVal << array[k] << ", ";
5556
k += row;
5657
}
57-
if(col > 0) {
58+
if(col > 0)
59+
{
5860
retVal << array[k];
5961
}
60-
if(!((i+1) == row) && !(col == 0)) {
61-
retVal << ";";
62+
if((i+1 != row) && (col != 0))
63+
{
64+
retVal << "; ";
6265
}
6366
}
6467
return retVal.str();
@@ -477,9 +480,9 @@ int linearize(DATA* data, threadData_t *threadData)
477480
/* Need to do this before changing anything so that we get a proper z0 */
478481
if(do_data_recovery > 0){
479482
if(size_z){
480-
strZ0 = array2string(&data->localData[0]->realVars[2*size_A],1,size_z);
483+
strZ0 = "{" + array2string(&data->localData[0]->realVars[2*size_A],1,size_z) + "}";
481484
}else{
482-
strZ0 = "i for i in 1:0";
485+
strZ0 = "zeros(0)";
483486
}
484487
}
485488

@@ -537,14 +540,14 @@ int linearize(DATA* data, threadData_t *threadData)
537540
// inside the curly braces for x0 and u0. {for i in in 1:0} will create an
538541
// empty array if needed.
539542
if(size_A)
540-
strX = array2string(data->localData[0]->realVars,1,size_A);
543+
strX = "{" + array2string(data->localData[0]->realVars, 1, size_A) + "}";
541544
else
542-
strX = "i for i in 1:0";
545+
strX = "zeros(0)";
543546

544547
if(size_Inputs)
545-
strU = array2string(data->simulationInfo->inputVars,1,size_Inputs);
548+
strU = "{" + array2string(data->simulationInfo->inputVars, 1, size_Inputs) + "}";
546549
else
547-
strU = "i for i in 1:0";
550+
strU = "zeros(0)";
548551

549552
free(matrixA);
550553
free(matrixB);

0 commit comments

Comments
 (0)