@@ -59,6 +59,7 @@ protected import BaseHashTable;
5959protected import Ceval ;
6060protected import CheckModel ;
6161protected import ClassInf ;
62+ protected import Config ;
6263protected import ComponentReference ;
6364protected import DAEUtil ;
6465protected import Debug ;
@@ -3072,7 +3073,7 @@ protected
30723073algorithm
30733074 System . realtimeTick(GlobalScript . RT_CLOCK_EXECSTAT_JACOBIANS );
30743075 BackendDAE . DAE (eqs= eqs,shared = shared ) := inBackendDAE;
3075- (linearModelMatrixes, funcs) := createLinearModelMatrixes(inBackendDAE);
3076+ (linearModelMatrixes, funcs) := createLinearModelMatrixes(inBackendDAE, Config . acceptOptimicaGrammar() );
30763077 shared := BackendDAEUtil . addBackendDAESharedJacobians(linearModelMatrixes, shared );
30773078 functionTree := BackendDAEUtil . getFunctions(shared );
30783079 functionTree := DAEUtil . joinAvlTrees(functionTree, funcs);
@@ -3094,7 +3095,7 @@ protected function createSymbolicJacobianforStates
30943095 output DAE . FunctionTree outFunctionTree;
30953096algorithm
30963097 (outJacobian, outSparsePattern, outSparseColoring, outFunctionTree) :=
3097- matchcontinue (inBackendDAE)
3098+ match (inBackendDAE)
30983099 local
30993100 BackendDAE . BackendDAE backendDAE, backendDAE2;
31003101
@@ -3147,25 +3148,29 @@ algorithm
31473148 Error . addMessage(Error . INTERNAL_ERROR , {"Generation of symbolic Jacobian Matrix code failed. Function: BackendDAEOpimize.createSymcolicaJacobianforStates" });
31483149 then
31493150 fail();
3150- end matchcontinue ;
3151+ end match ;
31513152end createSymbolicJacobianforStates;
31523153
31533154protected function createLinearModelMatrixes
31543155"fuction creates the linear model matrices column-wise
31553156 author: wbraun"
31563157 input BackendDAE . BackendDAE inBackendDAE;
3158+ input Boolean UseOtimica ;
31573159 output BackendDAE . SymbolicJacobians outJacobianMatrixes;
31583160 output DAE . FunctionTree outFunctionTree;
3161+
31593162algorithm
31603163 (outJacobianMatrixes, outFunctionTree) :=
3161- matchcontinue (inBackendDAE)
3164+ match (inBackendDAE, UseOtimica )
31623165 local
31633166 BackendDAE . BackendDAE backendDAE,backendDAE2;
31643167
3165- list< BackendDAE . Var > varlst, knvarlst, states, inputvars, inputvars2, outputvars, paramvars;
3168+ list< BackendDAE . Var > varlst, knvarlst, states, inputvars, inputvars2, outputvars, paramvars, states_inputs;
3169+ BackendDAE . Var mayer, lagrange;
31663170 list< DAE . ComponentRef > comref_states, comref_inputvars, comref_outputvars, comref_vars, comref_knvars;
3171+ DAE . ComponentRef leftcref;
31673172
3168- BackendDAE . Variables v,kv,statesarr,inputvarsarr,paramvarsarr,outputvarsarr;
3173+ BackendDAE . Variables v,kv,statesarr,inputvarsarr,paramvarsarr,outputvarsarr, object ;
31693174 BackendDAE . EquationArray e;
31703175
31713176 BackendDAE . SymbolicJacobians linearModelMatrices;
@@ -3176,8 +3181,8 @@ algorithm
31763181
31773182 DAE . FunctionTree funcs, functionTree;
31783183 list< DAE . Function > funcLst;
3179-
3180- case (backendDAE)
3184+
3185+ case (backendDAE, false )
31813186 equation
31823187 backendDAE2 = BackendDAEUtil . copyBackendDAE(backendDAE);
31833188 backendDAE2 = collapseIndependentBlocks(backendDAE2);
@@ -3222,6 +3227,71 @@ algorithm
32223227 Debug . fcall(Flags . JAC_DUMP2 , print, "analytical Jacobians -> generated system for matrix C time: " +& realString(clock()) +& " \n " );
32233228
32243229
3230+ // Differentiate the System w.r.t inputs for matrices D
3231+ (linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,inputvars2,statesarr,inputvarsarr,paramvarsarr,outputvarsarr,varlst,"D" );
3232+ functionTree = DAEUtil . joinAvlTrees(functionTree, funcs);
3233+ linearModelMatrices = listAppend(linearModelMatrices,{(SOME (linearModelMatrix),sparsePattern,sparseColoring)});
3234+ Debug . fcall(Flags . JAC_DUMP2 , print, "analytical Jacobians -> generated system for matrix D time: " +& realString(clock()) +& " \n " );
3235+
3236+ then
3237+ (linearModelMatrices, functionTree);
3238+
3239+ case (backendDAE, true ) // created linear model (matrixes) fir for optimize
3240+ equation
3241+ backendDAE2 = BackendDAEUtil . copyBackendDAE(backendDAE);
3242+ backendDAE2 = collapseIndependentBlocks(backendDAE2);
3243+ backendDAE2 = BackendDAEUtil . transformBackendDAE(backendDAE2,SOME ((BackendDAE . NO_INDEX_REDUCTION (),BackendDAE . EXACT ())),NONE (),NONE ());
3244+ BackendDAE . DAE ({BackendDAE . EQSYSTEM (orderedVars = v, orderedEqs = e)}, BackendDAE . SHARED (knownVars = kv)) = backendDAE2;
3245+
3246+ // Prepare all needed variables
3247+ varlst = BackendVariable . varList(v);
3248+ comref_vars = List . map(varlst,BackendVariable . varCref);
3249+ knvarlst = BackendVariable . varList(kv);
3250+ comref_knvars = List . map(knvarlst,BackendVariable . varCref);
3251+ states = BackendVariable . getAllStateVarFromVariables(v);
3252+ inputvars = List . select(knvarlst,BackendVariable . isInput);
3253+ paramvars = List . select(knvarlst, BackendVariable . isParam);
3254+ inputvars2 = List . select(knvarlst,BackendVariable . isVarOnTopLevelAndInput);
3255+ outputvars = List . select(varlst, BackendVariable . isVarOnTopLevelAndOutput);
3256+ states_inputs = listAppend(states, inputvars2);
3257+
3258+ comref_states = List . map(states,BackendVariable . varCref);
3259+ comref_inputvars = List . map(inputvars2,BackendVariable . varCref);
3260+ comref_outputvars = List . map(outputvars,BackendVariable . varCref);
3261+
3262+ statesarr = BackendVariable . listVar1(states);
3263+ inputvarsarr = BackendVariable . listVar1(inputvars);
3264+ paramvarsarr = BackendVariable . listVar1(paramvars);
3265+ outputvarsarr = BackendVariable . listVar1(outputvars);
3266+
3267+ leftcref = ComponentReference . makeCrefIdent("$TMP_mayerTerm" , DAE . T_REAL_DEFAULT , {});
3268+ mayer = BackendDAE . VAR (DAE . CREF_IDENT ("$TMP_mayerTerm" , DAE . T_REAL_DEFAULT , {}), BackendDAE . VARIABLE (), DAE . BIDIR (), DAE . NON_PARALLEL (), DAE . T_REAL_DEFAULT , NONE (), NONE (), {}, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
3269+ mayer = BackendVariable . setVarDirection(mayer, DAE . OUTPUT ());
3270+
3271+ leftcref = ComponentReference . makeCrefIdent("$TMP_lagrangeTerm" , DAE . T_REAL_DEFAULT , {});
3272+ lagrange = BackendDAE . VAR (DAE . CREF_IDENT ("$TMP_lagrangeTerm" , DAE . T_REAL_DEFAULT , {}), BackendDAE . VARIABLE (), DAE . BIDIR (), DAE . NON_PARALLEL (), DAE . T_REAL_DEFAULT , NONE (), NONE (), {}, DAE . emptyElementSource, NONE (), NONE (), DAE . NON_CONNECTOR ());
3273+ lagrange = BackendVariable . setVarDirection(lagrange, DAE . OUTPUT ());
3274+
3275+ object = BackendVariable . listVar1({mayer,lagrange});
3276+
3277+ // Differentiate the System w.r.t states for matrices A
3278+ (linearModelMatrix, sparsePattern, sparseColoring, functionTree) = createJacobian(backendDAE2,states,statesarr,inputvarsarr,paramvarsarr,statesarr,varlst,"A" );
3279+ linearModelMatrices = {(SOME (linearModelMatrix),sparsePattern,sparseColoring)};
3280+ Debug . fcall(Flags . JAC_DUMP2 , print, "analytical Jacobians -> generated system for matrix A time: " +& realString(clock()) +& " \n " );
3281+
3282+
3283+ // Differentiate the System w.r.t states&inputs for matrices B
3284+ (linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,statesarr,varlst,"B" );
3285+ functionTree = DAEUtil . joinAvlTrees(functionTree, funcs);
3286+ linearModelMatrices = listAppend(linearModelMatrices,{(SOME (linearModelMatrix),sparsePattern,sparseColoring)});
3287+ Debug . fcall(Flags . JAC_DUMP2 , print, "analytical Jacobians -> generated system for matrix B time: " +& realString(clock()) +& " \n " );
3288+
3289+ // Differentiate the System w.r.t states for matrices C
3290+ (linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,object ,varlst,"C" );
3291+ linearModelMatrices = listAppend(linearModelMatrices,{(SOME (linearModelMatrix),sparsePattern,sparseColoring)});
3292+ Debug . fcall(Flags . JAC_DUMP2 , print, "analytical Jacobians -> generated system for matrix C time: " +& realString(clock()) +& " \n " );
3293+
3294+
32253295 // Differentiate the System w.r.t inputs for matrices D
32263296 (linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,inputvars2,statesarr,inputvarsarr,paramvarsarr,outputvarsarr,varlst,"D" );
32273297 functionTree = DAEUtil . joinAvlTrees(functionTree, funcs);
@@ -3235,7 +3305,7 @@ algorithm
32353305 Error . addMessage(Error . INTERNAL_ERROR , {"Generation of LinearModel Matrices failed. Function: BackendDAEOpimize.createLinearModelMatrixes" });
32363306 then
32373307 fail();
3238- end matchcontinue ;
3308+ end match ;
32393309end createLinearModelMatrixes;
32403310
32413311public function createJacobian "author: wbraun
0 commit comments