From c5bc6e51935306d1e7263236e36a376575db5029 Mon Sep 17 00:00:00 2001 From: niklwors Date: Thu, 19 Jul 2018 08:55:06 +0200 Subject: [PATCH] Removed code generation for algebraic loop variables and added it to algebraic loop default solver implementation Belonging to [master]: - OpenModelica/OMCompiler#2577 --- Compiler/Template/CodegenCpp.tpl | 419 ++++++------------ Compiler/Template/CodegenFMUCpp.tpl | 4 +- .../AlgLoopSolverDefaultImplementation.cpp | 71 +++ .../cpp/Core/Solver/CMakeLists.txt | 2 +- .../LinearAlgLoopDefaultImplementation.cpp | 4 + .../NonLinearAlgLoopDefaultImplementation.cpp | 5 + .../AlgLoopSolverDefaultImplementation.h | 35 ++ .../Core/Solver/ILinearAlgLoopSolver.h | 4 +- .../Core/Solver/INonLinearAlgLoopSolver.h | 4 +- .../cpp/Include/Core/System/ILinearAlgLoop.h | 2 +- .../Include/Core/System/INonLinearAlgLoop.h | 2 +- .../LinearAlgLoopDefaultImplementation.h | 4 +- .../NonLinearAlgLoopDefaultImplementation.h | 3 +- .../cpp/Include/Solver/Broyden/Broyden.h | 11 +- .../cpp/Include/Solver/Dgesv/DgesvSolver.h | 11 +- .../cpp/Include/Solver/Hybrj/Hybrj.h | 11 +- .../cpp/Include/Solver/Kinsol/Kinsol.h | 14 +- .../Solver/LinearSolver/LinearSolver.h | 13 +- .../cpp/Include/Solver/Newton/Newton.h | 13 +- .../cpp/Include/Solver/Nox/Nox.h | 12 +- .../cpp/Include/Solver/UmfPack/UmfPack.h | 10 +- .../cpp/Solver/Broyden/Broyden.cpp | 50 ++- .../cpp/Solver/Broyden/CMakeLists.txt | 2 +- .../cpp/Solver/Dgesv/DgesvSolver.cpp | 42 +- .../cpp/Solver/Hybrj/CMakeLists.txt | 34 +- SimulationRuntime/cpp/Solver/Hybrj/Hybrj.cpp | 82 ++-- .../cpp/Solver/Kinsol/CMakeLists.txt | 2 +- .../cpp/Solver/Kinsol/Kinsol.cpp | 59 ++- .../cpp/Solver/LinearSolver/CMakeLists.txt | 2 +- .../cpp/Solver/LinearSolver/LinearSolver.cpp | 50 ++- .../cpp/Solver/Newton/CMakeLists.txt | 2 +- .../cpp/Solver/Newton/Newton.cpp | 45 +- .../cpp/Solver/Nox/CMakeLists.txt | 2 +- SimulationRuntime/cpp/Solver/Nox/Nox.cpp | 33 +- .../cpp/Solver/UmfPack/CMakeLists.txt | 2 +- .../cpp/Solver/UmfPack/UmfPack.cpp | 35 +- 36 files changed, 646 insertions(+), 450 deletions(-) create mode 100644 SimulationRuntime/cpp/Core/Solver/AlgLoopSolverDefaultImplementation.cpp create mode 100644 SimulationRuntime/cpp/Include/Core/Solver/AlgLoopSolverDefaultImplementation.h diff --git a/Compiler/Template/CodegenCpp.tpl b/Compiler/Template/CodegenCpp.tpl index 65bddedd4a..e82e289364 100644 --- a/Compiler/Template/CodegenCpp.tpl +++ b/Compiler/Template/CodegenCpp.tpl @@ -3605,7 +3605,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then if(_functions != NULL) delete _functions; - deleteAlgloopSolverVariables(); + } shared_ptr <%className%>::getAlgLoopSolverFactory() @@ -3613,9 +3613,6 @@ case SIMCODE(modelInfo = MODELINFO(__)) then return _algLoopSolverFactory; } - <%generateInitAlgloopsolverVariables(jacobianMatrixes, listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, className)%> - - <%generateDeleteAlgloopsolverVariables(jacobianMatrixes, listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, className)%> <%updateFunctionsCode%> @@ -3703,9 +3700,6 @@ match simCode //Number of residues _event_handling= shared_ptr(new EventHandling()); - initializeAlgloopSolverVariables(); //if we do not initialize it here, we get a segfault in the destructor if initialization of Solver or OMFactory has failed - - <%if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then let numOfEqs = SimCodeUtil.getMaxSimEqSystemIndex(simCode) << @@ -3776,6 +3770,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then , _system(system) , __z(z) , __zDot(zDot) + <% match eq case SES_LINEAR(lSystem = ls as LINEARSYSTEM(__)) then let size = listLength(ls.vars) @@ -3809,7 +3804,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then end match << <%inits%> - + _dimZeroFunc = <%zeroCrossLength(simCode)%>; <%initAlgloopVarAttributes(eq, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, context, stateDerVectorName, useFlatArrayNotation)%> >> %> @@ -3819,7 +3814,10 @@ case SIMCODE(modelInfo = MODELINFO(__)) then { } - + int <%modelname%>Algloop<%ls.index%>::getDimZeroFunc() const + { + return _dimZeroFunc; + } bool <%modelname%>Algloop<%ls.index%>::getFreeVariablesLock() { return _system->getFreeVariablesLock(); @@ -3861,10 +3859,11 @@ case SIMCODE(modelInfo = MODELINFO(__)) then , _conditions(conditions) , _discrete_events(discrete_events) , _functions(system->_functions) + { _useSparseFormat=false; <%initAlgloopDimension(eq,varDecls)%> - + _dimZeroFunc = <%zeroCrossLength(simCode)%>; <%initAlgloopVarAttributes(eq, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, context, stateDerVectorName, useFlatArrayNotation)%> } @@ -3873,6 +3872,11 @@ case SIMCODE(modelInfo = MODELINFO(__)) then } + int <%modelname%>Algloop<%nls.index%>::getDimZeroFunc() const + { + return _dimZeroFunc; + } + bool <%modelname%>Algloop<%nls.index%>::getUseSparseFormat() { return NonLinearAlgLoopDefaultImplementation::getUseSparseFormat(); @@ -5734,7 +5738,7 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th let initClockIntervals = clockIntervalsInit(simCode, &varDecls, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) let initAlgloopSolvers = initAlgloopsolvers(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))),simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace) - let initAlgloopvars = initAlgloopVars(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace) + let initialequations = functionInitialEquations(initialEquations,"initEquation",simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation, false, true, false) let boundparameterequations = functionInitialEquations(parameterEquations,"initParameterEquation",simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation, false, true, true) @@ -5756,10 +5760,6 @@ case SIMCODE(modelInfo = MODELINFO(__),makefileParams = MAKEFILE_PARAMS(__)) th <%generateAlgloopSystems(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)%> <%generateAlgloopSolvers(modelInfo,listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)%> - //initialize Algloop variables - initializeAlgloopSolverVariables(); - //init alg loop vars - <%initAlgloopvars%> <%lastIdentOfPath(modelInfo.name)%>WriteOutput::initialize(); <%lastIdentOfPath(modelInfo.name)%>Jacobian::initialize(); <%lastIdentOfPath(modelInfo.name)%>Jacobian::initializeColoredJacobianA(); @@ -6859,10 +6859,8 @@ match simCode case SIMCODE(modelInfo = MODELINFO(__)) then let friendclasses = generatefriendAlgloops(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace) -let algloopsolvers = generateAlgloopsolverVariables(modelInfo,listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace) -let jacalgloopsolver = (jacobianMatrixes |> JAC_MATRIX(columns=mat) hasindex index0 => - (mat |> JAC_COLUMN(columnEqns=eqs) => generateAlgloopsolverVariables(modelInfo,eqs,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="\n") - ;separator="") +let algloopsolvers = generateAlgloopsolverVariables(modelInfo,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace) + let algloopsystems = generateAlgloopsSystemVariables(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace ) let jacalgloopsystems = (jacobianMatrixes |> JAC_MATRIX(columns=mat) hasindex index0 => (mat |> JAC_COLUMN(columnEqns=eqs) => generateAlgloopsSystemVariables(eqs,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="\n") @@ -6880,12 +6878,7 @@ match modelInfo >> ;separator="\n") - let initDeleteAlgloopSolverVars = (List.partition(listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), 100) |> ls hasindex idx => - << - void initializeAlgloopSolverVariables_<%idx%>(); - void deleteAlgloopSolverVariables_<%idx%>(); - >> - ;separator="\n") + << <%if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then @@ -6911,11 +6904,6 @@ match modelInfo protected: //Methods: - void initializeAlgloopSolverVariables(); - void initializeJacAlgloopSolverVariables(); - void deleteAlgloopSolverVariables(); - void deleteJacAlgloopSolverVariables(); - <%initDeleteAlgloopSolverVars%> <% /*match context case FMI_CONTEXT(__) then*/ << <%getstringvars%> @@ -6967,7 +6955,6 @@ match modelInfo shared_ptr _reader; shared_ptr _algLoopSolverFactory; ///< Factory that provides an appropriate solver <%algloopsolvers%> - <%jacalgloopsolver%> <%algloopsystems%> <%jacalgloopsystems%> <% if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then @@ -7099,7 +7086,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then void setUseSparseFormat(bool value); float queryDensity(); - + virtual int getDimZeroFunc() const; private: AlgloopVarAttributes _vars[<%listLength(ls.vars)%>]; Functions* _functions; @@ -7134,7 +7121,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then bool getUseSparseFormat(); void setUseSparseFormat(bool value); float queryDensity(); - + virtual int getDimZeroFunc() const; private: AlgloopVarAttributes _vars[<%listLength(nls.crefs)%>]; Functions* _functions; @@ -9710,7 +9697,20 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode bool restart<%ls.index%> = true; unsigned int iterations<%ls.index%> = 0; - _algLoop<%ls.index%>->getReal(_algloop<%ls.index%>Vars); + <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) + then + 'double* algloop<%ls.index%>Vars = _algLoopLinearSolver<%ls.index%>->getVariableWorkArray(); + bool* conditions0<%ls.index%> = _algLoopLinearSolver<%ls.index%>->getConditionsWorkArray(); + bool* conditions1<%ls.index%> = _algLoopLinearSolver<%ls.index%>->getConditions2WorkArray();' + else + 'double* algloop<%ls.index%>Vars = _algLoopLinearSolver->getVariableWorkArray(); + bool* conditions0<%ls.index%> = _algLoopLinearSolver->getConditionsWorkArray(); + bool* conditions1<%ls.index%> = _algLoopLinearSolver->getConditions2WorkArray();' + %> + + + + _algLoop<%ls.index%>->getReal(algloop<%ls.index%>Vars); bool restatDiscrete<%ls.index%> = false; try { @@ -9719,7 +9719,7 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode { while(restart<%ls.index%> && !(iterations<%ls.index%>++>500)) { - getConditions(_conditions0<%ls.index%>); + getConditions(conditions0<%ls.index%>); _callType = IContinuous::CONTINUOUS; <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) @@ -9732,8 +9732,8 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode { getCondition(i); } - getConditions(_conditions1<%ls.index%>); - restart<%ls.index%> = !std::equal (_conditions1<%ls.index%>, _conditions1<%ls.index%>+_dimZeroFunc,_conditions0<%ls.index%>); + getConditions(conditions1<%ls.index%>); + restart<%ls.index%> = !std::equal (conditions1<%ls.index%>, conditions1<%ls.index%>+_dimZeroFunc,conditions0<%ls.index%>); } } else @@ -9754,7 +9754,7 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode { //workaround: try to solve algoop discrete (evaluate all zero crossing conditions) since we do not have the information which zercrossing contains a algloop var IContinuous::UPDATETYPE calltype = _callType; _callType = IContinuous::DISCRETE; - _algLoop<%ls.index%>->setReal(_algloop<%ls.index%>Vars ); + _algLoop<%ls.index%>->setReal(algloop<%ls.index%>Vars ); <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) then '_algLoopLinearSolver<%ls.index%>->solve();' else @@ -9808,7 +9808,17 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode bool restart<%nls.index%> = true; unsigned int iterations<%nls.index%> = 0; - _algLoop<%nls.index%>->getReal(_algloop<%nls.index%>Vars); + <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) + then + 'double* algloop<%nls.index%>Vars = _algLoopLinearSolver<%nls.index%>->getVariableWorkArray(); + bool* conditions0<%nls.index%> = _algLoopLinearSolver<%nls.index%>->getConditionsWorkArray(); + bool* conditions1<%nls.index%> = _algLoopLinearSolver<%nls.index%>->getConditions2WorkArray();' + else + 'double* algloop<%nls.index%>Vars = _algLoopLinearSolver->getVariableWorkArray(); + bool* conditions0<%nls.index%> = _algLoopLinearSolver->getConditionsWorkArray(); + bool* conditions1<%nls.index%> = _algLoopLinearSolver->getConditions2WorkArray();' + %> + _algLoop<%nls.index%>->getReal(algloop<%nls.index%>Vars); bool restatDiscrete<%nls.index%> = false; try { @@ -9817,7 +9827,7 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode { while(restart<%nls.index%> && !(iterations<%nls.index%>++>500)) { - getConditions(_conditions0<%nls.index%>); + getConditions(conditions0<%nls.index%>); _callType = IContinuous::CONTINUOUS; <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) @@ -9831,7 +9841,7 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode { getCondition(i); } - getConditions(_conditions1<%nls.index%>); + getConditions(conditions1<%nls.index%>); restart<%nls.index%> = !std::equal (_conditions1<%nls.index%>, _conditions1<%nls.index%>+_dimZeroFunc,_conditions0<%nls.index%>); } } @@ -9853,7 +9863,7 @@ template equationString(SimEqSystem eq, Context context, Text &varDecls, SimCode { //workaround: try to solve algoop discrete (evaluate all zero crossing conditions) since we do not have the information which zercrossing contains a algloop var IContinuous::UPDATETYPE calltype = _callType; _callType = IContinuous::DISCRETE; - _algLoop<%nls.index%>->setReal(_algloop<%nls.index%>Vars ); + _algLoop<%nls.index%>->setReal(algloop<%nls.index%>Vars ); <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) then '_algLoopNonLinearSolver<%nls.index%>->solve();' else @@ -10466,16 +10476,60 @@ let jacAlgloopsolver = (jacobianMatrixes |> (mat, _, _, _, _, _, _) hasindex ind */ -template generateAlgloopsolverVariables(ModelInfo modelInfo,list allEquationsPlusWhen,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) +template generateAlgloopsolverVariables( ModelInfo modelInfo,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) +::= + match (boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER)))) + case true then + generateAlgloopsolverVariables2(simCode , extraFuncs, extraFuncsDecl, extraFuncsNamespace) + case false then + match modelInfo + case MODELINFO(linearSystems=ls,nonLinearSystems=nls) + then + let linearSolver = match(listLength(ls)) + case 0 + then "" + else "shared_ptr _algLoopLinearSolver; ///< Solver for linear algebraic loop */" + end match + let nonlinearSolver = match(listLength(nls)) + case 0 + then "" + else "shared_ptr _algLoopNonLinearSolver; ///< Solver for nonlinear algebraic loop */" + end match + << + <%linearSolver%> + <%nonlinearSolver%> + >> + end match + +end generateAlgloopsolverVariables; + +template generateAlgloopsolverVariables2( SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) +::= + match simCode + case SIMCODE(__) then + let algloopsolvers = generateAlgloopsolverVariables3(modelInfo,listAppend(listAppend(allEquations, initialEquations), getClockedEquations(getSubPartitions(clockedPartitions))), simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace) + let jacalgloopsolver = (jacobianMatrixes |> JAC_MATRIX(columns=mat) hasindex index0 => + (mat |> JAC_COLUMN(columnEqns=eqs) => generateAlgloopsolverVariables3(modelInfo,eqs,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="\n") + ;separator="") + << + + <%algloopsolvers%> + <%jacalgloopsolver%> + + + >> +end generateAlgloopsolverVariables2; + +template generateAlgloopsolverVariables3(ModelInfo modelInfo,list allEquationsPlusWhen,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) ::= match (boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER)))) case true then let &varDecls = buffer "" /*BUFD*/ let algloopsolver = (allEquationsPlusWhen |> eqs => (eqs |> eq => - generateAlgloopsolverVariables2(eq, contextOther, &varDecls /*BUFC*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace);separator="\n") + generateAlgloopsolverVariables4(eq, contextOther, &varDecls /*BUFC*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace);separator="\n") ;separator="\n") << - /*algloop solvers for parallel code*/ + <%algloopsolver%> >> case false then @@ -10498,9 +10552,9 @@ template generateAlgloopsolverVariables(ModelInfo modelInfo,list al >> end match -end generateAlgloopsolverVariables; +end generateAlgloopsolverVariables3; -template generateAlgloopsolverVariables2(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) +template generateAlgloopsolverVariables4(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) "Generates algloopsolver variables for parallel code e.g for hpcom code generation" ::= match eq @@ -10527,7 +10581,7 @@ template generateAlgloopsolverVariables2(SimEqSystem eq, Context context, Text & end match else "" -end generateAlgloopsolverVariables2; +end generateAlgloopsolverVariables4; @@ -10563,9 +10617,7 @@ template generateAlgloopsSystemVariables2(SimEqSystem eq, Context context, Text << shared_ptr //Algloop which holds equation system _algLoop<%num%>; - bool* _conditions0<%num%>; - bool* _conditions1<%num%>; - double* _algloop<%num%>Vars; + >> end match case e as SES_NONLINEAR(nlSystem = nls as NONLINEARSYSTEM(__)) @@ -10577,9 +10629,7 @@ template generateAlgloopsSystemVariables2(SimEqSystem eq, Context context, Text shared_ptr //Algloop which holds equation system _algLoop<%num%>; - bool* _conditions0<%num%>; - bool* _conditions1<%num%>; - double* _algloop<%num%>Vars; + >> end match case e as SES_MIXED(cont = eq_sys) @@ -10591,165 +10641,15 @@ template generateAlgloopsSystemVariables2(SimEqSystem eq, Context context, Text "" end generateAlgloopsSystemVariables2; -template generateInitAlgloopsolverVariables(list jacobianMatrixes,list allEquationsPlusWhen,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text className) -::= - let &funcCalls = buffer "" /*BUFD*/ - let &jacFuncCalls = buffer "" /*BUFD*/ - let algloopsolverFuncs = (List.partition(allEquationsPlusWhen, 100) |> part hasindex i0 => - generateInitAlgloopsolverVariables1(part, i0, &funcCalls ,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, className);separator="\n") - let &varDecls = buffer "" /*BUFD*/ - let jacAlgloopsolverFuncs = (jacobianMatrixes |> JAC_MATRIX(columns=mat) => - ( mat |> JAC_COLUMN(columnEqns=eqs) => (eqs |> eq => generateInitAlgloopsolverVariables2(eq, contextOther, varDecls ,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) - ) ;separator="\n") - ;separator="") - << - <%algloopsolverFuncs%> - - void <%className%>::initializeAlgloopSolverVariables() - { - <%funcCalls%> - initializeJacAlgloopSolverVariables(); - } - - - void <%className%>::initializeJacAlgloopSolverVariables() - { - <%jacAlgloopsolverFuncs%> - } - >> -end generateInitAlgloopsolverVariables; - -//generateInitAlgloopsolverVariables2(eq, contextOther, varDecls ,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) -template generateInitAlgloopsolverVariables1(list allEquationsPlusWhen, Integer partIdx, Text &funcCalls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text className) -::= - let &varDecls = buffer "" /*BUFD*/ - - let algloopsolver = (allEquationsPlusWhen |> eqs => (eqs |> eq => - generateInitAlgloopsolverVariables2(eq, contextOther, &varDecls /*BUFC*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace);separator="\n") - ;separator="\n") - - let &funcCalls += 'initializeAlgloopSolverVariables_<%partIdx%>(); <%\n%>' - << - void <%className%>::initializeAlgloopSolverVariables_<%partIdx%>() - { - <%algloopsolver%> - } - - >> -end generateInitAlgloopsolverVariables1; -template generateInitAlgloopsolverVariables2(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) - "Generates an equation. - This template should not be used for a SES_RESIDUAL. - Residual equations are handled differently." -::= - match eq - case SES_LINEAR(lSystem = ls as LINEARSYSTEM(__)) - then - let num = ls.index - match simCode - case SIMCODE(modelInfo = MODELINFO(__)) then - << - _conditions0<%num%> = NULL; - _conditions1<%num%> = NULL; - _algloop<%num%>Vars = NULL; - >> - end match - case e as SES_NONLINEAR(nlSystem = nls as NONLINEARSYSTEM(__)) - then - let num = nls.index - match simCode - case SIMCODE(modelInfo = MODELINFO(__)) then - << - _conditions0<%num%> = NULL; - _conditions1<%num%> = NULL; - _algloop<%num%>Vars = NULL; - >> - end match - else "" -end generateInitAlgloopsolverVariables2; -template generateDeleteAlgloopsolverVariables(list jacobianMatrixes,list allEquationsPlusWhen,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text className) -::= - let &funcCalls = buffer "" /*BUFD*/ - let algloopsolverFuncs = (List.partition(allEquationsPlusWhen,100) |> part hasindex i0 => - generateDeleteAlgloopsolverVariables1(part, i0, &funcCalls, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, className);separator="\n") - let &varDecls = buffer "" /*BUFD*/ - let jacAlgloopsolverFuncs = (jacobianMatrixes |> JAC_MATRIX(columns=mat) => - ( mat |> JAC_COLUMN(columnEqns=eqs) => (eqs |> eq => generateDeleteAlgloopsolverVariables2(eq, contextOther, varDecls ,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) - ) ;separator="\n") - ;separator="") - << - <%algloopsolverFuncs%> - void <%className%>::deleteAlgloopSolverVariables() - { - <%funcCalls%> - deleteJacAlgloopSolverVariables(); - } - void <%className%>::deleteJacAlgloopSolverVariables() - { - <%jacAlgloopsolverFuncs%> - } - >> -end generateDeleteAlgloopsolverVariables; -template generateDeleteAlgloopsolverVariables1(list allEquationsPlusWhen, Integer partIdx, Text &funcCalls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text className) -::= - let &varDecls = buffer "" /*BUFD*/ - let algloopsolver = (allEquationsPlusWhen |> eqs => (eqs |> eq => - generateDeleteAlgloopsolverVariables2(eq, contextOther, &varDecls /*BUFC*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace);separator="\n") - ;separator="\n") - let &funcCalls += 'deleteAlgloopSolverVariables_<%partIdx%>(); <%\n%>' - << - void <%className%>::deleteAlgloopSolverVariables_<%partIdx%>() - { - <%algloopsolver%> - } - >> -end generateDeleteAlgloopsolverVariables1; -template generateDeleteAlgloopsolverVariables2(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) - "Generates an equation. - This template should not be used for a SES_RESIDUAL. - Residual equations are handled differently." -::= - match eq - case SES_LINEAR(lSystem = ls as LINEARSYSTEM(__)) - then - let num = ls.index - match simCode - case SIMCODE(modelInfo = MODELINFO(__)) then - << - if(_conditions0<%num%>) - delete [] _conditions0<%num%>; - if(_conditions1<%num%>) - delete [] _conditions1<%num%>; - if(_algloop<%num%>Vars) - delete [] _algloop<%num%>Vars; - >> - end match - case e as SES_NONLINEAR(nlSystem = nls as NONLINEARSYSTEM(__)) - then - let num = nls.index - match simCode - case SIMCODE(modelInfo = MODELINFO(__)) then - << - if(_conditions0<%num%>) - delete [] _conditions0<%num%>; - if(_conditions1<%num%>) - delete [] _conditions1<%num%>; - if(_algloop<%num%>Vars) - delete [] _algloop<%num%>Vars; - >> - end match - else - "" - end generateDeleteAlgloopsolverVariables2; @@ -10816,70 +10716,8 @@ template initAlgloopsolvers2(SimEqSystem eq, Context context, Text &varDecls, Si end initAlgloopsolvers2; -template initAlgloopVars(list allEquationsPlusWhen,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) -::= - let &varDecls = buffer "" /*BUFD*/ - let algloopsolver = (allEquationsPlusWhen |> eqs => (eqs |> eq => - initAlgloopVars2(eq, contextOther, &varDecls /*BUFC*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)) - ;separator="") - - << - <%algloopsolver%> - - >> -end initAlgloopVars; -template initAlgloopVars2(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) - "Generates an equation. - This template should not be used for a SES_RESIDUAL. - Residual equations are handled differently." -::= - match eq - case SES_LINEAR(lSystem = ls as LINEARSYSTEM(__)) - then - let num = ls.index - match simCode - case SIMCODE(modelInfo = MODELINFO(__)) then - << - if(_algloop<%ls.index%>Vars) - delete [] _algloop<%ls.index%>Vars; - if(_conditions0<%ls.index%>) - delete [] _conditions0<%ls.index%>; - if(_conditions1<%ls.index%>) - delete [] _conditions1<%ls.index%>; - unsigned int dim<%ls.index%> = _algLoop<%ls.index%>->getDimReal(); - _algloop<%ls.index%>Vars = new double[dim<%ls.index%>]; - _conditions0<%ls.index%> = new bool[_dimZeroFunc]; - _conditions1<%ls.index%> = new bool[_dimZeroFunc]; - >> - end match - case SES_NONLINEAR(nlSystem = nls as NONLINEARSYSTEM(__)) - then - let num = nls.index - match simCode - case SIMCODE(modelInfo = MODELINFO(__)) then - << - if(_algloop<%nls.index%>Vars) - delete [] _algloop<%nls.index%>Vars; - if(_conditions0<%nls.index%>) - delete [] _conditions0<%nls.index%>; - if(_conditions1<%nls.index%>) - delete [] _conditions1<%nls.index%>; - unsigned int dim<%nls.index%> = _algLoop<%nls.index%>->getDimReal(); - _algloop<%nls.index%>Vars = new double[dim<%nls.index%>]; - _conditions0<%nls.index%> = new bool[_dimZeroFunc]; - _conditions1<%nls.index%> = new bool[_dimZeroFunc]; - >> - end match - case e as SES_MIXED(cont = eq_sys) - then - << - <%initAlgloopsolvers2(eq_sys,context,varDecls,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)%> - >> - else - " " -end initAlgloopVars2; template algloopForwardDeclaration(list allEquations,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace) @@ -11527,7 +11365,17 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl << bool restart<%ls.index%> = true; unsigned int iterations<%ls.index%> = 0; - _algLoop<%ls.index%>->getReal(_algloop<%ls.index%>Vars ); + <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) + then + 'double* algloop<%ls.index%>Vars = _algLoopLinearSolver<%ls.index%>->getVariableWorkArray(); + bool* conditions0<%ls.index%> = _algLoopLinearSolver<%ls.index%>->getConditionsWorkArray(); + bool* conditions1<%ls.index%> = _algLoopLinearSolver<%ls.index%>->getConditions2WorkArray();' + else + 'double* algloop<%ls.index%>Vars = _algLoopLinearSolver->getVariableWorkArray(); + bool* conditions0<%ls.index%> = _algLoopLinearSolver->getConditionsWorkArray(); + bool* conditions1<%ls.index%> = _algLoopLinearSolver->getConditions2WorkArray();' + %> + _algLoop<%ls.index%>->getReal(algloop<%ls.index%>Vars ); bool restatDiscrete<%ls.index%>= false; IContinuous::UPDATETYPE calltype = _callType; try @@ -11537,7 +11385,7 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl _algLoop<%ls.index%>->evaluate(); while(restart<%ls.index%> && !(iterations<%ls.index%>++>500)) { - getConditions(_conditions0<%ls.index%>); + getConditions(conditions0<%ls.index%>); _callType = IContinuous::CONTINUOUS; <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) @@ -11552,8 +11400,8 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl getCondition(i); } - getConditions(_conditions1<%ls.index%>); - restart<%ls.index%> = !std::equal (_conditions1<%ls.index%>, _conditions1<%ls.index%>+_dimZeroFunc,_conditions0<%ls.index%>); + getConditions(conditions1<%ls.index%>); + restart<%ls.index%> = !std::equal (conditions1<%ls.index%>, conditions1<%ls.index%>+_dimZeroFunc,conditions0<%ls.index%>); } } else @@ -11575,7 +11423,7 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl try { //workaround: try to solve algoop discrete (evaluate all zero crossing conditions) since we do not have the information which zercrossing contains a algloop var _callType = IContinuous::DISCRETE; - _algLoop<%ls.index%>->setReal(_algloop<%ls.index%>Vars ); + _algLoop<%ls.index%>->setReal(algloop<%ls.index%>Vars ); <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) then '_algLoopLinearSolver<%ls.index%>->solve();' @@ -11627,7 +11475,17 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl << bool restart<%nls.index%> = true; unsigned int iterations<%nls.index%> = 0; - _algLoop<%nls.index%>->getReal(_algloop<%nls.index%>Vars ); + <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) + then + 'double* algloop<%nls.index%>Vars = _algLoopNonLinearSolver<%nls.index%>->getVariableWorkArray(); + bool* conditions0<%nls.index%> = _algLoopNonLinearSolver<%nls.index%>->getConditionsWorkArray(); + bool* conditions1<%nls.index%> = _algLoopNonLinearSolver<%nls.index%>->getConditions2WorkArray();' + else + 'double* algloop<%nls.index%>Vars = _algLoopNonLinearSolver->getVariableWorkArray(); + bool* conditions0<%nls.index%> = _algLoopNonLinearSolver->getConditionsWorkArray(); + bool* conditions1<%nls.index%> = _algLoopNonLinearSolver->getConditions2WorkArray();' + %> + _algLoop<%nls.index%>->getReal(algloop<%nls.index%>Vars ); bool restatDiscrete<%nls.index%>= false; IContinuous::UPDATETYPE calltype = _callType; try @@ -11637,7 +11495,7 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl _algLoop<%nls.index%>->evaluate(); while(restart<%nls.index%> && !(iterations<%nls.index%>++>500)) { - getConditions(_conditions0<%nls.index%>); + getConditions(conditions0<%nls.index%>); _callType = IContinuous::CONTINUOUS; <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) @@ -11652,8 +11510,8 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl getCondition(i); } - getConditions(_conditions1<%nls.index%>); - restart<%nls.index%> = !std::equal (_conditions1<%nls.index%>, _conditions1<%nls.index%>+_dimZeroFunc,_conditions0<%nls.index%>); + getConditions(conditions1<%nls.index%>); + restart<%nls.index%> = !std::equal (conditions1<%nls.index%>, conditions1<%nls.index%>+_dimZeroFunc,conditions0<%nls.index%>); } } else @@ -11675,13 +11533,13 @@ template equationLinearOrNonLinear(SimEqSystem eq, Context context,Text &varDecl try { //workaround: try to solve algoop discrete (evaluate all zero crossing conditions) since we do not have the information which zercrossing contains a algloop var _callType = IContinuous::DISCRETE; - _algLoop<%nls.index%>->setReal(_algloop<%nls.index%>Vars ); + _algLoop<%nls.index%>->setReal(algloop<%nls.index%>Vars ); <%if boolOr(Flags.isSet(HPCOM),boolNot(getConfigBool(SINGLE_INSTANCE_AGLSOLVER))) then '_algLoopNonLinearSolver<%nls.index%>->solve();' else - '_algLoopNonLinearSolver->solve(_algLoop<%nls.index%>);' + '_algLoopNonLinearSolver->solve(algLoop<%nls.index%>);' %> _callType = calltype; } @@ -13163,10 +13021,7 @@ template functionAnalyticJacobians(ModelInfo modelInfo,list Jaco (mat |> JAC_COLUMN(columnEqns=eqs) => generateAlgloopSolvers(modelInfo,eqs,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) ;separator="") ;separator="") - let jacalgloopinit =(JacobianMatrixes |> JAC_MATRIX(columns=mat) => - ( mat |> JAC_COLUMN(columnEqns=eqs) => (eqs |> eq => initAlgloopVars2(eq, contextOther, &varDecls /*BUFC*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace) - ) ;separator="\n") - ;separator="") + << @@ -13177,7 +13032,7 @@ void <%classname%>Jacobian::initialize() //create Algloopsolver for analytical Jacobians <%jacalgloopsystems%> <%jacalgloopsolvers%> - <%jacalgloopinit%> + } diff --git a/Compiler/Template/CodegenFMUCpp.tpl b/Compiler/Template/CodegenFMUCpp.tpl index f6411daa77..c824e8d9a2 100644 --- a/Compiler/Template/CodegenFMUCpp.tpl +++ b/Compiler/Template/CodegenFMUCpp.tpl @@ -707,7 +707,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula # /MD - link with MSVCRT.LIB # /link - [linker options and libraries] # /LIBPATH: - Directories where libs can be found - OMCPP_SOLVER_LIBS=OMCppNewton_static.lib OMCppDgesv_static.lib OMCppDgesvSolver_static.lib + OMCPP_SOLVER_LIBS=OMCppNewton_static.lib OMCppDgesv_static.lib OMCppDgesvSolver_static.lib -lOMCppSolver_static MODELICA_UTILITIES_LIB=OMCppModelicaUtilities_static.lib EXTRA_LIBS=<%dirExtra%> <%libsExtra%> LDFLAGS=/link /DLL /NOENTRY /LIBPATH:"<%makefileParams.omhome%>/lib/omc/cpp/msvc" /LIBPATH:"<%makefileParams.omhome%>/bin" OMCppSystem_static.lib OMCppMath_static.lib OMCppExtensionUtilities_static.lib OMCppFMU_static.lib $(OMCPP_SOLVER_LIBS) $(EXTRA_LIBS) $(MODELICA_UTILITIES_LIB) @@ -795,7 +795,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula CALCHELPERMAINFILE=OMCpp<%fileNamePrefix%>CalcHelperMain.cpp # CVode can be used for Co-Simulation FMUs, Kinsol is available to handle non linear equation systems - OMCPP_SOLVER_LIBS=-lOMCppNewton_static -lOMCppDgesvSolver_static + OMCPP_SOLVER_LIBS=-lOMCppNewton_static -lOMCppDgesvSolver_static -lOMCppSolver_static ifeq ($(USE_FMU_SUNDIALS),ON) $(eval OMCPP_SOLVER_LIBS=$(OMCPP_SOLVER_LIBS) -lOMCppKinsol_static $(SUNDIALS_LIBRARIES)) $(eval CFLAGS=-DENABLE_SUNDIALS_STATIC $(CFLAGS)) diff --git a/SimulationRuntime/cpp/Core/Solver/AlgLoopSolverDefaultImplementation.cpp b/SimulationRuntime/cpp/Core/Solver/AlgLoopSolverDefaultImplementation.cpp new file mode 100644 index 0000000000..35904fd3b6 --- /dev/null +++ b/SimulationRuntime/cpp/Core/Solver/AlgLoopSolverDefaultImplementation.cpp @@ -0,0 +1,71 @@ +/** @addtogroup coreSolver + * + * @{ + */ +#include +#include +#include +#include + + +AlgLoopSolverDefaultImplementation::AlgLoopSolverDefaultImplementation() +:_dimZeroFunc(-1) +, _dimSys(-1) +,_algloopVars(NULL) +,_conditions0(NULL) +,_conditions1(NULL) +{ + +} + +AlgLoopSolverDefaultImplementation::~AlgLoopSolverDefaultImplementation() +{ + if(_algloopVars) + delete [] _algloopVars; + if(_conditions0) + delete [] _conditions0; + if(_conditions1) + delete [] _conditions1; +} +bool* AlgLoopSolverDefaultImplementation::getConditionsWorkArray() +{ + if(_conditions0) + return _conditions0; + else + ModelicaSimulationError(ALGLOOP_SOLVER, "algloop working arrays are not initialized"); + +} +bool* AlgLoopSolverDefaultImplementation::getConditions2WorkArray() +{ + if(_conditions1) + return _conditions1; + else + ModelicaSimulationError(ALGLOOP_SOLVER, "algloop working arrays are not initialized"); + } + + + double* AlgLoopSolverDefaultImplementation::getVariableWorkArray() + { + if(_algloopVars) + return _algloopVars; + else + ModelicaSimulationError(ALGLOOP_SOLVER, "algloop working arrays are not initialized"); + + } + +void AlgLoopSolverDefaultImplementation::initialize(int dimZeroFunc,int dimSys) +{ + _dimZeroFunc = dimZeroFunc; + if(_conditions0) + delete [] _conditions0; + if(_conditions1) + delete [] _conditions1; + _conditions0 = new bool[_dimZeroFunc]; + _conditions1 = new bool[_dimZeroFunc]; + _dimSys=dimSys; + if(_algloopVars) + delete [] _algloopVars; + _algloopVars = new double[_dimSys]; + memset(_algloopVars, 0, _dimSys*sizeof(double)); +} + /** @} */ // end of coreSolver diff --git a/SimulationRuntime/cpp/Core/Solver/CMakeLists.txt b/SimulationRuntime/cpp/Core/Solver/CMakeLists.txt index 8d0fc9a6f6..6d94277ffb 100644 --- a/SimulationRuntime/cpp/Core/Solver/CMakeLists.txt +++ b/SimulationRuntime/cpp/Core/Solver/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8.9) project(${SolverName}) -add_library(${SolverName} SolverDefaultImplementation.cpp SolverSettings.cpp SystemStateSelection.cpp FactoryExport.cpp SimulationMonitor.cpp) +add_library(${SolverName} SolverDefaultImplementation.cpp AlgLoopSolverDefaultImplementation.cpp SolverSettings.cpp SystemStateSelection.cpp FactoryExport.cpp SimulationMonitor.cpp) if(NOT BUILD_SHARED_LIBS) set_target_properties(${SolverName} PROPERTIES COMPILE_DEFINITIONS "RUNTIME_STATIC_LINKING;ENABLE_SUNDIALS_STATIC") diff --git a/SimulationRuntime/cpp/Core/System/LinearAlgLoopDefaultImplementation.cpp b/SimulationRuntime/cpp/Core/System/LinearAlgLoopDefaultImplementation.cpp index d84e6abbea..d40b7c5dde 100644 --- a/SimulationRuntime/cpp/Core/System/LinearAlgLoopDefaultImplementation.cpp +++ b/SimulationRuntime/cpp/Core/System/LinearAlgLoopDefaultImplementation.cpp @@ -32,6 +32,10 @@ int LinearAlgLoopDefaultImplementation::getDimReal() const return _dimAEq; } +int LinearAlgLoopDefaultImplementation::getDimZeroFunc() const +{ + return _dimZeroFunc; +} /// (Re-) initialize the system of equations void LinearAlgLoopDefaultImplementation::initialize() { diff --git a/SimulationRuntime/cpp/Core/System/NonLinearAlgLoopDefaultImplementation.cpp b/SimulationRuntime/cpp/Core/System/NonLinearAlgLoopDefaultImplementation.cpp index 6da5bf8275..6d7b78e5b0 100644 --- a/SimulationRuntime/cpp/Core/System/NonLinearAlgLoopDefaultImplementation.cpp +++ b/SimulationRuntime/cpp/Core/System/NonLinearAlgLoopDefaultImplementation.cpp @@ -36,6 +36,11 @@ int NonLinearAlgLoopDefaultImplementation::getDimReal() const return _dimAEq; } +int NonLinearAlgLoopDefaultImplementation::getDimZeroFunc() const +{ + return _dimZeroFunc; +} + /// (Re-) initialize the system of equations void NonLinearAlgLoopDefaultImplementation::initialize() { diff --git a/SimulationRuntime/cpp/Include/Core/Solver/AlgLoopSolverDefaultImplementation.h b/SimulationRuntime/cpp/Include/Core/Solver/AlgLoopSolverDefaultImplementation.h new file mode 100644 index 0000000000..63b653dd2a --- /dev/null +++ b/SimulationRuntime/cpp/Include/Core/Solver/AlgLoopSolverDefaultImplementation.h @@ -0,0 +1,35 @@ +#pragma once +/** @addtogroup coreSolver + * + * @{ + */ + + +/***************************************************************************** +Copyright (c) 2008, OSMC +*****************************************************************************/ + +class BOOST_EXTENSION_SOLVER_DECL AlgLoopSolverDefaultImplementation +{ + public: + AlgLoopSolverDefaultImplementation(); + ~AlgLoopSolverDefaultImplementation(); + /// (Re-) initialize the solver + virtual void initialize(int dimZeroFunc,int dimSys); + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); +protected: + long int _dimZeroFunc; + long int _dimSys; ///< Number of unknowns (=dimension of system of equations) + long int _max_dimSys; + long int _max_dimZeroFunc; + bool _single_instance; +private: + double* _algloopVars; + bool* _conditions0; + bool* _conditions1; + + +}; + /** @} */ // end of coreSolver diff --git a/SimulationRuntime/cpp/Include/Core/Solver/ILinearAlgLoopSolver.h b/SimulationRuntime/cpp/Include/Core/Solver/ILinearAlgLoopSolver.h index fa66bb0d41..630312bcb8 100644 --- a/SimulationRuntime/cpp/Include/Core/Solver/ILinearAlgLoopSolver.h +++ b/SimulationRuntime/cpp/Include/Core/Solver/ILinearAlgLoopSolver.h @@ -40,7 +40,9 @@ class ILinearAlgLoopSolver virtual void solve() = 0; //solve for a single instance call virtual void solve(shared_ptr algLoop,bool first_solve = false) = 0; - + virtual bool* getConditionsWorkArray()=0; + virtual bool* getConditions2WorkArray()=0; + virtual double* getVariableWorkArray()=0; /// Returns the status of iteration virtual ITERATIONSTATUS getIterationStatus() = 0; virtual void stepCompleted(double time) = 0; diff --git a/SimulationRuntime/cpp/Include/Core/Solver/INonLinearAlgLoopSolver.h b/SimulationRuntime/cpp/Include/Core/Solver/INonLinearAlgLoopSolver.h index 13077618e6..1651b75dec 100644 --- a/SimulationRuntime/cpp/Include/Core/Solver/INonLinearAlgLoopSolver.h +++ b/SimulationRuntime/cpp/Include/Core/Solver/INonLinearAlgLoopSolver.h @@ -40,7 +40,9 @@ class INonLinearAlgLoopSolver virtual void solve() = 0; //solve for a single instance call virtual void solve(shared_ptr algLoop,bool first_solve = false) = 0; - + virtual bool* getConditionsWorkArray()=0; + virtual bool* getConditions2WorkArray()=0; + virtual double* getVariableWorkArray()=0; /// Returns the status of iteration virtual ITERATIONSTATUS getIterationStatus() = 0; diff --git a/SimulationRuntime/cpp/Include/Core/System/ILinearAlgLoop.h b/SimulationRuntime/cpp/Include/Core/System/ILinearAlgLoop.h index 1dd9580319..10f620623e 100644 --- a/SimulationRuntime/cpp/Include/Core/System/ILinearAlgLoop.h +++ b/SimulationRuntime/cpp/Include/Core/System/ILinearAlgLoop.h @@ -29,7 +29,7 @@ class ILinearAlgLoop /// Provide number (dimension) of variables according to the data type virtual int getDimReal() const = 0; - + virtual int getDimZeroFunc() const =0; /// (Re-) initialize the system of equations virtual void initialize() = 0; diff --git a/SimulationRuntime/cpp/Include/Core/System/INonLinearAlgLoop.h b/SimulationRuntime/cpp/Include/Core/System/INonLinearAlgLoop.h index 04a060bda9..acfdea8720 100644 --- a/SimulationRuntime/cpp/Include/Core/System/INonLinearAlgLoop.h +++ b/SimulationRuntime/cpp/Include/Core/System/INonLinearAlgLoop.h @@ -35,7 +35,7 @@ class INonLinearAlgLoop /// Provide index of equation virtual int getEquationIndex() const = 0; - + virtual int getDimZeroFunc() const = 0;; /// Provide number (dimension) of variables according to the data type virtual int getDimReal() const = 0; diff --git a/SimulationRuntime/cpp/Include/Core/System/LinearAlgLoopDefaultImplementation.h b/SimulationRuntime/cpp/Include/Core/System/LinearAlgLoopDefaultImplementation.h index b1fbb903ba..913c3dee8c 100644 --- a/SimulationRuntime/cpp/Include/Core/System/LinearAlgLoopDefaultImplementation.h +++ b/SimulationRuntime/cpp/Include/Core/System/LinearAlgLoopDefaultImplementation.h @@ -27,7 +27,7 @@ class BOOST_EXTENSION_ALGLOOPDEFAULTIMPL_DECL LinearAlgLoopDefaultImplementation /// Provide number (dimension) of variables according to data type int getDimReal() const; - + virtual int getDimZeroFunc() const; /// (Re-) initialize the system of equations void initialize(); @@ -38,12 +38,14 @@ class BOOST_EXTENSION_ALGLOOPDEFAULTIMPL_DECL LinearAlgLoopDefaultImplementation void setUseSparseFormat(bool value); virtual void getRealStartValues(double* vars) const; + //void getSparseAdata(double* data, int nonzeros); // Member variables //--------------------------------------------------------------- protected: int _dimAEq; ///< Number (dimension) of unknown/equations (the index denotes the data type; 0: double, 1: int, 2: bool) + int _dimZeroFunc; double* _b; double* _x0; diff --git a/SimulationRuntime/cpp/Include/Core/System/NonLinearAlgLoopDefaultImplementation.h b/SimulationRuntime/cpp/Include/Core/System/NonLinearAlgLoopDefaultImplementation.h index 5dc9de5b87..997bdd6b4a 100644 --- a/SimulationRuntime/cpp/Include/Core/System/NonLinearAlgLoopDefaultImplementation.h +++ b/SimulationRuntime/cpp/Include/Core/System/NonLinearAlgLoopDefaultImplementation.h @@ -59,7 +59,7 @@ class BOOST_EXTENSION_ALGLOOPDEFAULTIMPL_DECL NonLinearAlgLoopDefaultImplementat /// Provide number (dimension) of variables according to data type int getDimReal() const; - + virtual int getDimZeroFunc() const; /// (Re-) initialize the system of equations void initialize(); @@ -77,6 +77,7 @@ class BOOST_EXTENSION_ALGLOOPDEFAULTIMPL_DECL NonLinearAlgLoopDefaultImplementat //--------------------------------------------------------------- protected: int _dimAEq; ///< Number (dimension) of unknown/equations (the index denotes the data type; 0: double, 1: int, 2: bool) + int _dimZeroFunc; double* _res; double* _x0; diff --git a/SimulationRuntime/cpp/Include/Solver/Broyden/Broyden.h b/SimulationRuntime/cpp/Include/Solver/Broyden/Broyden.h index 76d8a5dcad..a16211ffec 100644 --- a/SimulationRuntime/cpp/Include/Solver/Broyden/Broyden.h +++ b/SimulationRuntime/cpp/Include/Solver/Broyden/Broyden.h @@ -6,10 +6,9 @@ #pragma once #include "FactoryExport.h" - +#include #include - #include /*****************************************************************************/ @@ -42,7 +41,7 @@ where A is an n-by-n matrix and y and B are n-by-n(right hand side) matrices. /***************************************************************************** OSMS(c) 2008 *****************************************************************************/ -class Broyden : public INonLinearAlgLoopSolver +class Broyden : public INonLinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: @@ -65,6 +64,10 @@ class Broyden : public INonLinearAlgLoopSolver virtual void stepCompleted(double time); virtual void restoreOldValues(); virtual void restoreNewValues(); + + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); private: /// Encapsulation of determination of residuals to given unknowns void calcFunction(const double* y, double* residual); @@ -83,7 +86,7 @@ class Broyden : public INonLinearAlgLoopSolver _iterationStatus; ///< Output - Denotes the status of iteration long int - _dimSys, ///< Temp - Number of unknowns (=dimension of system of equations) + _lwork, _iONE; diff --git a/SimulationRuntime/cpp/Include/Solver/Dgesv/DgesvSolver.h b/SimulationRuntime/cpp/Include/Solver/Dgesv/DgesvSolver.h index 95a72a1562..3a447c5682 100644 --- a/SimulationRuntime/cpp/Include/Solver/Dgesv/DgesvSolver.h +++ b/SimulationRuntime/cpp/Include/Solver/Dgesv/DgesvSolver.h @@ -4,7 +4,11 @@ * @{ */ -class DgesvSolver : public ILinearAlgLoopSolver +#include "FactoryExport.h" +#include + + +class DgesvSolver : public ILinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: DgesvSolver(ILinSolverSettings* settings,shared_ptr algLoop=shared_ptr()); @@ -24,6 +28,9 @@ class DgesvSolver : public ILinearAlgLoopSolver virtual void restoreOldValues(); virtual void restoreNewValues(); + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); private: // Member variables //--------------------------------------------------------------- @@ -34,7 +41,7 @@ class DgesvSolver : public ILinearAlgLoopSolver _iterationStatus; ///< Output - Denotes the status of iteration long int - _dimSys, ///< Number of unknowns (=dimension of system of equations) + *_iHelp, ///< Pivot indices for LAPACK routines *_jHelp; ///< Pivot indices for LAPACK routines diff --git a/SimulationRuntime/cpp/Include/Solver/Hybrj/Hybrj.h b/SimulationRuntime/cpp/Include/Solver/Hybrj/Hybrj.h index 26070d7c3f..bfe36866e3 100644 --- a/SimulationRuntime/cpp/Include/Solver/Hybrj/Hybrj.h +++ b/SimulationRuntime/cpp/Include/Solver/Hybrj/Hybrj.h @@ -4,6 +4,8 @@ * @{ */ #include "FactoryExport.h" +#include + #include "HybrjSettings.h" #if defined(__MINGW32__) || defined(_MSC_VER) /* we have static libcminpack.a on MinGW and MSVC */ @@ -16,7 +18,7 @@ see documentation: http://www.math.utah.edu/software/minpack/minpack/hybrj.html */ -class Hybrj : public INonLinearAlgLoopSolver +class Hybrj : public INonLinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: @@ -40,6 +42,10 @@ class Hybrj : public INonLinearAlgLoopSolver virtual void restoreOldValues(); virtual void restoreNewValues(); + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); + private: /// Encapsulation of determination of residuals to given unknowns void calcFunction(const double* y, double* residual); @@ -59,8 +65,7 @@ class Hybrj : public INonLinearAlgLoopSolver ITERATIONSTATUS _iterationStatus; ///< Output - Denotes the status of iteration - int - _dimSys; ///< Temp - Number of unknowns (=dimension of system of equations) + bool _firstCall; ///< Temp - Denotes the first call to the solver, initialize() is called diff --git a/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h b/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h index 1f5f9db31e..82dc01f905 100644 --- a/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h +++ b/SimulationRuntime/cpp/Include/Solver/Kinsol/Kinsol.h @@ -4,7 +4,11 @@ * @{ */ -class Kinsol : public INonLinearAlgLoopSolver +#include "FactoryExport.h" +#include + + +class Kinsol : public INonLinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: Kinsol(INonLinSolverSettings* settings,shared_ptr algLoop=shared_ptr()); @@ -22,6 +26,11 @@ class Kinsol : public INonLinearAlgLoopSolver virtual void stepCompleted(double time); virtual void restoreOldValues(); virtual void restoreNewValues(); + + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); + int kin_f(N_Vector y, N_Vector fval, void *user_data); /*will be used with new sundials version @@ -48,8 +57,7 @@ class Kinsol : public INonLinearAlgLoopSolver ITERATIONSTATUS _iterationStatus; ///< Output - Denotes the status of iteration - long int - _dimSys; ///< Temp - Number of unknowns (=dimension of system of equations) + int _dim; bool _firstCall; ///< Temp - Denotes the first call to the solver, init() is called diff --git a/SimulationRuntime/cpp/Include/Solver/LinearSolver/LinearSolver.h b/SimulationRuntime/cpp/Include/Solver/LinearSolver/LinearSolver.h index 1062a3529e..811daffc76 100644 --- a/SimulationRuntime/cpp/Include/Solver/LinearSolver/LinearSolver.h +++ b/SimulationRuntime/cpp/Include/Solver/LinearSolver/LinearSolver.h @@ -3,12 +3,14 @@ * * @{ */ +#include "FactoryExport.h" +#include #if defined(klu) #include <../../../../build/include/omc/c/suitesparse/Include/klu.h> #endif -class LinearSolver : public ILinearAlgLoopSolver +class LinearSolver : public ILinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: LinearSolver(ILinSolverSettings* settings,shared_ptr algLoop=shared_ptr()); @@ -29,6 +31,10 @@ class LinearSolver : public ILinearAlgLoopSolver virtual void restoreNewValues(); + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); + private: // Member variables @@ -40,8 +46,7 @@ class LinearSolver : public ILinearAlgLoopSolver ITERATIONSTATUS _iterationStatus; ///< Output - Denotes the status of iteration - long int - _dimSys; ///< Temp - Number of unknowns (=dimension of system of equations) + bool _firstCall, ///< Temp - Denotes the first call to the solver, init() is called @@ -66,7 +71,7 @@ class LinearSolver : public ILinearAlgLoopSolver *_scale; //scaling parameter to prevent overflow in singular systems bool _sparse; bool _generateoutput; //prints nothing, if set to false. Prints Matrix, right hand side, and solution of the linear system, if set to true. - bool _single_instance; + #if defined(klu) klu_symbolic* _kluSymbolic; klu_numeric* _kluNumeric; diff --git a/SimulationRuntime/cpp/Include/Solver/Newton/Newton.h b/SimulationRuntime/cpp/Include/Solver/Newton/Newton.h index a339b845b9..9c10749303 100644 --- a/SimulationRuntime/cpp/Include/Solver/Newton/Newton.h +++ b/SimulationRuntime/cpp/Include/Solver/Newton/Newton.h @@ -10,6 +10,8 @@ #include // Export function from dll #include #include +#include "FactoryExport.h" +#include /*****************************************************************************/ @@ -32,7 +34,7 @@ /***************************************************************************** * Copyright (c) 1998-CurrentYear, Open Source Modelica Consortium (OSMC), *****************************************************************************/ -class Newton : public INonLinearAlgLoopSolver +class Newton : public INonLinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: Newton(INonLinSolverSettings* settings,shared_ptr algLoop=shared_ptr()); @@ -52,6 +54,12 @@ class Newton : public INonLinearAlgLoopSolver virtual void stepCompleted(double time); virtual void restoreOldValues(); virtual void restoreNewValues(); + + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); + + private: /// Encapsulation of determination of residuals to given unknowns void calcFunction(const double* y, double* residual); @@ -69,8 +77,7 @@ class Newton : public INonLinearAlgLoopSolver ITERATIONSTATUS _iterationStatus; ///< Output - Denotes the status of iteration - long int - _dimSys; ///< Temp - Number of unknowns (=dimension of system of equations) + bool _firstCall; ///< Temp - Denotes the first call to the solver, init() is called diff --git a/SimulationRuntime/cpp/Include/Solver/Nox/Nox.h b/SimulationRuntime/cpp/Include/Solver/Nox/Nox.h index b82965fc19..3f56092d85 100644 --- a/SimulationRuntime/cpp/Include/Solver/Nox/Nox.h +++ b/SimulationRuntime/cpp/Include/Solver/Nox/Nox.h @@ -3,12 +3,14 @@ * * @{ */ - +#include "FactoryExport.h" +#include #include -class Nox : public INonLinearAlgLoopSolver + +class Nox : public INonLinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: Nox(INonLinSolverSettings* settings,shared_ptr algLoop=shared_ptr()); @@ -28,6 +30,10 @@ class Nox : public INonLinearAlgLoopSolver virtual void restoreOldValues(); virtual void restoreNewValues(); + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); + private: void getsolutionandevaluate(NOX::LAPACK::Group grp); @@ -63,7 +69,7 @@ class Nox : public INonLinearAlgLoopSolver ITERATIONSTATUS _iterationStatus; ///< Output - Denotes the status of iteration - const long int _dimSys; + double *_y, diff --git a/SimulationRuntime/cpp/Include/Solver/UmfPack/UmfPack.h b/SimulationRuntime/cpp/Include/Solver/UmfPack/UmfPack.h index 46d9dfbded..a4763526c7 100644 --- a/SimulationRuntime/cpp/Include/Solver/UmfPack/UmfPack.h +++ b/SimulationRuntime/cpp/Include/Solver/UmfPack/UmfPack.h @@ -1,5 +1,6 @@ #pragma once - +#include "FactoryExport.h" +#include #include // Interface to AlgLoo #include // Interface to AlgLoo #include // Export function from dll @@ -7,7 +8,7 @@ #include -class UmfPack : public ILinearAlgLoopSolver +class UmfPack : public ILinearAlgLoopSolver, public AlgLoopSolverDefaultImplementation { public: UmfPack(ILinSolverSettings* settings,shared_ptr algLoop=shared_ptr()); @@ -26,6 +27,11 @@ class UmfPack : public ILinearAlgLoopSolver virtual void stepCompleted(double time); virtual void restoreOldValues(); virtual void restoreNewValues(); + + + virtual bool* getConditionsWorkArray(); + virtual bool* getConditions2WorkArray(); + virtual double* getVariableWorkArray(); private: ITERATIONSTATUS _iterationStatus; ILinSolverSettings *_umfpackSettings; diff --git a/SimulationRuntime/cpp/Solver/Broyden/Broyden.cpp b/SimulationRuntime/cpp/Solver/Broyden/Broyden.cpp index e243d7a984..550ac994eb 100644 --- a/SimulationRuntime/cpp/Solver/Broyden/Broyden.cpp +++ b/SimulationRuntime/cpp/Solver/Broyden/Broyden.cpp @@ -18,7 +18,8 @@ #include Broyden::Broyden(INonLinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) + :AlgLoopSolverDefaultImplementation() + , _algLoop (algLoop) , _BroydenSettings ((INonLinSolverSettings*)settings) , _y (NULL) , _yHelp (NULL) @@ -38,7 +39,7 @@ Broyden::Broyden(INonLinSolverSettings* settings,shared_ptr a , _work (NULL) , _identity (NULL) - , _dimSys (0) + , _firstCall (true) , _iterationStatus (CONTINUE) , _broydenMethod (2) @@ -51,6 +52,15 @@ Broyden::Broyden(INonLinSolverSettings* settings,shared_ptr a { _sparse = _algLoop->getUseSparseFormat(); + if (_algLoop) + { + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); + } + } Broyden::~Broyden() @@ -84,19 +94,9 @@ void Broyden::initialize() _algLoop->initialize(); else throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); + // Dimension of the system (number of variables) + _dimSys =_algLoop->getDimReal(); - - // Dimension of the system (number of variables) - int - dimDouble = _algLoop->getDimReal(), - - dimInt = 0, - dimBool = 0; - - // Check system dimension - if (dimDouble != _dimSys) - { - _dimSys = dimDouble; _lwork = 8*_dimSys; _fNormTol = 1e-6; _dim = _dimSys; @@ -169,7 +169,7 @@ void Broyden::initialize() { _iterationStatus = SOLVERERROR; } - } + long int @@ -195,6 +195,26 @@ void Broyden::solve(shared_ptr algLoop,bool first_solve) throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); } + +bool* Broyden::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* Broyden::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* Broyden::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + + } + void Broyden::solve( ) { diff --git a/SimulationRuntime/cpp/Solver/Broyden/CMakeLists.txt b/SimulationRuntime/cpp/Solver/Broyden/CMakeLists.txt index eaa573bd22..65b8c63328 100644 --- a/SimulationRuntime/cpp/Solver/Broyden/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/Broyden/CMakeLists.txt @@ -8,7 +8,7 @@ if(NOT BUILD_SHARED_LIBS) set_target_properties(${BroydenName} PROPERTIES COMPILE_DEFINITIONS "RUNTIME_STATIC_LINKING") endif(NOT BUILD_SHARED_LIBS) -target_link_libraries(${BroydenName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName}) +target_link_libraries(${BroydenName} ${SolverName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName}) add_precompiled_header(${BroydenName} Include/Core/Modelica.h) install(FILES $ DESTINATION ${LIBINSTALLEXT} OPTIONAL) diff --git a/SimulationRuntime/cpp/Solver/Dgesv/DgesvSolver.cpp b/SimulationRuntime/cpp/Solver/Dgesv/DgesvSolver.cpp index c831f91202..2343e46eab 100644 --- a/SimulationRuntime/cpp/Solver/Dgesv/DgesvSolver.cpp +++ b/SimulationRuntime/cpp/Solver/Dgesv/DgesvSolver.cpp @@ -16,8 +16,9 @@ #include DgesvSolver::DgesvSolver(ILinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) - , _dimSys (0) + :AlgLoopSolverDefaultImplementation() + , _algLoop (algLoop) + , _yNames (NULL) , _yNominal (NULL) , _y (NULL) @@ -35,6 +36,14 @@ DgesvSolver::DgesvSolver(ILinSolverSettings* settings,shared_ptr , _hasDgetc2Factors (false) , _fNominal (NULL) { + if (_algLoop) + { + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); + } } DgesvSolver::~DgesvSolver() @@ -62,12 +71,7 @@ void DgesvSolver::initialize() else throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); - int dimDouble = _algLoop->getDimReal(); - int ok = 0; - - if (dimDouble != _dimSys) { - _dimSys = dimDouble; - + int _dimSys = _algLoop->getDimReal(); if (_dimSys > 0) { // Initialization of vector of unknowns if (_yNames) delete [] _yNames; @@ -108,10 +112,10 @@ void DgesvSolver::initialize() memset(_A, 0, _dimSys*_dimSys*sizeof(double)); memset(_zeroVec, 0, _dimSys*sizeof(double)); } - else { + else { _iterationStatus = SOLVERERROR; } - } + LOGGER_WRITE_BEGIN("DgesvSolver: eq" + to_string(_algLoop->getEquationIndex()) + " initialized", LC_LS, LL_DEBUG); @@ -124,7 +128,24 @@ void DgesvSolver::solve(shared_ptr algLoop,bool first_solve) { throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); } +bool* DgesvSolver::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* DgesvSolver::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + double* DgesvSolver::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + + } void DgesvSolver::solve() { @@ -138,6 +159,7 @@ void DgesvSolver::solve() } _iterationStatus = CONTINUE; + LOGGER_WRITE_BEGIN("DgesvSolver: eq" + to_string(_algLoop->getEquationIndex()) + " at time " + to_string(_algLoop->getSimTime()) + ":", LC_LS, LL_DEBUG); diff --git a/SimulationRuntime/cpp/Solver/Hybrj/CMakeLists.txt b/SimulationRuntime/cpp/Solver/Hybrj/CMakeLists.txt index ce2219a2b0..a930bf241a 100644 --- a/SimulationRuntime/cpp/Solver/Hybrj/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/Hybrj/CMakeLists.txt @@ -1,17 +1,17 @@ -cmake_minimum_required(VERSION 2.8.9) - -project(${HybrjName}) - -add_library(${HybrjName} Hybrj.cpp HybrjSettings.cpp FactoryExport.cpp) - -if(NOT BUILD_SHARED_LIBS) - set_target_properties(${HybrjName} PROPERTIES COMPILE_DEFINITIONS "RUNTIME_STATIC_LINKING") -endif(NOT BUILD_SHARED_LIBS) - -add_precompiled_header(${HybrjName} Include/Core/Modelica.h) -target_link_libraries(${HybrjName} ${Boost_LIBRARIES}) -target_link_libraries(${HybrjName} ${LAPACK_LIBRARIES} ${CMINPACK_LIBRARY} ${ModelicaName}) - -message(STATUS ${CMINPACK_LIBRARY}) - -install (TARGETS ${HybrjName} DESTINATION ${LIBINSTALLEXT}) +cmake_minimum_required(VERSION 2.8.9) + +project(${HybrjName}) + +add_library(${HybrjName} Hybrj.cpp HybrjSettings.cpp FactoryExport.cpp) + +if(NOT BUILD_SHARED_LIBS) + set_target_properties(${HybrjName} PROPERTIES COMPILE_DEFINITIONS "RUNTIME_STATIC_LINKING") +endif(NOT BUILD_SHARED_LIBS) + +add_precompiled_header(${HybrjName} Include/Core/Modelica.h) +target_link_libraries(${HybrjName} ${Boost_LIBRARIES}) +target_link_libraries(${HybrjName} ${SolverName} ${LAPACK_LIBRARIES} ${CMINPACK_LIBRARY} ${ModelicaName}) + +message(STATUS ${CMINPACK_LIBRARY}) + +install (TARGETS ${HybrjName} DESTINATION ${LIBINSTALLEXT}) diff --git a/SimulationRuntime/cpp/Solver/Hybrj/Hybrj.cpp b/SimulationRuntime/cpp/Solver/Hybrj/Hybrj.cpp index 5e8c5248f7..18e70a5f5a 100644 --- a/SimulationRuntime/cpp/Solver/Hybrj/Hybrj.cpp +++ b/SimulationRuntime/cpp/Solver/Hybrj/Hybrj.cpp @@ -11,7 +11,8 @@ #include // std::max Hybrj::Hybrj(INonLinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) + :AlgLoopSolverDefaultImplementation() + , _algLoop (algLoop) , _newtonSettings ((INonLinSolverSettings*)settings) , _x (NULL) , _xHelp (NULL) @@ -26,7 +27,7 @@ Hybrj::Hybrj(INonLinSolverSettings* settings,shared_ptr algLo ,_wa2(NULL) ,_wa3(NULL) ,_wa4(NULL) - , _dimSys(0) + , _firstCall(true) , _iterationStatus(CONTINUE) ,_x0(NULL) @@ -40,6 +41,14 @@ Hybrj::Hybrj(INonLinSolverSettings* settings,shared_ptr algLo ,_usescale(false) { _data = ((void*)this); + if (_algLoop) + { + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); + } } Hybrj::~Hybrj() @@ -82,15 +91,7 @@ void Hybrj::initialize() throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); // Dimension of the system (number of variables) - int - dimDouble = _algLoop->getDimReal(), - dimInt = 0, - dimBool = 0; - - // Check system dimension - if (dimDouble != _dimSys) - { - _dimSys = dimDouble; + _dimSys = _algLoop->getDimReal(); if(_dimSys > 0) { @@ -162,11 +163,6 @@ void Hybrj::initialize() } - else - { - _iterationStatus = SOLVERERROR; - } - } } @@ -176,7 +172,24 @@ void Hybrj::solve(shared_ptr algLoop,bool first_solve) throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); } +bool* Hybrj::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* Hybrj::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* Hybrj::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + } void Hybrj::solve() { @@ -194,12 +207,13 @@ void Hybrj::solve() _iterationStatus = CONTINUE; bool isConsistent = true; double local_tol = 1e-12; + int dimSys = _dimSys; while(_iterationStatus == CONTINUE) { /* Scaling x vector */ if(_usescale) - std::transform (_x, _x+_dimSys, _x_scale,_x, std::divides()); - __minpack_func__(hybrj)((minpack_funcder_nn)fcn, &_dimSys, _x, _f, _jac, &_ldfjac, &_xtol, &_maxfev, _diag, + std::transform (_x, _x+dimSys, _x_scale,_x, std::divides()); + __minpack_func__(hybrj)((minpack_funcder_nn)fcn, &dimSys, _x, _f, _jac, &_ldfjac, &_xtol, &_maxfev, _diag, &_mode, &_factor, &_nprint, &info, &_nfev, &_njev, _r, &_lr, _qtf, _wa1, _wa2, _wa3, _wa4,_data); //check if the conditions of the system has changed @@ -211,10 +225,10 @@ void Hybrj::solve() } /* re-scaling x vector */ if(_usescale) - std::transform (_x, _x+_dimSys, _x_scale, _x, std::multiplies()); + std::transform (_x, _x+dimSys, _x_scale, _x, std::multiplies()); - _fnorm = __minpack_func__(enorm)(&_dimSys, _f); + _fnorm = __minpack_func__(enorm)(&dimSys, _f); /*solution was found*/ if(info==1 || (_fnorm <= local_tol)) _iterationStatus = DONE; @@ -232,7 +246,7 @@ void Hybrj::solve() else if((info==4 || info == 5) && iter<4) { _factor=_initial_factor; - for(int i = 0; i < _dimSys; i++) + for(int i = 0; i < dimSys; i++) _x[i] += _x_nom[i] * 0.1; iter++; // cout <<"iteration making no progress:\t vary solution point by 1%%"<< std::endl ; @@ -240,7 +254,7 @@ void Hybrj::solve() /* try old values as x-Scaling factors */ else if((info==4 || info == 5) && iter<5) { - for(int i = 0; i < _dimSys; i++) + for(int i = 0; i < dimSys; i++) _x_scale[i] = std::max(_x0[i], _x_nom[i]); iter++; //cout << "iteration making no progress:\t try without scaling at all."<< std::endl ; @@ -250,14 +264,14 @@ void Hybrj::solve() else if((info==4 || info == 5) && iter<6) { _usescale = false; - memcpy(_x_scale, _x_nom,_dimSys*(sizeof(double))); + memcpy(_x_scale, _x_nom,dimSys*(sizeof(double))); iter++; // cout << "iteration making no progress:\t try without scaling at all."<< std::endl ; } /*try with old values (instead of extrapolating )*/ else if((info==4 || info == 5) && iter_retry<1) { - memcpy(_x, _x0, _dimSys*(sizeof(double))); + memcpy(_x, _x0, dimSys*(sizeof(double))); iter=0; iter_retry++; // cout << "- iteration making no progress:\t use old values instead extrapolated."<< std::endl ; @@ -265,8 +279,8 @@ void Hybrj::solve() /* try to vary the initial values */ else if((info==4 || info == 5) && iter_retry<2) { - memcpy(_x, _x_ex, _dimSys*(sizeof(double))); - for(int i = 0; i < _dimSys; i++) + memcpy(_x, _x_ex, dimSys*(sizeof(double))); + for(int i = 0; i < dimSys; i++) { _x[i] *= 1.01; } @@ -278,8 +292,8 @@ void Hybrj::solve() /* try to vary the initial values */ else if((info==4 || info == 5) && iter_retry<3) { - memcpy(_x, _x_ex, _dimSys*(sizeof(double))); - for(int i = 0; i < _dimSys; i++) + memcpy(_x, _x_ex, dimSys*(sizeof(double))); + for(int i = 0; i < dimSys; i++) { _x[i] *= 0.99; } @@ -291,7 +305,7 @@ void Hybrj::solve() /* try to vary the initial values */ else if((info==4 || info == 5) && iter_retry<4) { - memcpy(_x, _x_nom, _dimSys*(sizeof(double))); + memcpy(_x, _x_nom, dimSys*(sizeof(double))); iter = 0; iter_retry++; // cout << "- iteration making no progress:\t try scaling factor as initial point."<< std::endl ; @@ -299,8 +313,8 @@ void Hybrj::solve() /* try own scaling factors */ else if((info==4 || info == 5) && iter_retry<5) { - memcpy(_x, _x_ex, _dimSys*(sizeof(double))); - for(int i = 0; i < _dimSys; i++) + memcpy(_x, _x_ex, dimSys*(sizeof(double))); + for(int i = 0; i < dimSys; i++) { _diag[i] = fabs(_x_scale[i]); if(_diag[i] <= 0) @@ -314,8 +328,8 @@ void Hybrj::solve() /* try without internal scaling */ else if((info==4 || info == 5) && iter_retry2<2) { - memcpy(_x, _x_ex, _dimSys*(sizeof(double))); - for(int i = 0; i < _dimSys; i++) + memcpy(_x, _x_ex, dimSys*(sizeof(double))); + for(int i = 0; i < dimSys; i++) { _diag[i] = 1.0; } @@ -329,7 +343,7 @@ void Hybrj::solve() /* try to reduce the tolerance a bit */ else if((info==4 || info == 5) && iter_retry2<6) { - memcpy(_x, _x_ex, _dimSys*(sizeof(double))); + memcpy(_x, _x_ex, dimSys*(sizeof(double))); _xtol*=10; _factor = _initial_factor; iter = 0; diff --git a/SimulationRuntime/cpp/Solver/Kinsol/CMakeLists.txt b/SimulationRuntime/cpp/Solver/Kinsol/CMakeLists.txt index 4bf68e589c..700262c936 100644 --- a/SimulationRuntime/cpp/Solver/Kinsol/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/Kinsol/CMakeLists.txt @@ -9,7 +9,7 @@ if(NOT BUILD_SHARED_LIBS) endif(NOT BUILD_SHARED_LIBS) add_precompiled_header(${KinsolName} Include/Core/Modelica.h) -target_link_libraries(${KinsolName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${SUNDIALS_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName} ) +target_link_libraries(${KinsolName} ${SolverName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${SUNDIALS_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName} ) install(FILES $ DESTINATION ${LIBINSTALLEXT} OPTIONAL) diff --git a/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp b/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp index c75c5fdea0..2c404ec5d0 100644 --- a/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp +++ b/SimulationRuntime/cpp/Solver/Kinsol/Kinsol.cpp @@ -107,7 +107,8 @@ int kin_DlsDenseJacFn(long int N, N_Vector u, N_Vector fu,DlsMat J, void *user_d */ Kinsol::Kinsol(INonLinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) + :AlgLoopSolverDefaultImplementation() + ,_algLoop (algLoop) , _kinsolSettings ((INonLinSolverSettings*)settings) , _y (NULL) , _y0 (NULL) @@ -119,7 +120,7 @@ Kinsol::Kinsol(INonLinSolverSettings* settings,shared_ptr alg , _jac (NULL) , _fHelp (NULL) , _yHelp (NULL) - , _dimSys (0) + , _fnorm (10.0) , _currentIterateNorm (100.0) , _firstCall (true) @@ -143,9 +144,21 @@ Kinsol::Kinsol(INonLinSolverSettings* settings,shared_ptr alg , _y_old(NULL) , _y_new(NULL) , _solverErrorNotificationGiven(false) + { + _max_dimSys = 100; + _max_dimZeroFunc=50; _data = ((void*)this); - + if (_algLoop) + { + _single_instance = false; + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + _single_instance = true; + AlgLoopSolverDefaultImplementation::initialize(_max_dimZeroFunc,_max_dimSys); + } } Kinsol::~Kinsol() @@ -200,28 +213,15 @@ Kinsol::~Kinsol() void Kinsol::initialize() { int idid; - + if(!_algLoop) + throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); if(_firstCall) _algLoop->initialize(); _firstCall = false; + _sparse = _algLoop->getUseSparseFormat(); + _dimSys =_algLoop->getDimReal(); - if(!_algLoop) - throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); - - _sparse = _algLoop->getUseSparseFormat(); - - // Dimension of the system (number of variables) - int - dimDouble = _algLoop->getDimReal(), - dimInt = 0, - dimBool = 0; - - - _dimSys = dimDouble; - - if(_dimSys > 0) - { // Initialization of vector of unknowns if(_y) delete [] _y; if(_y0) delete [] _y0; @@ -364,7 +364,6 @@ void Kinsol::initialize() _counter = 0; - } LOGGER_WRITE("Kinsol: initialized",LC_NLS,LL_DEBUG); } @@ -379,6 +378,24 @@ void Kinsol::solve(shared_ptr algLoop, bool first_solve) throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); solve(); } +bool* Kinsol::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* Kinsol::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* Kinsol::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + + } void Kinsol::solve() diff --git a/SimulationRuntime/cpp/Solver/LinearSolver/CMakeLists.txt b/SimulationRuntime/cpp/Solver/LinearSolver/CMakeLists.txt index e8c1d55441..ba852bed24 100644 --- a/SimulationRuntime/cpp/Solver/LinearSolver/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/LinearSolver/CMakeLists.txt @@ -9,7 +9,7 @@ if(NOT BUILD_SHARED_LIBS) endif(NOT BUILD_SHARED_LIBS) add_precompiled_header(${LinearSolverName} Include/Core/Modelica.h) -target_link_libraries(${LinearSolverName} ${KLU_LIBRARIES} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${SUNDIALS_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName}) +target_link_libraries(${LinearSolverName} ${SolverName} ${KLU_LIBRARIES} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${SUNDIALS_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName}) install(FILES $ DESTINATION ${LIBINSTALLEXT} OPTIONAL) diff --git a/SimulationRuntime/cpp/Solver/LinearSolver/LinearSolver.cpp b/SimulationRuntime/cpp/Solver/LinearSolver/LinearSolver.cpp index 4da9cd83b8..e003c772b3 100644 --- a/SimulationRuntime/cpp/Solver/LinearSolver/LinearSolver.cpp +++ b/SimulationRuntime/cpp/Solver/LinearSolver/LinearSolver.cpp @@ -14,8 +14,9 @@ #include LinearSolver::LinearSolver(ILinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) - , _dimSys (0) + :AlgLoopSolverDefaultImplementation() + , _algLoop (algLoop) + , _yNames (NULL) , _yNominal (NULL) @@ -45,11 +46,21 @@ LinearSolver::LinearSolver(ILinSolverSettings* settings,shared_ptrgetDimZeroFunc(),_algLoop->getDimReal()); + } else + { _single_instance = true; + AlgLoopSolverDefaultImplementation::initialize(_max_dimZeroFunc,_max_dimSys); + } + } LinearSolver::~LinearSolver() @@ -97,13 +108,8 @@ void LinearSolver::initialize() throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); _sparse = _algLoop->getUseSparseFormat(); - int dimDouble=_algLoop->getDimReal(); - int ok=0; - - if (dimDouble!=_dimSys) { - _dimSys=dimDouble; - - if (_dimSys>0) { + _dimSys =_algLoop->getDimReal(); + if (_dimSys>0) { // Initialization of vector of unknowns if (_yNames) delete [] _yNames; if (_yNominal) delete [] _yNominal; @@ -175,10 +181,7 @@ void LinearSolver::initialize() throw ModelicaSimulationError(ALGLOOP_SOLVER, "error during numerical factorization with Sparse Solver KLU"); } #endif - } - else { - _iterationStatus = SOLVERERROR; - } + } LOGGER_WRITE_BEGIN("LinearSolver: eq" + to_string(_algLoop->getEquationIndex()) + @@ -406,6 +409,27 @@ ILinearAlgLoopSolver::ITERATIONSTATUS LinearSolver::getIterationStatus() return _iterationStatus; } +bool* LinearSolver::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* LinearSolver::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* LinearSolver::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + + } + + + void LinearSolver::stepCompleted(double time) { memcpy(_y0, _y, _dimSys*sizeof(double)); diff --git a/SimulationRuntime/cpp/Solver/Newton/CMakeLists.txt b/SimulationRuntime/cpp/Solver/Newton/CMakeLists.txt index 3061e75f37..c73d8a0e0a 100644 --- a/SimulationRuntime/cpp/Solver/Newton/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/Newton/CMakeLists.txt @@ -8,7 +8,7 @@ if(NOT BUILD_SHARED_LIBS) set_target_properties(${NewtonName} PROPERTIES COMPILE_DEFINITIONS "RUNTIME_STATIC_LINKING") endif(NOT BUILD_SHARED_LIBS) -target_link_libraries(${NewtonName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName}) +target_link_libraries(${NewtonName} ${SolverName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${ModelicaName}) add_precompiled_header(${NewtonName} Include/Core/Modelica.h) install(FILES $ DESTINATION ${LIBINSTALLEXT} OPTIONAL) diff --git a/SimulationRuntime/cpp/Solver/Newton/Newton.cpp b/SimulationRuntime/cpp/Solver/Newton/Newton.cpp index a0b71aebf4..4db9a9f4f8 100644 --- a/SimulationRuntime/cpp/Solver/Newton/Newton.cpp +++ b/SimulationRuntime/cpp/Solver/Newton/Newton.cpp @@ -15,7 +15,8 @@ #include // definitializeion of constants like uround Newton::Newton(INonLinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) + :AlgLoopSolverDefaultImplementation() + ,_algLoop (algLoop) , _newtonSettings ((INonLinSolverSettings*)settings) , _yNames (NULL) , _yNominal (NULL) @@ -30,11 +31,18 @@ Newton::Newton(INonLinSolverSettings* settings,shared_ptr alg , _fTest (NULL) , _iHelp (NULL) , _jac (NULL) - , _dimSys (0) , _firstCall (true) , _iterationStatus (CONTINUE) , _lc (LC_NLS) { + if (_algLoop) + { + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); + } } Newton::~Newton() @@ -64,15 +72,8 @@ void Newton::initialize() else throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); - // Dimension of the system (number of variables) - int - dimDouble = _algLoop->getDimReal(), - dimInt = 0, - dimBool = 0; - // Check system dimension - if (dimDouble != _dimSys) { - _dimSys = dimDouble; + _dimSys = _algLoop->getDimReal(); if (_dimSys > 0) { // initialize of vectors of unknowns and residuals @@ -109,10 +110,9 @@ void Newton::initialize() _algLoop->getMinReal(_yMin); _algLoop->getMaxReal(_yMax); } - else { - _iterationStatus = SOLVERERROR; - } - } + + + LOGGER_WRITE_BEGIN("Newton: eq" + to_string(_algLoop->getEquationIndex()) + " initialized", _lc, LL_DEBUG); LOGGER_WRITE_VECTOR("yNames", _yNames, _dimSys, _lc, LL_DEBUG); @@ -363,7 +363,24 @@ void Newton::calcJacobian(double *jac, double *fNominal) //jac[idx] *= _yNominal[j] / fNominal[i]; jac[idx] /= fNominal[i]; } +bool* Newton::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* Newton::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* Newton::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + } void Newton::restoreOldValues() { } diff --git a/SimulationRuntime/cpp/Solver/Nox/CMakeLists.txt b/SimulationRuntime/cpp/Solver/Nox/CMakeLists.txt index aacfc0a92e..0b03320f0c 100644 --- a/SimulationRuntime/cpp/Solver/Nox/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/Nox/CMakeLists.txt @@ -9,7 +9,7 @@ if(NOT BUILD_SHARED_LIBS) endif(NOT BUILD_SHARED_LIBS) add_precompiled_header(${NoxName} Include/Core/Modelica.h) -target_link_libraries(${NoxName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${TRILINOS_LIBRARIES} ) #C:/OpenModelica/OMCompiler/SimulationRuntime/cpp/Solver/KLU/OMCppklu_static.lib +target_link_libraries(${NoxName} ${SolverName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${TRILINOS_LIBRARIES} ) #C:/OpenModelica/OMCompiler/SimulationRuntime/cpp/Solver/KLU/OMCppklu_static.lib #target_link_libraries(${NoxName} ${ExtensionUtilitiesName} ${Boost_LIBRARIES} ${SUNDIALS_LIBRARIES} ${LAPACK_LIBRARIES} ${kluName}) install(FILES $ DESTINATION ${LIBINSTALLEXT} OPTIONAL) diff --git a/SimulationRuntime/cpp/Solver/Nox/Nox.cpp b/SimulationRuntime/cpp/Solver/Nox/Nox.cpp index b4270608c0..711a4f317b 100644 --- a/SimulationRuntime/cpp/Solver/Nox/Nox.cpp +++ b/SimulationRuntime/cpp/Solver/Nox/Nox.cpp @@ -25,7 +25,8 @@ //!Constructor Nox::Nox(INonLinSolverSettings* settings,shared_ptr algLoop) - : _algLoop (algLoop) + :AlgLoopSolverDefaultImplementation() + , _algLoop (algLoop) , _noxSettings ((INonLinSolverSettings*)settings) , _iterationStatus (CONTINUE) , _y (NULL) @@ -37,11 +38,19 @@ Nox::Nox(INonLinSolverSettings* settings,shared_ptr algLoop) , _firstCall (true) , _useDomainScaling (false) , _currentIterate (NULL) - , _dimSys (_algLoop->getDimReal()) + , _lc(LC_NLS) , _SimTimeOld (0.0) , _SimTimeNew (0.0) { + if (_algLoop) + { + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); + } } @@ -70,7 +79,8 @@ void Nox::initialize() _algLoop->initialize(); else throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); - + _dimSys = _algLoop->getDimReal(); + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_dimSys); if(_y) delete [] _y; if(_y0) delete [] _y0; if(_y_old) delete [] _y_old; @@ -387,7 +397,24 @@ void Nox::stepCompleted(double time) _SimTimeNew = _algLoop->getSimTime(); } } +bool* Nox::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* Nox::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* Nox::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + } /** * \brief Restores all algloop variables for a output step * \return Return_Description diff --git a/SimulationRuntime/cpp/Solver/UmfPack/CMakeLists.txt b/SimulationRuntime/cpp/Solver/UmfPack/CMakeLists.txt index deee82f87b..1ddb75483f 100644 --- a/SimulationRuntime/cpp/Solver/UmfPack/CMakeLists.txt +++ b/SimulationRuntime/cpp/Solver/UmfPack/CMakeLists.txt @@ -8,7 +8,7 @@ if(NOT BUILD_SHARED_LIBS) set_target_properties(${UmfPackName} PROPERTIES COMPILE_DEFINITIONS "RUNTIME_STATIC_LINKING") endif(NOT BUILD_SHARED_LIBS) -target_link_libraries(${UmfPackName} ${MathName} ${SUITESPARSE_LIBRARIES} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${UMFPACK_LIB}) +target_link_libraries(${UmfPackName} ${SolverName} ${MathName} ${SUITESPARSE_LIBRARIES} ${Boost_LIBRARIES} ${LAPACK_LIBRARIES} ${UMFPACK_LIB}) install(FILES $ DESTINATION ${LIBINSTALLEXT} OPTIONAL) diff --git a/SimulationRuntime/cpp/Solver/UmfPack/UmfPack.cpp b/SimulationRuntime/cpp/Solver/UmfPack/UmfPack.cpp index 74b5572c5c..34d0783be7 100644 --- a/SimulationRuntime/cpp/Solver/UmfPack/UmfPack.cpp +++ b/SimulationRuntime/cpp/Solver/UmfPack/UmfPack.cpp @@ -12,7 +12,8 @@ namespace umf = boost::numeric::bindings::umfpack; #endif UmfPack::UmfPack(ILinSolverSettings* settings,shared_ptr algLoop) -: _iterationStatus(CONTINUE), + :AlgLoopSolverDefaultImplementation() + ,_iterationStatus(CONTINUE), _umfpackSettings(settings), _algLoop(algLoop), _rhs(NULL), @@ -20,6 +21,14 @@ UmfPack::UmfPack(ILinSolverSettings* settings,shared_ptr algLoop _firstuse(true), _jacd(NULL) { + if (_algLoop) + { + AlgLoopSolverDefaultImplementation::initialize(_algLoop->getDimZeroFunc(),_algLoop->getDimReal()); + } + else + { + throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported"); + } } UmfPack::~UmfPack() @@ -37,7 +46,9 @@ void UmfPack::initialize() _algLoop->initialize(); else throw ModelicaSimulationError(ALGLOOP_SOLVER, "algloop system is not initialized"); - if(_algLoop->queryDensity()<1. &&_umfpackSettings->getUseSparseFormat() ) + _dimSys = _algLoop->getDimReal(); + + if(_algLoop->queryDensity()<1. &&_umfpackSettings->getUseSparseFormat() ) { _algLoop->setUseSparseFormat(true); @@ -54,6 +65,26 @@ void UmfPack::initialize() #endif } + +bool* UmfPack::getConditionsWorkArray() +{ + return AlgLoopSolverDefaultImplementation::getConditionsWorkArray(); + +} +bool* UmfPack::getConditions2WorkArray() +{ + + return AlgLoopSolverDefaultImplementation::getConditions2WorkArray(); + } + + + double* UmfPack::getVariableWorkArray() + { + + return AlgLoopSolverDefaultImplementation::getVariableWorkArray(); + + } + void UmfPack::solve(shared_ptr algLoop,bool first_solve) { throw ModelicaSimulationError(ALGLOOP_SOLVER, "solve for single instance is not supported");