Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/niklwors/OMCompiler
Browse files Browse the repository at this point in the history
  • Loading branch information
niklwors committed Oct 16, 2015
2 parents 3792fac + 524ce11 commit 89c5e8c
Show file tree
Hide file tree
Showing 13 changed files with 226 additions and 204 deletions.
18 changes: 9 additions & 9 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -7019,14 +7019,14 @@ case SIMCODE(modelInfo = MODELINFO(__),simulationSettingsOpt = SOME(settings as
if (command & IWriteOutput::HEAD_LINE)
{

const all_names_t outputVarNames = boost::make_tuple(outputRealVars.ourputVarNames,outputIntVars.ourputVarNames,outputBoolVars.ourputVarNames);
const all_names_t outputVarDescription = boost::make_tuple(outputRealVars.ourputVarDescription,outputIntVars.ourputVarDescription,outputBoolVars.ourputVarDescription);
const all_names_t outputVarNames = make_tuple(outputRealVars.ourputVarNames,outputIntVars.ourputVarNames,outputBoolVars.ourputVarNames);
const all_names_t outputVarDescription = make_tuple(outputRealVars.ourputVarDescription,outputIntVars.ourputVarDescription,outputBoolVars.ourputVarDescription);
<%
match settings.outputFormat
case "mat" then
<<
const all_names_t parameterVarNames = boost::make_tuple(outputRealVars.parameterNames,outputIntVars.parameterNames,outputBoolVars.parameterNames);
const all_names_t parameterVarDescription = boost::make_tuple(outputRealVars.parameterDescription,outputIntVars.parameterDescription,outputBoolVars.parameterDescription);
const all_names_t parameterVarNames = make_tuple(outputRealVars.parameterNames,outputIntVars.parameterNames,outputBoolVars.parameterNames);
const all_names_t parameterVarDescription = make_tuple(outputRealVars.parameterDescription,outputIntVars.parameterDescription,outputBoolVars.parameterDescription);
>>
else
<<
Expand All @@ -7040,7 +7040,7 @@ case SIMCODE(modelInfo = MODELINFO(__),simulationSettingsOpt = SOME(settings as
match settings.outputFormat
case "mat" then
<<
const all_vars_t params = boost::make_tuple(outputRealVars.outputParams,outputIntVars.outputParams,outputBoolVars.outputParams);
const all_vars_t params = make_tuple(outputRealVars.outputParams,outputIntVars.outputParams,outputBoolVars.outputParams);

>>
else
Expand Down Expand Up @@ -7069,10 +7069,10 @@ case SIMCODE(modelInfo = MODELINFO(__),simulationSettingsOpt = SOME(settings as
else
<<
<%generateMeasureTimeEndCode("measuredFunctionStartValues", "measuredFunctionEndValues", "(*measureTimeFunctionsArray)[2]", "writeOutput", "MEASURETIME_MODELFUNCTIONS")%>

all_vars_time_t all_vars = boost::make_tuple(outputRealVars.outputVars,outputIntVars.outputVars,outputBoolVars.outputVars,_simTime);
neg_all_vars_t neg_all_vars = boost::make_tuple(outputRealVars.negateOutputVars,outputIntVars.negateOutputVars,outputBoolVars.negateOutputVars);
_historyImpl->addContainerToWriteQueue(all_vars,neg_all_vars);
write_data_t& container = _historyImpl->getFreeContainer();
all_vars_time_t all_vars = make_tuple(outputRealVars.outputVars,outputIntVars.outputVars,outputBoolVars.outputVars,_simTime);
neg_all_vars_t neg_all_vars = make_tuple(outputRealVars.negateOutputVars,outputIntVars.negateOutputVars,outputBoolVars.negateOutputVars);
_historyImpl->addContainerToWriteQueue(make_tuple(all_vars,neg_all_vars));
>>
%>
}
Expand Down
9 changes: 6 additions & 3 deletions SimulationRuntime/cpp/Core/DataExchange/CMakeLists.txt
Expand Up @@ -25,14 +25,17 @@ install (TARGETS ${DataExchangeName} DESTINATION ${LIBINSTALLEXT})
install (TARGETS ${DataExchangeName}_static DESTINATION ${LIBINSTALLEXT})

install (FILES ${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/IHistory.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/ISimVar.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/SimData.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/Writer.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/ISimVar.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/SimData.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/Writer.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/SimDouble.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/SimBoolean.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/XmlPropertyReader.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/IPropertyReader.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/FactoryExport.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/FactoryPolicy.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/DefaultContainerManager.h
${CMAKE_SOURCE_DIR}/Include/Core/DataExchange/ParallelContainerManager.h
DESTINATION include/omc/cpp/Core/DataExchange)


Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/cpp/Core/Utils/extension/CMakeLists.txt
Expand Up @@ -28,7 +28,7 @@ install (FILES ${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/measure_time.hp
${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/measure_time_statistic.hpp
${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/measure_time_rdtsc.hpp
${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/measure_time_scorep.hpp
${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/busywaiting_barrier.hpp
${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/barriers.hpp
${CMAKE_SOURCE_DIR}/Include/Core/Utils/extension/logger.hpp
DESTINATION include/omc/cpp/Core/Utils/extension)

Expand Down
@@ -0,0 +1,55 @@
#pragma once
/** @addtogroup dataexchange
*
* @{
*/
#include <Core/Modelica.h>
#include <Core/ModelicaDefine.h>

/**
* A container manager that is designed for single threaded write output. It has just one container that can
* be filled with values and written directly.
*/
class DefaultContainerManager : public Writer
{
private:
write_data_t _container;

protected:
/**
* Write the given container to the result file.
* @param container The container that should be written.
*/
void writeContainer(const write_data_t& container)
{
write(get<0>(container),get<1>(container));
}

public:
DefaultContainerManager() :
_container()
{
}

virtual ~DefaultContainerManager()
{
}
/**
* Get the internal container. It is always the same.
* @return A reference to the internal container that can be filled with values.
*/
write_data_t& getFreeContainer()
{
return _container;
};
/**
* Write the given container to the result file.
* @param container The container that should be written.
*/
void addContainerToWriteQueue(const write_data_t& container)
{
writeContainer(container);
};
};
/** @} */ // end of dataexchange
10 changes: 5 additions & 5 deletions SimulationRuntime/cpp/Include/Core/DataExchange/FactoryExport.h
@@ -1,8 +1,8 @@
#pragma once
/** @addtogroup solverCvode
*
* @{
*/
/** @addtogroup dataexchange
*
* @{
*/
#if defined(__vxworks)

#define BOOST_EXTENSION_SOLVER_DECL
Expand All @@ -19,4 +19,4 @@
#else
error "operating system not supported"
#endif
/** @} */ // end of solverCvode
/** @} */
12 changes: 12 additions & 0 deletions SimulationRuntime/cpp/Include/Core/DataExchange/FactoryPolicy.h
@@ -0,0 +1,12 @@
/** @addtogroup dataexchange
*
* @{
*/
#if defined USE_PARALLEL_OUTPUT && defined USE_BOOST_THREAD
#include <Core/DataExchange/ParallelContainerManager.h>
typedef ParallelContainerManager ContainerManager;
#else
#include <Core/DataExchange/DefaultContainerManager.h>
typedef DefaultContainerManager ContainerManager;
#endif
/** @} */
@@ -0,0 +1,101 @@
#pragma once
/** @addtogroup dataexchange
*
* @{
*/
#include <Core/Modelica.h>
#include <Core/ModelicaDefine.h>

#define CONTAINER_COUNT 3

/**
* This container manager is designed to write simulation results in parallel. It has multiple data containers that
* can be filled with values. The write routine works asynchronously with the help of a consumer-producer-queue.
*/
class ParallelContainerManager : public Writer
{
private:
deque<write_data_t > _writeContainers;
deque<write_data_t > _freeContainers;
semaphore _freeContainerMutex;
semaphore _writeContainerMutex;
semaphore _nempty;
thread _writerThread;
bool _threadWorkDone;

protected:
void writeThread()
{
std::cerr << "Parallel writer thread used" << std::endl;
while(!_threadWorkDone)
writeContainer();

while(!_writeContainers.empty())
writeContainer();
}

void writeContainer()
{
const write_data_t* container;

_writeContainerMutex.wait();
if (!_writeContainers.empty())
container = &_writeContainers.front();

_writeContainerMutex.post();

if (!container)
{
usleep(5);
return;
}

write(get<0>(*container),get<1>(*container));

_writeContainerMutex.wait();
_writeContainers.pop_front();
_writeContainerMutex.post();

_freeContainerMutex.wait();
_freeContainers.push_back(*container);
_freeContainerMutex.post();
_nempty.post();
}

public:
ParallelContainerManager() : Writer()
, _writeContainers()
,_freeContainers()
,_freeContainerMutex(1)
,_writeContainerMutex(1)
,_nempty(CONTAINER_COUNT)
,_writerThread(&ParallelContainerManager::writeThread, this)
,_threadWorkDone(false)
{
}

virtual ~ParallelContainerManager()
{
_threadWorkDone = true;
_writerThread.join();
}

write_data_t& getFreeContainer()
{
_nempty.wait();
_freeContainerMutex.wait();

write_data_t& container = _freeContainers.front();
_freeContainers.pop_front();
_freeContainerMutex.post();

return container;
};

void addContainerToWriteQueue(const write_data_t& container)
{
_writeContainers.push_back(container);
};
};
/** @} */ // end of dataexchange
Expand Up @@ -7,12 +7,12 @@



class BufferReaderWriter : public Writer
class BufferReaderWriter : public ContainerManager
{
//typedef TextFileWriter<dim_1,dim_2> TextwriterType;
public:
BufferReaderWriter(unsigned long size, string output_path, string file_name)
: Writer(),
: ContainerManager(),
_buffer_pos(0)
{
try
Expand Down Expand Up @@ -276,4 +276,4 @@ class BufferReaderWriter : public Writer
all_names_t _var_outputs;

};
/** @} */ // end of dataexchangePolicies
/** @} */ // end of dataexchangePolicies
Expand Up @@ -21,14 +21,14 @@
#include <fstream>
using std::ios;
*/
#include <Core/DataExchange/FactoryPolicy.h>



class MatFileWriter : public Writer
class MatFileWriter : public ContainerManager
{
public:
MatFileWriter(unsigned long size, string output_path, string file_name)
: Writer(),
: ContainerManager(),
_dataHdrPos(),
_dataEofPos(),
_curser_position(0),
Expand Down
Expand Up @@ -4,30 +4,19 @@
* @{
*/

#include <Core/DataExchange/FactoryPolicy.h>

/*includes removed for static linking not needed any more
#ifdef RUNTIME_STATIC_LINKING
#include <sstream>
#include <vector>
#endif
// Output
#include <fstream>
#include <Core/DataExchange/Writer.h>
using std::ios;
#define SEPERATOR ","
#define EXTENSION ","
*/
/**
Policy class to write simulation results in a text file
*/
const char SEPERATOR = ',';
const char EXTENSION = ',';
class TextFileWriter : public Writer
*/
const char SEPERATOR = ',';
const char EXTENSION = ',';

class TextFileWriter : public ContainerManager
{
public:
TextFileWriter(unsigned long size, string output_path, string file_name)
: Writer(),
: ContainerManager(),
_output_stream(),
_curser_position(0),
_output_path(output_path),
Expand Down Expand Up @@ -159,4 +148,4 @@ class TextFileWriter : public Writer
std::string _file_name;
vector<string> _var_outputs;
};
/** @} */ // end of dataexchangePolicies
/** @} */ // end of dataexchangePolicies

0 comments on commit 89c5e8c

Please sign in to comment.