     ----------------------------------------------------------------------
     -- Author      :  David Wallace Croft, CompuServe [76600,102]
     -- Compiler    :  Meridian OpenAda for DOS
     -- Description :  Hodgkin-Huxley neural model for membrane current.
     ----------------------------------------------------------------------

     package HHNM is
     ----------------------------------------------------------------------
     ----------------------------------------------------------------------

     Copyright : constant string :=
       "HHNM v1.11 (C) 1994 David Wallace Croft.  All rights reserved.";

     ----------------------------------------------------------------------
     -- Time parameters for demo
     ----------------------------------------------------------------------

     Time_Delta_Default : constant float := 1.0E-6;
     -- default step length for integration in seconds

     Time_Max_Default : constant float := 0.010; -- formerly 0.040;
     -- default maximum time to calculate in seconds

     TPS_Default : constant float := 1.0E-4;
     -- step length to print results in seconds

     ----------------------------------------------------------------------
     -- Neural values that are constant throughout run
     ----------------------------------------------------------------------

     CM_Default : constant float := 1.0E-6;
     -- default membrance capacitance in Farads per square centimeter

     V_K_Default    : constant float := -77.0E-3;
     V_Na_Default   : constant float := +50.0E-3;
     V_Rest_Default : constant float := -65.0E-3;

     ----------------------------------------------------------------------
     --  neural default constants
     ----------------------------------------------------------------------

     G_K_Mul_Default  : constant float := 36.0E-3;
     G_Na_Mul_Default : constant float := 120.0E-3;
     J_L_Mul_Default  : constant float := 0.3E-3;
     J_L_Sub_Default  : constant float := 10.6E-3;

     ----------------------------------------------------------------------
     -- Constants that do not pass through the interfaces of the procedures
     ----------------------------------------------------------------------

     Tightness : constant float := 1000.0;
     -- Affects how tight the sigmoidal function is.

     J_Stim_Default : constant float := 1.0E-4;

     ----------------------------------------------------------------------

     N_Default : constant float := 3.17676914060697E-01;
     M_Default : constant float := 5.29324852572496E-02;
     H_Default : constant float := 5.96120753508460E-01;

     type Soma_Type is
       record
	 V_Memb : float := V_Rest_Default;
	 N      : float := N_Default;
	 M      : float := M_Default;
	 H      : float := H_Default;
       end record;

     type Status_Type is
       record
	 G_K    :  float; -- Potassium conductance
	 G_Na   :  float; -- Sodium conductance
	 J_K    :  float; -- current of Potassium
	 J_Na   :  float; -- current of Sodium
	 J_L    :  float; -- current of leakage
	 J_Memb :  float; -- current of membrane
       end record;

--   ----------------------------------------------------------------------
--   -- Bandpass_Filter defaults
--   ----------------------------------------------------------------------
--
--   Freq_Min_Default  : constant float :=       0.0; -- Hz
--   Freq_Max_Default  : constant float := +10_000.0; -- Hz
--   Freq_Step_Default : constant float :=       1.0; -- Hz
--
--   Threshold_Default : constant float :=   0.0; -- Volts
--   -- Soma considered spiking if V_Memb >= Threshold.
--
--   DC_Value_Default  : constant float := 5.0e-5; -- Amperes
--   AC_Ampli_Default  : constant float := DC_Value_Default;
--
--   ----------------------------------------------------------------------
--
--   procedure Bandpass_Filter (
--     Freq_Min   : in     float   := Freq_Min_Default;
--     Freq_Max   : in     float   := Freq_Max_Default;
--     Freq_Step  : in     float   := Freq_Step_Default;
--     AC_Ampli   : in     float   := AC_Ampli_Default;
--     DC_Value   : in     float   := DC_Value_Default;
--     Threshold  : in     float   := Threshold_Default;
--     Time_Max   : in     float   := Time_Max_Default;
--     Time_Delta : in     float   := Time_Delta_Default;
--     Print_Step : in     boolean := false;
--     TPS        : in     float   := TPS_Default;
--     CM         : in     float   := CM_Default;
--     V_K        : in     float   := V_K_Default;
--     V_Na       : in     float   := V_Na_Default;
--     V_Rest     : in     float   := V_Rest_Default;
--     G_K_Mul    : in     float   := G_K_Mul_Default;
--     G_Na_Mul   : in     float   := G_Na_Mul_Default;
--     J_L_Mul    : in     float   := J_L_Mul_Default;
--     J_L_Sub    : in     float   := J_L_Sub_Default;
--     Log_File   : in     string  := "";
--     Interpolate_On : in boolean := false );
--
--   procedure Bandpass_Filter_Demo;

     procedure Calc_AB (
       AN     :    out float;
       AM     :    out float;
       AH     :    out float;
       BN     :    out float;
       BM     :    out float;
       BH     :    out float;
       V_Memb      : in     float;
       V_Rest : in     float );

     procedure Comparison (
       Soma_Count  : in    positive := 1;
       Current_Mul : in    float    := J_Stim_Default );

     procedure Demo;

     procedure F_I_Curve (
--     TPS        : in     float := TPS_Default;
       Time_Delta : in     float := Time_Delta_Default;
       CM         : in     float := CM_Default;
       V_K        : in     float := V_K_Default;
       V_Na       : in     float := V_Na_Default;
       V_Rest     : in     float := V_Rest_Default;
       G_K_Mul    : in     float := G_K_Mul_Default;
       G_Na_Mul   : in     float := G_Na_Mul_Default;
       J_L_Mul    : in     float := J_L_Mul_Default;
       J_L_Sub    : in     float := J_L_Sub_Default );

     procedure Fire (
       Save_File  : in     string := "";
       Time_Max   : in     float := Time_Max_Default;
       TPS        : in     float := TPS_Default;
       Time_Delta : in     float := Time_Delta_Default;
       CM         : in     float := CM_Default;
       V_K        : in     float := V_K_Default;
       V_Na       : in     float := V_Na_Default;
       V_Rest     : in     float := V_Rest_Default;
       G_K_Mul    : in     float := G_K_Mul_Default;
       G_Na_Mul   : in     float := G_Na_Mul_Default;
       J_L_Mul    : in     float := J_L_Mul_Default;
       J_L_Sub    : in     float := J_L_Sub_Default );

     procedure Initialize (
       Soma   :    out Soma_Type;
       V_Rest : in     float := V_Rest_Default );

     procedure Print (
       Time   : in     float;
       V_Memb : in     float;
       Status : in     Status_Type );

     procedure Print_Header;

     procedure Soma_HH (
       Status     :    out Status_Type;
       Soma       : in out Soma_Type;
       J_Stim     : in     float;
       CM         : in     float := CM_Default;
       Time_Delta : in     float := Time_Delta_Default;
       V_K        : in     float := V_K_Default;
       V_Na       : in     float := V_Na_Default;
       V_Rest     : in     float := V_Rest_Default;
       G_K_Mul    : in     float := G_K_Mul_Default;
       G_Na_Mul   : in     float := G_Na_Mul_Default;
       J_L_Mul    : in     float := J_L_Mul_Default;
       J_L_Sub    : in     float := J_L_Sub_Default );

     procedure Stimulate (
       Soma       : in out Soma_Type;
       Time       : in out float;
       T_Print    : in out float;
       J_Stim     : in     float;
       Print_On   : in     boolean := true;
       TPS        : in     float   := TPS_Default;
       Time_Delta : in     float   := Time_Delta_Default;
       CM         : in     float   := CM_Default;
       V_K        : in     float   := V_K_Default;
       V_Na       : in     float   := V_Na_Default;
       V_Rest     : in     float   := V_Rest_Default;
       G_K_Mul    : in     float   := G_K_Mul_Default;
       G_Na_Mul   : in     float   := G_Na_Mul_Default;
       J_L_Mul    : in     float   := J_L_Mul_Default;
       J_L_Sub    : in     float   := J_L_Sub_Default );

     ----------------------------------------------------------------------
     ----------------------------------------------------------------------
     end HHNM;
