function V = lifModel(~, V,opt)
% lifModel
%   t   - Time in msec.
%   V   - Membrane potential in Volts.
%   opt - Structure with fields:
%         * dt      - Time simulated in one step in milli seconds.
%         * V_PEAK  - Peak value for membrane potential in Volts.
%         * V_RESET - Reset value for membrane potential in Volts.
%         * V_TH    - Threshold voltage for spike in Volts.
%
% RETURN
%   V   - Updated membrane potential in Volts.
%
% DESCRIPTION
%   Leaky Integrate and Fire (LIF) model.

%   Florian Raudies, 09/07/2014, Boston University.

dt          = opt.dt;       % Step width in milli seconds
V_PEAK      = opt.V_PEAK;   % Peak value in Volts.
V_RESET     = opt.V_RESET;  % Reset value in Volts.
V_TH        = opt.V_TH;     % Threshold value in Volts.
C_MEM       = 5.5;          % Membrane capacitance in nano Farad.
G_LEAK      = 10;           % Membrance leaky conductance in nano Siemens.

% Does any of the potentials have the peak value or above?
AbovePeak   = V>=V_PEAK;

% If they have they have the peak value or above then reset.
V(AbovePeak)= V_RESET;

% Does any of the potentials reach a value above threshold?
AboveTh     = V>V_TH;

% If a potental is above threshold set it to the peak value.
V(AboveTh)  = V_PEAK;

% Update all membrane potentials not updated thus far by using the lif eq.
Update      = ~AbovePeak & ~AboveTh;
V(Update)   = V(Update) + dt*10^-3*(G_LEAK/C_MEM*(V_RESET-V(Update)) ...
                                  + opt.I(Update)/C_MEM);