You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I have one question of the update of model aeif.
The following is the update function of HH model, it is copyed from hh_psc_alpha.cpp.
The paramer such as membrane voltage is updated when the numerical integration fininshed.
void
nest::hh_psc_alpha::update( Time const& origin, const long from, const long to )
{
for ( long lag = from; lag < to; ++lag )
{
double t = 0.0;
const double U_old = S_.y_[ State_::V_M ];
// numerical integration with adaptive step size control:
// ------------------------------------------------------
// gsl_odeiv_evolve_apply performs only a single numerical
// integration step, starting from t and bounded by step;
// the while-loop ensures integration over the whole simulation
// step (0, step] if more than one integration step is needed due
// to a small integration step size;
// note that (t+IntegrationStep > step) leads to integration over
// (t, step] and afterwards setting t to step, but it does not
// enforce setting IntegrationStep to step-t; this is of advantage
// for a consistent and efficient integration across subsequent
// simulation intervals
while ( t < B_.step_ )
{
const int status = gsl_odeiv_evolve_apply( B_.e_,
B_.c_,
B_.s_,
&B_.sys_, // system of ODE
&t, // from t
B_.step_, // to t <= step
&B_.IntegrationStep_, // integration step size
S_.y_ ); // neuronal state
if ( status != GSL_SUCCESS )
{
throw GSLSolverFailure( get_name(), status );
}
}
S_.y_[ State_::DI_EXC ] += B_.spike_exc_.get_value( lag ) * V_.PSCurrInit_E_;
S_.y_[ State_::DI_INH ] += B_.spike_inh_.get_value( lag ) * V_.PSCurrInit_I_;
// sending spikes: crossing 0 mV, pseudo-refractoriness and local maximum...
// refractory?
if ( S_.r_ > 0 )
{
--S_.r_;
}
else if ( S_.y_[ State_::V_M ] >= 0 and U_old > S_.y_[ State_::V_M ] ) // ( threshold and maximum )
{
S_.r_ = V_.RefractoryCounts_;
set_spiketime( Time::step( origin.get_steps() + lag + 1 ) );
SpikeEvent se;
kernel().event_delivery_manager.send( *this, se, lag );
}
// log state data
B_.logger_.record_data( origin.get_steps() + lag );
// set new input current
B_.I_stim_ = B_.currents_.get_value( lag );
}
}
Differs from HH, the aeif model updated the parameter multiple times during the numerical integration. Whether it should be similar to HH model is not updated until the end of numerical integration.
The following is copyed from aeif_cond_alpha.cpp.
In the code, it is mainly reflected in where does the while loop terminate
void
nest::aeif_cond_alpha::update( Time const& origin, const long from, const long to )
{
assert( State_::V_M == 0 );
for ( long lag = from; lag < to; ++lag )
{
double t = 0.0;
// numerical integration with adaptive step size control:
// ------------------------------------------------------
// gsl_odeiv_evolve_apply performs only a single numerical
// integration step, starting from t and bounded by step;
// the while-loop ensures integration over the whole simulation
// step (0, step] if more than one integration step is needed due
// to a small integration step size;
// note that (t+IntegrationStep > step) leads to integration over
// (t, step] and afterwards setting t to step, but it does not
// enforce setting IntegrationStep to step-t; this is of advantage
// for a consistent and efficient integration across subsequent
// simulation intervals
while ( t < B_.step_ )
{
const int status = gsl_odeiv_evolve_apply( B_.e_,
B_.c_,
B_.s_,
&B_.sys_, // system of ODE
&t, // from t
B_.step_, // to t <= step
&B_.IntegrationStep_, // integration step size
S_.y_ ); // neuronal state
if ( status != GSL_SUCCESS )
{
throw GSLSolverFailure( get_name(), status );
}
// check for unreasonable values; we allow V_M to explode
if ( S_.y_[ State_::V_M ] < -1e3 or S_.y_[ State_::W ] < -1e6 or S_.y_[ State_::W ] > 1e6 )
{
throw NumericalInstability( get_name() );
}
// spikes are handled inside the while-loop
// due to spike-driven adaptation
if ( S_.r_ > 0 )
{
S_.y_[ State_::V_M ] = P_.V_reset_;
}
else if ( S_.y_[ State_::V_M ] >= V_.V_peak )
{
S_.y_[ State_::V_M ] = P_.V_reset_;
S_.y_[ State_::W ] += P_.b; // spike-driven adaptation
/* Initialize refractory step counter.
* - We need to add 1 to compensate for count-down immediately after
* while loop.
* - If neuron has no refractory time, set to 0 to avoid refractory
* artifact inside while loop.
*/
S_.r_ = V_.refractory_counts_ > 0 ? V_.refractory_counts_ + 1 : 0;
set_spiketime( Time::step( origin.get_steps() + lag + 1 ) );
SpikeEvent se;
kernel().event_delivery_manager.send( *this, se, lag );
}
}
// decrement refractory count
if ( S_.r_ > 0 )
{
--S_.r_;
}
// apply spikes
S_.y_[ State_::DG_EXC ] += B_.spike_exc_.get_value( lag ) * V_.g0_ex_;
S_.y_[ State_::DG_INH ] += B_.spike_inh_.get_value( lag ) * V_.g0_in_;
// set new input current
B_.I_stim_ = B_.currents_.get_value( lag );
// log state data
B_.logger_.record_data( origin.get_steps() + lag );
}
}
Looking forward to your reply.
The text was updated successfully, but these errors were encountered:
I have one question of the update of model aeif.
The following is the update function of HH model, it is copyed from hh_psc_alpha.cpp.
The paramer such as membrane voltage is updated when the numerical integration fininshed.
Differs from HH, the aeif model updated the parameter multiple times during the numerical integration. Whether it should be similar to HH model is not updated until the end of numerical integration.
The following is copyed from aeif_cond_alpha.cpp.
In the code, it is mainly reflected in where does the while loop terminate
Looking forward to your reply.
The text was updated successfully, but these errors were encountered: