Skip to content

Commit

Permalink
fix event iteration for algloops
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18337 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
niklwors committed Nov 28, 2013
1 parent 2cb3f6e commit 8a87f91
Showing 1 changed file with 14 additions and 32 deletions.
46 changes: 14 additions & 32 deletions Compiler/Template/CodegenCpp.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -4200,46 +4200,27 @@ template equation_(SimEqSystem eq, Context context, Text &varDecls, SimCode simC
then
<<

bool* conditions0<%index%> = new bool[_dimZeroFunc];
bool* conditions1<%index%> = new bool[_dimZeroFunc];
bool restart<%index%>=true;
unsigned int iterations<%index%> = 0;


try
{
_algLoopSolver<%index%>->initialize();
_algLoop<%index%>->evaluate();
unsigned int iterations = 0;
if( _callType == IContinuous::DISCRETE )
for(int i=0;i<_dimZeroFunc;i++)
{
while(restart<%index%> && !(iterations<%index%>++>500))
{
getConditions(conditions0<%index%>);
_algLoopSolver<%index%>->solve();
for(int i=0;i<_dimZeroFunc;i++)
{
getCondition(i);
}

getConditions(conditions1<%index%>);
restart<%index%> = !std::equal (conditions1<%index%>, conditions1<%index%>+_dimZeroFunc,conditions0<%index%>);
}
getCondition(i);
}
else
_algLoopSolver<%index%>->solve();
IContinuous::UPDATETYPE calltype = _callType;
_callType = IContinuous::CONTINUOUS;
_algLoopSolver<%index%>->solve();
_callType = calltype;
}
catch(std::exception &ex)
{
delete[] conditions0<%index%>;
delete[] conditions1<%index%>;
throw std::invalid_argument("Nonlinear solver stopped at time " + boost::lexical_cast<string>(_simTime) + " with error: " + ex.what());
}
delete[] conditions0<%index%>;
delete[] conditions1<%index%>;
if(restart<%index%> && iterations<%index%> > 0)
throw std::invalid_argument("Nonlinear solver stopped at time " + boost::lexical_cast<string>(_simTime) );

>>
else
<<
Expand All @@ -4252,21 +4233,22 @@ template equation_(SimEqSystem eq, Context context, Text &varDecls, SimCode simC
{
_algLoop<%index%>->evaluate();
if( _callType == IContinuous::DISCRETE )
{
while(restart<%index%> && !(iterations<%index%>++>500))
{
getConditions(conditions0<%index%>);
_callType = IContinuous::CONTINUOUS;
_algLoopSolver<%index%>->solve();
_callType = IContinuous::DISCRETE;
for(int i=0;i<_dimZeroFunc;i++)
{
getCondition(i);
}

getConditions(conditions1<%index%>);
restart<%index%> = !std::equal (conditions1<%index%>, conditions1<%index%>+_dimZeroFunc,conditions0<%index%>);
}
Expand Down

0 comments on commit 8a87f91

Please sign in to comment.