Changeset 5c431b26 in OpenModelica


Ignore:
Timestamp:
2020-10-21T15:08:49+02:00 (3 years ago)
Author:
Adrian Pop <adrian.pop@…>
Children:
1019c41e
Parents:
c9471b8
git-author:
Per Östlund <perost86@…> (10/20/20 11:00:13)
git-committer:
Adrian Pop <adrian.pop@…> (10/21/20 15:08:49)
Message:

Fix -d=-nfScalarize for multidimensional eqs

  • Generalize Flatten.vectorizeEquation/Algorithm for multiple dimensions.
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • OMCompiler/Compiler/NFFrontEnd/NFArrayConnections.mo

    rc9471b8 r5c431b26  
    887887    forLoop := Equation.FOR(iterators[icount], SOME(ranges[icount]), body, DAE.emptyElementSource);
    888888
    889     for i in 1:icount-1 loop
     889    for i in icount-1:-1:1 loop
    890890      forLoop := Equation.FOR(iterators[i], SOME(ranges[i]), {forLoop}, DAE.emptyElementSource);
    891891    end for;
  • OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo

    rc9471b8 r5c431b26  
    689689  veqn := match eqn
    690690    local
    691       InstNode prefix_node, iter;
    692       Integer stop;
     691      InstNode iter;
     692      list<InstNode> iters;
    693693      Expression range;
     694      list<Expression> ranges;
     695      list<Subscript> subs;
     696      DAE.ElementSource src;
     697
     698    // convert simple equality of crefs to array equality
    694699    case Equation.EQUALITY(lhs = Expression.CREF(), rhs = Expression.CREF())
    695       // convert simple equality of crefs to array equality
    696700      then Equation.ARRAY_EQUALITY(eqn.lhs, eqn.rhs, Type.liftArrayLeftList(eqn.ty, dimensions), eqn.source);
     701
     702    // wrap general equation into for loop
    697703    else
    698       // wrap general equation into for loop
    699       algorithm
    700         iter := match ComponentRef.node(prefix)
    701           case prefix_node as InstNode.COMPONENT_NODE()
    702             then InstNode.COMPONENT_NODE(
    703               "$i", prefix_node.visibility,
    704               Pointer.create(Component.ITERATOR(Type.INTEGER(), Variability.IMPLICITLY_DISCRETE,
    705                              Component.info(Pointer.access(prefix_node.component)))),
    706               prefix_node.parent, InstNodeType.NORMAL_COMP());
    707         end match;
    708         {Dimension.INTEGER(size = stop)} := dimensions;
    709         range := Expression.RANGE(Type.ARRAY(Type.INTEGER(), dimensions), Expression.INTEGER(1), NONE(), Expression.INTEGER(stop));
    710         veqn := Equation.mapExp(eqn, function addIterator(prefix = prefix, subscript = Subscript.INDEX(Expression.CREF(Type.INTEGER(), ComponentRef.makeIterator(iter, Type.INTEGER())))));
    711       then
    712         Equation.FOR(iter, SOME(range), {veqn}, Equation.source(eqn));
     704      algorithm
     705        (iters, ranges, subs) := makeIterators(prefix, dimensions);
     706        subs := listReverseInPlace(subs);
     707        veqn := Equation.mapExp(eqn, function addIterator(prefix = prefix, subscripts = subs));
     708        src := Equation.source(eqn);
     709
     710        iter :: iters := iters;
     711        range :: ranges := ranges;
     712        veqn := Equation.FOR(iter, SOME(range), {veqn}, src);
     713
     714        while not listEmpty(iters) loop
     715          iter :: iters := iters;
     716          range :: ranges := ranges;
     717          veqn := Equation.FOR(iter, SOME(range), {veqn}, src);
     718        end while;
     719      then
     720        veqn;
     721
    713722  end match;
    714723end vectorizeEquation;
     
    722731  valg := match alg
    723732    local
    724       InstNode prefix_node, iter;
    725       Integer stop;
     733      InstNode iter;
     734      list<InstNode> iters;
    726735      Expression range;
     736      list<Expression> ranges;
     737      list<Subscript> subs;
    727738      list<Statement> body;
     739      Statement stmt;
     740
     741    // let simple assignment as is
    728742    case Algorithm.ALGORITHM(statements = {Statement.ASSIGNMENT(lhs = Expression.CREF(), rhs = Expression.CREF())})
    729       // let simple assignment as is
    730743      then alg;
     744
     745    // wrap general algorithm into for loop
    731746    else
    732       // wrap general algorithm into for loop
    733       algorithm
    734         iter := match ComponentRef.node(prefix)
    735           case prefix_node as InstNode.COMPONENT_NODE()
    736             then InstNode.COMPONENT_NODE(
    737               "$i", prefix_node.visibility,
    738               Pointer.create(Component.ITERATOR(Type.INTEGER(), Variability.IMPLICITLY_DISCRETE,
    739                              Component.info(Pointer.access(prefix_node.component)))),
    740               prefix_node.parent, InstNodeType.NORMAL_COMP());
    741         end match;
    742         {Dimension.INTEGER(size = stop)} := dimensions;
    743         range := Expression.RANGE(Type.ARRAY(Type.INTEGER(), dimensions), Expression.INTEGER(1), NONE(), Expression.INTEGER(stop));
    744         body := Statement.mapExpList(alg.statements, function addIterator(prefix = prefix, subscript = Subscript.INDEX(Expression.CREF(Type.INTEGER(), ComponentRef.makeIterator(iter, Type.INTEGER())))));
    745       then
    746         Algorithm.ALGORITHM({Statement.FOR(iter, SOME(range), body, alg.source)}, alg.source);
     747      algorithm
     748        (iters, ranges, subs) := makeIterators(prefix, dimensions);
     749        subs := listReverseInPlace(subs);
     750        body := Statement.mapExpList(alg.statements, function addIterator(prefix = prefix, subscripts = subs));
     751
     752        iter :: iters := iters;
     753        range :: ranges := ranges;
     754        stmt := Statement.FOR(iter, SOME(range), body, alg.source);
     755
     756        while not listEmpty(iters) loop
     757          iter :: iters := iters;
     758          range :: ranges := ranges;
     759          stmt := Statement.FOR(iter, SOME(range), body, alg.source);
     760        end while;
     761      then
     762        Algorithm.ALGORITHM({stmt}, alg.source);
     763
    747764  end match;
    748765end vectorizeAlgorithm;
     766
     767function makeIterators
     768  input ComponentRef prefix;
     769  input list<Dimension> dimensions;
     770  output list<InstNode> iterators = {};
     771  output list<Expression> ranges = {};
     772  output list<Subscript> subscripts = {};
     773protected
     774  Component iter_comp;
     775  InstNode prefix_node, iter;
     776  Expression range;
     777  Integer index = 1;
     778  Subscript sub;
     779algorithm
     780  prefix_node := ComponentRef.node(prefix);
     781
     782  for dim in dimensions loop
     783    iter_comp := Component.ITERATOR(Type.INTEGER(),
     784      Variability.IMPLICITLY_DISCRETE, InstNode.info(prefix_node));
     785    iter := InstNode.fromComponent("$i" + String(index), iter_comp, InstNode.parent(prefix_node));
     786    iterators := iter :: iterators;
     787    index := index + 1;
     788
     789    range := Expression.makeRange(Expression.INTEGER(1), NONE(), Dimension.sizeExp(dim));
     790    ranges := range :: ranges;
     791
     792    sub := Subscript.INDEX(Expression.CREF(Type.INTEGER(), ComponentRef.makeIterator(iter, Type.INTEGER())));
     793    subscripts := sub :: subscripts;
     794  end for;
     795end makeIterators;
    749796
    750797function addIterator
    751798  input output Expression exp;
    752799  input ComponentRef prefix;
    753   input Subscript subscript;
    754 algorithm
    755   exp := Expression.map(exp, function addIterator_traverse(prefix = prefix, subscript = subscript));
     800  input list<Subscript> subscripts;
     801algorithm
     802  exp := Expression.map(exp, function addIterator_traverse(prefix = prefix, subscripts = subscripts));
    756803end addIterator;
    757804
     
    759806  input output Expression exp;
    760807  input ComponentRef prefix;
    761   input Subscript subscript;
     808  input list<Subscript> subscripts;
    762809protected
    763810  String restString, prefixString = ComponentRef.toString(prefix);
     
    771818        restString := ComponentRef.toString(restCref);
    772819        if prefixLength <= stringLength(restString) and prefixString == substring(restString, 1, prefixLength) then
    773           exp.cref := ComponentRef.mergeSubscripts({subscript}, exp.cref, applyToScope = true);
     820          exp.cref := ComponentRef.mergeSubscripts(subscripts, exp.cref, applyToScope = true);
    774821        end if;
    775822      then
  • testsuite/openmodelica/cppruntime/testVectorizedBlocks.mos

    r1a64c7d r5c431b26  
    7070// 3/21 (10): integrator1.y = y   [dynamic |0|0|0|0|]
    7171// 4/31 (10): assignClock1.y = assignClock1.u   [dynamic |0|0|0|0|]
    72 // 5/41 (10): for $i in 1 : 10 loop
    73 //     der(integrator1[$i].y) = integrator1[$i].k * integrator1[$i].u; end for;    [dynamic |0|0|0|0|]
     72// 5/41 (10): for $i1 in 1 : 10 loop
     73//     der(integrator1[$i1].y) = integrator1[$i1].k * integrator1[$i1].u; end for;    [dynamic |0|0|0|0|]
    7474//
    7575//
     
    134134// 3/21 (10): integrator1.y = y   [dynamic |0|0|0|0|]
    135135// 4/31 (10): assignClock1.y = assignClock1.u   [dynamic |0|0|0|0|]
    136 // 5/41 (10): for $i in 1 : 10 loop
    137 //     $DER.integrator1[$i].y = integrator1[$i].k * integrator1[$i].u; end for;    [dynamic |0|0|0|0|]
     136// 5/41 (10): for $i1 in 1 : 10 loop
     137//     $DER.integrator1[$i1].y = integrator1[$i1].k * integrator1[$i1].u; end for;    [dynamic |0|0|0|0|]
    138138// 6/51 (10): for i in 1 : 10 loop
    139139//     (integrator1[i].y - previous(integrator1[i].y)) / interval() = if firstTick() then 0.0 else $DER.integrator1[i].y; end for;    [dynamic |0|0|0|0|]
  • testsuite/openmodelica/cppruntime/testVectorizedPowerSystem.mos

    rc9471b8 r5c431b26  
    176176// 5/9 (1): fixedVoltageSource1.p = {fixedVoltageSource1.terminal.v * fixedVoltageSource1.terminal.i}   [dynamic |0|0|0|0|]
    177177// 6/10 (1): fixedVoltageSource1.terminal.v = {fixedVoltageSource1.V}   [dynamic |0|0|0|0|]
    178 // 7/11 (3): for $i in 1 : 3 loop
    179 //     fixedLoad1[$i].p = {fixedLoad1[$i].terminal.v * fixedLoad1[$i].terminal.i}; end for;    [dynamic |0|0|0|0|]
    180 // 8/14 (3): for $i in 1 : 3 loop
    181 //     fixedLoad1[$i].terminal.v * fixedLoad1[$i].terminal.i = fixedLoad1[$i].P; end for;    [dynamic |0|0|0|0|]
     178// 7/11 (3): for $i1 in 1 : 3 loop
     179//     fixedLoad1[$i1].p = {fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i}; end for;    [dynamic |0|0|0|0|]
     180// 8/14 (3): for $i1 in 1 : 3 loop
     181//     fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i = fixedLoad1[$i1].P; end for;    [dynamic |0|0|0|0|]
    182182// 9/17 (1): busBar1.v = busBar1.terminal_p.v   [dynamic |0|0|0|0|]
    183183// 10/18 (1): busBar1.i = busBar1.terminal_p.i   [dynamic |0|0|0|0|]
     
    422422// 5/9 (1): fixedVoltageSource1.p = {fixedVoltageSource1.terminal.v * fixedVoltageSource1.terminal.i}   [dynamic |0|0|0|0|]
    423423// 6/10 (1): fixedVoltageSource1.terminal.v = {fixedVoltageSource1.V}   [dynamic |0|0|0|0|]
    424 // 7/11 (3): for $i in 1 : 3 loop
    425 //     fixedLoad1[$i].p = {fixedLoad1[$i].terminal.v * fixedLoad1[$i].terminal.i}; end for;    [dynamic |0|0|0|0|]
    426 // 8/14 (3): for $i in 1 : 3 loop
    427 //     fixedLoad1[$i].terminal.v * fixedLoad1[$i].terminal.i = fixedLoad1[$i].P; end for;    [dynamic |0|0|0|0|]
     424// 7/11 (3): for $i1 in 1 : 3 loop
     425//     fixedLoad1[$i1].p = {fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i}; end for;    [dynamic |0|0|0|0|]
     426// 8/14 (3): for $i1 in 1 : 3 loop
     427//     fixedLoad1[$i1].terminal.v * fixedLoad1[$i1].terminal.i = fixedLoad1[$i1].P; end for;    [dynamic |0|0|0|0|]
    428428// 9/17 (1): busBar1.v = busBar1.terminal_p.v   [dynamic |0|0|0|0|]
    429429// 10/18 (1): busBar1.i = busBar1.terminal_p.i   [dynamic |0|0|0|0|]
  • testsuite/openmodelica/cppruntime/testVectorizedSolarSystem.mos

    r84f52c5 r5c431b26  
    5353// 1/1 (1000): plant.term.v = grid.terms.v   [dynamic |0|0|0|0|]
    5454// 2/1001 (1000): plant.term.i + grid.terms.i = 0.0   [dynamic |0|0|0|0|]
    55 // 3/2001 (1000): for $i in 1 : 1000 loop
    56 //     plant[$i].term.v * plant[$i].term.i = if plant[$i].on then plant[$i].eta * plant[$i].P_solar else 0.0; end for;    [dynamic |0|0|0|0|]
     55// 3/2001 (1000): for $i1 in 1 : 1000 loop
     56//     plant[$i1].term.v * plant[$i1].term.i = if plant[$i1].on then plant[$i1].eta * plant[$i1].P_solar else 0.0; end for;    [dynamic |0|0|0|0|]
    5757// 4/3001 (1000): for i in 1 : 1000 loop
    5858//     grid.terms[i].v = grid.V; end for;    [dynamic |0|0|0|0|]
     
    101101// 1/1 (1000): plant.term.v = grid.terms.v   [dynamic |0|0|0|0|]
    102102// 2/1001 (1000): plant.term.i + grid.terms.i = 0.0   [dynamic |0|0|0|0|]
    103 // 3/2001 (1000): for $i in 1 : 1000 loop
    104 //     plant[$i].term.v * plant[$i].term.i = if plant[$i].on then plant[$i].eta * plant[$i].P_solar else 0.0; end for;    [dynamic |0|0|0|0|]
     103// 3/2001 (1000): for $i1 in 1 : 1000 loop
     104//     plant[$i1].term.v * plant[$i1].term.i = if plant[$i1].on then plant[$i1].eta * plant[$i1].P_solar else 0.0; end for;    [dynamic |0|0|0|0|]
    105105// 4/3001 (1000): for i in 1 : 1000 loop
    106106//     grid.terms[i].v = grid.V; end for;    [dynamic |0|0|0|0|]
Note: See TracChangeset for help on using the changeset viewer.