diff --git a/OMCompiler/Compiler/BackEnd/BackendDump.mo b/OMCompiler/Compiler/BackEnd/BackendDump.mo index 4232ed31edc..07f1160944d 100644 --- a/OMCompiler/Compiler/BackEnd/BackendDump.mo +++ b/OMCompiler/Compiler/BackEnd/BackendDump.mo @@ -2328,12 +2328,12 @@ algorithm end match; end jacobianTypeStr; -public function jacobianString"dumps a string representation of a jacobian. +public function dumpJacobianString +"dumps a string representation of a jacobian. author: Waurich TUD 2014-10" input BackendDAE.Jacobian jacIn; - output String sOut; algorithm - sOut := match(jacIn) + _ := match(jacIn) local BackendDAE.BackendDAE dae; BackendDAE.FullJacobian fJac; @@ -2343,28 +2343,37 @@ algorithm String s; case(BackendDAE.FULL_JACOBIAN(jacobian=fJac)) equation - s = "FULL JACOBIAN:\n"; - s = s + dumpJacobianStr(fJac); - then s; + s = "###############\n" + + " FULL_JACOBIAN \n" + + "###############\n\n" + + dumpJacobianStr(fJac); + print(s); + then ""; case(BackendDAE.GENERIC_JACOBIAN(jacobian=SOME(sJac),sparsePattern=sparsePattern)) equation ((dae,_,_,_,_, _)) = sJac; - s = "GENERIC JACOBIAN:\n"; + print("##################\n" + + " GENERIC_JACOBIAN \n" + + "##################\n\n"); dumpBackendDAE(dae,"Directional Derivatives System"); dumpSparsityPattern(sparsePattern,"Sparse Pattern"); - then s; + then ""; case(BackendDAE.GENERIC_JACOBIAN(jacobian=NONE(),sparsePattern=sparsePattern)) equation - s = "GENERIC JACOBIAN:\n"; + print("##################\n" + + " GENERIC_JACOBIAN \n" + + "##################\n\n"); dumpSparsityPattern(sparsePattern,"Sparse Pattern"); - then s; + then ""; case(BackendDAE.EMPTY_JACOBIAN()) equation - s = "EMPTY JACOBIAN:\n"; - then s; + print("################\n" + + " EMPTY_JACOBIAN \n" + + "################\n\n"); + then ""; end match; -end jacobianString; +end dumpJacobianString; public function symJacString "dumps a string representation of a jacobian." input tuple, BackendDAE.SparsePattern, BackendDAE.SparseColoring> jacIn; diff --git a/OMCompiler/Compiler/BackEnd/SymbolicJacobian.mo b/OMCompiler/Compiler/BackEnd/SymbolicJacobian.mo index dd2b5474f25..f648aae6783 100644 --- a/OMCompiler/Compiler/BackEnd/SymbolicJacobian.mo +++ b/OMCompiler/Compiler/BackEnd/SymbolicJacobian.mo @@ -2751,10 +2751,9 @@ algorithm // Check if all nonlinear iteration variables have start values if BackendDAEUtil.isInitializationDAE(inShared) then try - checkNonLinDependecies(outComp,inEqns); + checkNonLinDependecies(outComp,inEqns); else - // ToDo Fix me! Like seriously! - Error.addInternalError("function calculateJacobianComponent failed to check all non-linear iteration variables for start values.", sourceInfo()); + Error.addInternalError("function calculateJacobianComponent failed to check all non-linear iteration variables for start values.", sourceInfo()); end try; end if; end calculateJacobianComponent; @@ -2778,7 +2777,7 @@ algorithm BackendDAE.InnerEquations innerEquations; Boolean linear; String str; - // Case non-linear teared equation system + // Case non-linear torn equation system case (BackendDAE.TORNSYSTEM(strictTearingSet=BackendDAE.TEARINGSET(jac=jac, residualequations=resIndices, innerEquations=innerEquations), linear=false)) algorithm for eq in innerEquations loop @@ -2794,7 +2793,7 @@ algorithm printNonLinIterVarsAndEqs(jac,eqnIndices,inEqns); then ""; - // Case non-linear non-teared equation system + // Case non-linear non-torn equation system case (BackendDAE.EQUATIONSYSTEM(eqns=eqnIndices, jac=jac, jacType=BackendDAE.JAC_NONLINEAR())) algorithm printNonLinIterVarsAndEqs(jac,eqnIndices,inEqns); @@ -2874,53 +2873,57 @@ protected function printNonLinIterVarsAndEqs input BackendDAE.Jacobian jacobian; input list eqnIndices; input BackendDAE.EquationArray inEqns; -protected - BackendDAE.EqSystem syst; - BackendDAE.Shared shared; - Integer idx = 1; - list diffVars, residualVars, allDiffedVars, nonLin = {}, nonLinStart = {}, lin = {}; - list dependentVarsCref; - DAE.ComponentRef varCref; - BackendDAE.Var var; - String name; algorithm - BackendDAE.GENERIC_JACOBIAN(SOME((BackendDAE.DAE({syst}, shared),name,diffVars,residualVars,allDiffedVars,dependentVarsCref))) := jacobian; - - // Get non-linear variables without start value - for varCref in dependentVarsCref loop - for var in diffVars loop - if ComponentReference.crefEqual(varCref, var.varName) then - if (not BackendVariable.varHasStartValue(var)) then - nonLin := var::nonLin; - else - nonLinStart := var::nonLinStart; + _ := match jacobian + local + BackendDAE.EqSystem syst; + BackendDAE.Shared shared; + Integer idx = 1; + list diffVars, residualVars, allDiffedVars, nonLin = {}, nonLinStart = {}, lin = {}; + list dependentVarsCref; + DAE.ComponentRef varCref; + BackendDAE.Var var; + String name; + case BackendDAE.GENERIC_JACOBIAN(jacobian = SOME((BackendDAE.DAE({syst}, shared),name,diffVars,residualVars,allDiffedVars,dependentVarsCref))) + algorithm + // Get non-linear variables without start value + for varCref in dependentVarsCref loop + for var in diffVars loop + if ComponentReference.crefEqual(varCref, var.varName) then + if (not BackendVariable.varHasStartValue(var)) then + nonLin := var::nonLin; + else + nonLinStart := var::nonLinStart; + end if; + end if; + end for; + end for; + if not listEmpty(nonLin) then + BackendDump.dumpVarList(nonLin, "Nonlinear iteration variables with default zero start attribute in " + name + "."); + end if; + if not listEmpty(nonLinStart) then + BackendDump.dumpVarList(nonLinStart, "Nonlinear iteration variables with predefined start attribute in " + name + "."); end if; - end if; - end for; - end for; - if not listEmpty(nonLin) then - BackendDump.dumpVarList(nonLin, "Nonlinear iteration variables with default zero start attribute in " + name + "."); - end if; - if not listEmpty(nonLinStart) then - BackendDump.dumpVarList(nonLinStart, "Nonlinear iteration variables with predefined start attribute in " + name + "."); - end if; - // Get linear variables with start value, but ignore discrete vars - for var in allDiffedVars loop - if (BackendVariable.varHasStartValue(var) and not BackendVariable.isVarDiscrete(var) ) then - lin := var::lin; - end if; - end for; - if not listEmpty(lin) then - BackendDump.dumpVarList(lin, "Linear iteration variables with predefined start attributes that are unrelevant in " + name + "."); - end if; + // Get linear variables with start value, but ignore discrete vars + for var in allDiffedVars loop + if (BackendVariable.varHasStartValue(var) and not BackendVariable.isVarDiscrete(var) ) then + lin := var::lin; + end if; + end for; + if not listEmpty(lin) then + BackendDump.dumpVarList(lin, "Linear iteration variables with predefined start attributes that are unrelevant in " + name + "."); + end if; - if not (listEmpty(nonLin) and listEmpty(nonLinStart) and listEmpty(lin)) then - print("Info: Only non-linear iteration variables in non-linear eqation systems require start values. " + - "All other start values have no influence on convergence and are ignored. " + - "Use \"-d=dumpLoops\" to show all loops. In OMEdit Tools->Options->Simulation->OMCFlags, in "+ - "OMNotebook call setCommandLineOptions(\"-d=dumpLoops\")\n\n"); - end if; + if not (listEmpty(nonLin) and listEmpty(nonLinStart) and listEmpty(lin)) then + print("Info: Only non-linear iteration variables in non-linear eqation systems require start values. " + + "All other start values have no influence on convergence and are ignored. " + + "Use \"-d=dumpLoops\" to show all loops. In OMEdit Tools->Options->Simulation->OMCFlags, in "+ + "OMNotebook call setCommandLineOptions(\"-d=dumpLoops\")\n\n"); + end if; + then ""; + else ""; + end match; // ToDo // BackendDAE.FULL_JACOBIAN() end printNonLinIterVarsAndEqs; diff --git a/OMCompiler/Compiler/FrontEnd/ComponentReference.mo b/OMCompiler/Compiler/FrontEnd/ComponentReference.mo index 56348fd179d..dfb98a7a891 100644 --- a/OMCompiler/Compiler/FrontEnd/ComponentReference.mo +++ b/OMCompiler/Compiler/FrontEnd/ComponentReference.mo @@ -436,6 +436,16 @@ algorithm outString := stringDelimitList(toStringList(inComponentRef), if Flags.getConfigBool(Flags.MODELICA_OUTPUT) then "__" else "."); end crefStr; +public function crefListStr +"This function simply converts a list of ComponentReferences to a String." + input list crList; + output String outString = ""; +algorithm + for cr in crList loop + outString := outString + crefStr(cr) + "\n"; + end for; +end crefListStr; + public function crefModelicaStr "Same as crefStr, but uses _ instead of . " input DAE.ComponentRef inComponentRef; diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeInitialValues.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeInitialValues.mos index c87f0bfcc99..f6e571f7662 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeInitialValues.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeInitialValues.mos @@ -23,7 +23,6 @@ simulate(OverdeterminedInitialization.Fluid.DynamicPipeInitialValues); getErrorS // " // end SimulationResult; // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: Assuming fixed start value for the following 1 variables: // m_flow_initial:DISCRETE(unit = "kg/s" fixed = false ) type: Real // Warning: The initial conditions are over specified. The following 1 initial equations are redundant, so they are removed from the initialization sytem: diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitialization.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitialization.mos index 9b47eecd3ee..3815055b164 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitialization.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitialization.mos @@ -17,7 +17,6 @@ buildModel(OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitializ // "" // {"OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitialization","OverdeterminedInitialization.Fluid.DynamicPipeLumpedPressureInitialization_init.xml"} // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: Assuming fixed start value for the following 1 variables: // m_flow_initial:DISCRETE(unit = "kg/s" fixed = false ) type: Real // Warning: The initial conditions are over specified. The following 4 initial equations are redundant, so they are removed from the initialization sytem: diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStateInitial.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStateInitial.mos index 2294a2b995d..20f74819eec 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStateInitial.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStateInitial.mos @@ -18,7 +18,6 @@ buildModel(OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStat // {"OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStateInitial","OverdeterminedInitialization.Fluid.DynamicPipesSeriesLargeNSteadyStateInitial_init.xml"} // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. // Notification: The following initial equation is redundant and consistent due to simplifications in RemoveSimpleEquations and therefore removed from the initialization problem: der(pipe1.mediums[1].p) = 0.0 -> 0.0 = 0.0 -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: The initial conditions are over specified. The following 1 initial equations are redundant, so they are removed from the initialization sytem: // $DER.pipe1.mediums[50].p = 0.0. // " diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateInitial.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateInitial.mos index ff4e17768da..a459fec2f92 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateInitial.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateInitial.mos @@ -18,7 +18,6 @@ buildModel(OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateIniti // {"OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateInitial","OverdeterminedInitialization.Fluid.DynamicPipesSeriesSteadyStateInitial_init.xml"} // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. // Notification: The following initial equation is redundant and consistent due to simplifications in RemoveSimpleEquations and therefore removed from the initialization problem: der(pipe1.mediums[1].p) = 0.0 -> 0.0 = 0.0 -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: The initial conditions are over specified. The following 1 initial equations are redundant, so they are removed from the initialization sytem: // $DER.pipe1.mediums[5].p = 0.0. // " diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitial.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitial.mos index 46126f90c4f..39aad6ad910 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitial.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitial.mos @@ -18,7 +18,6 @@ buildModel(OverdeterminedInitialization.Fluid.TwoVolumesFullInitial); getErrorSt // {"OverdeterminedInitialization.Fluid.TwoVolumesFullInitial","OverdeterminedInitialization.Fluid.TwoVolumesFullInitial_init.xml"} // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. // Warning: It was not possible to determine if the initialization problem is consistent, because of not evaluable parameters/start values during compile time: V1.medium.p = V1.p_start (V2.p_start = V1.p_start) -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: The initial conditions are over specified. The following 1 initial equations are redundant, so they are removed from the initialization sytem: // V1.medium.p = V1.p_start. // " diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitialInconsistent.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitialInconsistent.mos index 009e29a758c..e1fc337aa04 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitialInconsistent.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullInitialInconsistent.mos @@ -26,7 +26,6 @@ simulate(OverdeterminedInitialization.Fluid.TwoVolumesFullInitialInconsistent); // end SimulationResult; // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. // Warning: It was not possible to determine if the initialization problem is consistent, because of not evaluable parameters/start values during compile time: V1.medium.p = V1.p_start (V2.p_start = V1.p_start) -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: The initial conditions are over specified. The following 1 initial equations are redundant, so they are removed from the initialization sytem: // V1.medium.p = V1.p_start. // Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. diff --git a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureAndTemperature.mos b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureAndTemperature.mos index 7224266fa80..5aac21d81cb 100644 --- a/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureAndTemperature.mos +++ b/testsuite/simulation/modelica/initialization/OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureAndTemperature.mos @@ -17,7 +17,6 @@ buildModel(OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureA // "" // {"OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureAndTemperature","OverdeterminedInitialization.Fluid.TwoVolumesFullSteadyStatePressureAndTemperature_init.xml"} // "Warning: The model contains alias variables with conflicting start and/or nominal values. It is recommended to resolve the conflicts, because otherwise the system could be hard to solve. To print the conflicting alias sets and the chosen candidates please use -d=aliasConflicts. -// [BackEnd/SymbolicJacobian.mo:0:0-0:0:writable] Error: Internal error function calculateJacobianComponent failed to check all non-linear iteration variables for start values. // Warning: The initial conditions are over specified. The following 1 initial equations are redundant, so they are removed from the initialization sytem: // $DER.V1.medium.p = 0.0. // "