@@ -3704,7 +3704,7 @@ match simCode
37043704 _dimZeroFunc = <%zeroCrossLength(simCode)%>;
37053705 _dimClock = <%listLength(getSubPartitions(clockedPartitions))%>;
37063706 // simplified treatment of clocks in model as time events
3707- _dimTimeEvent = <%timeEventLength(simCode)%> + _dimClock ;
3707+ _dimTimeEvent = <%timeEventLength(simCode)%> ;
37083708 //Number of residues
37093709 _event_handling= shared_ptr<EventHandling>(new EventHandling());
37103710 initializeAlgloopSolverVariables(); //if we do not initialize it here, we get a segfault in the destructor if initialization of Solver or OMFactory has failed
@@ -6829,7 +6829,7 @@ case SIMCODE(__) then
68296829 <<
68306830 <%equationFunctions(allEquations, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace,contextSimulationDiscrete,stateDerVectorName,useFlatArrayNotation,boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")))%>
68316831
6832- <%clockedFunctions(getSubPartitions( clockedPartitions) , simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, boolNot(stringEq(getConfigString(PROFILING_LEVEL), "none")))%>
6832+ <%clockedFunctions(clockedPartitions, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, boolNot(stringEq(getConfigString(PROFILING_LEVEL), "none")))%>
68336833
68346834 <%createEvaluateAll(allEquations, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace,contextOther, stateDerVectorName, useFlatArrayNotation, boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")))%>
68356835
@@ -7260,11 +7260,11 @@ template generateClockedFuncDecls(list<SubPartition> subPartitions, Text method)
72607260 let decls = (subPartitions |> subPartition hasindex i fromindex 1 =>
72617261 match subPartition case SUBPARTITION(__) then
72627262 <<
7263- /// Clocked partition <%i%>
7264- void evaluateClocked<%i%>(const UPDATETYPE command);
7263+ /// Clocked partition <%getSubPartitionIdx(subPartition)%>
7264+ void evaluateClocked<%getSubPartitionIdx(subPartition)%>(const UPDATETYPE command);
7265+ void evaluateClockedAssignPrevious<%getSubPartitionIdx(subPartition)%>(const UPDATETYPE command);
72657266
7266-
7267- <%generateEquationMemberFuncDecls(listAppend(equations, removedEquations), method)%>
7267+ <%generateEquationMemberFuncDecls(listAppend(listAppend(previousAssignments,equations), removedEquations), method)%>
72687268 >>
72697269 ; separator="\n")
72707270 '<%decls%>'
@@ -9815,8 +9815,13 @@ case SIMCODE(modelInfo = MODELINFO(__), modelStructure = fmims) then
98159815 <%preExp%>
98169816 _clockInterval[<%i%>] = <%interval%> * <%fnom%>.0 / <%fres%>.0;
98179817 _clockShift[<%i%>] = <%snom%>.0 / <%sres%>.0;
9818- _clockTime[<%i%>] = _simTime + _clockShift[<%i%>] * _clockInterval[<%i%>];
9819- _clockStart[<%i%>] = true;
9818+ _clockTime[<%i%>] = _simTime + _clockShift[<%i%>] * _clockInterval[<%i%>];
9819+ if( _clockShift[<%i%>]>0)
9820+ _clockCondition[<%i%>] = false;
9821+ else
9822+ _clockCondition[<%i%>] =true;
9823+ _clockStart[<%i%>] = true;
9824+
98209825 <%i%> ++;
98219826 >>
98229827 ; separator="\n")
@@ -10510,9 +10515,11 @@ template generateTimeEvent(list<BackendDAE.TimeEvent> timeEvents, SimCode simCod
1051010515 >>
1051110516 else ''
1051210517 ;separator="\n\n")%>
10513- // simplified treatment of clocks in model as time events
10518+ /* temporary deactivated: using state events for clocks
10519+ // simplified treatment of clocks in model as time events
1051410520 for (int i = 0; i < _dimClock; i++)
1051510521 time_events.push_back(std::make_pair(_clockShift[i] * _clockInterval[i], _clockInterval[i]));
10522+ */
1051610523 }
1051710524 >>
1051810525end generateTimeEvent;
@@ -12449,13 +12456,32 @@ template handleSystemEvents(list<ZeroCrossing> zeroCrossings, SimCode simCode ,T
1244912456 <<
1245012457 bool <%lastIdentOfPath(modelInfo.name)%>Mixed::handleSystemEvents(bool* events)
1245112458 {
12452- _callType = IContinuous::DISCRETE;
12453-
1245412459 bool restart = true;
1245512460 bool state_vars_reinitialized = false;
1245612461 bool clock_event_detected = false;
1245712462
1245812463 int iter = 0;
12464+ //check for clock events
12465+ for(int i =0;i< _dimClock;i++)
12466+ {
12467+ if(events[_dimZeroFunc+i] )
12468+ {
12469+ clock_event_detected = true;
12470+ break;
12471+ }
12472+ }
12473+ //if there is a single clock event, update all clock conditions
12474+ if (clock_event_detected){
12475+ for(int i =0;i< _dimClock;i++){
12476+ if(_simTime +1e-9 > _clockTime[i]){
12477+ _clockCondition[i]=true;
12478+ }
12479+ }
12480+ evaluateAll();
12481+ }
12482+
12483+ if (clock_event_detected) return false;// no event iteration after clock tick handling
12484+ _callType = IContinuous::DISCRETE;
1245912485 while(restart && !(iter++ > 100))
1246012486 {
1246112487 bool st_vars_reinit = false;
@@ -12502,7 +12528,14 @@ template giveZeroFunc1(list<ZeroCrossing> zeroCrossings,SimCode simCode ,Text& e
1250212528 <%varDecls%>
1250312529 <%prexp%>
1250412530 <%zeroCrossingsCode%>
12531+ for(int i =0;i<_dimClock;i++)
12532+ {
1250512533
12534+ if((_simTime>0.0) && (_simTime < _clockTime[i]))
12535+ f[i+_dimZeroFunc]= (_simTime - _clockTime[i])- 1e-9;
12536+ else
12537+ f[i+_dimZeroFunc]=1.0;
12538+ }
1250612539
1250712540 }
1250812541 >>
@@ -12709,26 +12742,39 @@ template equationFunctions(list<SimEqSystem> allEquationsPlusWhen, SimCode simCo
1270912742 >>
1271012743end equationFunctions;
1271112744
12712- template clockedFunctions(list<SubPartition> subPartitions, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Context context, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation, Boolean enableMeasureTime)
12745+ template clockedFunctions(list<ClockedPartition> clockedPartitions, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Context context, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation, Boolean enableMeasureTime)
1271312746 "Evaluate clocked synchronous equations"
1271412747::=
1271512748 let className = lastIdentOfPathFromSimCode(simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
1271612749
12717-
12750+ /*
1271812751 let parts = subPartitions |> subPartition hasindex i fromindex 1 =>
1271912752 match subPartition
1272012753 case SUBPARTITION(__) then
12721- clockedPartFunctions(i, vars, listAppend(equations, removedEquations), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, enableMeasureTime)
12754+ clockedPartFunctions(i, vars, listAppend(equations, removedEquations), subPartition, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, enableMeasureTime)
1272212755 ; separator = "\n"
12756+ */
12757+ let parts =
12758+ (clockedPartitions |> partition hasindex i fromindex 1 =>
12759+ match partition
12760+ case CLOCKED_PARTITION(baseClock=clock) then
1272312761
12762+ let subClocks = (subPartitions |> subPartition hasindex j fromindex 1 =>
12763+ match subPartition
12764+ case SUBPARTITION(idx=idx, subClock=SUBCLOCK(factor=RATIONAL(nom=fnom, denom=fres), shift=RATIONAL(nom=snom, denom=sres))) then
12765+ clockedPartFunctions(idx, previousAssignments, listAppend(equations, removedEquations), clock,subClock,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, enableMeasureTime)
12766+ ; separator="\n")
12767+ <<
12768+ <%subClocks%>
12769+ >>
12770+ ; separator="\n")
1272412771
1272512772
1272612773
12727-
12728- let cases = subPartitions |> subPartition hasindex i fromindex 1 =>
12774+ let cases = getSubPartitions(clockedPartitions) |> subPartition hasindex i fromindex 1 =>
1272912775 <<
12730- case <%i %>:
12731- evaluateClocked<%i %>(IContinuous::UNDEF_UPDATE);
12776+ case <%getSubPartitionIdx(subPartition) %>:
12777+ evaluateClocked<%getSubPartitionIdx(subPartition) %>(IContinuous::UNDEF_UPDATE);
1273212778 break;
1273312779 >>; separator = "\n"
1273412780 <<
@@ -12748,13 +12794,31 @@ template clockedFunctions(list<SubPartition> subPartitions, SimCode simCode, Te
1274812794 >>
1274912795end clockedFunctions;
1275012796
12751- template clockedPartFunctions(Integer i, list<tuple<SimCodeVar.SimVar, Boolean>> vars , list<SimEqSystem> equations,SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Context context, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation, Boolean enableMeasureTime)
12797+ template clockedPartFunctions(Integer i, list<SimEqSystem> previousAssignments , list<SimEqSystem> equations,DAE.ClockKind baseClock,BackendDAE.SubClock subClock ,SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Context context, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation, Boolean enableMeasureTime)
1275212798 "Evaluate functions that belong to a clocked partition"
1275312799::=
1275412800 let className = lastIdentOfPathFromSimCode(simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
12755- let funcs = equations |> eq =>
12801+ let &preExp = buffer "" /*BUFD*/
12802+ let &varDecls = buffer "" /*BUFD*/
12803+ let intvl = daeExp(getClockInterval(baseClock), contextOther, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl,extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
12804+ let idx = intAdd(i, -1)
12805+ let clockvals = match subClock
12806+ case SUBCLOCK(factor=RATIONAL(nom=fnom, denom=fres), shift=RATIONAL(nom=snom, denom=sres))
12807+ then
12808+ <<
12809+ _clockInterval[<%idx%>] = <%intvl%> * <%fnom%>.0 / <%fres%>.0;
12810+ _clockTime[<%idx%>] = _simTime +_clockInterval[<%idx%>] ;
12811+ >>
12812+
12813+ let funcs = listAppend(previousAssignments,equations) |> eq =>
1275612814 equation_function_create_single_func(eq, context/*BUFC*/, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, "evaluate", "", stateDerVectorName, useFlatArrayNotation, enableMeasureTime, false, false, 'const int clockIndex = <%i%>;<%\n%>')
1275712815 ; separator="\n"
12816+
12817+ let funcNamePrev = 'evaluateClockedAssignPrevious<%i%>'
12818+ let funcCallsPrev = (List.partition(previousAssignments, 100) |> eqs hasindex i0 =>
12819+ createEvaluateWithSplit(i0, context, eqs, funcNamePrev, className, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
12820+ ; separator="\n")
12821+
1275812822 let funcName = 'evaluateClocked<%i%>'
1275912823 let funcCalls = (List.partition(equations, 100) |> eqs hasindex i0 =>
1276012824 createEvaluateWithSplit(i0, context, eqs, funcName, className, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
@@ -12765,14 +12829,20 @@ template clockedPartFunctions(Integer i, list<tuple<SimCodeVar.SimVar, Boolean>>
1276512829
1276612830 void <%className%>::<%funcName%>(const UPDATETYPE command)
1276712831 {
12768- if (_simTime > _clockTime[<%idx%>]) {
12832+
12833+ <%varDecls%>
12834+ <%preExp%>
12835+ if (_simTime > _clockTime[<%idx%>]) {
1276912836 _clockStart[<%idx%>] = false;
1277012837 }
12771- <%funcCalls%>
12772- if (_simTime > _clockTime[<%idx%>]) {
12773- _clockInterval[<%idx%>] = _simTime - _clockTime[<%idx%>];
12774- _clockTime[<%idx%>] = _simTime;
12775- }
12838+ //evaluate clock partition equations
12839+ <%funcCalls%>
12840+
12841+ //compute new clock tick
12842+ <%clockvals%>
12843+
12844+ //assign the previous-vars since the step is completed
12845+ <%funcCallsPrev%>
1277612846 }
1277712847 >>
1277812848end clockedPartFunctions;
@@ -12805,13 +12875,21 @@ end createEvaluateAll;
1280512875template createTimeConditionTreatments(String numberOfTimeEvents)
1280612876::=
1280712877 <<
12808-
12878+ /*temporary deactivated: treatment of clocks in model as state events
1280912879 // treatment of clocks in model as time events
1281012880 for (int i = <%numberOfTimeEvents%>; i < _dimTimeEvent; i++) {
1281112881 if (_time_conditions[i]) {
1281212882 evaluateClocked(i - <%numberOfTimeEvents%> + 1);
1281312883 _time_conditions[i] = false; // reset clock after one evaluation
12814-
12884+ }
12885+ }
12886+ */
12887+ for (int i = 0; i < _dimClock; i++)
12888+ {
12889+ if( _clockCondition[i])
12890+ {
12891+ evaluateClocked(i+1);
12892+ _clockCondition[i] = false;// reset clock after one evaluation
1281512893 }
1281612894 }
1281712895 >>
0 commit comments