Changeset 2c7da6d in OpenModelica
- Timestamp:
- 2016-04-07T16:16:52+02:00 (8 years ago)
- Branches:
- Added-citation-metadata, maintenance/v1.14, maintenance/v1.15, maintenance/v1.16, maintenance/v1.17, maintenance/v1.18, maintenance/v1.19, maintenance/v1.20, maintenance/v1.21, maintenance/v1.22, maintenance/v1.23, master, omlib-staging
- Children:
- b0f60261
- Parents:
- c3cf1e92
- git-author:
- Martin Sjölund <martin.sjolund@…> (04/07/16 16:14:21)
- git-committer:
- Martin Sjölund <martin.sjolund@…> (04/07/16 16:16:52)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Compiler/SimCode/SimCodeUtil.mo
rc3cf1e92 r2c7da6d 6274 6274 end getStateInfo; 6275 6275 6276 protected type SimVarsIndex = enumeration( 6277 // In special order for fmi: real => intger => boolean => string => external 6278 state, 6279 derivative, 6280 alg, 6281 discreteAlg, 6282 param, 6283 alias, 6284 6285 intAlg, 6286 intParam, 6287 intAlias, 6288 6289 boolAlg, 6290 boolParam, 6291 boolAlias, 6292 6293 stringAlg, 6294 stringParam, 6295 stringAlias, 6296 6297 extObj, 6298 6299 inputs, 6300 outputs, 6301 6302 realOptimizeConstraints, 6303 realOptimizeFinalConstraints, 6304 6305 const, 6306 intConst, 6307 boolConst, 6308 stringConst, 6309 6310 mixedArray, 6311 jacobian, 6312 seed 6313 ); 6314 6276 6315 protected function createVars 6277 6316 input BackendDAE.BackendDAE inSimDAE "simulation"; … … 6285 6324 DAE.FunctionTree funcTree; 6286 6325 array<HashSet.HashSet> hs = arrayCreate(1, HashSet.emptyHashSet()); 6326 array<list<SimCodeVar.SimVar>> simVars = arrayCreate(size(SimVarsIndex,1), {}); 6287 6327 algorithm 6288 6328 BackendDAE.DAE(eqs=systs1, shared=BackendDAE.SHARED(knownVars=knvars1, externalObjects=extvars1, aliasVars=aliasVars1, functionTree=funcTree)) := inSimDAE; … … 6297 6337 // ### simulation ### 6298 6338 // Extract from variable list 6299 outVars := List.fold1(list(BackendVariable.daeVars(syst) for syst guard not BackendDAEUtil.isClockedSyst(syst) in systs1), BackendVariable.traverseBackendDAEVars, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), SimCodeVar.emptySimVars);6339 simVars := List.fold1(list(BackendVariable.daeVars(syst) for syst guard not BackendDAEUtil.isClockedSyst(syst) in systs1), BackendVariable.traverseBackendDAEVars, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), simVars); 6300 6340 6301 6341 // Extract from known variable list 6302 outVars := BackendVariable.traverseBackendDAEVars(knvars1, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), outVars);6342 simVars := BackendVariable.traverseBackendDAEVars(knvars1, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), simVars); 6303 6343 6304 6344 // Extract from removed variable list 6305 outVars := BackendVariable.traverseBackendDAEVars(aliasVars1, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), outVars);6345 simVars := BackendVariable.traverseBackendDAEVars(aliasVars1, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), simVars); 6306 6346 6307 6347 // Extract from external object list 6308 outVars := BackendVariable.traverseBackendDAEVars(extvars1, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), outVars);6348 simVars := BackendVariable.traverseBackendDAEVars(extvars1, function extractVarsFromList(aliasVars=aliasVars1, vars=knvars1, hs=hs), simVars); 6309 6349 6310 6350 6311 6351 // ### initialization ### 6312 6352 // Extract from variable list 6313 outVars := List.fold1(list(BackendVariable.daeVars(syst) for syst guard not BackendDAEUtil.isClockedSyst(syst) in systs2), BackendVariable.traverseBackendDAEVars, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), outVars);6353 simVars := List.fold1(list(BackendVariable.daeVars(syst) for syst guard not BackendDAEUtil.isClockedSyst(syst) in systs2), BackendVariable.traverseBackendDAEVars, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), simVars); 6314 6354 6315 6355 // Extract from known variable list 6316 outVars := BackendVariable.traverseBackendDAEVars(knvars2, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), outVars);6356 simVars := BackendVariable.traverseBackendDAEVars(knvars2, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), simVars); 6317 6357 6318 6358 // Extract from removed variable list 6319 outVars := BackendVariable.traverseBackendDAEVars(aliasVars2, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), outVars);6359 simVars := BackendVariable.traverseBackendDAEVars(aliasVars2, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), simVars); 6320 6360 6321 6361 // Extract from external object list 6322 outVars := BackendVariable.traverseBackendDAEVars(extvars2, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), outVars);6362 simVars := BackendVariable.traverseBackendDAEVars(extvars2, function extractVarsFromList(aliasVars=aliasVars2, vars=knvars2, hs=hs), simVars); 6323 6363 6324 6364 //BaseHashSet.printHashSet(hs); 6325 6365 6326 6366 // sort variables on index 6327 outVars := sortSimvars(outVars); 6328 outVars := if stringEqual(Config.simCodeTarget(), "Cpp") then extendIncompleteArray(outVars) else outVars; 6367 sortSimvars(simVars); 6368 6369 if stringEqual(Config.simCodeTarget(), "Cpp") then 6370 extendIncompleteArray(simVars); 6371 end if; 6329 6372 6330 6373 // Index of algebraic and parameters need to fix due to separation of integer variables 6331 outVars := fixIndex(outVars); 6332 outVars := setVariableIndex(outVars); 6374 fixIndex(simVars); 6375 setVariableIndex(simVars); 6376 6377 outVars := SimCodeVar.SIMVARS( 6378 arrayGet(simVars, Integer(SimVarsIndex.state)), 6379 arrayGet(simVars, Integer(SimVarsIndex.derivative)), 6380 arrayGet(simVars, Integer(SimVarsIndex.alg)), 6381 arrayGet(simVars, Integer(SimVarsIndex.discreteAlg)), 6382 arrayGet(simVars, Integer(SimVarsIndex.intAlg)), 6383 arrayGet(simVars, Integer(SimVarsIndex.boolAlg)), 6384 arrayGet(simVars, Integer(SimVarsIndex.inputs)), 6385 arrayGet(simVars, Integer(SimVarsIndex.outputs)), 6386 arrayGet(simVars, Integer(SimVarsIndex.alias)), 6387 arrayGet(simVars, Integer(SimVarsIndex.intAlias)), 6388 arrayGet(simVars, Integer(SimVarsIndex.boolAlias)), 6389 arrayGet(simVars, Integer(SimVarsIndex.param)), 6390 arrayGet(simVars, Integer(SimVarsIndex.intParam)), 6391 arrayGet(simVars, Integer(SimVarsIndex.boolParam)), 6392 arrayGet(simVars, Integer(SimVarsIndex.stringAlg)), 6393 arrayGet(simVars, Integer(SimVarsIndex.stringParam)), 6394 arrayGet(simVars, Integer(SimVarsIndex.stringAlias)), 6395 arrayGet(simVars, Integer(SimVarsIndex.extObj)), 6396 arrayGet(simVars, Integer(SimVarsIndex.const)), 6397 arrayGet(simVars, Integer(SimVarsIndex.intConst)), 6398 arrayGet(simVars, Integer(SimVarsIndex.boolConst)), 6399 arrayGet(simVars, Integer(SimVarsIndex.stringConst)), 6400 arrayGet(simVars, Integer(SimVarsIndex.jacobian)), 6401 arrayGet(simVars, Integer(SimVarsIndex.seed)), 6402 arrayGet(simVars, Integer(SimVarsIndex.realOptimizeConstraints)), 6403 arrayGet(simVars, Integer(SimVarsIndex.realOptimizeFinalConstraints)), 6404 arrayGet(simVars, Integer(SimVarsIndex.mixedArray)) 6405 ); 6333 6406 end createVars; 6334 6407 … … 6445 6518 protected function extractVarsFromList 6446 6519 input output BackendDAE.Var var; 6447 input output SimCodeVar.SimVarssimVars;6520 input output array<list<SimCodeVar.SimVar>> simVars; 6448 6521 input BackendDAE.Variables aliasVars, vars; 6449 6522 input array<HashSet.HashSet> hs; 6450 6523 algorithm 6451 6524 if if ComponentReference.isPreCref(var.varName) then false else not BaseHashSet.has(var.varName, arrayGet(hs,1)) then 6452 simVars :=extractVarFromVar(var, aliasVars, vars, simVars, hs);6525 extractVarFromVar(var, aliasVars, vars, simVars, hs); 6453 6526 // print("Added " + ComponentReference.printComponentRefStr(inVar.varName) + "\n"); 6454 6527 //else … … 6463 6536 input BackendDAE.Variables inAliasVars; 6464 6537 input BackendDAE.Variables inVars; 6465 input SimCodeVar.SimVars varsIn;6538 input array<list<SimCodeVar.SimVar>> simVars; 6466 6539 input array<HashSet.HashSet> hs "all processed crefs"; 6467 output SimCodeVar.SimVars varsOut; 6468 protected 6469 list<SimCodeVar.SimVar> stateVars; 6470 list<SimCodeVar.SimVar> derivativeVars; 6471 list<SimCodeVar.SimVar> algVars; 6472 list<SimCodeVar.SimVar> discreteAlgVars; 6473 list<SimCodeVar.SimVar> intAlgVars; 6474 list<SimCodeVar.SimVar> boolAlgVars; 6475 list<SimCodeVar.SimVar> inputVars; 6476 list<SimCodeVar.SimVar> outputVars; 6477 list<SimCodeVar.SimVar> aliasVars; 6478 list<SimCodeVar.SimVar> intAliasVars; 6479 list<SimCodeVar.SimVar> boolAliasVars; 6480 list<SimCodeVar.SimVar> paramVars; 6481 list<SimCodeVar.SimVar> intParamVars; 6482 list<SimCodeVar.SimVar> boolParamVars; 6483 list<SimCodeVar.SimVar> stringAlgVars; 6484 list<SimCodeVar.SimVar> stringParamVars; 6485 list<SimCodeVar.SimVar> stringAliasVars; 6486 list<SimCodeVar.SimVar> extObjVars; 6487 list<SimCodeVar.SimVar> constVars; 6488 list<SimCodeVar.SimVar> intConstVars; 6489 list<SimCodeVar.SimVar> boolConstVars; 6490 list<SimCodeVar.SimVar> stringConstVars; 6491 list<SimCodeVar.SimVar> jacobianVars; 6492 list<SimCodeVar.SimVar> seedVars; 6493 list<SimCodeVar.SimVar> realOptimizeConstraintsVars; 6494 list<SimCodeVar.SimVar> realOptimizeFinalConstraintsVars; 6495 list<SimCodeVar.SimVar> mixedArrayVars; 6496 SimCodeVar.SimVar simvar; 6540 protected 6541 SimCodeVar.SimVar simVar; 6497 6542 SimCodeVar.SimVar derivSimvar; 6498 6543 Boolean isalias, isAlg, isParam, isConst; … … 6500 6545 Integer len; 6501 6546 algorithm 6502 SimCodeVar.SIMVARS(stateVars, derivativeVars, algVars, discreteAlgVars, intAlgVars, boolAlgVars, inputVars, outputVars,6503 aliasVars, intAliasVars, boolAliasVars, paramVars, intParamVars, boolParamVars,6504 stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars, jacobianVars, seedVars, realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars, mixedArrayVars) := varsIn;6505 6506 6547 // extract the sim var 6507 sim var := dlowvarToSimvar(dlowVar, SOME(inAliasVars), inVars);6508 isalias := isAliasVar(sim var);6548 simVar := dlowvarToSimvar(dlowVar, SOME(inAliasVars), inVars); 6549 isalias := isAliasVar(simVar); 6509 6550 6510 6551 6511 6552 // update HashSet 6512 arrayUpdate(hs, 1, BaseHashSet.add(sim var.name, arrayGet(hs,1)));6553 arrayUpdate(hs, 1, BaseHashSet.add(simVar.name, arrayGet(hs,1))); 6513 6554 if (not isalias) and (BackendVariable.isStateVar(dlowVar) or BackendVariable.isAlgState(dlowVar)) then 6514 derivSimvar := derVarFromStateVar(sim var);6555 derivSimvar := derVarFromStateVar(simVar); 6515 6556 arrayUpdate(hs, 1, BaseHashSet.add(derivSimvar.name, arrayGet(hs,1))); 6516 6557 else 6517 derivSimvar := sim var; // Just in case6558 derivSimvar := simVar; // Just in case 6518 6559 end if; 6519 6560 6520 6561 // If it is an input variable, we give it an index 6521 6562 if (not isalias) and BackendVariable.isVarOnTopLevelAndInputNoDerInput(dlowVar) then 6522 sim var := match simvar6563 simVar := match simVar 6523 6564 case SimCodeVar.SIMVAR() 6524 6565 algorithm 6525 sim var.inputIndex := SOME(arrayCreate(1,-2));6526 then sim var;6566 simVar.inputIndex := SOME(arrayCreate(1,-2)); 6567 then simVar; 6527 6568 else 6528 6569 algorithm … … 6539 6580 // for inputs and outputs we have additional lists 6540 6581 if BackendVariable.isVarOnTopLevelAndInputNoDerInput(dlowVar) then 6541 inputVars := simvar::inputVars;6582 addSimVar(simVar, SimVarsIndex.inputs, simVars); 6542 6583 end if; 6543 6584 if BackendVariable.isVarOnTopLevelAndOutput(dlowVar) then 6544 outputVars := simvar::outputVars;6585 addSimVar(simVar, SimVarsIndex.outputs, simVars); 6545 6586 end if; 6546 6587 // check if alias 6547 6588 if isalias then 6548 6589 if Types.isReal(dlowVar.varType) then 6549 a liasVars := simvar::aliasVars;6590 addSimVar(simVar, SimVarsIndex.alias, simVars); 6550 6591 elseif Types.isInteger(dlowVar.varType) or Types.isEnumeration(dlowVar.varType) then 6551 intAliasVars := simvar::intAliasVars;6592 addSimVar(simVar, SimVarsIndex.intAlias, simVars); 6552 6593 elseif Types.isBoolean(dlowVar.varType) then 6553 boolAliasVars := simvar::boolAliasVars;6594 addSimVar(simVar, SimVarsIndex.boolAlias, simVars); 6554 6595 elseif Types.isString(dlowVar.varType) then 6555 stringAliasVars := simvar::stringAliasVars;6596 addSimVar(simVar, SimVarsIndex.stringAlias, simVars); 6556 6597 end if; 6557 6598 // check for states 6558 6599 elseif BackendVariable.isStateVar(dlowVar) or BackendVariable.isAlgState(dlowVar) then 6559 stateVars := simvar::stateVars;6560 derivativeVars := derivSimvar::derivativeVars;6600 addSimVar(simVar, SimVarsIndex.state, simVars); 6601 addSimVar(derivSimvar, SimVarsIndex.derivative, simVars); 6561 6602 // check for algebraic varibales 6562 6603 elseif isAlg or isParam or isConst then … … 6565 6606 if isAlg then 6566 6607 if BackendVariable.isVarDiscrete(dlowVar) then 6567 discreteAlgVars := simvar::discreteAlgVars;6608 addSimVar(simVar, SimVarsIndex.discreteAlg, simVars); 6568 6609 else 6569 a lgVars := simvar::algVars;6610 addSimVar(simVar, SimVarsIndex.alg, simVars); 6570 6611 end if; 6571 6612 elseif isParam then 6572 paramVars := simvar::paramVars;6613 addSimVar(simVar, SimVarsIndex.param, simVars); 6573 6614 elseif isConst then 6574 constVars := simvar::constVars;6615 addSimVar(simVar, SimVarsIndex.const, simVars); 6575 6616 end if; 6576 6617 // Integer vars 6577 6618 elseif Types.isInteger(dlowVar.varType) or Types.isEnumeration(dlowVar.varType) then 6578 6619 if isAlg then 6579 intAlgVars := simvar::intAlgVars;6620 addSimVar(simVar, SimVarsIndex.intAlg, simVars); 6580 6621 elseif isParam then 6581 intParamVars := simvar::intParamVars;6622 addSimVar(simVar, SimVarsIndex.intParam, simVars); 6582 6623 elseif isConst then 6583 intConstVars := simvar::intConstVars;6624 addSimVar(simVar, SimVarsIndex.intConst, simVars); 6584 6625 end if; 6585 6626 // Boolean vars 6586 6627 elseif Types.isBoolean(dlowVar.varType) then 6587 6628 if isAlg then 6588 boolAlgVars := simvar::boolAlgVars;6629 addSimVar(simVar, SimVarsIndex.boolAlg, simVars); 6589 6630 elseif isParam then 6590 boolParamVars := simvar::boolParamVars;6631 addSimVar(simVar, SimVarsIndex.boolParam, simVars); 6591 6632 elseif isConst then 6592 boolConstVars := simvar::boolConstVars;6633 addSimVar(simVar, SimVarsIndex.boolConst, simVars); 6593 6634 end if; 6594 6635 // String vars 6595 6636 elseif Types.isString(dlowVar.varType) then 6596 6637 if isAlg then 6597 stringAlgVars := simvar::stringAlgVars;6638 addSimVar(simVar, SimVarsIndex.stringAlg, simVars); 6598 6639 elseif isParam then 6599 stringParamVars := simvar::stringParamVars;6640 addSimVar(simVar, SimVarsIndex.stringParam, simVars); 6600 6641 elseif isConst then 6601 stringConstVars := simvar::stringConstVars;6642 addSimVar(simVar, SimVarsIndex.stringConst, simVars); 6602 6643 end if; 6603 6644 end if; 6604 6645 // external objects 6605 6646 elseif BackendVariable.isExtObj(dlowVar) then 6606 extObjVars := simvar::extObjVars;6647 addSimVar(simVar, SimVarsIndex.extObj, simVars); 6607 6648 // optimize constraints 6608 6649 elseif BackendVariable.isRealOptimizeConstraintsVars(dlowVar) then 6609 realOptimizeConstraintsVars := simvar::realOptimizeConstraintsVars;6650 addSimVar(simVar, SimVarsIndex.realOptimizeConstraints, simVars); 6610 6651 // optimize final constraints vars 6611 6652 elseif BackendVariable.isRealOptimizeFinalConstraintsVars(dlowVar) then 6612 realOptimizeFinalConstraintsVars := simvar::realOptimizeFinalConstraintsVars;6653 addSimVar(simVar, SimVarsIndex.realOptimizeFinalConstraints, simVars); 6613 6654 elseif BackendVariable.isOptInputVar(dlowVar) then 6614 a lgVars := simvar::algVars;6655 addSimVar(simVar, SimVarsIndex.alg, simVars); 6615 6656 else 6616 6657 Error.addInternalError("Failed to find the correct SimVar list for Var: " + BackendDump.varString(dlowVar), sourceInfo()); 6617 6658 end if; 6618 6619 varsOut := SimCodeVar.SIMVARS(stateVars, derivativeVars, algVars, discreteAlgVars, intAlgVars, boolAlgVars, inputVars, outputVars,6620 aliasVars, intAliasVars, boolAliasVars, paramVars, intParamVars, boolParamVars,6621 stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars, jacobianVars, seedVars, realOptimizeConstraintsVars, realOptimizeFinalConstraintsVars, mixedArrayVars);6622 6659 end extractVarFromVar; 6660 6661 protected function addSimVar 6662 input SimCodeVar.SimVar simVar; 6663 input SimVarsIndex index; 6664 input array<list<SimCodeVar.SimVar>> simVars; 6665 algorithm 6666 arrayUpdate(simVars, Integer(index), simVar::arrayGet(simVars, Integer(index))); 6667 end addSimVar; 6623 6668 6624 6669 protected function derVarFromStateVar … … 7160 7205 7161 7206 protected function sortSimvars 7162 input SimCodeVar.SimVars unsortedSimvars; 7163 output SimCodeVar.SimVars sortedSimvars = unsortedSimvars; 7207 input array<list<SimCodeVar.SimVar>> simvars; 7164 7208 protected 7165 7209 Integer i = 0; 7166 7210 array<Integer> arr; 7167 7211 algorithm 7168 sortedSimvars.stateVars := List.sort(sortedSimvars.stateVars, simVarCompareByCrefSubsAtEndlLexical); 7169 sortedSimvars.derivativeVars := List.sort(sortedSimvars.derivativeVars, simVarCompareByCrefSubsAtEndlLexical); 7170 sortedSimvars.algVars := List.sort(sortedSimvars.algVars, simVarCompareByCrefSubsAtEndlLexical); 7171 sortedSimvars.discreteAlgVars := List.sort(sortedSimvars.discreteAlgVars, simVarCompareByCrefSubsAtEndlLexical); 7172 sortedSimvars.intAlgVars := List.sort(sortedSimvars.intAlgVars, simVarCompareByCrefSubsAtEndlLexical); 7173 sortedSimvars.boolAlgVars := List.sort(sortedSimvars.boolAlgVars, simVarCompareByCrefSubsAtEndlLexical); 7174 sortedSimvars.inputVars := List.sort(sortedSimvars.inputVars, simVarCompareByCrefSubsAtEndlLexical); 7175 for v in sortedSimvars.inputVars loop 7212 for i in SimVarsIndex loop 7213 arrayUpdate(simvars, Integer(i), List.sort(arrayGet(simvars, Integer(i)), simVarCompareByCrefSubsAtEndlLexical)); 7214 end for; 7215 for v in arrayGet(simvars, Integer(SimVarsIndex.inputs)) loop 7176 7216 // Set input indexes as they appear in the sorted order; is mutable since we need the same index in the other lists of vars... 7177 7217 i := match v … … 7186 7226 end match; 7187 7227 end for; 7188 sortedSimvars.outputVars := List.sort(sortedSimvars.outputVars, simVarCompareByCrefSubsAtEndlLexical);7189 sortedSimvars.aliasVars := List.sort(sortedSimvars.aliasVars, simVarCompareByCrefSubsAtEndlLexical);7190 sortedSimvars.intAliasVars := List.sort(sortedSimvars.intAliasVars, simVarCompareByCrefSubsAtEndlLexical);7191 sortedSimvars.boolAliasVars := List.sort(sortedSimvars.boolAliasVars, simVarCompareByCrefSubsAtEndlLexical);7192 sortedSimvars.paramVars := List.sort(sortedSimvars.paramVars, simVarCompareByCrefSubsAtEndlLexical);7193 sortedSimvars.intParamVars := List.sort(sortedSimvars.intParamVars, simVarCompareByCrefSubsAtEndlLexical);7194 sortedSimvars.boolParamVars := List.sort(sortedSimvars.boolParamVars, simVarCompareByCrefSubsAtEndlLexical);7195 sortedSimvars.stringAlgVars := List.sort(sortedSimvars.stringAlgVars, simVarCompareByCrefSubsAtEndlLexical);7196 sortedSimvars.stringParamVars := List.sort(sortedSimvars.stringParamVars, simVarCompareByCrefSubsAtEndlLexical);7197 sortedSimvars.stringAliasVars := List.sort(sortedSimvars.stringAliasVars, simVarCompareByCrefSubsAtEndlLexical);7198 sortedSimvars.extObjVars := List.sort(sortedSimvars.extObjVars, simVarCompareByCrefSubsAtEndlLexical);7199 sortedSimvars.constVars := List.sort(sortedSimvars.constVars, simVarCompareByCrefSubsAtEndlLexical);7200 sortedSimvars.intConstVars := List.sort(sortedSimvars.intConstVars, simVarCompareByCrefSubsAtEndlLexical);7201 sortedSimvars.boolConstVars := List.sort(sortedSimvars.boolConstVars, simVarCompareByCrefSubsAtEndlLexical);7202 sortedSimvars.stringConstVars := List.sort(sortedSimvars.stringConstVars, simVarCompareByCrefSubsAtEndlLexical);7203 sortedSimvars.jacobianVars := List.sort(sortedSimvars.jacobianVars, simVarCompareByCrefSubsAtEndlLexical);7204 sortedSimvars.seedVars := List.sort(sortedSimvars.seedVars, simVarCompareByCrefSubsAtEndlLexical);7205 sortedSimvars.realOptimizeConstraintsVars := List.sort(sortedSimvars.realOptimizeConstraintsVars, simVarCompareByCrefSubsAtEndlLexical);7206 sortedSimvars.realOptimizeFinalConstraintsVars := List.sort(sortedSimvars.realOptimizeFinalConstraintsVars, simVarCompareByCrefSubsAtEndlLexical);7207 7228 end sortSimvars; 7208 7229 … … 7227 7248 7228 7249 protected function extendIncompleteArray 7229 input SimCodeVar.SimVars unsortedSimvars; 7230 output SimCodeVar.SimVars sortedSimvars = unsortedSimvars; 7250 input array<list<SimCodeVar.SimVar>> simvars; 7231 7251 protected 7232 7252 list<SimCodeVar.SimVar> simVars; … … 7236 7256 // search all arrays with array information 7237 7257 set := HashSet.emptyHashSet(); 7238 set := List.fold(sortedSimvars.stateVars, collectArrayFirstVars, set); 7239 set := List.fold(sortedSimvars.derivativeVars, collectArrayFirstVars, set); 7240 set := List.fold(sortedSimvars.algVars, collectArrayFirstVars, set); 7241 set := List.fold(sortedSimvars.discreteAlgVars, collectArrayFirstVars, set); 7242 set := List.fold(sortedSimvars.intAlgVars, collectArrayFirstVars, set); 7243 set := List.fold(sortedSimvars.boolAlgVars, collectArrayFirstVars, set); 7244 set := List.fold(sortedSimvars.inputVars, collectArrayFirstVars, set); 7245 set := List.fold(sortedSimvars.outputVars, collectArrayFirstVars, set); 7246 set := List.fold(sortedSimvars.aliasVars, collectArrayFirstVars, set); 7247 set := List.fold(sortedSimvars.intAliasVars, collectArrayFirstVars, set); 7248 set := List.fold(sortedSimvars.boolAliasVars, collectArrayFirstVars, set); 7249 set := List.fold(sortedSimvars.paramVars, collectArrayFirstVars, set); 7250 set := List.fold(sortedSimvars.intParamVars, collectArrayFirstVars, set); 7251 set := List.fold(sortedSimvars.boolParamVars, collectArrayFirstVars, set); 7252 set := List.fold(sortedSimvars.stringAlgVars, collectArrayFirstVars, set); 7253 set := List.fold(sortedSimvars.stringParamVars, collectArrayFirstVars, set); 7254 set := List.fold(sortedSimvars.stringAliasVars, collectArrayFirstVars, set); 7255 set := List.fold(sortedSimvars.extObjVars, collectArrayFirstVars, set); 7256 set := List.fold(sortedSimvars.constVars, collectArrayFirstVars, set); 7257 set := List.fold(sortedSimvars.intConstVars, collectArrayFirstVars, set); 7258 set := List.fold(sortedSimvars.boolConstVars, collectArrayFirstVars, set); 7259 set := List.fold(sortedSimvars.stringConstVars, collectArrayFirstVars, set); 7260 set := List.fold(sortedSimvars.jacobianVars, collectArrayFirstVars, set); 7261 set := List.fold(sortedSimvars.seedVars, collectArrayFirstVars, set); 7262 set := List.fold(sortedSimvars.realOptimizeConstraintsVars, collectArrayFirstVars, set); 7263 set := List.fold(sortedSimvars.realOptimizeFinalConstraintsVars, collectArrayFirstVars, set); 7258 7259 for i in SimVarsIndex loop 7260 set := List.fold(arrayGet(simvars, Integer(i)), collectArrayFirstVars, set); 7261 end for; 7264 7262 7265 7263 // add array information to incomplete arrays 7266 (simVars, set) := List.mapFold(sortedSimvars.stateVars, setArrayElementnoFirst, set); sortedSimvars.stateVars := simVars; 7267 (simVars, set) := List.mapFold(sortedSimvars.derivativeVars, setArrayElementnoFirst, set); sortedSimvars.derivativeVars := simVars; 7268 (simVars, set) := List.mapFold(sortedSimvars.algVars, setArrayElementnoFirst, set); sortedSimvars.algVars := simVars; 7269 (simVars, set) := List.mapFold(sortedSimvars.discreteAlgVars, setArrayElementnoFirst, set); sortedSimvars.discreteAlgVars := simVars; 7270 (simVars, set) := List.mapFold(sortedSimvars.intAlgVars, setArrayElementnoFirst, set); sortedSimvars.intAlgVars := simVars; 7271 (simVars, set) := List.mapFold(sortedSimvars.boolAlgVars, setArrayElementnoFirst, set); sortedSimvars.boolAlgVars := simVars; 7272 (simVars, set) := List.mapFold(sortedSimvars.inputVars, setArrayElementnoFirst, set); sortedSimvars.inputVars := simVars; 7273 (simVars, set) := List.mapFold(sortedSimvars.outputVars, setArrayElementnoFirst, set); sortedSimvars.outputVars := simVars; 7274 (simVars, set) := List.mapFold(sortedSimvars.aliasVars, setArrayElementnoFirst, set); sortedSimvars.aliasVars := simVars; 7275 (simVars, set) := List.mapFold(sortedSimvars.intAliasVars, setArrayElementnoFirst, set); sortedSimvars.intAliasVars := simVars; 7276 (simVars, set) := List.mapFold(sortedSimvars.boolAliasVars, setArrayElementnoFirst, set); sortedSimvars.boolAliasVars := simVars; 7277 (simVars, set) := List.mapFold(sortedSimvars.paramVars, setArrayElementnoFirst, set); sortedSimvars.paramVars := simVars; 7278 (simVars, set) := List.mapFold(sortedSimvars.intParamVars, setArrayElementnoFirst, set); sortedSimvars.intParamVars := simVars; 7279 (simVars, set) := List.mapFold(sortedSimvars.boolParamVars, setArrayElementnoFirst, set); sortedSimvars.boolParamVars := simVars; 7280 (simVars, set) := List.mapFold(sortedSimvars.stringAlgVars, setArrayElementnoFirst, set); sortedSimvars.stringAlgVars := simVars; 7281 (simVars, set) := List.mapFold(sortedSimvars.stringParamVars, setArrayElementnoFirst, set); sortedSimvars.stringParamVars := simVars; 7282 (simVars, set) := List.mapFold(sortedSimvars.stringAliasVars, setArrayElementnoFirst, set); sortedSimvars.stringAliasVars := simVars; 7283 (simVars, set) := List.mapFold(sortedSimvars.extObjVars, setArrayElementnoFirst, set); sortedSimvars.extObjVars := simVars; 7284 (simVars, set) := List.mapFold(sortedSimvars.constVars, setArrayElementnoFirst, set); sortedSimvars.constVars := simVars; 7285 (simVars, set) := List.mapFold(sortedSimvars.intConstVars, setArrayElementnoFirst, set); sortedSimvars.intConstVars := simVars; 7286 (simVars, set) := List.mapFold(sortedSimvars.boolConstVars, setArrayElementnoFirst, set); sortedSimvars.boolConstVars := simVars; 7287 (simVars, set) := List.mapFold(sortedSimvars.stringConstVars, setArrayElementnoFirst, set); sortedSimvars.stringConstVars := simVars; 7288 (simVars, set) := List.mapFold(sortedSimvars.jacobianVars, setArrayElementnoFirst, set); sortedSimvars.jacobianVars := simVars; 7289 (simVars, set) := List.mapFold(sortedSimvars.seedVars, setArrayElementnoFirst, set); sortedSimvars.seedVars := simVars; 7290 (simVars, set) := List.mapFold(sortedSimvars.realOptimizeConstraintsVars, setArrayElementnoFirst, set); sortedSimvars.realOptimizeConstraintsVars := simVars; 7291 (simVars, set) := List.mapFold(sortedSimvars.realOptimizeFinalConstraintsVars, setArrayElementnoFirst, set); sortedSimvars.realOptimizeFinalConstraintsVars := simVars; 7264 for i in SimVarsIndex loop 7265 (simVars, set) := List.mapFold(arrayGet(simvars, Integer(i)), setArrayElementnoFirst, set); 7266 arrayUpdate(simvars, Integer(i), simVars); 7267 end for; 7292 7268 end extendIncompleteArray; 7293 7269 … … 7348 7324 7349 7325 protected function fixIndex 7350 input SimCodeVar.SimVars unfixedSimvars; 7351 output SimCodeVar.SimVars fixedSimvars = unfixedSimvars; 7352 algorithm 7353 fixedSimvars.stateVars := rewriteIndex(fixedSimvars.stateVars, 0); 7354 fixedSimvars.derivativeVars := rewriteIndex(fixedSimvars.derivativeVars, 0); 7355 fixedSimvars.algVars := rewriteIndex(fixedSimvars.algVars, 0); 7356 fixedSimvars.discreteAlgVars := rewriteIndex(fixedSimvars.discreteAlgVars, 0); 7357 fixedSimvars.intAlgVars := rewriteIndex(fixedSimvars.intAlgVars, 0); 7358 fixedSimvars.boolAlgVars := rewriteIndex(fixedSimvars.boolAlgVars, 0); 7359 fixedSimvars.paramVars := rewriteIndex(fixedSimvars.paramVars, 0); 7360 fixedSimvars.intParamVars := rewriteIndex(fixedSimvars.intParamVars, 0); 7361 fixedSimvars.boolParamVars := rewriteIndex(fixedSimvars.boolParamVars, 0); 7362 fixedSimvars.aliasVars := rewriteIndex(fixedSimvars.aliasVars, 0); 7363 fixedSimvars.intAliasVars := rewriteIndex(fixedSimvars.intAliasVars, 0); 7364 fixedSimvars.boolAliasVars := rewriteIndex(fixedSimvars.boolAliasVars, 0); 7365 fixedSimvars.stringAlgVars := rewriteIndex(fixedSimvars.stringAlgVars, 0); 7366 fixedSimvars.stringParamVars := rewriteIndex(fixedSimvars.stringParamVars, 0); 7367 fixedSimvars.stringAliasVars := rewriteIndex(fixedSimvars.stringAliasVars, 0); 7368 fixedSimvars.constVars := rewriteIndex(fixedSimvars.constVars, 0); 7369 fixedSimvars.intConstVars := rewriteIndex(fixedSimvars.intConstVars, 0); 7370 fixedSimvars.boolConstVars := rewriteIndex(fixedSimvars.boolConstVars, 0); 7371 fixedSimvars.stringConstVars := rewriteIndex(fixedSimvars.stringConstVars, 0); 7372 fixedSimvars.extObjVars := rewriteIndex(fixedSimvars.extObjVars, 0); 7373 fixedSimvars.inputVars := rewriteIndex(fixedSimvars.inputVars, 0); 7374 fixedSimvars.outputVars := rewriteIndex(fixedSimvars.outputVars, 0); 7375 //jacobianVars and seedVars don't need index rewrite 7376 fixedSimvars.realOptimizeConstraintsVars := rewriteIndex(fixedSimvars.realOptimizeConstraintsVars, 0); 7377 fixedSimvars.realOptimizeFinalConstraintsVars := rewriteIndex(fixedSimvars.realOptimizeFinalConstraintsVars, 0); 7326 input array<list<SimCodeVar.SimVar>> simVars; 7327 algorithm 7328 for i in SimVarsIndex.state : SimVarsIndex.stringConst loop // Skip jacobian, seed, mixedArray 7329 arrayUpdate(simVars, Integer(i), rewriteIndex(arrayGet(simVars,Integer(i)), 0)); 7330 end for; 7378 7331 end fixIndex; 7379 7332 … … 7394 7347 7395 7348 protected function setVariableIndex 7396 input SimCodeVar.SimVars inSimVars; 7397 output SimCodeVar.SimVars outSimVars = inSimVars; 7398 protected 7399 Integer index_; 7400 list<SimCodeVar.SimVar> simVars; 7349 input array<list<SimCodeVar.SimVar>> simVars; 7350 protected 7351 Integer index_=1; 7352 list<SimCodeVar.SimVar> lst; 7401 7353 algorithm 7402 7354 //special order for fmi: real => intger => boolean => string => external 7403 //real variables 7404 (simVars, index_) := setVariableIndexHelper(outSimVars.stateVars, 1); outSimVars.stateVars := simVars; 7405 (simVars, index_) := setVariableIndexHelper(outSimVars.derivativeVars, index_); outSimVars.derivativeVars := simVars; 7406 (simVars, index_) := setVariableIndexHelper(outSimVars.algVars, index_); outSimVars.algVars := simVars; 7407 (simVars, index_) := setVariableIndexHelper(outSimVars.discreteAlgVars, index_); outSimVars.discreteAlgVars := simVars; 7408 (simVars, index_) := setVariableIndexHelper(outSimVars.paramVars, index_); outSimVars.paramVars := simVars; 7409 (simVars, index_) := setVariableIndexHelper(outSimVars.aliasVars, index_); outSimVars.aliasVars := simVars; 7410 7411 //integer variables 7412 (simVars, index_) := setVariableIndexHelper(outSimVars.intAlgVars, index_); outSimVars.intAlgVars := simVars; 7413 (simVars, index_) := setVariableIndexHelper(outSimVars.intParamVars, index_); outSimVars.intParamVars := simVars; 7414 (simVars, index_) := setVariableIndexHelper(outSimVars.intAliasVars, index_); outSimVars.intAliasVars := simVars; 7415 7416 //boolean varriables 7417 (simVars, index_) := setVariableIndexHelper(outSimVars.boolAlgVars, index_); outSimVars.boolAlgVars := simVars; 7418 (simVars, index_) := setVariableIndexHelper(outSimVars.boolParamVars, index_); outSimVars.boolParamVars := simVars; 7419 (simVars, index_) := setVariableIndexHelper(outSimVars.boolAliasVars, index_); outSimVars.boolAliasVars := simVars; 7420 7421 //string varriables 7422 (simVars, index_) := setVariableIndexHelper(outSimVars.stringAlgVars, index_); outSimVars.stringAlgVars := simVars; 7423 (simVars, index_) := setVariableIndexHelper(outSimVars.stringParamVars, index_); outSimVars.stringParamVars := simVars; 7424 (simVars, index_) := setVariableIndexHelper(outSimVars.stringAliasVars, index_); outSimVars.stringAliasVars := simVars; 7425 7426 //external variables 7427 (simVars, index_) := setVariableIndexHelper(outSimVars.extObjVars, index_); outSimVars.extObjVars := simVars; 7428 7429 (simVars, index_) := setVariableIndexHelper(outSimVars.inputVars, index_); outSimVars.inputVars := simVars; 7430 (simVars, index_) := setVariableIndexHelper(outSimVars.outputVars, index_); outSimVars.outputVars := simVars; 7431 //jacobianVars and seedVars don't need index rewrite 7432 (simVars, index_) := setVariableIndexHelper(outSimVars.realOptimizeConstraintsVars, index_); outSimVars.realOptimizeConstraintsVars := simVars; 7433 (simVars, index_) := setVariableIndexHelper(outSimVars.realOptimizeFinalConstraintsVars, index_); outSimVars.realOptimizeFinalConstraintsVars := simVars; 7355 for i in SimVarsIndex.state : SimVarsIndex.stringConst loop 7356 (lst, index_) := setVariableIndexHelper(arrayGet(simVars, Integer(i)), index_); 7357 arrayUpdate(simVars, Integer(i), lst); 7358 end for; 7434 7359 end setVariableIndex; 7435 7360
Note: See TracChangeset
for help on using the changeset viewer.