Commit 2bfe3f9a authored by Pascal Palenda's avatar Pascal Palenda
Browse files

Introduce ITASimulationScheduler namespace - WIP

parent aff95e94
......@@ -28,199 +28,204 @@
// STL includes
#include <string>
//! Raven Konfiguration
/**
* Wird die RavenConfig in einem Simulator verwendet (z.B. als Teil eines Tasks),
* dann wird das Makro 'RavenDataBasePath', also die Zeichenkette $(RavenDataBasePath)
* automatisch durch den ausfhrenden Simulator in das jeweils eingestellte
* Basisverzeichnis umgesetzt. Dies kann sich je nach Simulator unterscheiden und
* ist vor Allem bei verteilten Systemen nicht immer identisch.
*
* Es sollte fr alle Pfade immer so verwendet werden:
*
* Beispiel Directivity: $(RavenDataBasePath)/Directivities/Bratsche.daff
* Beispiel HRIR: $(RavenDataBasePath)/HRIR/ITAKunstkopf.daff
* Beispiel RPF: $(RavenDataBasePath)/Scenes/Eurogress/Eurogress.rpf
*
* \note $(RavenDataBasePath) wird durch den aktuellen Basispfad der Instanz ersetzt
*/
class ITA_SIMULATION_SCHEDULER_API CRavenConfig
namespace ITASimulationScheduler
{
public:
//! Difference flags (bitvector)
enum
{
GEO_SCENE = 1<<0, //!< Difference in selected Scene/Project
ROOM_HUMIDITY = 1<<1,
ROOM_STATPRESSURE = 1<<2,
ROOM_REVERBTIME = 1<<3,
ROOM_TEMPERATUR = 1<<4,
IS_ORDER_PS = 1<<5, //!< Difference in Image Source Order fr Primrschallquellen (Direktschall)
IS_ORDER_SS = 1<<6, //!< Difference in Image Source Order fr Sekundrschallquellen (Reflexionen)
RT_PORTDETECT_ELTHRESH = 1<<7,
RT_PORTDETECT_FILTERLENGTH = 1<<8,
RT_PORTDETECT_RESTIMESLOTS = 1<<9,
RT_PORTDETECT_NUMPARTICLES = 1<<10,
RT_SPHEREDETECT_ELTHRESH = 1<<11,
RT_SPHEREDETECT_FILTERLENGTH = 1<<12,
RT_SPHEREDETECT_RESTIMESLOTS = 1<<13,
RT_SPHEREDETECT_NUMPARTICLES = 1<<14,
RT_SPHEREDETECT_RADIUS = 1<<15,
RT_SPHEREDETECT_RESAZI = 1<<16,
RT_SPHEREDETECT_RESELE = 1<<17,
SIMSETS_ACCELETYPE = 1<<18,
SIMSETS_SAMPLERATE = 1<<19,
FILTENG_MAGRES = 1<<20, //!< Filter enginge magnitude resolution
};
CRavenConfig();
virtual ~CRavenConfig();
struct Geometry
{
std::string sSceneFileName; //!< Pfad zur Geometriedatei (.ac)
};
Geometry oGeometry; //!< Konfiguration der Geometrie
struct Room
//! Raven Konfiguration
/**
* Wird die RavenConfig in einem Simulator verwendet (z.B. als Teil eines Tasks),
* dann wird das Makro 'RavenDataBasePath', also die Zeichenkette $(RavenDataBasePath)
* automatisch durch den ausfhrenden Simulator in das jeweils eingestellte
* Basisverzeichnis umgesetzt. Dies kann sich je nach Simulator unterscheiden und
* ist vor Allem bei verteilten Systemen nicht immer identisch.
*
* Es sollte fr alle Pfade immer so verwendet werden:
*
* Beispiel Directivity: $(RavenDataBasePath)/Directivities/Bratsche.daff
* Beispiel HRIR: $(RavenDataBasePath)/HRIR/ITAKunstkopf.daff
* Beispiel RPF: $(RavenDataBasePath)/Scenes/Eurogress/Eurogress.rpf
*
* \note $(RavenDataBasePath) wird durch den aktuellen Basispfad der Instanz ersetzt
*/
class ITA_SIMULATION_SCHEDULER_API CRavenConfig
{
float fTemperature; //!< Raumtemperatur in Grad Celsius
float fHumidity; //!< Raumfeuchte in % [0..100]
float fStaticPressure; //!< Statischer Luftdruck im Raum in Pascal
float fReverberationTime; //!< Aproximated reverberation time (for filter length prediction, in s!)
};
Room oRoom; //!< Konfiguration des Raumes
public:
//! Difference flags (bitvector)
enum
{
GEO_SCENE = 1 << 0, //!< Difference in selected Scene/Project
ROOM_HUMIDITY = 1 << 1,
ROOM_STATPRESSURE = 1 << 2,
ROOM_REVERBTIME = 1 << 3,
ROOM_TEMPERATUR = 1 << 4,
IS_ORDER_PS = 1 << 5, //!< Difference in Image Source Order fr Primrschallquellen (Direktschall)
IS_ORDER_SS = 1 << 6, //!< Difference in Image Source Order fr Sekundrschallquellen (Reflexionen)
RT_PORTDETECT_ELTHRESH = 1 << 7,
RT_PORTDETECT_FILTERLENGTH = 1 << 8,
RT_PORTDETECT_RESTIMESLOTS = 1 << 9,
RT_PORTDETECT_NUMPARTICLES = 1 << 10,
RT_SPHEREDETECT_ELTHRESH = 1 << 11,
RT_SPHEREDETECT_FILTERLENGTH = 1 << 12,
RT_SPHEREDETECT_RESTIMESLOTS = 1 << 13,
RT_SPHEREDETECT_NUMPARTICLES = 1 << 14,
RT_SPHEREDETECT_RADIUS = 1 << 15,
RT_SPHEREDETECT_RESAZI = 1 << 16,
RT_SPHEREDETECT_RESELE = 1 << 17,
SIMSETS_ACCELETYPE = 1 << 18,
SIMSETS_SAMPLERATE = 1 << 19,
FILTENG_MAGRES = 1 << 20, //!< Filter enginge magnitude resolution
};
struct ImageSources
{
int iOrderPrimarySource; //!< Spiegelschallquellenordnung Primrschallquellen (Direktschall)
int iOrderSecondarySource; //!< Spiegelschallquellenordnung Sekundrschallquellen (Reflexionen)
};
ImageSources oImageSource; //!< Konfiguration der Image Sources
CRavenConfig();
virtual ~CRavenConfig();
struct RayTracer
{
struct SphereDetector
struct Geometry
{
unsigned long int uliNumParticles; //!< Anzahl abgefeuerter Partikelstrahlen
float fEnergyLossThreshold; //!< Energiegrenze fr Partikel in dB
float fFilterLength; //!< Length of sphere detector filter in s (!)
float fResolutionAzimuth; //!< Grad
float fResolutionElevation; //!< Grad
float fRadius; //!< Meter
float fResolutionTimeSlots; //!< Time resolution is ms
std::string sSceneFileName; //!< Pfad zur Geometriedatei (.ac)
};
SphereDetector oSphereDetector;
Geometry oGeometry; //!< Konfiguration der Geometrie
struct PortalDetector
struct Room
{
unsigned long int uliNumParticles; //!< Anzahl abgefeuerter Partikelstrahlen
float fEnergyLossThreshold; //!< Energiegrenze fr Partikel in dB
float fFilterLength; //!< Length of portal detector filter in s (!)
float fResolutionTimeSlots; //!< Time resolution is ms (!)
float fTemperature; //!< Raumtemperatur in Grad Celsius
float fHumidity; //!< Raumfeuchte in % [0..100]
float fStaticPressure; //!< Statischer Luftdruck im Raum in Pascal
float fReverberationTime; //!< Aproximated reverberation time (for filter length prediction, in s!)
};
PortalDetector oPortalDetector;
};
RayTracer oRayTracer; //!< Konfiguration des Ray Tracers
//! Geometrische Beschleunigungsalgorithmen
enum
{
BSP = 0, //!< Binary Space Partitioning
HASHMAP = 1, //!< Hashing
};
struct SimulationSettings
{
int iAccelerationType; //!< Geometrischer Beschleunigungsalgorithmus (BSP oder HASHMAP)
double dSampleRate; //!< Abtastrate, mit der die Audiohardware sampelt
};
SimulationSettings oSimulationSettings; //!< Konfiguration der Simulation
//! Bandfilter-Spektren
enum
{
WHOLE_OCTAVE_SPECTRUM = 0, //!< Terzbandfilter
THIRD_OCTAVE_SPECTRUM = 1, //!< Oktavbandfilter
};
struct FilterEngine
{
int iMagnitudesResolution; //!< Bandfilter-Auflsung (THIRD_OCTAVE oder WHOLE_OCTAVE)
};
FilterEngine oFilterEngine;
Room oRoom; //!< Konfiguration des Raumes
//! Vergleicht die eigene Konfiguration gegen eine andere
/**
* \return Gibt den Difference flag zurck
*/
virtual unsigned int Compare( const CRavenConfig& oOtherConfig );
//! Setzt die Konfiguration zurck
virtual void Reset();
struct ImageSources
{
int iOrderPrimarySource; //!< Spiegelschallquellenordnung Primrschallquellen (Direktschall)
int iOrderSecondarySource; //!< Spiegelschallquellenordnung Sekundrschallquellen (Reflexionen)
};
ImageSources oImageSource; //!< Konfiguration der Image Sources
//! Setzt die Konfiguration auf sinnvolle Standardwerte
virtual void SetDefaults();
struct RayTracer
{
struct SphereDetector
{
unsigned long int uliNumParticles; //!< Anzahl abgefeuerter Partikelstrahlen
float fEnergyLossThreshold; //!< Energiegrenze fr Partikel in dB
float fFilterLength; //!< Length of sphere detector filter in s (!)
float fResolutionAzimuth; //!< Grad
float fResolutionElevation; //!< Grad
float fRadius; //!< Meter
float fResolutionTimeSlots; //!< Time resolution is ms
};
SphereDetector oSphereDetector;
struct PortalDetector
{
unsigned long int uliNumParticles; //!< Anzahl abgefeuerter Partikelstrahlen
float fEnergyLossThreshold; //!< Energiegrenze fr Partikel in dB
float fFilterLength; //!< Length of portal detector filter in s (!)
float fResolutionTimeSlots; //!< Time resolution is ms (!)
};
PortalDetector oPortalDetector;
};
RayTracer oRayTracer; //!< Konfiguration des Ray Tracers
//! Set the configuration from another object (copy from method)
virtual void Set( const CRavenConfig& oSrc );
//! Geometrische Beschleunigungsalgorithmen
enum
{
BSP = 0, //!< Binary Space Partitioning
HASHMAP = 1, //!< Hashing
};
//! Ld eine Konfiguration aus einer RPF-Datei
/**
* Ld smtliche vorhandenen Informationen aus einer
* Raven-Projektdatei und fllt nicht vorhandene Werte
* mit den Default-Werten aus, wie sie durch die Methode
* SetDefaults() gesetzt werden.
*
* \param sFilePath Pfad zur Datei (relativ oder absolut, keine Makros, berschreibt)
*
* \note Legacy-Support fr RPF-Dateien
*/
virtual void LoadFromRPFFile( const std::string& sRPFFilePath );
struct SimulationSettings
{
int iAccelerationType; //!< Geometrischer Beschleunigungsalgorithmus (BSP oder HASHMAP)
double dSampleRate; //!< Abtastrate, mit der die Audiohardware sampelt
};
SimulationSettings oSimulationSettings; //!< Konfiguration der Simulation
//! Ld eine Konfiguration aus einer INI-Datei
/**
* Ld smtliche vorhandenen Informationen aus einer
* INI-Datei und fllt nicht vorhandene Werte
* mit den Default-Werten aus, wie sie durch die Methode
* SetDefaults() gesetzt werden.
*
* \note Throws ITAException on error
*
* \param sFilePath Pfad zur Datei (relativ oder absolut, keine Makros, berschreibt)turn
*
*/
virtual void Load( const std::string& sPath );
//! Bandfilter-Spektren
enum
{
WHOLE_OCTAVE_SPECTRUM = 0, //!< Terzbandfilter
THIRD_OCTAVE_SPECTRUM = 1, //!< Oktavbandfilter
};
//! Speicher die Konfiguration in eine INI-Datei
/**
* Speichert die Konfigurationsparameter in eine INI-Datei
*
* \param sFilePath Pfad zur Datei (relativ oder absolut, keine Makros, berschreibt)
*/
virtual void Store( const std::string& sPath ) const;
struct FilterEngine
{
int iMagnitudesResolution; //!< Bandfilter-Auflsung (THIRD_OCTAVE oder WHOLE_OCTAVE)
};
FilterEngine oFilterEngine;
//! Vergleicht die eigene Konfiguration gegen eine andere
/**
* \return Gibt den Difference flag zurck
*/
virtual unsigned int Compare(const CRavenConfig& oOtherConfig);
//! Setzt die Konfiguration zurck
virtual void Reset();
//! Setzt die Konfiguration auf sinnvolle Standardwerte
virtual void SetDefaults();
//! Set the configuration from another object (copy from method)
virtual void Set(const CRavenConfig& oSrc);
//! Ld eine Konfiguration aus einer RPF-Datei
/**
* Ld smtliche vorhandenen Informationen aus einer
* Raven-Projektdatei und fllt nicht vorhandene Werte
* mit den Default-Werten aus, wie sie durch die Methode
* SetDefaults() gesetzt werden.
*
* \param sFilePath Pfad zur Datei (relativ oder absolut, keine Makros, berschreibt)
*
* \note Legacy-Support fr RPF-Dateien
*/
virtual void LoadFromRPFFile(const std::string& sRPFFilePath);
//! Ld eine Konfiguration aus einer INI-Datei
/**
* Ld smtliche vorhandenen Informationen aus einer
* INI-Datei und fllt nicht vorhandene Werte
* mit den Default-Werten aus, wie sie durch die Methode
* SetDefaults() gesetzt werden.
*
* \note Throws ITAException on error
*
* \param sFilePath Pfad zur Datei (relativ oder absolut, keine Makros, berschreibt)turn
*
*/
virtual void Load(const std::string& sPath);
//! Speicher die Konfiguration in eine INI-Datei
/**
* Speichert die Konfigurationsparameter in eine INI-Datei
*
* \param sFilePath Pfad zur Datei (relativ oder absolut, keine Makros, berschreibt)
*/
virtual void Store(const std::string& sPath) const;
//! Erzeugt einen String mit den Parametern
/**
* \return Zeichenausgabe
*/
virtual std::string ToString() const;
//! Validates settings to detect odd configuration
/*
* Validation based on meaningfull settings to detect odd settings,
* i.e. for early warning purpose. A return value greater zero
* indicates a probable wrong config, though that does not necessarily
* mean that a problem will rise during simulation.
*
* Use validation to ensure good settings and ignore output if you
* know what you are doing.
*
* It is always recommended to start with default set, see SetDefaults()
*
* \return Difference bitvector containing flags about avery odd setting
*/
virtual unsigned int Validate() const;
};
//! Erzeugt einen String mit den Parametern
/**
* \return Zeichenausgabe
*/
virtual std::string ToString() const;
//! Validates settings to detect odd configuration
/*
* Validation based on meaningfull settings to detect odd settings,
* i.e. for early warning purpose. A return value greater zero
* indicates a probable wrong config, though that does not necessarily
* mean that a problem will rise during simulation.
*
* Use validation to ensure good settings and ignore output if you
* know what you are doing.
*
* It is always recommended to start with default set, see SetDefaults()
*
* \return Difference bitvector containing flags about avery odd setting
*/
virtual unsigned int Validate() const;
};
}
#endif // __R_RAVEN_CONFIG_H__
......@@ -46,217 +46,222 @@
#include <list>
#include <vector>
//! Lokaler Scheduler fr Raven-Simulationsauftrge
/**
* Dieser lokal arbeitende Scheduler erzeugt mehrere Threads fr Raven-Simulatoren und verteilt
* eingehende Tasks auf diese. Dabei arbeitet er so, dass die Threads mit unterschiedlichen
* Priorisierungen laufen und jeweils unterschiedliche Simulationsauftrge abarbeiten (DS, DS+IS, IS und RT).
* Andere Typen sind nicht erlaubt, und die Anzahl der verfgbaren Entitten (Receiver, Sources, Portals)
* hngt von der Einstellung der Raven-Simulatoren (CRavenSimulator) ab.
* Der lokale Scheduler verwirft smtliche Tasks, die nicht abgearbeitet werden konnten und von einem
* neuen Task unter folgenden auflagen verdngt wurden:
*
* 1. Exakt identische Konfiguration (CRavenConfig)
* 2. Identischer Auftragstyp (DS, DS+ER, ER oder DD)
* 3. Gleiche Szene (CRavenScene), d.h. smtliche Entitten identisch, aber mglicherweise unterschiedlicher State (CRaven*State)
*
* \todo Eventuell den Scheduler so einstellbar machen, dass er sich auch anders verhlt, z.B. NIE verdrngt. Dies
* knnte dann sinnvoll sein, wenn man den Scheduler als "Task-Queue" verwendet, um z.B. Trajektorien abzufahren und
* Impulsantworten zu generieren.
*/
class ITA_SIMULATION_SCHEDULER_API CRavenLocalScheduler : public IRavenSimulationSchedulerInterface, public VistaThreadLoop
namespace ITASimulationScheduler
{
public:
//! Scheduler configuration
class ITA_SIMULATION_SCHEDULER_API CConfiguration
//! Lokaler Scheduler fr Raven-Simulationsauftrge
/**
* Dieser lokal arbeitende Scheduler erzeugt mehrere Threads fr Raven-Simulatoren und verteilt
* eingehende Tasks auf diese. Dabei arbeitet er so, dass die Threads mit unterschiedlichen
* Priorisierungen laufen und jeweils unterschiedliche Simulationsauftrge abarbeiten (DS, DS+IS, IS und RT).
* Andere Typen sind nicht erlaubt, und die Anzahl der verfgbaren Entitten (Receiver, Sources, Portals)
* hngt von der Einstellung der Raven-Simulatoren (CRavenSimulator) ab.
* Der lokale Scheduler verwirft smtliche Tasks, die nicht abgearbeitet werden konnten und von einem
* neuen Task unter folgenden auflagen verdngt wurden:
*
* 1. Exakt identische Konfiguration (CRavenConfig)
* 2. Identischer Auftragstyp (DS, DS+ER, ER oder DD)
* 3. Gleiche Szene (CRavenScene), d.h. smtliche Entitten identisch, aber mglicherweise unterschiedlicher State (CRaven*State)
*
* \todo Eventuell den Scheduler so einstellbar machen, dass er sich auch anders verhlt, z.B. NIE verdrngt. Dies
* knnte dann sinnvoll sein, wenn man den Scheduler als "Task-Queue" verwendet, um z.B. Trajektorien abzufahren und
* Impulsantworten zu generieren.
*/
class ITA_SIMULATION_SCHEDULER_API CRavenLocalScheduler : public IRavenSimulationSchedulerInterface, public VistaThreadLoop
{
public:
//! Thread configuration
class ITA_SIMULATION_SCHEDULER_API CThreadConfiguration
//! Scheduler configuration
class ITA_SIMULATION_SCHEDULER_API CConfiguration
{
public:
//! Process task assignment
enum
//! Thread configuration
class ITA_SIMULATION_SCHEDULER_API CThreadConfiguration
{
TIMEOUT = 0, //!< Update task assignment using a timeout
EVENTSYNC, //!< Update task assignment when added (may use entire ressources)
CONTINUOUS //!< Update tasks continuously (uses entire ressources)
public:
//! Process task assignment
enum
{
TIMEOUT = 0, //!< Update task assignment using a timeout
EVENTSYNC, //!< Update task assignment when added (may use entire ressources)
CONTINUOUS //!< Update tasks continuously (uses entire ressources)
};
int iTaskProcessingMode; //!< One of \TaskAssignmentProcessing
int iFieldOfDuty; //!< Field of duty for this thread (DS, ER, DD)
float fUpdateRate; //!< Desired update rate for this thread in Hz
int iPriority; //!< Thread priority, careful with this parameter!
std::string sRavenDataBasePath; //!< Raven data base path
};
int iTaskProcessingMode; //!< One of \TaskAssignmentProcessing
int iFieldOfDuty; //!< Field of duty for this thread (DS, ER, DD)
float fUpdateRate; //!< Desired update rate for this thread in Hz
int iPriority; //!< Thread priority, careful with this parameter!
std::string sRavenDataBasePath; //!< Raven data base path
std::string sRavenDataBasePath; //!< Local path to RAVEN data, can be absolute or relative to executable
std::vector< CThreadConfiguration > voThreads; //!< List of thread configurations
std::string ToString() const;
};
std::string sRavenDataBasePath; //!< Local path to RAVEN data, can be absolute or relative to executable
std::vector< CThreadConfiguration > voThreads; //!< List of thread configurations
//! Constructor with configuration
/**
* Creates a scheduler based on given configuration
*
* \param oConf Local scheduler configuration, see \Configuration
*
*/
CRavenLocalScheduler(const CConfiguration& oConf);
std::string ToString() const;
};
//! Destructor
virtual ~CRavenLocalScheduler();
//! Constructor with configuration
/**
* Creates a scheduler based on given configuration
*
* \param oConf Local scheduler configuration, see \Configuration
*
*/
CRavenLocalScheduler( const CConfiguration& oConf );
//! Alles RAVEN-artige intern abrumen und neu aufsetzen
/**
* \note Non-reentrant! Es darf wrend dieses Aufrufs keine andere Funktion parallel betreten werden
*/
virtual void Reset();
//! Destructor
virtual ~CRavenLocalScheduler();
//! Laden der Geometrien aus einer Scene
/**
* \note Non-reentrant! Es darf wrend dieses Aufrufs keine andere Funktion parallel betreten werden
*/
virtual void AddTask(CRavenSimulationTask* pTask);
//! Alles RAVEN-artige intern abrumen und neu aufsetzen
/**
* \note Non-reentrant! Es darf wrend dieses Aufrufs keine andere Funktion parallel betreten werden
*/
virtual void Reset();
//! Preload geometry
virtual void LoadScene(const std::string&);
//! Laden der Geometrien aus einer Scene
/**
* \note Non-reentrant! Es darf wrend dieses Aufrufs keine andere Funktion parallel betreten werden
*/
virtual void AddTask( CRavenSimulationTask* pTask );
virtual void HandleTaskFinished(CRavenSimulationTask* pTask, CRavenSimulationResult* pResult, int iErrorcode);
virtual void HandleTaskDiscarded(CRavenSimulationTask* pTask);
//! Preload geometry
virtual void LoadScene( const std::string& );
virtual bool AttachSimulationResultHandler(IRavenSimulationSchedulerResultHandler*);
virtual bool DetachSimulationResultHandler(IRavenSimulationSchedulerResultHandler*);
virtual void HandleTaskFinished( CRavenSimulationTask* pTask, CRavenSimulationResult* pResult, int iErrorcode );
virtual void HandleTaskDiscarded( CRavenSimulationTask* pTask );
virtual bool GetProfilerStatus(IRavenSimulationSchedulerInterface::CProfiler& oStatus);
virtual bool AttachSimulationResultHandler( IRavenSimulationSchedulerResultHandler* );
virtual bool DetachSimulationResultHandler( IRavenSimulationSchedulerResultHandler* );
// --= Schnittstelle "VistaCoreThread" =--
virtual bool LoopBody();
virtual bool GetProfilerStatus( IRavenSimulationSchedulerInterface::CProfiler& oStatus );
// --= Schnittstelle "VistaCoreThread" =--
virtual bool LoopBody();
class CSimulationThread : public VistaThreadLoop
{
public:
//! Erzeugt einen eigenstndigen Simulationsthread mit einer Raven-Instanz
CSimulationThread(CRavenLocalScheduler* pScheduler, const CConfiguration::CThreadConfiguration& oConf);
class CSimulationThread : public VistaThreadLoop
{
public:
//! Erzeugt einen eigenstndigen Simulationsthread mit einer Raven-Instanz
CSimulationThread( CRavenLocalScheduler* pScheduler, const CConfiguration::CThreadConfiguration& oConf );
virtual ~CSimulationThread();
virtual ~CSimulationThread();
//! Gibt true zurck, wenn kein Task bearbeitet wird
virtual bool IsIdle();
//! Gibt true zurck, wenn kein Task bearbeitet wird
virtual bool IsIdle();
//! Gibt true zurck, wenn die Scene geladen ist
virtual bool IsSceneLoaded() const;
//! Gibt true zurck, wenn die Scene geladen ist
virtual bool IsSceneLoaded() const;
//! Gibt den aktuellen Task oder NULL (Idle) zurck
/**
* \note Es gibt keine Garantie, dass der Task weiterhin existiert
*/
virtual CRavenSimulationTask* GetCurrentTask() const;
//! Gibt den aktuellen Task oder NULL (Idle) zurck
/**
* \note Es gibt keine Garantie, dass der Task weiterhin existiert
*/
virtual CRavenSimulationTask* GetCurrentTask() const;
//! Task retrieval loop
virtual bool LoopBody();
//! Task retrieval loop
virtual bool LoopBody();
//! Performs compute of given task
virtual void Compute(CRavenSimulationTask* pTask);
//! Performs compute of given task
virtual void Compute( CRavenSimulationTask* pTask );
//! Preloads geometry