/*
* test_mini_brunel_ps.sli
*
* This file is part of NEST.
*
* Copyright (C) 2004 The NEST Initiative
*
* NEST 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 2 of the License, or
* (at your option) any later version.
*
* NEST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NEST. If not, see <http://www.gnu.org/licenses/>.
*
*/
/* BeginDocumentation
Name: testsuite::test_mini_brunel_ps - Test parallel simulation of small Brunel-style network
Synopsis: nest_indirect test_mini_brunel_ps.sli -> -
Description:
Simulates scaled-down Brunel net with precise timing for different numbers of MPI
processes and compares results.
Author: May 2012, Plesser, based on brunel_ps.sli
See: brunel_ps.sli
*/
/unittest (9726) require
/unittest using
/brunel_setup {
/brunel << >> def
brunel begin
/order 50 def % scales size of network (total 5*order neurons)
/g 250.0 def % rel strength, inhibitory synapses
/eta 2.0 def % nu_ext / nu_thresh
/simtime 200.0 def % simulation time [ms]
/dt 0.1 def % simulation step length [ms]
% Number of POSIX threads per program instance.
% When using MPI, the mpirun call determines the number
% of MPI processes (=program instances). The total number
% of virtual processes is #MPI processes x local_num_threads.
/total_num_virtual_procs 4 def
% Compute the maximum of postsynaptic potential
% for a synaptic input current of unit amplitude
% (1 pA)
/ComputePSPnorm
{
% calculate the normalization factor for the PSP
(
a = tauMem / tauSyn;
b = 1.0 / tauSyn - 1.0 / tauMem;
% time of maximum
t_max = 1.0/b * (-LambertWm1(-exp(-1.0/a)/a)-1.0/a);
% maximum of PSP for current of unit amplitude
exp(1.0)/(tauSyn*CMem*b) * ((exp(-t_max/tauMem) - exp(-t_max/tauSyn)) / b - t_max*exp(-t_max/tauSyn))
) ExecMath
}
def
%%% PREPARATION SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/NE 4 order mul cvi def % number of excitatory neurons
/NI 1 order mul cvi def % number of inhibitory neurons
/N NI NE add def % total number of neurons
/epsilon 0.1 def % connectivity
/CE epsilon NE mul cvi def % number of excitatory synapses on neuron
/CI epsilon NI mul cvi def % number of inhibitory synapses on neuron
/C CE CI add def % total number of internal synapses per n.
/Cext CE def % number of external synapses on neuron
/tauMem 20.0 def % neuron membrane time constant [ms]
/CMem 250.0 def % membrane capacity [pF]
/tauSyn 0.5 def % synaptic time constant [ms]
/tauRef 2.0 def % refractory time [ms]
/U0 0.0 def % resting potential [mV]
/theta 20.0 def % threshold
% amplitude of PSP given 1pA current
ComputePSPnorm /J_max_unit Set
% synaptic weights, scaled for our alpha functions, such that
% for constant membrane potential, the peak amplitude of the PSP
% equals J
/delay 1.5 def % synaptic delay, all connections [ms]
/J 0.1 def % synaptic weight [mV]
/JE J J_max_unit div def % synaptic weight [pA]
/JI g JE mul neg def % inhibitory
% threshold rate, equivalent rate of events needed to
% have mean input current equal to threshold
/nu_thresh ((theta * CMem) / (JE*CE*exp(1)*tauMem*tauSyn)) ExecMath def
/nu_ext eta nu_thresh mul def % external rate per synapse
/p_rate nu_ext Cext mul 1000. mul def % external input rate per neuron
% must be given in Hz
% number of neurons to record from
/Nrec 20 def
end
}
def % brunel_setup
%%% CONSTRUCTION SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[1 2 4]
{
brunel_setup
/brunel using
% set resolution and total/local number of threads
0
<<
/resolution dt
/total_num_virtual_procs total_num_virtual_procs
>> SetStatus
/E_net /subnet Create def % create subnet
E_net ChangeSubnet % enter subnet
/iaf_psc_alpha_canon NE Create % create neurons in subnet
; % pop gids returned by Create
0 ChangeSubnet % return to full network
/I_net /subnet Create def % create subnet
I_net ChangeSubnet % enter subnet
/iaf_psc_alpha_canon NI Create % create neurons in subnet
; % pop gids returned by Create
0 ChangeSubnet % return to full network
/expoisson /poisson_generator_ps Create def
expoisson
<< % set firing rate
/rate p_rate
>> SetStatus
/inpoisson /poisson_generator_ps Create def
inpoisson
<<
/rate p_rate
>> SetStatus
/exsd /spike_detector Create def
exsd
<<
/withtime true % record time of spikes
/withgid true % record which neuron spiked
/precise_times true
/time_in_steps true
>> SetStatus
/E_neurons E_net GetGlobalNodes def
/I_neurons I_net GetGlobalNodes def
/allNeurons E_neurons I_neurons join def
allNeurons
{
<<
/tau_m tauMem
/C_m CMem
/tau_syn tauSyn
/t_ref tauRef
/E_L U0
/V_th theta
/V_m U0
/V_reset U0
/C_m 1.0 % capacitance is unity in Brunel model
>> SetStatus
} forall
/static_synapse << /delay delay >> SetDefaults
/static_synapse /syn_ex << /weight JE >> CopyModel
/static_synapse /syn_in << /weight JI >> CopyModel
E_neurons
{
/target Set
expoisson target /syn_ex Connect
E_neurons target CE /syn_ex RandomConvergentConnect
I_neurons target CI /syn_in RandomConvergentConnect
} bind % bind improves efficiency
forall
I_neurons
{
/target Set
inpoisson target /syn_ex Connect
E_neurons target CE /syn_ex RandomConvergentConnect
I_neurons target CI /syn_in RandomConvergentConnect
} bind forall
E_neurons Nrec Take
{
exsd Connect
} bind forall
simtime Simulate
% get events, replace vectors with SLI arrays
/ev exsd /events get def
ev keys { /k Set ev dup k get cva k exch put } forall
ev
endusing
} distributed_process_invariant_events_assert_or_die