// Rallpack3 test implementation//// Copyright 2006 John L Baker. All rights reserved.//// File: test_rallpack3.cpp//// Release: 1.0.0// Author: John Baker// Updated: 14 July 2006//// Description://// This implements the rallpack3 test case.#include"bnsf.h"#include"neuron_rallpack.h"#include<iostream>#include<ctime>usingnamespace std;
usingnamespace BNSF;
usingnamespace UOM;
usingnamespace RALLPACK;
voidtest_rallpack3(){
cout<<"Rallpack3 - cable with Na and K channels"<<endl;
int nComp = 1000;
RPNeuron3* cell = newRPNeuron3(nComp);
Number Iinj;
Controller* cont = new Controller;
time_t startTime,endTime;
ExternalRecorder* nearVoltage = newExternalVoltageRecorder(
"test-rallpack-near-vm.txt");
ExternalRecorder* farVoltage = newExternalVoltageRecorder(
"test-rallpack-far-vm.txt");
ExternalRecorder* nearStates = newExternalStateRecorder(
"test-rallpack-near-states.txt");
ExternalRecorder* farStates = newExternalStateRecorder(
"test-rallpack-far-states.txt");
// Set test parameters
Iinj = 0.1*nanoA;
// Connect cell with recorders and controller.
cell->numericIdentifier(1);
cell->nearComp()->addProbe(nearVoltage);
cell->farComp()->addProbe(farVoltage);
// Ion channels states are not part of Rallpack// as such, but may be interesting. Connecting// the recorder with the neuron would capture// the states of ion channels in all compartments,// but this would be of unworkable size for display.
cell->nearComp()->addProbe(nearStates);
cell->farComp()->addProbe(farStates);
cell->addToController(cont);
// Run the simulation
cout<<endl<<"Simulation starting"<<endl;
cont->start();
time(&startTime); // Start current injection
cell->nearComp()->Iinjected(Iinj);
// Set a time step size to compare with genesis results (or not)// Note that accuracy is minimally affected by step size.
cell->solver()->timeStep(250*microsec);
// cell->solver()->timeStep(50*microsec);// cell->solver()->timeStep(1*msec);
cell->solver()->errTol(0.001f);
// Turn off (default) or on debug output from the solver.
cell->solver()->debugPerformance(false);
// Simulate for the required duration
cont->runForDuration(250*msec);
time(&endTime);
cout<<"Time to execute = ";
cout<< (endTime-startTime);
cout<<" sec";
cout<<endl;
cout<<"Simulated time = "<<(cont->evalTime()/UOM::msec);
cout<<" msec"<<endl;
cout<<"Number of compartments = "<<nComp<<endl;
cout<<"Injection current (nanoA) = "<<Iinj/nanoA<<endl;
cout<<"Derivative evaluations = "<<cell->solver()->derivativeEvals()<<endl;
cout<<"Time steps done = "<<cell->solver()->timeStepsDone()<<endl;
cont->finish();
delete cell;
delete nearVoltage;
delete farVoltage;
delete nearStates;
delete farStates;
delete cont;
cout<<"Done with deletes"<<endl;
}