Changeset 2c7da6d in OpenModelica


Ignore:
Timestamp:
2016-04-07T16:16:52+02:00 (8 years ago)
Author:
Martin Sjölund <martin.sjolund@…>
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)
Message:

Fix bottleneck for create model info

This is related to ticket:3813. Uses an array of SimVar instead of
pushing everything into a large uniontype record for every change
to a simvar. The array is indexed by an enumeration, which maintains
some knowledge of which field a particular index belongs to. The
enumeration has elements ordered in FMI order since it is important
these indexes appear in a certain order.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Compiler/SimCode/SimCodeUtil.mo

    rc3cf1e92 r2c7da6d  
    62746274end getStateInfo;
    62756275
     6276protected 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
    62766315protected function createVars
    62776316  input BackendDAE.BackendDAE inSimDAE "simulation";
     
    62856324  DAE.FunctionTree funcTree;
    62866325  array<HashSet.HashSet> hs = arrayCreate(1, HashSet.emptyHashSet());
     6326  array<list<SimCodeVar.SimVar>> simVars = arrayCreate(size(SimVarsIndex,1), {});
    62876327algorithm
    62886328  BackendDAE.DAE(eqs=systs1, shared=BackendDAE.SHARED(knownVars=knvars1, externalObjects=extvars1, aliasVars=aliasVars1, functionTree=funcTree)) := inSimDAE;
     
    62976337  // ### simulation ###
    62986338  // 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);
    63006340
    63016341  // 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);
    63036343
    63046344  // 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);
    63066346
    63076347  // 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);
    63096349
    63106350
    63116351  // ### initialization ###
    63126352  // 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);
    63146354
    63156355  // 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);
    63176357
    63186358  // 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);
    63206360
    63216361  // 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);
    63236363
    63246364  //BaseHashSet.printHashSet(hs);
    63256365
    63266366  // 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;
    63296372
    63306373  // 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  );
    63336406end createVars;
    63346407
     
    64456518protected function extractVarsFromList
    64466519  input output BackendDAE.Var var;
    6447   input output SimCodeVar.SimVars simVars;
     6520  input output array<list<SimCodeVar.SimVar>> simVars;
    64486521  input BackendDAE.Variables aliasVars, vars;
    64496522  input array<HashSet.HashSet> hs;
    64506523algorithm
    64516524  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);
    64536526  //  print("Added  " + ComponentReference.printComponentRefStr(inVar.varName) + "\n");
    64546527  //else
     
    64636536  input BackendDAE.Variables inAliasVars;
    64646537  input BackendDAE.Variables inVars;
    6465   input SimCodeVar.SimVars varsIn;
     6538  input array<list<SimCodeVar.SimVar>> simVars;
    64666539  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;
     6540protected
     6541  SimCodeVar.SimVar simVar;
    64976542  SimCodeVar.SimVar derivSimvar;
    64986543  Boolean isalias, isAlg, isParam, isConst;
     
    65006545  Integer len;
    65016546algorithm
    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 
    65066547  // extract the sim var
    6507   simvar := dlowvarToSimvar(dlowVar, SOME(inAliasVars), inVars);
    6508   isalias := isAliasVar(simvar);
     6548  simVar := dlowvarToSimvar(dlowVar, SOME(inAliasVars), inVars);
     6549  isalias := isAliasVar(simVar);
    65096550
    65106551
    65116552  // update HashSet
    6512   arrayUpdate(hs, 1, BaseHashSet.add(simvar.name, arrayGet(hs,1)));
     6553  arrayUpdate(hs, 1, BaseHashSet.add(simVar.name, arrayGet(hs,1)));
    65136554  if (not isalias) and (BackendVariable.isStateVar(dlowVar) or BackendVariable.isAlgState(dlowVar)) then
    6514     derivSimvar := derVarFromStateVar(simvar);
     6555    derivSimvar := derVarFromStateVar(simVar);
    65156556    arrayUpdate(hs, 1, BaseHashSet.add(derivSimvar.name, arrayGet(hs,1)));
    65166557  else
    6517     derivSimvar := simvar; // Just in case
     6558    derivSimvar := simVar; // Just in case
    65186559  end if;
    65196560
    65206561  // If it is an input variable, we give it an index
    65216562  if (not isalias) and BackendVariable.isVarOnTopLevelAndInputNoDerInput(dlowVar) then
    6522     simvar := match simvar
     6563    simVar := match simVar
    65236564      case SimCodeVar.SIMVAR()
    65246565        algorithm
    6525           simvar.inputIndex := SOME(arrayCreate(1,-2));
    6526         then simvar;
     6566          simVar.inputIndex := SOME(arrayCreate(1,-2));
     6567        then simVar;
    65276568      else
    65286569        algorithm
     
    65396580  // for inputs and outputs we have additional lists
    65406581  if BackendVariable.isVarOnTopLevelAndInputNoDerInput(dlowVar) then
    6541     inputVars := simvar::inputVars;
     6582    addSimVar(simVar, SimVarsIndex.inputs, simVars);
    65426583  end if;
    65436584  if BackendVariable.isVarOnTopLevelAndOutput(dlowVar) then
    6544     outputVars := simvar::outputVars;
     6585    addSimVar(simVar, SimVarsIndex.outputs, simVars);
    65456586  end if;
    65466587  // check if alias
    65476588  if isalias then
    65486589    if Types.isReal(dlowVar.varType) then
    6549       aliasVars := simvar::aliasVars;
     6590      addSimVar(simVar, SimVarsIndex.alias, simVars);
    65506591    elseif Types.isInteger(dlowVar.varType) or  Types.isEnumeration(dlowVar.varType) then
    6551       intAliasVars := simvar::intAliasVars;
     6592      addSimVar(simVar, SimVarsIndex.intAlias, simVars);
    65526593    elseif Types.isBoolean(dlowVar.varType) then
    6553       boolAliasVars := simvar::boolAliasVars;
     6594      addSimVar(simVar, SimVarsIndex.boolAlias, simVars);
    65546595    elseif Types.isString(dlowVar.varType) then
    6555       stringAliasVars := simvar::stringAliasVars;
     6596      addSimVar(simVar, SimVarsIndex.stringAlias, simVars);
    65566597    end if;
    65576598  // check for states
    65586599  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);
    65616602  // check for algebraic varibales
    65626603  elseif isAlg or isParam or isConst then
     
    65656606      if isAlg then
    65666607        if BackendVariable.isVarDiscrete(dlowVar) then
    6567           discreteAlgVars := simvar::discreteAlgVars;
     6608          addSimVar(simVar, SimVarsIndex.discreteAlg, simVars);
    65686609        else
    6569           algVars := simvar::algVars;
     6610          addSimVar(simVar, SimVarsIndex.alg, simVars);
    65706611        end if;
    65716612      elseif isParam then
    6572         paramVars := simvar::paramVars;
     6613        addSimVar(simVar, SimVarsIndex.param, simVars);
    65736614      elseif isConst then
    6574         constVars := simvar::constVars;
     6615        addSimVar(simVar, SimVarsIndex.const, simVars);
    65756616      end if;
    65766617    // Integer vars
    65776618    elseif Types.isInteger(dlowVar.varType) or  Types.isEnumeration(dlowVar.varType) then
    65786619      if isAlg then
    6579         intAlgVars := simvar::intAlgVars;
     6620        addSimVar(simVar, SimVarsIndex.intAlg, simVars);
    65806621      elseif isParam then
    6581         intParamVars := simvar::intParamVars;
     6622        addSimVar(simVar, SimVarsIndex.intParam, simVars);
    65826623      elseif isConst then
    6583         intConstVars := simvar::intConstVars;
     6624        addSimVar(simVar, SimVarsIndex.intConst, simVars);
    65846625      end if;
    65856626    // Boolean vars
    65866627    elseif Types.isBoolean(dlowVar.varType) then
    65876628      if isAlg then
    6588         boolAlgVars := simvar::boolAlgVars;
     6629        addSimVar(simVar, SimVarsIndex.boolAlg, simVars);
    65896630      elseif isParam then
    6590         boolParamVars := simvar::boolParamVars;
     6631        addSimVar(simVar, SimVarsIndex.boolParam, simVars);
    65916632      elseif isConst then
    6592         boolConstVars := simvar::boolConstVars;
     6633        addSimVar(simVar, SimVarsIndex.boolConst, simVars);
    65936634      end if;
    65946635    // String vars
    65956636    elseif Types.isString(dlowVar.varType) then
    65966637      if isAlg then
    6597         stringAlgVars := simvar::stringAlgVars;
     6638        addSimVar(simVar, SimVarsIndex.stringAlg, simVars);
    65986639      elseif isParam then
    6599         stringParamVars := simvar::stringParamVars;
     6640        addSimVar(simVar, SimVarsIndex.stringParam, simVars);
    66006641      elseif isConst then
    6601         stringConstVars := simvar::stringConstVars;
     6642        addSimVar(simVar, SimVarsIndex.stringConst, simVars);
    66026643      end if;
    66036644    end if;
    66046645  // external objects
    66056646  elseif BackendVariable.isExtObj(dlowVar) then
    6606     extObjVars := simvar::extObjVars;
     6647    addSimVar(simVar, SimVarsIndex.extObj, simVars);
    66076648  // optimize constraints
    66086649  elseif BackendVariable.isRealOptimizeConstraintsVars(dlowVar) then
    6609     realOptimizeConstraintsVars := simvar::realOptimizeConstraintsVars;
     6650    addSimVar(simVar, SimVarsIndex.realOptimizeConstraints, simVars);
    66106651  // optimize final constraints vars
    66116652  elseif BackendVariable.isRealOptimizeFinalConstraintsVars(dlowVar) then
    6612     realOptimizeFinalConstraintsVars := simvar::realOptimizeFinalConstraintsVars;
     6653    addSimVar(simVar, SimVarsIndex.realOptimizeFinalConstraints, simVars);
    66136654  elseif BackendVariable.isOptInputVar(dlowVar) then
    6614     algVars := simvar::algVars;
     6655    addSimVar(simVar, SimVarsIndex.alg, simVars);
    66156656  else
    66166657    Error.addInternalError("Failed to find the correct SimVar list for Var: " + BackendDump.varString(dlowVar), sourceInfo());
    66176658  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);
    66226659end extractVarFromVar;
     6660
     6661protected function addSimVar
     6662  input SimCodeVar.SimVar simVar;
     6663  input SimVarsIndex index;
     6664  input array<list<SimCodeVar.SimVar>> simVars;
     6665algorithm
     6666  arrayUpdate(simVars, Integer(index), simVar::arrayGet(simVars, Integer(index)));
     6667end addSimVar;
    66236668
    66246669protected function derVarFromStateVar
     
    71607205
    71617206protected function sortSimvars
    7162   input SimCodeVar.SimVars unsortedSimvars;
    7163   output SimCodeVar.SimVars sortedSimvars = unsortedSimvars;
     7207  input array<list<SimCodeVar.SimVar>> simvars;
    71647208protected
    71657209  Integer i = 0;
    71667210  array<Integer> arr;
    71677211algorithm
    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
    71767216    // Set input indexes as they appear in the sorted order; is mutable since we need the same index in the other lists of vars...
    71777217    i := match v
     
    71867226    end match;
    71877227  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);
    72077228end sortSimvars;
    72087229
     
    72277248
    72287249protected function extendIncompleteArray
    7229    input SimCodeVar.SimVars unsortedSimvars;
    7230   output SimCodeVar.SimVars sortedSimvars = unsortedSimvars;
     7250  input array<list<SimCodeVar.SimVar>> simvars;
    72317251protected
    72327252  list<SimCodeVar.SimVar> simVars;
     
    72367256  // search all arrays with array information
    72377257  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;
    72647262
    72657263  // 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;
    72927268end extendIncompleteArray;
    72937269
     
    73487324
    73497325protected 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;
     7327algorithm
     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;
    73787331end fixIndex;
    73797332
     
    73947347
    73957348protected 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;
     7350protected
     7351  Integer index_=1;
     7352  list<SimCodeVar.SimVar> lst;
    74017353algorithm
    74027354  //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;
    74347359end setVariableIndex;
    74357360
Note: See TracChangeset for help on using the changeset viewer.