Changeset dec85325 in OpenModelica
- Timestamp:
- 2016-04-08T09:59:27+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:
- 1f4723ef, fd246e86
- Parents:
- ad9aa799
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Compiler/BackEnd/BackendDAEOptimize.mo
r41d4cef rdec85325 3718 3718 This can not be done in Static, since we need all time- 3719 3719 dependent variables, which is only available in BackendDAE." 3720 input BackendDAE.EqSystem inSyst; 3721 input BackendDAE.Shared inShared; 3722 output BackendDAE.EqSystem osyst; 3723 output BackendDAE.Shared oshared; 3724 algorithm 3725 (osyst, oshared) := match (inSyst, inShared) 3720 input output BackendDAE.EqSystem syst; 3721 input output BackendDAE.Shared shared; 3722 algorithm 3723 (syst, shared) := match (syst, shared) 3726 3724 local 3727 3725 BackendDAE.Variables vars; 3728 3726 BackendDAE.EquationArray eqns, remeqns, inieqns; 3729 BackendDAE.EqSystem syst;3727 array<BackendDAE.Shared> shared_arr; 3730 3728 3731 3729 case (syst as BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns), BackendDAE.SHARED(initialEqs=inieqns)) 3732 3730 algorithm 3733 (_, (vars, _)) := 3734 BackendEquation.traverseEquationArray_WithUpdate(eqns, traverserexpandDerEquation, (vars, inShared)); 3735 (_, (vars, _)) := 3736 BackendEquation.traverseEquationArray_WithUpdate(inieqns, traverserexpandDerEquation, (vars, inShared)); 3731 shared_arr := arrayCreate(1, shared); 3732 (_, vars) := BackendEquation.traverseEquationArray_WithUpdate(eqns, function traverserexpandDerEquation(shared=shared_arr), vars); 3733 (_, vars) := BackendEquation.traverseEquationArray_WithUpdate(inieqns, function traverserexpandDerEquation(shared=shared_arr), vars); 3737 3734 syst.orderedVars := vars; 3738 then (syst, inShared);3735 then (syst, arrayGet(shared_arr, 1)); 3739 3736 end match; 3740 3737 end expandDerOperatorWork; … … 3742 3739 protected function traverserexpandDerEquation " 3743 3740 Help function to e.g. traverserexpandDerEquation" 3744 input BackendDAE.Equation inEq; 3745 input tuple<BackendDAE.Variables, BackendDAE.Shared> tpl; 3746 output BackendDAE.Equation outEq; 3747 output tuple<BackendDAE.Variables, BackendDAE.Shared> outTpl; 3741 input output BackendDAE.Equation eq; 3742 input output BackendDAE.Variables vars; 3743 input array<BackendDAE.Shared> shared; 3748 3744 protected 3749 3745 BackendDAE.Equation e, e1; 3750 3746 tuple<BackendDAE.Variables, DAE.FunctionTree> ext_arg, ext_art1; 3751 BackendDAE.Variables vars;3752 3747 DAE.FunctionTree funcs; 3753 3748 Boolean b; 3754 3749 list<DAE.SymbolicOperation> ops; 3755 BackendDAE.Shared shared; 3756 algorithm 3757 e := inEq; 3758 (vars, shared) := tpl; 3759 (e1, (vars, shared, ops)) := BackendEquation.traverseExpsOfEquation(e, traverserexpandDerExp, (vars, shared, {})); 3760 e1 := List.foldr(ops, BackendEquation.addOperation, e1); 3761 outEq := e1; 3762 outTpl := (vars, shared); 3750 algorithm 3751 (eq, (vars, ops)) := BackendEquation.traverseExpsOfEquation(eq, function traverserexpandDerExp(shared=shared), (vars, {})); 3752 eq := List.foldr(ops, BackendEquation.addOperation, eq); 3763 3753 end traverserexpandDerEquation; 3764 3754 3765 3755 protected function traverserexpandDerExp " 3766 3756 Help function to e.g. traverserexpandDerExp" 3767 input DAE.Exp inExp; 3768 input tuple<BackendDAE.Variables, BackendDAE.Shared, list<DAE.SymbolicOperation>> tpl; 3769 output DAE.Exp outExp; 3770 output tuple<BackendDAE.Variables, BackendDAE.Shared, list<DAE.SymbolicOperation>> outTpl; 3757 input output DAE.Exp exp; 3758 input output tuple<BackendDAE.Variables, list<DAE.SymbolicOperation>> tpl; 3759 input array<BackendDAE.Shared> shared; 3771 3760 protected 3772 DAE.Exp e , e1;3761 DAE.Exp exp_1; 3773 3762 tuple<BackendDAE.Variables, BackendDAE.Shared, Boolean> ext_arg; 3774 BackendDAE.Variables vars ;3763 BackendDAE.Variables vars1, vars2; 3775 3764 list<DAE.SymbolicOperation> ops; 3776 3765 DAE.FunctionTree funcs; 3777 3766 Boolean b; 3778 BackendDAE.Shared shared; 3779 algorithm 3780 e := inExp; 3781 (vars, shared, ops) := tpl; 3782 ext_arg := (vars, shared, false); 3783 (e1, ext_arg) := Expression.traverseExpBottomUp(e, expandDerExp, ext_arg); 3784 (vars, shared, b) := ext_arg; 3785 ops := List.consOnTrue(b, DAE.OP_DIFFERENTIATE(DAE.crefTime, e, e1), ops); 3786 outExp := e1; 3787 outTpl := (vars, shared, ops); 3767 algorithm 3768 (vars1, ops) := tpl; 3769 (exp_1, vars2) := Expression.traverseExpBottomUp(exp, function expandDerExp(inShared=shared), vars1); 3770 if not (referenceEq(vars1, vars2) and referenceEq(exp, exp_1)) then 3771 ops := DAE.OP_DIFFERENTIATE(DAE.crefTime, exp, exp_1)::ops; 3772 exp := exp_1; 3773 tpl := (vars2, ops); 3774 end if; 3788 3775 end traverserexpandDerExp; 3789 3776 3790 3777 protected function expandDerExp " 3791 3778 Help function to e.g. expandDerOperatorEqn" 3792 input DAE.Exp inExp; 3793 input tuple<BackendDAE.Variables, BackendDAE.Shared, Boolean> itpl; 3794 output DAE.Exp e; 3795 output tuple<BackendDAE.Variables, BackendDAE.Shared, Boolean> tpl; 3796 algorithm 3797 (e,tpl) := matchcontinue (inExp,itpl) 3798 local 3799 BackendDAE.Variables vars; 3779 input output DAE.Exp exp; 3780 input output BackendDAE.Variables vars; 3781 input array<BackendDAE.Shared> inShared; 3782 algorithm 3783 (exp,vars) := matchcontinue exp 3784 local 3800 3785 DAE.Exp e1, e2; 3801 3786 DAE.ComponentRef cr; 3802 3787 String str; 3803 BackendDAE.Shared shared;3804 3788 list<BackendDAE.Var> varlst; 3805 3789 BackendDAE.Var v; 3806 3790 Boolean b; 3807 3791 DAE.FunctionTree funcs; 3808 case (DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(componentRef=cr)})}), (_, _, _)) 3792 BackendDAE.Shared shared; 3793 case DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(componentRef=cr)})}) 3809 3794 equation 3810 3795 str = ComponentReference.crefStr(cr); … … 3813 3798 then fail(); 3814 3799 // case for arrays 3815 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(ty = DAE.T_ARRAY())}) , (vars, shared as BackendDAE.SHARED(), b))3800 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(ty = DAE.T_ARRAY())})) 3816 3801 equation 3817 3802 (e2, true) = Expression.extendArrExp(e1, false); 3818 (e ,tpl) = Expression.traverseExpBottomUp(e2, expandDerExp, itpl);3819 then (e ,tpl);3803 (exp,vars) = Expression.traverseExpBottomUp(e2, function expandDerExp(inShared=inShared), vars); 3804 then (exp,vars); 3820 3805 // case for records 3821 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(ty = DAE.T_COMPLEX(complexClassType=ClassInf.RECORD(_)))}) , (vars, shared as BackendDAE.SHARED(), b))3806 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(ty = DAE.T_COMPLEX(complexClassType=ClassInf.RECORD(_)))})) 3822 3807 equation 3823 3808 (e2, true) = Expression.extendArrExp(e1, false); 3824 (e ,tpl) = Expression.traverseExpBottomUp(e2, expandDerExp, itpl);3825 then (e ,tpl);3826 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(componentRef=cr)}) , (vars, shared, _))3809 (exp,vars) = Expression.traverseExpBottomUp(e2, function expandDerExp(inShared=inShared), vars); 3810 then (exp,vars); 3811 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(componentRef=cr)})) 3827 3812 equation 3828 3813 ({v}, _) = BackendVariable.getVar(cr, vars); 3829 3814 (vars, e1) = updateStatesVar(vars, v, e1); 3830 then (e1, (vars, shared, true));3831 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(componentRef=cr)}) , (vars, shared, _))3815 then (e1, vars); 3816 case (e1 as DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={DAE.CREF(componentRef=cr)})) 3832 3817 equation 3833 3818 (varlst, _) = BackendVariable.getVar(cr, vars); 3834 3819 vars = updateStatesVars(vars, varlst, false); 3835 then (e1, (vars, shared, true)); 3836 case (DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={e1}), (vars, shared, _)) 3837 equation 3838 (e2, shared) = Differentiate.differentiateExpTime(e1, vars, shared); 3820 then (e1, vars); 3821 case (DAE.CALL(path=Absyn.IDENT(name = "der"), expLst={e1})) 3822 equation 3823 (e2, shared) = Differentiate.differentiateExpTime(e1, vars, arrayGet(inShared,1)); 3824 arrayUpdate(inShared, 1, shared); 3839 3825 (e2, _) = ExpressionSimplify.simplify(e2); 3840 3826 (_, vars) = Expression.traverseExpBottomUp(e2, derCrefsExp, vars); 3841 then (e2, (vars, shared, true));3842 else ( inExp,itpl);3827 then (e2, vars); 3828 else (exp,vars); 3843 3829 end matchcontinue; 3844 3830 end expandDerExp;
Note: See TracChangeset
for help on using the changeset viewer.