Skip to content

Commit

Permalink
fix for array index operator call in cpp template, separated external…
Browse files Browse the repository at this point in the history
… vars initialization in cpp template

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@23624 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
niklwors committed Dec 2, 2014
1 parent a467730 commit 34fd6de
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 33 deletions.
111 changes: 85 additions & 26 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -96,9 +96,9 @@ let initeqs = generateEquationMemberFuncDecls(initialEquations,"initEquation")
private:
<%initeqs%>
<%List.partition(vars.algVars, 100) |> ls hasindex idx => 'void initializeAlgVars_<%idx%>();';separator="\n"%>
<%initExtVarsDecl(simCode, false)%>
void initializeAlgVars();
void initializeDiscreteAlgVars();
Expand Down Expand Up @@ -525,7 +525,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then

<%GetIntialStatus(simCode)%>
<%SetIntialStatus(simCode)%>

<%initExtVars(simCode, useFlatArrayNotation)%>
<%init(simCode, useFlatArrayNotation)%>
>>

Expand Down Expand Up @@ -3740,6 +3740,32 @@ template funStatement(Statement stmt, Text &varDecls /*BUFP*/,SimCode simCode,Bo
"NOT IMPLEMENTED FUN STATEMENT"
end funStatement;

template initExtVars(SimCode simCode, Boolean useFlatArrayNotation)
::=
match simCode
case SIMCODE(modelInfo = MODELINFO(__)) then
let externalvarfuncs = functionCallExternalObjectConstructors('<%lastIdentOfPath(modelInfo.name)%>Initialize::initializeExternalVar',extObjInfo,simCode,useFlatArrayNotation)
let externalvarsfunccalls = functionCallExternalObjectConstructorsCall('<%lastIdentOfPath(modelInfo.name)%>Initialize','initializeExternalVar',extObjInfo,simCode,useFlatArrayNotation)
<<
<%externalvarfuncs%>
<%externalvarsfunccalls%>
>>
end match
end initExtVars;

template initExtVarsDecl(SimCode simCode, Boolean useFlatArrayNotation)
::=
match simCode
case SIMCODE(modelInfo = MODELINFO(__)) then
let externalvarsdecl = functionCallExternalObjectConstructorsDecl('initializeExternalVar',extObjInfo,simCode,useFlatArrayNotation)
<<
<%externalvarsdecl%>
void initializeExternalVar();
>>
end match
end initExtVarsDecl;


template init(SimCode simCode, Boolean useFlatArrayNotation)
::=
match simCode
Expand All @@ -3755,18 +3781,17 @@ case SIMCODE(modelInfo = MODELINFO(__)) then
let initAlgloopvars = initAlgloopVars(listAppend(allEquations,initialEquations),simCode)

let initialequations = functionInitialEquations(initialEquations,simCode, useFlatArrayNotation)
let initextvars = functionCallExternalObjectConstructors(extObjInfo,simCode,useFlatArrayNotation)

<<
void <%lastIdentOfPath(modelInfo.name)%>Initialize::initialize()
{
<%generateAlgloopsolvers( listAppend(allEquations,initialEquations),simCode)%>
_simTime = 0.0;
/*variable decls*/
<%varDecls%>
<%initextvars%>
/*external vars decls*/
initializeExternalVar();
/*initialize parameter*/
initializeParameterVars();
initializeIntParameterVars();
initializeBoolParameterVars();
Expand Down Expand Up @@ -3899,37 +3924,71 @@ case modelInfo as MODELINFO(vars=SIMVARS(__)) then
end init2;


template functionCallExternalObjectConstructors(ExtObjInfo extObjInfo,SimCode simCode,Boolean useFlatArrayNotation)
template functionCallExternalObjectConstructors(Text funcNamePrefix,ExtObjInfo extObjInfo,SimCode simCode,Boolean useFlatArrayNotation)
"Generates function in simulation file."
::=
match extObjInfo
case EXTOBJINFO(__) then
let &funDecls = buffer "" /*BUFD*/
let &varDecls = buffer "" /*BUFD*/
let ctorCalls = (vars |> var as SIMVAR(initialValue=SOME(exp)) =>


let ctorCalls = (vars |> var as SIMVAR(initialValue=SOME(exp)) hasindex idx=>
let &preExp = buffer "" /*BUFD*/
let &varDecls = buffer "" /*BUFD*/
let arg = daeExp(exp, contextOther, &preExp, &varDecls,simCode,useFlatArrayNotation)
/* Restore the memory state after each object has been initialized. Then we can
* initalize a really large number of external objects that play with strings :)
*/
<<
<%preExp%>
<%cref(var.name,useFlatArrayNotation)%> = <%arg%>;
void <%funcNamePrefix%>_<%idx%>()
{
<%varDecls%>
<%preExp%>
<%cref(var.name,useFlatArrayNotation)%> = <%arg%>;
}
>>
;separator="\n")
ctorCalls
end match
end functionCallExternalObjectConstructors;

<<

<%varDecls%>


<%ctorCalls%>
<%aliases |> (var1, var2) => '<%cref(var1,useFlatArrayNotation)%> = <%cref(var2,useFlatArrayNotation)%>;' ;separator="\n"%>
template functionCallExternalObjectConstructorsCall(Text classname,Text funcNamePrefix,ExtObjInfo extObjInfo,SimCode simCode,Boolean useFlatArrayNotation)
"Generates function in simulation file."
::=
match extObjInfo
case EXTOBJINFO(__) then
let &funDecls = buffer "" /*BUFD*/
let &varDecls = buffer "" /*BUFD*/
let ctorCalls = (vars |> var as SIMVAR(initialValue=SOME(exp)) hasindex idx=>
<<
<%funcNamePrefix%>_<%idx%>();
>>
;separator="\n")
<<
void <%classname%>::<%funcNamePrefix%>()
{
<%ctorCalls%>
<%aliases |> (var1, var2) => '<%cref(var1,useFlatArrayNotation)%> = <%cref(var2,useFlatArrayNotation)%>;' ;separator="\n"%>
}
>>
end match
end functionCallExternalObjectConstructorsCall;


>>
template functionCallExternalObjectConstructorsDecl(Text funcNamePrefix,ExtObjInfo extObjInfo,SimCode simCode,Boolean useFlatArrayNotation)
"Generates function in simulation file."
::=
match extObjInfo
case EXTOBJINFO(__) then
let &funDecls = buffer "" /*BUFD*/
let &varDecls = buffer "" /*BUFD*/
let ctorCallsDecl = (vars |> var as SIMVAR(initialValue=SOME(exp)) hasindex idx=>
<<
void <%funcNamePrefix%>_<%idx%>();
>>
;separator="\n")
ctorCallsDecl
end match
end functionCallExternalObjectConstructors;
end functionCallExternalObjectConstructorsDecl;


template functionInitialEquations(list<SimEqSystem> initalEquations, SimCode simCode, Boolean useFlatArrayNotation)
Expand Down Expand Up @@ -11346,7 +11405,7 @@ template threadDimSubList(list<Dimension> dims, list<Subscript> subs, Context co
'((<%estr%><%
dimrest |> dim =>
match dim
case DIM_INTEGER(__) then '-1)*<%integer%>'
case DIM_INTEGER(__) then ')*<%integer%>'
case DIM_BOOLEAN(__) then '*2'
case DIM_ENUM(__) then '*<%size%>'
else error(sourceInfo(),"Non-constant dimension in simulation context")
Expand Down Expand Up @@ -11679,7 +11738,7 @@ template handleSystemEvents(list<ZeroCrossing> zeroCrossings,list<SimWhenClause>
saveAll();
}

if(iter>100 && restart ){
throw std::runtime_error("Number of event iteration steps exceeded at time: " + boost::lexical_cast<string>(_simTime) );}
_callType = IContinuous::CONTINUOUS;
Expand Down
9 changes: 5 additions & 4 deletions SimulationRuntime/cpp/Include/Core/Math/Array.h
Expand Up @@ -165,11 +165,12 @@ template<typename T, std::size_t size>class StatArrayDim1 : public BaseArray<T>

inline virtual T& operator()(unsigned int index)
{
return _real_array[index - 1];
return _real_array[index - 1];
}
inline virtual const T& operator()(unsigned int index) const
{
return _real_array[index - 1];

return _real_array[index - 1];
}

virtual std::vector<size_t> getDims() const
Expand Down Expand Up @@ -581,11 +582,11 @@ template<typename T ,std::size_t size1, std::size_t size2, std::size_t size3> cl
}
virtual T& operator()(vector<size_t> idx)
{
return _real_array[ size2 * (idx[0] - 1) +size3 * (idx[1] - 1) + (idx[2] - 1)];
return _real_array[(idx[2] - 1)*size2*size1 + (idx[1] - 1)*size1 + (idx[0] - 1)];
};
inline virtual T& operator()(unsigned int i, unsigned int j, unsigned int k)
{
return _real_array[size2 * (i - 1) + size3 * (j - 1) + (k - 1)];
return _real_array[(k - 1)*size2*size1 + (j - 1)*size1 + (i - 1)];
}

virtual unsigned int getNumElems()
Expand Down
Expand Up @@ -44,7 +44,7 @@ SimSettings OMCFactory::ReadSimulationParameter(int argc, const char* argv[])
("config-path,c", po::value< string >(), "path to xml files")
("start-time,s", po::value< double >()->default_value(0.0), "simulation start time")
("stop-time,e", po::value< double >()->default_value(1.0), "simulation stop time")
("step-size,f", po::value< double >()->default_value(1e-2), "simulation step size")
("step-size,f", po::value< double >()->default_value(0.0), "simulation step size")
("solver,i", po::value< string >()->default_value("euler"), "solver method")
("lin-solver,L", po::value< string >()->default_value("kinsol"), "linear solver method")
("non-lin-solver,N", po::value< string >()->default_value("kinsol"), "non linear solver method")
Expand All @@ -64,8 +64,9 @@ SimSettings OMCFactory::ReadSimulationParameter(int argc, const char* argv[])
string modelica_lib_path;
double starttime = vm["start-time"].as<double>();
double stoptime = vm["stop-time"].as<double>();

double stepsize = stoptime/vm["number-of-intervals"].as<int>();
double stepsize =vm["step-size"].as<double>();
if (!(stepsize > 0.0))
stepsize = stoptime/vm["number-of-intervals"].as<int>();
double tolerance =vm["tolerance"].as<double>();
string solver = vm["solver"].as<string>();
string nonLinSolver = vm["non-lin-solver"].as<string>();
Expand Down

0 comments on commit 34fd6de

Please sign in to comment.