@@ -324,7 +324,7 @@ algorithm
324324 case (_) equation
325325 true = Flags . getConfigBool(Flags . GENERATE_SYMBOLIC_LINEARIZATION );
326326 BackendDAE . DAE (eqs= eqs,shared = shared ) = inBackendDAE;
327- (linearModelMatrixes, funcs) = createLinearModelMatrixes(inBackendDAE, Config . acceptOptimicaGrammar(), Flags . isSet( Flags . DIS_SYMJAC_FMI20 ) );
327+ (linearModelMatrixes, funcs) = createLinearModelMatrixes(inBackendDAE, Config . acceptOptimicaGrammar());
328328 shared = BackendDAEUtil . setSharedSymJacs(shared , linearModelMatrixes);
329329 functionTree = BackendDAEUtil . getFunctions(shared );
330330 functionTree = DAE . AvlTreePathFunction . join(functionTree, funcs);
@@ -1582,17 +1582,102 @@ algorithm
15821582 end if ;
15831583end createBipartiteGraph;
15841584
1585+ public function createFMIModelDerivatives
1586+ "This function genererate the stucture output and the
1587+ partial derivatives for FMI, which are basically the jacobian matrices.
1588+ author: wbraun"
1589+ input BackendDAE . BackendDAE inBackendDAE;
1590+ output BackendDAE . SymbolicJacobians outJacobianMatrixes = {};
1591+ output DAE . FunctionTree outFunctionTree;
1592+ protected
1593+ BackendDAE . BackendDAE backendDAE,emptyBDAE;
1594+ BackendDAE . EqSystem eqSyst;
1595+ Option < BackendDAE . SymbolicJacobian > outJacobian;
1596+
1597+ list< BackendDAE . Var > varlst, knvarlst, states, inputvars, outputvars, paramvars, indepVars, depVars;
1598+
1599+ BackendDAE . Variables v,globalKnownVars,statesarr,inputvarsarr,paramvarsarr,outputvarsarr, depVarsArr;
1600+
1601+ BackendDAE . SparsePattern sparsePattern;
1602+ BackendDAE . SparseColoring sparseColoring;
1603+
1604+ DAE . FunctionTree funcs, functionTree;
1605+
1606+ BackendDAE . ExtraInfo ei;
1607+ FCore . Cache cache;
1608+ FCore . Graph graph;
1609+ algorithm
1610+ try
1611+ // for now perform on collapsed system
1612+ backendDAE := BackendDAEUtil . copyBackendDAE(inBackendDAE);
1613+ backendDAE := BackendDAEOptimize . collapseIndependentBlocks(backendDAE);
1614+ backendDAE := BackendDAEUtil . transformBackendDAE(backendDAE,SOME ((BackendDAE . NO_INDEX_REDUCTION (),BackendDAE . EXACT ())),NONE (),NONE ());
1615+
1616+ // get all variables
1617+ eqSyst::{} := backendDAE. eqs;
1618+ v := eqSyst. orderedVars;
1619+ globalKnownVars := backendDAE. shared . globalKnownVars;
1620+
1621+ // prepare all needed variables
1622+ varlst := BackendVariable . varList(v);
1623+ knvarlst := BackendVariable . varList(globalKnownVars);
1624+ states := BackendVariable . getAllStateVarFromVariables(v);
1625+
1626+ inputvars := List . select(knvarlst,BackendVariable . isVarOnTopLevelAndInput);
1627+ outputvars := List . select(varlst, BackendVariable . isVarOnTopLevelAndOutput);
1628+
1629+ // independent varibales states + inputs
1630+ indepVars := listAppend(states, inputvars);
1631+
1632+ // dependent varibales der(states) + outputs
1633+ depVars := listAppend(states, outputvars);
1634+
1635+ // Generate sparse pattern for matrices states
1636+ // prepare more needed variables
1637+ if Flags . isSet(Flags . DIS_SYMJAC_FMI20 ) then
1638+ // empty BackendDAE in case derivates should not calclulated
1639+ cache := backendDAE. shared . cache;
1640+ graph := backendDAE. shared . graph;
1641+ ei := backendDAE. shared . info;
1642+ emptyBDAE := BackendDAE . DAE ({BackendDAEUtil . createEqSystem(BackendVariable . emptyVars(), BackendEquation . emptyEqns())}, BackendDAEUtil . createEmptyShared(BackendDAE . JACOBIAN (), ei, cache, graph));
1643+
1644+ (sparsePattern, sparseColoring) := generateSparsePattern(backendDAE, indepVars, depVars);
1645+ if Flags . isSet(Flags . JAC_DUMP2 ) then
1646+ BackendDump . dumpSparsityPattern(sparsePattern, "FMI sparsity" );
1647+ end if ;
1648+ outJacobianMatrixes := (SOME ((emptyBDAE,"FMIDER" ,{},{},{})), sparsePattern, sparseColoring)::outJacobianMatrixes;
1649+ outFunctionTree := inBackendDAE. shared . functionTree;
1650+ else
1651+ // prepare more needed variables
1652+ paramvars := List . select(knvarlst, BackendVariable . isParam);
1653+ statesarr := BackendVariable . listVar1(states);
1654+ inputvarsarr := BackendVariable . listVar1(inputvars);
1655+ paramvarsarr := BackendVariable . listVar1(paramvars);
1656+ depVarsArr := BackendVariable . listVar1(depVars);
1657+
1658+ (outJacobian, outFunctionTree, sparsePattern, sparseColoring) := generateGenericJacobian(backendDAE,indepVars,statesarr,inputvarsarr,paramvarsarr,depVarsArr,varlst,"FMIDER" , Flags . isSet(Flags . DIS_SYMJAC_FMI20 ));
1659+ if Flags . isSet(Flags . JAC_DUMP2 ) then
1660+ BackendDump . dumpSparsityPattern(sparsePattern, "FMI sparsity" );
1661+ end if ;
1662+ outJacobianMatrixes := (outJacobian, sparsePattern, sparseColoring)::outJacobianMatrixes;
1663+ end if ;
1664+ else
1665+ Error . addInternalError("function createFMIModelDerivatives failed" , sourceInfo());
1666+ outJacobianMatrixes := {};
1667+ outFunctionTree := inBackendDAE. shared . functionTree;
1668+ end try ;
1669+ end createFMIModelDerivatives;
1670+
15851671protected function createLinearModelMatrixes "This function creates the linear model matrices column-wise
15861672 author: wbraun"
15871673 input BackendDAE . BackendDAE inBackendDAE;
15881674 input Boolean useOptimica;
1589- input Boolean noGenSymbolicJac;
15901675 output BackendDAE . SymbolicJacobians outJacobianMatrixes;
15911676 output DAE . FunctionTree outFunctionTree;
15921677
15931678algorithm
15941679 (outJacobianMatrixes, outFunctionTree) :=
1595- match (inBackendDAE, useOptimica, noGenSymbolicJac )
1680+ match (inBackendDAE, useOptimica)
15961681 local
15971682 BackendDAE . BackendDAE backendDAE,backendDAE2,emptyBDAE;
15981683
@@ -1616,42 +1701,7 @@ algorithm
16161701 FCore . Cache cache;
16171702 FCore . Graph graph;
16181703
1619- case (backendDAE, false , true )
1620- equation
1621- backendDAE2 = BackendDAEUtil . copyBackendDAE(backendDAE);
1622- backendDAE2 = BackendDAEOptimize . collapseIndependentBlocks(backendDAE2);
1623- backendDAE2 = BackendDAEUtil . transformBackendDAE(backendDAE2,SOME ((BackendDAE . NO_INDEX_REDUCTION (),BackendDAE . EXACT ())),NONE (),NONE ());
1624- BackendDAE . DAE ({BackendDAE . EQSYSTEM (orderedVars = v)}, BackendDAE . SHARED (globalKnownVars = globalKnownVars, functionTree = functionTree, cache= cache, graph= graph, info= ei)) = backendDAE2;
1625-
1626- emptyBDAE = BackendDAE . DAE ({BackendDAEUtil . createEqSystem(BackendVariable . emptyVars(), BackendEquation . emptyEqns())}, BackendDAEUtil . createEmptyShared(BackendDAE . JACOBIAN (), ei, cache, graph));
1627- // Prepare all needed variables
1628- varlst = BackendVariable . varList(v);
1629- knvarlst = BackendVariable . varList(globalKnownVars);
1630- states = BackendVariable . getAllStateVarFromVariables(v);
1631- _ = List . select(knvarlst,BackendVariable . isInput);
1632- _ = List . select(knvarlst, BackendVariable . isParam);
1633- inputvars2 = List . select(knvarlst,BackendVariable . isVarOnTopLevelAndInput);
1634- outputvars = List . select(varlst, BackendVariable . isVarOnTopLevelAndOutput);
1635-
1636- // Generate sparse pattern for matrices A
1637- (sparsePattern, sparseColoring) = generateSparsePattern(backendDAE2, states, states);
1638- linearModelMatrices = {(SOME ((emptyBDAE,"A" ,{},{},{})), sparsePattern, sparseColoring)};
1639-
1640- // Generate sparse pattern for matrices B
1641- (sparsePattern, sparseColoring) = generateSparsePattern(backendDAE2, inputvars2, states);
1642- linearModelMatrices = listAppend(linearModelMatrices,{(SOME ((emptyBDAE,"B" ,{},{},{})), sparsePattern, sparseColoring)});
1643-
1644- // Generate sparse pattern for matrices C
1645- (sparsePattern, sparseColoring) = generateSparsePattern(backendDAE2, states, outputvars);
1646- linearModelMatrices = listAppend(linearModelMatrices,{(SOME ((emptyBDAE,"C" ,{},{},{})), sparsePattern, sparseColoring)});
1647-
1648- // Generate sparse pattern for matrices D
1649- (sparsePattern, sparseColoring) = generateSparsePattern(backendDAE2, inputvars2, outputvars);
1650- linearModelMatrices = listAppend(linearModelMatrices,{(SOME ((emptyBDAE,"D" ,{},{},{})), sparsePattern, sparseColoring)});
1651- then
1652- (linearModelMatrices, functionTree);
1653-
1654- case (backendDAE, false , _)
1704+ case (backendDAE, false )
16551705 equation
16561706 backendDAE2 = BackendDAEUtil . copyBackendDAE(backendDAE);
16571707 backendDAE2 = BackendDAEOptimize . collapseIndependentBlocks(backendDAE2);
@@ -1709,7 +1759,7 @@ algorithm
17091759 then
17101760 (linearModelMatrices, functionTree);
17111761
1712- case (backendDAE, true , _ ) // created linear model (matrixes) for optimization
1762+ case (backendDAE, true ) // created linear model (matrixes) for optimization
17131763 equation
17141764 // A := der(x)
17151765 // B := {der(x), con(x), L(x)}
0 commit comments