Skip to content

Commit

Permalink
reduce inStream equations for zero flow (#3430)
Browse files Browse the repository at this point in the history
  • Loading branch information
rfranke authored and OpenModelica-Hudson committed Sep 1, 2015
1 parent 7a8b275 commit e18a45a
Showing 1 changed file with 35 additions and 10 deletions.
45 changes: 35 additions & 10 deletions Compiler/FrontEnd/ConnectUtil.mo
Expand Up @@ -2822,28 +2822,53 @@ protected function streamSumEquationExp
output DAE.Exp outSumExp;
protected
DAE.Exp outside_sum1, outside_sum2, inside_sum1, inside_sum2, res;
list<ConnectorElement> insideElements, outsideElements;
algorithm
if listEmpty(inOutsideElements) then
(_, insideElements) := List.splitOnTrue(inInsideElements, function isZeroFlow(attr="min"));
(_, outsideElements) := List.splitOnTrue(inOutsideElements, function isZeroFlow(attr="max"));
if listEmpty(outsideElements) then
// No outside components.
inside_sum1 := sumMap(inInsideElements, sumInside1, inFlowThreshold);
inside_sum2 := sumMap(inInsideElements, sumInside2, inFlowThreshold);
inside_sum1 := sumMap(insideElements, sumInside1, inFlowThreshold);
inside_sum2 := sumMap(insideElements, sumInside2, inFlowThreshold);
outSumExp := Expression.expDiv(inside_sum1, inside_sum2);
elseif listEmpty(inInsideElements) then
elseif listEmpty(insideElements) then
// No inside components.
outside_sum1 := sumMap(inOutsideElements, sumOutside1, inFlowThreshold);
outside_sum2 := sumMap(inOutsideElements, sumOutside2, inFlowThreshold);
outside_sum1 := sumMap(outsideElements, sumOutside1, inFlowThreshold);
outside_sum2 := sumMap(outsideElements, sumOutside2, inFlowThreshold);
outSumExp := Expression.expDiv(outside_sum1, outside_sum2);
else
// Both outside and inside components.
outside_sum1 := sumMap(inOutsideElements, sumOutside1, inFlowThreshold);
outside_sum2 := sumMap(inOutsideElements, sumOutside2, inFlowThreshold);
inside_sum1 := sumMap(inInsideElements, sumInside1, inFlowThreshold);
inside_sum2 := sumMap(inInsideElements, sumInside2, inFlowThreshold);
outside_sum1 := sumMap(outsideElements, sumOutside1, inFlowThreshold);
outside_sum2 := sumMap(outsideElements, sumOutside2, inFlowThreshold);
inside_sum1 := sumMap(insideElements, sumInside1, inFlowThreshold);
inside_sum2 := sumMap(insideElements, sumInside2, inFlowThreshold);
outSumExp := Expression.expDiv(Expression.expAdd(outside_sum1, inside_sum1),
Expression.expAdd(outside_sum2, inside_sum2));
end if;
end streamSumEquationExp;

protected function isZeroFlow
"Returns true if the given flow attribute of a connector is zero."
input ConnectorElement inElement;
input String attr;
output Boolean isZero;
protected
DAE.Type ty;
Option<DAE.Exp> attr_oexp;
DAE.Exp flow_exp, attr_exp;
algorithm
flow_exp := flowExp(inElement);
ty := Expression.typeof(flow_exp);
attr_oexp := Types.lookupAttributeExp(Types.getAttributes(ty), attr);
isZero := false;
if isSome(attr_oexp) then
SOME(attr_exp) := attr_oexp;
isZero := Expression.isZero(attr_exp);
else
isZero := false;
end if;
end isZeroFlow;

protected function sumMap
"Creates a sum expression by applying the given function on the list of
elements and summing up the resulting expressions."
Expand Down

0 comments on commit e18a45a

Please sign in to comment.