/***************************************************************************
* TimeEventAllNeurons_GPU.cpp *
* ------------------- *
* copyright : (C) 2013 by Francisco Naveros *
* email : fnaveros@atc.ugr.es *
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "../../include/simulation/TimeEventAllNeurons_GPU.h"
#include "../../include/simulation/Simulation.h"
#include "../../include/simulation/EventQueue.h"
#include "../../include/neuron_model/NeuronModel.h"
#include "../../include/neuron_model/TimeDrivenNeuronModel_GPU.h"
#include "../../include/neuron_model/VectorNeuronState.h"
#include "../../include/spike/TimeDrivenInternalSpike.h"
#include "../../include/spike/Network.h"
#include "../../include/spike/Neuron.h"
#include "../../include/spike/NeuronModelPropagationDelayStructure.h"
#include "../../include/simulation/SynchronizeSimulationEvent.h"
#include "../../include/openmp/openmp.h"
TimeEventAllNeurons_GPU::TimeEventAllNeurons_GPU(double NewTime, TimeDrivenNeuronModel_GPU * newNeuronModel, Neuron ** newNeurons) : Event(NewTime), neuronModel(newNeuronModel), neurons(newNeurons){
}
TimeEventAllNeurons_GPU::~TimeEventAllNeurons_GPU(){
}
//Optimized version which executes the internal spikes instead of insert them in the queue.
void TimeEventAllNeurons_GPU::ProcessEvent(Simulation * CurrentSimulation , int RealTimeRestriction){
double CurrentTime = this->GetTime();
if(RealTimeRestriction<3){
VectorNeuronState * State=neuronModel->GetVectorNeuronState();
neuronModel->UpdateState(-1, State, CurrentTime);
TimeDrivenInternalSpike NewEvent(CurrentTime, State, neuronModel->PropagationStructure, neurons, omp_get_thread_num());
NewEvent.ProcessEvent(CurrentSimulation, RealTimeRestriction);
}
//Next TimeEvent for all cell
CurrentSimulation->GetQueue()->InsertEvent(new TimeEventAllNeurons_GPU(CurrentTime + neuronModel->TimeDrivenStep_GPU, GetModel(), GetNeurons()));
}
//Optimized version which executes the internal spikes instead of insert them in the queue.
void TimeEventAllNeurons_GPU::ProcessEvent(Simulation * CurrentSimulation){
double CurrentTime = this->GetTime();
VectorNeuronState * State=neuronModel->GetVectorNeuronState();
neuronModel->UpdateState(-1, State, CurrentTime);
TimeDrivenInternalSpike NewEvent(CurrentTime, State, neuronModel->PropagationStructure, neurons, omp_get_thread_num());
NewEvent.ProcessEvent(CurrentSimulation);
//Next TimeEvent for all cell
CurrentSimulation->GetQueue()->InsertEvent(new TimeEventAllNeurons_GPU(CurrentTime + neuronModel->TimeDrivenStep_GPU, GetModel(), GetNeurons()));
}
TimeDrivenNeuronModel_GPU * TimeEventAllNeurons_GPU::GetModel(){
return neuronModel;
}
Neuron ** TimeEventAllNeurons_GPU::GetNeurons(){
return neurons;
}
void TimeEventAllNeurons_GPU::PrintType(){
cout<<"TimeEventAllNeurons_GPU"<<endl;
}
enum EventPriority TimeEventAllNeurons_GPU::ProcessingPriority(){
return TIMEEVENT;
}