Skip to content

Commit

Permalink
added modelicastandardtables build in cpp runtime CMakeFiles
Browse files Browse the repository at this point in the history
changed cpp runtime executable  name  with Main suffix
added StateSelection class to cpp solver component
added stateselection methods of cpp system  in cpp template

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19446 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
niklwors committed Mar 5, 2014
1 parent 7650787 commit c2634e2
Show file tree
Hide file tree
Showing 31 changed files with 604 additions and 64 deletions.
352 changes: 324 additions & 28 deletions Compiler/Template/CodegenCpp.tpl

Large diffs are not rendered by default.

7 changes: 5 additions & 2 deletions Compiler/Template/CodegenFMUCpp.tpl
Expand Up @@ -74,6 +74,8 @@ case SIMCODE(modelInfo=modelInfo as MODELINFO(__)) then
let()= textFile(simulationJacobianCppFile(simCode),'OMCpp<%fileNamePrefix%>Jacobian.cpp')
let()= textFile(simulationWriteOutputHeaderFile(simCode),'OMCpp<%fileNamePrefix%>WriteOutput.h')
let()= textFile(simulationWriteOutputCppFile(simCode),'OMCpp<%fileNamePrefix%>WriteOutput.cpp')
let()= textFile(simulationStateSelectionCppFile(simCode), 'OMCpp<%fileNamePrefix%>StateSelection.cpp')
let()= textFile(simulationStateSelectionHeaderFile(simCode),'OMCpp<%fileNamePrefix%>StateSelection.h')
let()= textFile(fmudeffile(simCode), '<%name%>.def')
let()= textFile(fmuMakefile(target,simCode), '<%fileNamePrefix%>_FMU.makefile')
algloopfiles(listAppend(allEquations,initialEquations),simCode)
Expand Down Expand Up @@ -475,11 +477,12 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
WRITEOUTPUTFILE=OMCpp<%fileNamePrefix%>WriteOutput.cpp
MAINFILE=OMCpp<%lastIdentOfPath(modelInfo.name)%><% if acceptMetaModelicaGrammar() then ".conv"%>.cpp
MAINFILEFMU=OMCpp<%lastIdentOfPath(modelInfo.name)%>FMU.cpp
STATESELECTIONFILE=OMCpp<%fileNamePrefix%>StateSelection.cpp
MAINOBJ=$(MODELICA_SYSTEM_LIB)
GENERATEDFILES=$(MAINFILEFMU) $(MAINFILE) $(FUNCTIONFILE) <%algloopcppfilenames(allEquations,simCode)%>

$(MODELICA_SYSTEM_LIB)$(DLLEXT):
<%\t%>$(CXX) /Fe$(MODELICA_SYSTEM_LIB) $(MAINFILEFMU) $(MAINFILE) $(FUNCTIONFILE) $(INITFILE) $(FACTORYFILE) $(JACOBIANFILE) $(EXTENSIONFILE) $(WRITEOUTPUTFILE) <%algloopcppfilenames(allEquations,simCode)%> $(CFLAGS) $(LDFLAGS)
<%\t%>$(CXX) /Fe$(MODELICA_SYSTEM_LIB) $(MAINFILEFMU) $(MAINFILE) $(FUNCTIONFILE) $(INITFILE) $(FACTORYFILE) $(JACOBIANFILE) $(EXTENSIONFILE) $(STATESELECTIONFILE) $(WRITEOUTPUTFILE) <%algloopcppfilenames(allEquations,simCode)%> $(CFLAGS) $(LDFLAGS)
>>
end match
case "gcc" then
Expand Down Expand Up @@ -515,7 +518,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
SRC+= OMCpp<%fileNamePrefix%>WriteOutput.cpp
SRC+= OMCpp<%fileNamePrefix%>Jacobian.cpp
SRC+= <%algloopcppfilenames(listAppend(allEquations,initialEquations),simCode)%>

SRC+= OMCpp<%fileNamePrefix%>StateSelection.cpp
LIBS= -lOMCppSystem_static -lOMCppDataExchange_static -lOMCppOMCFactory
LIBS+= $(BOOST_SYSTEM_LIB) $(BOOST_FILESYSTEM_LIB) $(BOOST_SERIALIZATION_LIB)
LIBS+= $(LINUX_LIB_DL)
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/cpp/CMakeLists.txt
Expand Up @@ -61,6 +61,7 @@ SET(SystemName ${LIBPREFIX}System)
SET(OMCFactoryName ${LIBPREFIX}OMCFactory)
set(MathName ${LIBPREFIX}Math)
set(ModelicaExternalName ModelicaExternalC)
set(ModelicaTablesName ModelicaStandardTables)
set(SimulationSettings ${LIBPREFIX}SimulationSettings)
set(SimControllerName ${LIBPREFIX}SimController)
set(CVodeName ${LIBPREFIX}CVode)
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/cpp/Core/Math/Functions.cpp
Expand Up @@ -119,7 +119,7 @@ int pivot( double *A, int n_rows, int n_cols, int *rowInd, int *colInd )
/* get pivot (without abs, may have changed because of row/column interchange */
pivot = get_pivot_matrix_elt(A,row,row);
/* internal error, pivot element should never be zero if maxsearch succeeded */
if(pivot != 0)
if(pivot == 0)
throw std::invalid_argument("pivot element is zero ");

/* perform one step of Gaussian Elimination */
Expand Down
10 changes: 6 additions & 4 deletions SimulationRuntime/cpp/Core/Modelica/ModelicaSystem.cpp
Expand Up @@ -184,15 +184,17 @@ void Modelica::stepCompleted(double time)
throw std::runtime_error("checkConditions is not yet implemented");
}

void Modelica::getJacobianSparsityPattern(SparsityPattern pattern)
{
throw std::runtime_error("giveJacobianSparsityPattern is not yet implemented");
}


void Modelica::getJacobian(SparseMatrix& matrix)
{
throw std::runtime_error("giveJacobian is not yet implemented");
}
void Modelica::getStateSetJacobian(SparseMatrix& matrix)
{
throw std::runtime_error("giveStateJacobian is not yet implemented");
}


bool Modelica::isODE()
{
Expand Down
5 changes: 2 additions & 3 deletions SimulationRuntime/cpp/Core/Modelica/ModelicaSystem.h
Expand Up @@ -100,12 +100,11 @@ class Modelica: public IMixedSystem ,public IContinuous ,public IEvent ,public I



// Provide pattern for Jacobian
virtual void getJacobianSparsityPattern(SparsityPattern pattern) ;


// Provide Jacobian
virtual void getJacobian(SparseMatrix& matrix);

virtual void getStateSetJacobian(SparseMatrix& matrix);
// Provide number (dimension) of zero functions
virtual int getDimZeroFunc() ;

Expand Down
4 changes: 3 additions & 1 deletion SimulationRuntime/cpp/Core/ModelicaExternalC/CMakeLists.txt
Expand Up @@ -4,9 +4,11 @@ project(${ModelicaExternalName})
include_directories (${MODELICAEXTERNALCDIR})
include_directories (${USERTABDIR})
add_library(${ModelicaExternalName} ${MODELICAEXTERNALCDIR}/ModelicaStandardTables.c ${MODELICAEXTERNALCDIR}/ModelicaMatIO.c ${MODELICAEXTERNALCDIR}/ModelicaInternal.c ${MODELICAEXTERNALCDIR}/ModelicaStrings.c ${USERTABDIR}/usertab.c)
add_library(${ModelicaTablesName} ${MODELICAEXTERNALCDIR}/ModelicaStandardTables.c ${MODELICAEXTERNALCDIR}/ModelicaMatIO.c ${USERTABDIR}/usertab.c)
if (UNIX)
set_target_properties(${ModelicaUtilitiesName} PROPERTIES COMPILE_FLAGS -fPIC)
set_target_properties(${ModelicaTablesName} PROPERTIES COMPILE_FLAGS -fPIC)
endif(UNIX)
install (TARGETS ${ModelicaExternalName} DESTINATION lib/omc/${LIBINSTALLEXT})

install (TARGETS ${ModelicaTablesName} DESTINATION lib/omc/${LIBINSTALLEXT})
#lib/omc/cpp
19 changes: 16 additions & 3 deletions SimulationRuntime/cpp/Core/SimController/Initialization.cpp
Expand Up @@ -2,8 +2,9 @@
#include "Initialization.h"


Initialization::Initialization(boost::shared_ptr<ISystemInitialization> system_initialization)
Initialization::Initialization(boost::shared_ptr<ISystemInitialization> system_initialization,boost::shared_ptr<ISolver> solver )
:_system(system_initialization)
,_solver(solver)
{
}

Expand All @@ -13,7 +14,8 @@ Initialization::~Initialization(void)
}
void Initialization::initializeSystem()
{
boost::shared_ptr<IContinuous> continous_system = boost::dynamic_pointer_cast<IContinuous>(_system);

boost::shared_ptr<IContinuous> continous_system = boost::dynamic_pointer_cast<IContinuous>(_system);
boost::shared_ptr<IEvent> event_system =boost::dynamic_pointer_cast<IEvent>(_system);
boost::shared_ptr<IMixedSystem> mixed_system = boost::dynamic_pointer_cast<IMixedSystem>(_system);
int dim = event_system->getDimZeroFunc();
Expand All @@ -22,7 +24,9 @@ void Initialization::initializeSystem()

_system->setInitial(true);
//Initialization of continous equations and bounded parameters
_system->initialize();

_system->initialize();
_solver->stateSelection();
bool restart=true;
int iter=0;
bool cond_restart = true;
Expand All @@ -38,5 +42,14 @@ void Initialization::initializeSystem()

mixed_system->saveAll();
_system->setInitial(false);

if( _solver->stateSelection())
{
_system->initEquations();

/* report a warning about strange start values */
if(_solver->stateSelection())
cout << "Cannot initialize unique the dynamic state selection. " << std::endl;
}

}
4 changes: 2 additions & 2 deletions SimulationRuntime/cpp/Core/SimController/Initialization.h
Expand Up @@ -3,12 +3,12 @@
class Initialization
{
public:
Initialization(boost::shared_ptr<ISystemInitialization> system_initialization);
Initialization(boost::shared_ptr<ISystemInitialization> system_initialization,boost::shared_ptr<ISolver> );
~Initialization(void);
void initializeSystem(/*double start_time, double end_time*/);
private:

boost::shared_ptr<ISystemInitialization> _system;

boost::shared_ptr<ISolver> _solver;
};

2 changes: 1 addition & 1 deletion SimulationRuntime/cpp/Core/SimController/SimManager.cpp
Expand Up @@ -11,7 +11,7 @@ SimManager::SimManager(boost::shared_ptr<IMixedSystem> system,Configuration* con

_solver = _config->createSelectedSolver(system.get());

_initialization = new Initialization(boost::dynamic_pointer_cast<ISystemInitialization>(_mixed_system));
_initialization = new Initialization(boost::dynamic_pointer_cast<ISystemInitialization>(_mixed_system),_solver);

}
SimManager::~SimManager()
Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/cpp/Core/Solver/CMakeLists.txt
Expand Up @@ -2,8 +2,8 @@ cmake_minimum_required (VERSION 2.6)

project(${SolverName})
# add the solver default implementation library
add_library(${SolverName} SHARED SolverDefaultImplementation.cpp SolverSettings.cpp FactoryExport.cpp )
target_link_libraries (${SolverName} ${Boost_LIBRARIES} )
add_library(${SolverName} SHARED SolverDefaultImplementation.cpp SolverSettings.cpp SystemStateSelection.cpp FactoryExport.cpp )
target_link_libraries (${SolverName} ${MathName} ${Boost_LIBRARIES} )
install (TARGETS ${SolverName} DESTINATION lib/omc/${LIBINSTALLEXT})
install (FILES
${CMAKE_SOURCE_DIR}/Include/Core/Solver/IAlgLoopSolver.h
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/cpp/Core/Solver/FactoryExport.h
Expand Up @@ -9,6 +9,7 @@
#elif defined(OMC_BUILD) || defined(SIMSTER_BUILD)

#define BOOST_EXTENSION_SOLVER_DECL BOOST_EXTENSION_EXPORT_DECL
#define BOOST_EXTENSION_STATESELECT_DECL BOOST_EXTENSION_EXPORT_DECL
#define BOOST_EXTENSION_SOLVERSETTINGS_DECL BOOST_EXTENSION_EXPORT_DECL

#else
Expand Down
Expand Up @@ -39,7 +39,7 @@ SolverDefaultImplementation::SolverDefaultImplementation(IMixedSystem* system, I
, _outputCommand (IWriteOutput::WRITEOUT)

{

_state_selection = boost::shared_ptr<SystemStateSelection>(new SystemStateSelection(system));
}
SolverDefaultImplementation::~SolverDefaultImplementation()
{
Expand Down Expand Up @@ -75,6 +75,11 @@ SolverDefaultImplementation::~SolverDefaultImplementation()
{
return _solverStatus;
};

bool SolverDefaultImplementation::stateSelection()
{
return _state_selection->stateSelection(1);
}
void SolverDefaultImplementation::initialize()
{
IContinuous* continous_system = dynamic_cast<IContinuous*>(_system);
Expand Down
150 changes: 150 additions & 0 deletions SimulationRuntime/cpp/Core/Solver/SystemStateSelection.cpp
@@ -0,0 +1,150 @@

#include "stdafx.h"
#include "FactoryExport.h"
#include <Solver/SystemStateSelection.h>
#include <Math/ArrayOperations.h>
#include <Math/Functions.h>


SystemStateSelection::SystemStateSelection(IMixedSystem* system)
:_system(system)
,_colPivot(NULL)
,_rowPivot(NULL)
,_initialized(false)
{
_state_selection = dynamic_cast<IStateSelection*>(system);
if ( !_state_selection)
throw std::invalid_argument("No state selection system");
}
void SystemStateSelection::initialize()
{
if(_rowPivot) delete [] _rowPivot;
if(_colPivot) delete [] _colPivot;
_dimStates = _state_selection->getDimStateSets();
_dimStateCanditates = _state_selection->getDimCanditates();
_dimDummyStates = _dimStateCanditates-_dimStates;
_rowPivot = new int[_dimDummyStates];
_colPivot = new int[_dimStateCanditates];
for(int n=0; n<_dimDummyStates; n++)
_rowPivot[n] = n;

for(int n=0; n<_dimStateCanditates; n++)
_colPivot[n] = _dimStateCanditates-n-1;
_initialized = true;
}
SystemStateSelection::~SystemStateSelection()
{
if(_rowPivot) delete [] _rowPivot;
if(_colPivot) delete [] _colPivot;
}

bool SystemStateSelection::stateSelection(int switchStates)
{
if(!_initialized)
initialize();
int res=0;

int* oldColPivot = new int[_dimStateCanditates];
int* oldRowPivot = new int[_dimDummyStates];
SparseMatrix stateset_matrix;
_system->getStateSetJacobian(stateset_matrix);

/* call pivoting function to select the states */
memcpy(oldColPivot,_colPivot, _dimStateCanditates*sizeof(int));
memcpy(oldRowPivot, _rowPivot, _dimDummyStates*sizeof(int));


/*workarround for c array*/
double* jac = new double[_dimDummyStates*_dimStateCanditates];
for(int i=0;i<_dimStateCanditates;i++)
for(int j= 0;j<_dimDummyStates;j++)
jac[i*_dimDummyStates+j]=stateset_matrix(i,j);


if((pivot(jac, _dimDummyStates, _dimStateCanditates, _rowPivot, _colPivot) != 0))
{
throw std::invalid_argument("Error, singular Jacobian for dynamic state selection at time");
}

/* if we have a new set throw event for reinitialization
and set the A matrix for set.x=A*(states) */
res = comparePivot(oldColPivot, _colPivot, switchStates);
if(!switchStates)
{
memcpy(_colPivot, oldColPivot, _dimStateCanditates*sizeof(int));
memcpy(_rowPivot, oldRowPivot, _dimDummyStates*sizeof(int));
}
delete [] oldColPivot;
delete [] oldRowPivot;

if(res)
return true;
else
return false;
}

void SystemStateSelection::setAMatrix(int* newEnable)
{
int col;
int row=0;
boost::multi_array<int,2> A;
_state_selection->getAMatrix(A);
fill_array<int,2 >(A,0);
double* states;//states
double* states2;//state candidates
states = new double[_dimStates];
states2 = new double[_dimStateCanditates];
_state_selection->getStates(states);
_state_selection->getStateCanditates(states2);
for(col=0; col<_dimStateCanditates; col++)
{
if(newEnable[col]==2)
{
/* set A[row, col] */
A[row+1][col+1] = 1;
///* reinit state */
states[row] =states2[col];
row++;
}
}
_state_selection->setStates(states);
_state_selection->setAMatrix(A);
delete [] states ;
delete [] states2 ;
}


int SystemStateSelection::comparePivot(int *oldPivot, int *newPivot,int switchStates)
{

int ret = 0;
int* oldEnable = new int[_dimStateCanditates];
int* newEnable = new int[_dimStateCanditates];

for(int i=0; i<_dimStateCanditates; i++)
{
int entry = (i < _dimDummyStates) ? 1: 2;
newEnable[ newPivot[i] ] = entry;
oldEnable[ oldPivot[i] ] = entry;
}

for(int i=0; i<_dimStateCanditates; i++)
{
if(newEnable[i] != oldEnable[i])
{
if(switchStates)
{

setAMatrix(newEnable);

}
ret = -1;
break;
}
}

delete [] oldEnable;
delete [] newEnable;

return ret;
}
4 changes: 3 additions & 1 deletion SimulationRuntime/cpp/Core/Solver/stdafx.h
Expand Up @@ -39,6 +39,7 @@
#include <boost/range/adaptor/map.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/math/tools/real_cast.hpp>
#include <boost/multi_array.hpp>
using std::vector;
using std::map;
using std::string;
Expand All @@ -52,7 +53,7 @@ using boost::shared_ptr;
using boost::weak_ptr;
using boost::get;
using boost::circular_buffer;

using boost::multi_array;
typedef ublas::shallow_array_adaptor<double> adaptor_t;
typedef ublas::vector<double, adaptor_t> shared_vector_t;
typedef ublas::matrix<double, adaptor_t> shared_matrix_t;
Expand All @@ -68,6 +69,7 @@ typedef ublas::matrix<double, adaptor_t> shared_matrix_t;
#include <SimulationSettings/IGlobalSettings.h>
#include <System/IAlgLoopSolverFactory.h>
#include <System/IMixedSystem.h>
#include <System/IStateSelection.h>
#include <System/ISystemProperties.h>
#include <System/ISystemInitialization.h>
#include <System/IContinuous.h>
Expand Down

0 comments on commit c2634e2

Please sign in to comment.