static void Main(string[] args)
        {
            NeuronRegime   nr;
            ModelSimulator nm;
            Int32          nSamples     = 10000;
            Int32          totalTime    = 1000;
            Boolean        writePotFile = false;
            Double         tolerance    = 1.0e-8;
            Int32          maxTime      = 100000;

#if !DEBUG
            try
            {
#endif
            if (args.Length > 0)
            {
                foreach (String arg in args)
                {
                    String[] parVal = arg.Split(new char[] { '=' });
                    if (parVal[0][0] == '-')
                    {
                        parVal[0] = parVal[0].Substring(1);
                    }
                    if (parVal[0] == "nSamples")
                    {
                        nSamples = Convert.ToInt32(parVal[1]);
                    }
                    else if (parVal[0] == "totalTime")
                    {
                        totalTime = Convert.ToInt32(parVal[1]);
                    }
                    else if (parVal[0] == "w")
                    {
                        writePotFile = true;
                    }
                    else if (parVal[0] == "tolerance")
                    {
                        tolerance = Convert.ToDouble(parVal[1]);
                    }
                    else if (parVal[1] == "maxTime")
                    {
                        maxTime = Convert.ToInt32(parVal[1]);
                    }
                    else if ((parVal[0] == "h") || (parVal[0] == "help"))
                    {
                        Program.PrintHelp();
                        return;
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException(String.Format("Unrecognized parameter! {0}", parVal[0]));
                    }
                }
            }
#if !DEBUG
        }

        catch (Exception e)
        {
            Console.WriteLine("ERROR!");
            Console.WriteLine(e.Message);
            Program.PrintHelp();
            return;
        }
#endif

            nm = new ModelSimulator(NeuronRegime.Bursting);
            //nm.RunModel(nm.HHLeechODE, totalTime, 0.0D);
            CodeTimer.Time(true, nm.HHLeechODE.ToString(), totalTime, nm.HHLeechODE.TimeStep);
            //nm = new ModelSimulator(NeuronRegime.Excitable);
            //nm.RunModel(nm.HHLeechODE, totalTime, 0.0D);

            /*
             * Console.WriteLine("Preparing to measure timestep time...");
             * nr = NeuronRegime.Bursting;
             * nm = new ModelSimulator(nr);
             * System.Threading.Thread.Sleep(3000);
             *
             * Console.WriteLine("Beginning...");
             * Console.WriteLine("-");
             *
             * if (writePotFile)
             * {
             *  nm.RunModel(nm.KTzLogMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.KTzTanhMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.RulkovMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.IzhikevichMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.HHLeechODE, totalTime);//, 0.0D);
             * }
             *
             * nm.RunTimeStepTest(nm.KTzTanhMap, nSamples, totalTime);//, 0.0D);
             * nm.RunTimeStepTest(nm.KTzLogMap, nSamples, totalTime);//, 0.0D);
             * nm.RunTimeStepTest(nm.IzhikevichMap, nSamples, totalTime);//, 0.0D);
             * nm.RunTimeStepTest(nm.RulkovMap, nSamples, totalTime);//, 0.0D);
             * nm.RunTimeStepTest(nm.HHLeechODE, nSamples, totalTime);//, 0.0D);
             *
             * Console.WriteLine("--");
             * Console.WriteLine("Preparing to measure convergence time...");
             * nr = NeuronRegime.Excitable;
             * nm = new ModelSimulator(nr);
             * System.Threading.Thread.Sleep(3000);
             *
             * Console.WriteLine("Beginning...");
             * Console.WriteLine("-");
             *
             * if (writePotFile)
             * {
             *  nm.RunModel(nm.KTzLogMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.KTzTanhMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.RulkovMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.IzhikevichMap, totalTime);//, 0.0D);
             *  nm.RunModel(nm.HHLeechODE, totalTime);//, 0.0D);
             *  nm.ResetModels();
             * }
             *
             * nm.RunFPConvergenceTest(nm.KTzLogMap, nSamples, maxTime, tolerance);//, 0.0D);
             * nm.RunFPConvergenceTest(nm.KTzTanhMap, nSamples, maxTime, tolerance);//, 0.0D);
             * nm.RunFPConvergenceTest(nm.IzhikevichMap, nSamples, maxTime, tolerance);//, 0.0D);
             * nm.RunFPConvergenceTest(nm.RulkovMap, nSamples, maxTime, tolerance);//, 0.0D);
             * nm.RunFPConvergenceTest(nm.HHStdODE, nSamples, maxTime, tolerance);//, 0.0D);
             *
             *
             */
#if DEBUG
            Console.ReadKey();
#endif
        }
        static void Main(string[] args)
        {
            NeuronRegime   nr;
            ModelSimulator nm;
            Int32          nSamples     = DEFAULT_NSAMPLES;
            Int32          totalTime    = DEFAULT_TOTALTIME;
            Boolean        writePotFile = DEFAULT_WRITEPOTFILE;
            Double         tolerance    = DEFAULT_TOLERANCE;
            Int32          maxTime      = DEFAULT_MAXTIME;
            Int32          N            = DEFAULT_N;

#if !DEBUG
            try
            {
#endif
            if (args.Length > 0)
            {
                foreach (String arg in args)
                {
                    String[] parVal = arg.Split(new char[] { '=' });
                    if (parVal[0][0] == '-')
                    {
                        parVal[0] = parVal[0].Substring(1);
                    }
                    if (parVal[0] == "nSamples")
                    {
                        nSamples = Convert.ToInt32(parVal[1]);
                    }
                    else if (parVal[0] == "totalTime")
                    {
                        totalTime = Convert.ToInt32(parVal[1]);
                    }
                    else if (parVal[0] == "w")
                    {
                        writePotFile = true;
                    }
                    else if (parVal[0] == "tolerance")
                    {
                        tolerance = Convert.ToDouble(parVal[1]);
                    }
                    else if (parVal[0] == "maxTime")
                    {
                        maxTime = Convert.ToInt32(parVal[1]);
                    }
                    else if (parVal[0] == "N")
                    {
                        N = Convert.ToInt32(parVal[1]);
                    }
                    else if ((parVal[0] == "h") || (parVal[0] == "help"))
                    {
                        Program.PrintHelp();
                        return;
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException(String.Format("Unrecognized parameter! {0}", parVal[0]));
                    }
                }
            }
#if !DEBUG
        }

        catch (Exception e)
        {
            Console.WriteLine("ERROR!");
            Console.WriteLine(e.Message);
            Program.PrintHelp();
            return;
        }
#endif

            Console.WriteLine("Preparing to measure CPU cycles per timestep...");
            nr = NeuronRegime.Bursting;
            nm = new ModelSimulator(nr, totalTime, tolerance, maxTime, NetworkType.MeanField, N);
            System.Threading.Thread.Sleep(3000);

            Console.WriteLine("Beginning...");
            Console.WriteLine("-");

            if (writePotFile)
            {
                nm.RunModelForData(nm.GLExpMap, totalTime);
                nm.RunModelForData(nm.LIFMap, totalTime);
                nm.RunModelForData(nm.KTzLogMap, totalTime);
                nm.RunModelForData(nm.KTzTanhMap, totalTime);
                nm.RunModelForData(nm.RulkovMap, totalTime);
                nm.RunModelForData(nm.IzhikevichMap, totalTime);
                nm.RunModelForData(nm.HHLeechODE, totalTime);/**/

                // network models
                nm.RunModelForData(nm.NetGLExpMap, totalTime);
                nm.RunModelForData(nm.NetLIFMap, totalTime);
                nm.RunModelForData(nm.NetKTzLogMap, totalTime);
                nm.RunModelForData(nm.NetKTzTanhMap, totalTime);
                nm.RunModelForData(nm.NetRulkovMap, totalTime);
                nm.RunModelForData(nm.NetIzhikevichMap, totalTime);
                nm.RunModelForData(nm.NetHHModelODE, totalTime);
            }

            Console.WriteLine("- Execution cycles/timestep (Cycles/timestep)");

            nm.RunTimeStepTest(nm.KTzTanhMap, nSamples);
            nm.RunTimeStepTest(nm.KTzLogMap, nSamples);
            nm.RunTimeStepTest(nm.GLExpMap, nSamples);
            nm.RunTimeStepTest(nm.LIFMap, nSamples);
            nm.RunTimeStepTest(nm.IzhikevichMap, nSamples);
            nm.RunTimeStepTest(nm.RulkovMap, nSamples);
            nm.RunTimeStepTest(nm.HHLeechODE, nSamples);/**/

            Console.WriteLine("--");
            Console.WriteLine("Preparing to measure convergence time...");
            nr = NeuronRegime.Excitable;
            nm = new ModelSimulator(nr, totalTime, tolerance, maxTime, NetworkType.Linear, N);
            System.Threading.Thread.Sleep(3000);

            Console.WriteLine("Beginning...");
            Console.WriteLine("-");

            if (writePotFile)
            {
                nm.RunModelForData(nm.GLExpMap, totalTime);
                nm.RunModelForData(nm.LIFMap, totalTime);
                nm.RunModelForData(nm.KTzLogMap, totalTime);
                nm.RunModelForData(nm.KTzTanhMap, totalTime);
                nm.RunModelForData(nm.RulkovMap, totalTime);
                nm.RunModelForData(nm.IzhikevichMap, totalTime);
                nm.RunModelForData(nm.HHLeechODE, totalTime);

                // network models
                nm.RunModelForData(nm.NetGLExpMap, totalTime);
                nm.RunModelForData(nm.NetLIFMap, totalTime);
                nm.RunModelForData(nm.NetKTzLogMap, totalTime);
                nm.RunModelForData(nm.NetKTzTanhMap, totalTime);
                nm.RunModelForData(nm.NetRulkovMap, totalTime);
                nm.RunModelForData(nm.NetIzhikevichMap, totalTime);
                nm.RunModelForData(nm.NetHHModelODE, totalTime);

                nm.ResetModels(totalTime, tolerance, maxTime);/**/
            }

            nm.RunFPConvergenceTest(nm.KTzTanhMap, nSamples);
            nm.RunFPConvergenceTest(nm.KTzLogMap, nSamples);
            Console.WriteLine("*** WARNING: No FP Convergence time for GLExp model, since it fires stochastically");
            Console.WriteLine("-");
            Console.WriteLine("*** WARNING: No FP Convergence time for LIF model, since it fires constantly");
            Console.WriteLine("-");
            //nm.RunFPConvergenceTest(nm.GLExpMap, nSamples);
            nm.RunFPConvergenceTest(nm.IzhikevichMap, nSamples);
            nm.RunFPConvergenceTest(nm.RulkovMap, nSamples);
            nm.RunFPConvergenceTest(nm.HHStdODE, nSamples);/**/

            Console.WriteLine("--");
            Console.WriteLine("Preparing to measure network time step CPU cycles...");
            Console.WriteLine("-");
            Console.WriteLine("Linear Network (N = {0}, signal propagation)", N);
            nr = NeuronRegime.Excitable;
            nm = new ModelSimulator(nr, totalTime, tolerance, maxTime, NetworkType.Linear, N);
            System.Threading.Thread.Sleep(3000);

            nm.RunTimeStepTest(nm.NetGLExpMap, nSamples);
            nm.RunTimeStepTest(nm.NetLIFMap, nSamples);
            nm.RunTimeStepTest(nm.NetKTzLogMap, nSamples);
            nm.RunTimeStepTest(nm.NetKTzTanhMap, nSamples);
            nm.RunTimeStepTest(nm.NetRulkovMap, nSamples);
            nm.RunTimeStepTest(nm.NetIzhikevichMap, nSamples);
            nm.RunTimeStepTest(nm.NetHHModelODE, nSamples);

            Console.WriteLine("-");
            Console.WriteLine("Mean Field Network (N = {0}, synchronization)", N);
            nr = NeuronRegime.Bursting;
            nm = new ModelSimulator(nr, totalTime, tolerance, maxTime, NetworkType.MeanField, N);
            System.Threading.Thread.Sleep(3000);

            nm.RunTimeStepTest(nm.NetGLExpMap, nSamples);
            nm.RunTimeStepTest(nm.NetLIFMap, nSamples);
            nm.RunTimeStepTest(nm.NetKTzLogMap, nSamples);
            nm.RunTimeStepTest(nm.NetKTzTanhMap, nSamples);
            nm.RunTimeStepTest(nm.NetRulkovMap, nSamples);
            nm.RunTimeStepTest(nm.NetIzhikevichMap, nSamples);
            nm.RunTimeStepTest(nm.NetHHModelODE, nSamples);


#if DEBUG
            //Console.ReadKey();
#endif
        }
    }