Personal tools
 

heart10Doc.cpp

Click here to get the file

Size 46.2 kB - File type text/x-c++src

File contents

// heart10Doc.cpp : implementation of the CHeart10Doc class
//

#include "stdafx.h"
#include "heart10.h"
#include "math.h"
#include "heart10Doc.h"
#include "heart10View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHeart10Doc

IMPLEMENT_DYNCREATE(CHeart10Doc, CDocument)

BEGIN_MESSAGE_MAP(CHeart10Doc, CDocument)
	//{{AFX_MSG_MAP(CHeart10Doc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHeart10Doc construction/destruction

CHeart10Doc::CHeart10Doc()
{	
	NewCell = TRUE;
	bUserRate = TRUE;
	iVariablePulse = 2;		//which pulse is variable pulse?
}

CHeart10Doc::~CHeart10Doc()
{	
}

BOOL CHeart10Doc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;
	NewCell=TRUE;
	CString Title;
	Title = "Virtual Heart from SNU Laboratory";	
	SetTitle(Title);	
	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CHeart10Doc serialization

void CHeart10Doc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}	
}

/////////////////////////////////////////////////////////////////////////////
// CHeart10Doc diagnostics

#ifdef _DEBUG
void CHeart10Doc::AssertValid() const
{
	CDocument::AssertValid();
}

void CHeart10Doc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHeart10Doc commands

void CHeart10Doc::DefIonVar()
{
	Ke = Ion[2];
    Nae =Ion[0];
    Cae =Ion[4];
    Mgi =Ion[6];
}
   	

void CHeart10Doc::INITIALSETTING()
{
	//----------------------- Default Variable Values before User Defined Value ---------//
	if (!bUserRate)
	{	
		
		//----------------- [Permeability ratio] -----------------------//
		RGKNA = 0.086;		// PK/PNa of INa (voltage gated Na channel) 
		RGITONa = 0.09;		// PNa/PK of Ito (transient outward K-channel)
		RGIsusNa = 0.09;	// PNa/PK of Sustained Outward Na component
		RGIKrNa = 0.09;		// PNa/PK of IKr
		RGIKsNa = 0.04;		// PNa/PK of IKs
		RGILNSCK = 1.4;		// PK/PNa of NSC (non-selective cation channel)
		RGILNSCCA = 0.7;	// PCa/PNa of NSC (non-selective cation channel)
		PCaLNa = 0.0001;	// PNa/PCa of ICaL (L-type Ca-channel)
		PCaLK = 0.002;		// PK/PCa of ICaL (L-type Ca-channel)
		RGfNa = 0.6216;		// PNa/PK of If (hyperpolarization activated current)
	
		//----------------- [ratio of second component rate constants-IKr] ------//
		FS = 0.4;				// IKr channel activation II

		//--------------------- [Ca dynamics] ------------------------------//
		KmTRPN = 0.00077;		// dissociation constant of troponin (KmTRPN)
		KmCMDN= 0.00238;		// dissociation constant of calmodulin (KmCMDN)
		KmCSQN = 0.8;			// dissociation constant of calsequestrin (KmCSQN)
		TRPNt = 70.0e-3;		// total concentration of of troponin in mM/L (TRPNt)
		CMDNt = 50.0e-3;		// total concentration of of calmodulin in mM/L (CMDNt)
		CSQNt = 10.0;			// total concentration of of calsequestrin in mM/L (CSQNt)
		RVrel = 0.02;			//0.004, ratio of Ca releasing store volume to cell volume (RVrel)
		RVup = 0.05;			// 0.18, ratio of Ca uptaking store volume to cell volume (RVup)
		Caupmax = 1.0;			// maximum Ca concentration in uptake site (Caupmax)
		Caupinitial = 2.590;		// initial Ca concentration in uptake pool (C[4][6][L])
		Carelinitial = 9.422;	// initial Ca concentration in release pool (C[5][6][L])
		Taurel = 1.0;			// time constant of release (Taurel)
		Tautr = 2020.0;			// time constant of transfer (Tautr)
		TauUp = 0.05;			// time constant of uptake (TauUp)
		KmCa = 0.001;			// Km value of activation of the Ca release from SR (KmCa)
		SF_Arel = 0.01*2.0;			// amplitude factor for Ca release (Arel)
		SF_Atr = 2.0;			// amplitude factor for Ca transfer (Atr)
		SF_Aup = 2.0;			// amplitude factor for Ca uptake (Aup)
		

		//------------------------- [Na-K pump] --------------------------------//	
		KmNa = 11.0;			// Km value for Na sensitivity of Na-K pump (KmNa)
		Partition_v = 0.32;		// Partition_v of Na-K pump

		//------------------------- [Na-Ca Exchanger] ------------------------------//	
		KNAI = 670;				// dissociation constant for Na at the inner side of the membrane (NaCa exchanger)
		KNAO = 670000;			// dissociation constant for Na at the outer side of the membrane (NaCa exchanger)
		KCaI = 0.00138;			// dissociation constant for Ca at the inner side of the membrane (NaCa exchanger) 
		KCaO = 1.38;			// dissociation constant for Ca at the outer side of the membrane (NaCa exchanger)
		BasalRate = 250.0;		// basal rate constant for the Na-Ca exchanger (BasalRate)
				
		//----------------------- [rectifying field of IK channel] -------------------//
		RectifyingK = 50;		// if minus, then inward rectifying			
	}	

	/*----------------------- Physical Dimension of Cell-------------------------------
	Width = 20 micron, Length = 100 micron, Thickness = 8 micron
	Surface Area = 2 * 100 * 20 + 2 * 100 * 8 + 2 * 20 * 8 = 5920 micron^2 = 5920 * 0.01 pF = 59 pF
	Capacitance by Folding Surface Area = 2.0 * Surface Area = 2.0 * 59 pF = 118 pF
	Cell Volume =  100 * 20 * 8 * 0.5  (um^3) 
	multiply 0.5 because osmoticaly active volume is smaller than the bulk volume	
	See also Fujioka et al, 1998. 3.14 * (30/2)^2 * 100 = 70650 micron^3 
	----------------------------------------------------------------------------------*/    
	Cap =SF[23] * 132.0;													
	Vi = 100.0 * 20.0 * 8.0 / 2.0 * pow(SF[23]*0.132 / 0.132,3.0 / 2.0);		
	Vtotal =Condition[2] * Vi;		// Cell Volume + Pipette Volume
    Vrel = RVrel * Vi;				//0.02  original VOLUME OF SR RELEASING STORE
	Vup = RVup * Vi;				//0.05  original VOLUME OF SR UPTAKE STORE

	//------------------------ Conductance of Ion Channel ----------------------------//
    GIRK1[1] = SF[3] * 0.8 * 1800.0 / 20.0 * SF[23];       //IK1  component, adjusted to give 1.2 nA outward current at -40 mV	
    GNa[1] =SF[4]* 1.875 * 58.0 * SF[23];			//400 'sodium current
    GKr[1] =SF[5]* 132 * 0.108 * 0.3 * SF[23];		//*0.4    0.099  original from Ono. Conductance factor for IK,rapid?
    GITOK[1] =SF[6] * 1.5 * SF[23];					//Transient Outward K component, Cambell et al., J.Gen. Physiol,vol 101,571-601,1993
    GIsusK[1] =SF[7] * 0.3 * SF[23];					//Ca dependent K, K component, Cambell et al., J.Gen. Physiol,vol 101,571-601,1993
    PCaL[1] =SF[8] * 24 * 40 * SF[23]/2.0;			//IcaLAmplitude     '20  Ca Permeability factor for L-Ca channel
    PCaT[1] =SF[9] * 66 * 20 * SF[23];				//T-type Ca channel amplitude
    GIKsK[1] =SF[10] * 0.247 * 2.5 / 2 * SF[23];		//'IKs Amplitude factor , ZengJL et al, 1995, CR 77:140-152
    
    GfK[1] = SF[11] * 1.621 * 7.4 * SF[23] / (1 + RGfNa);
    GfNa[1] = SF[11] * 1.621 * 7.4 * SF[23] * RGfNa / (1 + RGfNa);
    ACh[1] = SF[12] * SF[23];
    GbK[1] = SF[18] * SF[23] / 3.0;
    GSAC[1] = SF[19] *	0.01 * 275 * SF[23] / 2.0;	      //0.04  Ca component conductance
    GILNSCNa[1] = 1.8 * SF[20] * 0.0561 * 1.5 * SF[23];          //leak Na component
	RGILNSCCA = 1.5;	// PCa/PNa of NSC (non-selective cation channel)

	//------------------------- Conductance of Na-K pump --------------------------------//	
	INaKmax[1] = SF[22] * 132.0 * 2.88 * 1.3 * SF[23];	//1.19    'SAKAI ET AL. J.P. 490:51-62

	//------------------------- Conductance of Na-Ca exchanger ------------------------------//
    NumberofCareer = 132.0 * 100.0 * 2000.0 * 4.0 * SF[23];	//(pF*100)um^2 * DENSITY/um^2    
	INaCaMax[1] = SF[21] * NumberofCareer * Elementarycharge * 1000000000000.0 * BasalRate * 1;	//pA    
		
	//--------------------- Ca dynamics ------------------------------//
    Arel = SF_Arel * Vrel * F / Taurel;         //Amplitude factor for Ca release
    Atr = SF_Atr * Vi * F / Tautr;              //Amplitude factor for Ca transfer
    Aup = SF_Aup * Vi * F / TauUp;				//Amplitude factor for Ca uptake
	//Aleak = 0.2 * 450.0 / 2.0;					//Amplitude factor for Ca leak	
	
	
}

void CHeart10Doc::calculatevm()
{ 	

   for (int L = 1;L<=cellNo;L++)
   {
        if (m_AP == 0)
		{
            Vm[L] = Erev;
            iterative = 200;
		}
        else		
		{
           Vm[L] = Pulse[0];
           iterative = 40;
        }
        qr = 0.0;
   }
   
   
   do   
   {
        for (L = 1;L<=cellNo;L++)
		{
            if (fabs(d[L]) > limitfactor)
			{
                Vm[L] = Vm[L] + pow(-1.0, qr) * 0.0005 * qr * iterative;            
			}
        }
		
        CABUFFER();    //to calculate concentration of free Ca in cytosol from x(16,5).
        
		for (L = 1;L<=cellNo;L++)
		{
            VNa[L] = RTF * log(Nae / C[2][6][L]);        //REVERSAL POTENTIAL FOR Na
            VK[L] = RTF * log(Ke / C[1][6][L]);           //REVERSAL POTENTIAL FOR K
            VCa[L] = RTF2 * log(Cae / Caf[L]);        //REVERSAL POTENTIAL FOR Ca
        }
	
        constantfield_noma();			
        RateConstants();         //determine x(y,1) & x(y,2)
        
        for (L = 1;L<=cellNo;L++)
		{
            for (int N = 3;N<=NOP;N++)
			{
                m[N][6][L] = m[N][1][L] / (m[N][1][L] + m[N][2][L]);
                m[N][7][L] = m[N][6][L];
                h[N][6][L] = h[N][1][L] / (h[N][1][L] + h[N][2][L]);
                h[N][7][L] = h[N][6][L];
            }
            
            for (N = 1;N<=3;N++)
			{
                Org[N][6][L] = Org[N][1][L] / (Org[N][1][L] + Org[N][2][L]);
                Org[N][7][L] = Org[N][6][L];
            }			
        
            mm[5][6][L] = mm[5][1][L] / (mm[5][1][L] + mm[5][2][L]);
            mm[5][7][L] = mm[5][6][L];
            hh[4][6][L] = hh[4][1][L] / (hh[4][1][L] + hh[4][2][L]);
            hh[4][7][L] = hh[4][6][L];
            m[3][6][L] = m[3][1][L] / (m[3][1][L] + m[3][2][L] * pow(1 - h[3][3][L],3.0)); //Inward rectifier K current
            m[3][7][L] = m[3][6][L];
		}			
        	DefSteps(FALSE);			
            currentamplitude();
            	
			for (L = 1;L<=cellNo;L++)
			{
			
				if (fabs(d[L]) > limitfactor)
				{
	                Itot_vm[L] = Itot_vm[L] + Vm[L] / (0.001*Condition[1]);
		        }
				if (m_AP == 0)
				{
					d[1] = Itot_vm[1];
					limitfactor = 20;
				}
				else
				{
					d[1] = Pulse[0] - Vm[1] - Itot_vm[1] * (0.001*Condition[0]);
					limitfactor = 0.1;
				}
            
			}        
        qr = qr + 1;
   } while(!(fabs(d[1]) < limitfactor));	
	
        for (L = 1;L<=cellNo;L++)
		{
            for (int N = 3;N<=NOP;N++)
			{
                m[N][7][L] = m[N][6][L];
                h[N][7][L] = h[N][6][L];
            }
    
            mm[5][7][L] = mm[5][6][L];
            hh[4][7][L] = hh[4][6][L];
        
            for (N = 1;N<=3;N++)
			{
                Org[N][7][L] = Org[N][6][L];
            }
                C[6][7][L] = Vm[L];
                C[6][6][L] = C[6][7][L];
        }		
}

void CHeart10Doc::CalSteps()
{
	
	DefIonVar();
	MemoryCurrent();	
	CABUFFER();    //to calculate concentration of free Ca in cytosol from x(16,5).
	for (int L = 1;L<=cellNo;L++)
	{		
		VNa[L] = RTF * log(Nae / C[2][6][L]);        //REVERSAL POTENTIAL FOR Na
		VK[L] = RTF * log(Ke / C[1][6][L]);           //REVERSAL POTENTIAL FOR K
		VCa[L] = RTF2 * log(Cae / Caf[L]);         //REVERSAL POTENTIAL FOR Ca
	}
	RateConstants();         //determine x(y,1) & x(y,2)
	constantfield_noma();
	DefSteps(m_AP);
	
	currentamplitude();
	differen();
	RUNGEKUTTA();         //INTEGRATION of parameters	
	CurrentTime = CurrentTime + timeinterval; 		
}

void CHeart10Doc::dataseparate()
{
}

void CHeart10Doc::CABUFFER()
{
for (int L = 1;L<=cellNo;L++)
{
    int N = 1;
    do
	{
            Caf[L] = C[3][6][L] / (1.0 + (TRPNf[L] / KmTRPN) + (CMDNf[L] / KmCMDN));
            TRPNf[L] = TRPNt / (1.0 + (Caf[L] / KmTRPN));
            CMDNf[L] = CMDNt / (1.0 + (Caf[L] / KmCMDN));
            
            N = N + 1;
	} while(N<=10);
            N = 1;
    do
	{
			Cafrel[L] = C[5][6][L] / (1.0 + (CSQNf[L] / KmCSQN));
            CSQNf[L] = CSQNt / (1.0 + (Cafrel[L] / KmCSQN));
            N = N + 1;            
    } while(N<=10);
}
}

void CHeart10Doc::constantfield_noma()
{			
for (int L = 1;L<=cellNo;L++)
{
	float RectifyingFactor;
	if (bRectify)	//rectifing current equation= Vm[L]
	{
		RectifyingFactor = 50;
	}
	else
	{
		RectifyingFactor = 0;
	}

        RTF = R * (Condition[3]+273.15) / F;
        RTF2 = R * (Condition[3]+273.15) / F / 2.0;
    if (Vm[L] == RectifyingFactor)       //******* constant field for Ca *********
	{
        CaCF[L] = 0.99906;
	}
    else
	{
        CaCF[L] = ((Vm[L] - RectifyingFactor) / RTF2) / (1 - exp(-(Vm[L] - RectifyingFactor) / RTF2));
	}    
        CaCF[L] = CaCF[L] * (Caf[L] * exp(RectifyingFactor / RTF2) - Cae * exp(-(Vm[L] - RectifyingFactor) / RTF2));
                                 
    if (Vm[L] == RectifyingFactor)		//******* constant field for K *********
	{
		KCF[L] = 0.99906;
	}
    else
	{
        KCF[L] = ((Vm[L] - RectifyingFactor) / RTF) / (1.0 - exp(-(Vm[L] - RectifyingFactor) / RTF));
	}
    
        KCF[L] = KCF[L] * (C[1][6][L] * exp(RectifyingFactor / RTF) - Ke * exp(-(Vm[L] - RectifyingFactor) / RTF));

    if (Vm[L] == RectifyingFactor)	        //******* constant field for Na *********
	{
		NaCF[L] = 0.99906;
	}
    else
	{
        NaCF[L] = ((Vm[L] - RectifyingFactor) / RTF) / (1.0 - exp(-(Vm[L] - RectifyingFactor) / RTF));
    }	
        NaCF[L] = NaCF[L] * (C[2][6][L] * exp(RectifyingFactor / RTF) - Nae * exp(-(Vm[L] - RectifyingFactor) / RTF));
}
}

void CHeart10Doc::RateConstants()
{

    if (bUserRate == TRUE)
	{
        RateConstantsUser();
	}
    else
	{
        RateConstantsDefault();     //RateConstantsUser();
	}    
    
	for (int L=1;L<=cellNo;L++)
	{
        //********** Ih current******************************
		m[11][1][L] = exp(-0.0220741 * (Vm[L] + 386.9));	//wilders
		m[11][2][L] = exp(0.052 * (Vm[L] - 73.08));      //wilders
		m[11][3][L] = m[11][1][L] / (m[11][1][L] + m[11][2][L]);
		m[11][4][L] = 1.0 / (m[11][1][L] + m[11][2][L]);
	   
		h[11][1][L] = exp(-0.0220741 * (Vm[L] + 386.9)); //wilders
		h[11][2][L] = exp(0.052 * (Vm[L] - 73.08));	//wilders
		h[11][3][L] = h[11][1][L] / (h[11][1][L] + h[11][2][L]);
		h[11][4][L] = 1.0 / (h[11][1][L] + h[11][2][L]);
        
		//***********Ach-activated K current****************
		if (ACh[L] == 0.0) 
		{
			m[12][1][L] = 0.165 * 0.001 * 1.5;      //spontaneous opening   /msec"
		}
		else
		{
			m[12][1][L] = 12.32 / (1.0 + 4.2 / ACh[L]) * 0.001;
		}
     
		m[12][2][L] = 10.0 * exp(0.0133 * (Vm[L] + 40.0)) * 0.001; //beta of IKACh

		h[12][1][L] = exp(-0.0220741 * (Vm[L] + 386.9));	//wilders
		h[12][2][L] = exp(0.052 * (Vm[L] - 73.08));      //wilders
		h[12][3][L] = h[12][1][L] / (h[12][1][L] + h[12][2][L]);
		h[12][4][L] = 1.0 / (h[12][1][L] + h[12][2][L]);
     
        //************ Ca transfer in the Ca store***************************
	    if (Vm[L] == -64.0)
		{
			Org[2][1][L] = 0.0200047;
		}
		else
		{
			Org[2][1][L] = 0.000625 * 8.0 * (Vm[L] + 64.0) / (exp(0.25 * (Vm[L] + 64.0)) - 1.0);
		}
		Org[2][2][L] = 0.005 * 8.0 / (1.0 + exp(-0.25 * (Vm[L] + 64.0)));

		//------------- Ca uptake in the network SR ---------------------------//
		float k1SERCA = 0.01;			// Kyoto-model, 2003
		float k2SERCA = 1.0;			// Kyoto-model, 2003		
		float k3SERCA = 1.0/(1.0+0.1/4.663);			// Kyoto-model, 2003
		float k4SERCA = 0.01;			// Kyoto-model, 2003
		float KmCai = 0.08;				// mM
		float KmCao = 0.0008;			// mM
		float pE1Ca = 1.0/(1+KmCai/C[4][6][L]);
		float pE2Ca = 1.0/(1+KmCao/Caf[L]);
		float pE1 = 1 - pE1Ca;
		float pE2 = 1 - pE2Ca;
		Org[3][1][L] = k2SERCA*pE2Ca+k4SERCA*pE2;
		Org[3][2][L] = k1SERCA*pE1Ca+k3SERCA*pE1;
  
        //************  NACA EXCHANGE PINGPON ****************
		PNAO = 1.0 / (1.0 + ((1.0 + Cae / KCaO) / (pow(Nae,3.0) / KNAO))); //'PROBABILITY OF Na BINDING		
		PNAI = 1.0 / (1.0 + ((1.0 + Caf[L] / KCaI) / (pow(C[2][6][L],3.0) / KNAI))); //'PROBABILITY OF Na BINDING
		PCAO = 1.0 / (1.0 + ((1.0 + pow(Nae,3.0) / KNAO) / (Cae / KCaO))); //'PROBABILITY OF Na BINDING		
		PCAI = 1.0 / (1.0 + ((1.0 + pow(C[2][6][L],3.0) / KNAI) / (Caf[L] / KCaI))); //'PROBABILITY OF Na BINDING
	
		k12 = PCAO;
		k21 = PCAI;
		K30[L] = exp(Partition_v * Vm[L] / RTF) * PNAI;
		K03[L] = exp((Partition_v - 1.0) * Vm[L] / RTF) * PNAO;
		Org[1][2][L] = K30[L] + k21;    //RATE FROM PXI
		Org[1][1][L] = K03[L] + k12;   //RATE TO   PXI

		/*------------------ RyR and SR Ca2+ kinetics -------------------------------//
		RyR channel
		(1) C -> O
			kco = 280000*[Ca2+]i^2 - 150*ICaL*P(openCaL)	
		(2) O -> U
			kou = 0.08/(1+0.36/[Ca]rel)
		(3) U <-> C
			kuc = 0.000377*[Ca]rel^2
			kcu = 0.000849

		I(RyR) = P(RyR)*([Ca]rel - [Ca]i)*P(openRyR)
		P(RyR) = 62000
		//----------------------------------------------------------------------------*/
		kco[L] = 280000.0*pow(Caf[L], 2.0) - 150.0*0.0676*CaCF[L]*m[8][6][L]*h[8][6][L];
		kou[L] = 0.08/(1+0.36/Cafrel[L]);
		kuc[L] = 0.000377*pow(Cafrel[L], 2.0);
		kcu[L] = 0.000849;
	}
}

void CHeart10Doc::currentamplitude()
{
float RKCF;
float RKCF2;
float Tune;
for (int L = 1;L<=cellNo;L++)
{
	//------------------- SODIUM CURRENT ----------------------------------------------------------//
    ii[4][1][L] = pow(m[4][6][L],3.0) * h[4][6][L] * hh[4][6][L] * GNa[L] * RGKNA * KCF[L];
    ii[4][2][L] = pow(m[4][6][L],3.0) * h[4][6][L] * hh[4][6][L] * GNa[L] * NaCF[L];		//(E - VNa)
    ii[4][4][L] = ii[4][1][L] + ii[4][2][L];

	//************* Capacitive transient****
    if (timeintervalb == 0)
	{
    	Icap[L] = Cap * C[6][5][L];
	}
    else
	{
    	Icap[L] = Cap * (C[6][6][L] - C[6][7][L]) / timeintervalb;
	}
			
	//******** Ito **********
    ii[6][1][L] = (m[6][6][L] * h[6][6][L]) * GITOK[L] * KCF[L];
    ii[6][2][L] = (m[6][6][L] * h[6][6][L]) * GITOK[L] * RGITONa * NaCF[L];
    ii[6][4][L] = ii[6][1][L] + ii[6][2][L];
    
	

	//******** Isus **********
    ii[7][1][L] = m[7][6][L] * h[7][6][L] * GIsusK[L] * KCF[L];
    ii[7][2][L] = m[7][6][L] * h[7][6][L] * GIsusK[L] * RGIsusNa * NaCF[L];
    ii[7][4][L] = ii[7][1][L] + ii[7][2][L];

	//******* L-type Ca channel ***********
    ICaLCainf = PCaL[L]* CaCF[L];
    ICaLKinf = PCaLK * PCaL[L] * KCF[L];
    ICaLNainf = PCaLNa * PCaL[L] * NaCF[L];
    ii[8][3][L] = ICaLCainf * m[8][6][L] * h[8][6][L];
    ii[8][1][L] = ICaLKinf * m[8][6][L] * h[8][6][L];
    ii[8][2][L] = ICaLNainf * m[8][6][L] * h[8][6][L];
    ii[8][4][L] = ii[8][1][L] + ii[8][2][L] + ii[8][3][L];

	//************ ICaT ****************
    ICaTInf = PCaT[L] * CaCF[L];
    ii[9][4][L] = m[9][6][L] * h[9][6][L]*ICaTInf;
  
	//*************** IKr ***************
    FF = 1-FS;	
    PA = FF * m[5][6][L] + FS * mm[5][6][L];
    PI = h[5][6][L];
	ii[5][1][L] = GKr[L] * PA * PI * (Vm[L] - VK[L]);   //0.099
	ii[5][2][L] = GKr[L] * PA * PI * RGIKrNa * (Vm[L] - VNa[L]);   //0.099
    ii[5][4][L] = ii[5][1][L] + ii[5][2][L];   //0.099
	
	//*********** IRK1 **************
    ii[3][4][L] = GIRK1[L] * (Vm[L] - VK[L]) * pow((Ke / 5.4),0.62) * m[3][6][L] * (1-h[3][3][L]);

	//************** IKs *****************
    ii[10][1][L] = m[10][6][L] * GIKsK[L] * KCF[L];
    ii[10][2][L] = m[10][6][L] * RGIKsNa * GIKsK[L] * NaCF[L];
    ii[10][4][L] = ii[10][1][L] + ii[10][2][L];


	//******** Iha **********
    ii[11][1][L] = GfK[L] * (Vm[L] - VK[L]) * pow(m[11][6][L],2.0);     //Wilders
    ii[11][2][L] = GfNa[L] * (Vm[L] - VNa[L]) * pow(m[11][6][L],2.0);  //Wilders
    ii[11][4][L] = ii[11][1][L] + ii[11][2][L];
 
	//********* iKACh *******
    ii[12][4][L] = 0.27 / 2.0 * Cap * m[12][6][L] * (Vm[L] - VK[L]) / (1.0 + exp((Vm[L] + 20.0) / 20.0));

	//*********** exchangers ***************************
	float RectifyingFactor = 50;
    ii[21][4][L] = INaCaMax[L] * (Org[1][6][L]* K30[L] - (1.0 - Org[1][6][L]) * K03[L]);
    ii[22][4][L] = (1.0 / (1.0 + pow(KmNa / C[2][6][L],1.36))) * (1.0 - pow((Vm[L] - RectifyingFactor) / 125.0 / 2.0 ,2.0)) * INaKmax[L];
	
	//************ background K currents ******************			
	if (Vm[L] == RectifyingK)		//constant field for background K channel
	{
		RKCF = 0.99906;		
	}
    else
	{
        RKCF = ((Vm[L] - RectifyingK) / RTF) / (1.0 - exp(-(Vm[L] - RectifyingK) / RTF));		
	}
	if (RectifyingK == 0)
	{
		Tune = 1.0;
	}
	else
	{
		Tune = pow(fabs(RectifyingK), 0.1*fabs(RectifyingK)/RectifyingK);
	}

		RKCF2 = RKCF * (C[1][6][L] - Ke * exp(-Vm[L] / RTF));	
		ii[18][4][L] = GbK[L] * RKCF2 * Tune ;                   //Conductance X constant field X amplitude tuning   

	/*------------ Stretch-Activated Channel ------------------------------------*/			
    ii[19][2][L] = 1.0 * GSAC[L] * NaCF[L];                   //(E - VCa)    
	ii[19][1][L] = 1.32 * GSAC[L] * KCF[L];                   //(E - VCa)    
	ii[19][3][L] = 0.7 * GSAC[L] * CaCF[L];                   //(E - VCa)    
	ii[19][4][L] = ii[19][2][L]+ii[19][1][L]+ii[19][3][L];             //(E - VCa)    


	/*------------ NONSELECTIVE CATION currents ----------------------------------
	------------------------------------------------------------------------------*/
	ii[20][2][L] = GILNSCNa[L] * NaCF[L] * 1 / (1 + RGILNSCK + RGILNSCCA) ;
    ii[20][1][L] = GILNSCNa[L] * KCF[L] * RGILNSCK / (1 + RGILNSCK + RGILNSCCA);	
	ii[20][3][L] = GILNSCNa[L] * CaCF[L] * RGILNSCCA / (1 + RGILNSCK + RGILNSCCA);	
    ii[20][4][L] = ii[20][1][L] + ii[20][2][L] + ii[20][3][L];
	
	
	/*------------------ RyR and SR Ca2+ kinetics -------------------------------//
		RyR channel
		(1) C -> O
			kco = 280000*[Ca2+]i^2 - 150*ICaL*P(openCaL)	
		(2) O -> U
			kou = 0.08/(1+0.36/[Ca]rel)
		(3) U <-> C
			kuc = 0.000377*[Ca]rel^2
			kcu = 0.000849

		I(RyR) = P(RyR)*([Ca]rel - [Ca]i)*P(openRyR)
		P(RyR) = 62000
	//----------------------------------------------------------------------------*/		
	Irel[L] = 280000.0*50.0/132.0*(Cafrel[L] - Caf[L])*RyROpen[L];				    
	Atr = 386*50.0/132.0;
    Itr[L] = Atr * (C[4][6][L] - Cafrel[L]);
	Ileak[L] = 0.1*459.0*50.0/132.0*(C[4][6][L] - Caf[L]);			// leak component
	float k1SERCA = 0.01;			// Kyoto-model, 2003
	float k2SERCA = 1.0;			// Kyoto-model, 2003
	float KmCai = 0.08;				// mM
	float KmCao = 0.0008;			// mM
	float pE1Ca = 1.0/(1+KmCai/C[4][6][L]);
	float pE2Ca = 1.0/(1+KmCao/Caf[L]);
	float pE1 = 1 - pE1Ca;
	float pE2 = 1 - pE2Ca;
    Iup[L] = 42500.0 * 50.0/132.0 * (k2SERCA*pE2Ca*(1-Org[3][6][L]) - k1SERCA*pE1Ca*Org[3][6][L]);		// Iup[L] = Aup * Caf[L] * (1.0 - (C[4][6][L] / Caupmax));

	//*******************  net ION flux to estimate cellular concentration *****
    ICanet[L] = ii[19][3][L] + ii[20][3][L] + ii[5][2][L] + ii[8][3][L] + ii[9][4][L] - 2.0 * ii[21][4][L] - Irel[L] - Ileak[L] + Iup[L];
    IKnet[L] = ii[19][1][L] + ii[20][1][L] + ii[8][1][L] + ii[5][1][L] + ii[6][1][L]+ ii[7][1][L] + ii[10][1][L] + ii[4][1][L] + ii[3][4][L] - 2.0 * ii[22][4][L] + ii[11][1][L] + ii[12][4][L] + ii[18][4][L];
    INanet[L] = ii[19][2][L] + ii[20][2][L] + ii[8][2][L] + ii[6][2][L] + ii[7][2][L] + ii[4][2][L] + ii[10][2][L] + 3.0 * ii[21][4][L] + 3.0 * ii[22][4][L] + ii[11][2][L];

	//*******************  net current to calculate dV/dt ***********************	
    Itot_vm[L] = ii[3][4][L] + ii[4][4][L] + ii[5][4][L] + ii[6][4][L] + ii[7][4][L] + ii[8][4][L] + ii[9][4][L] + ii[10][4][L] + ii[11][4][L] + ii[12][4][L] + ii[18][4][L] + ii[19][4][L] + ii[20][4][L] + ii[21][4][L] + ii[22][4][L];
    float tempTot;
	if (m_AP == 0)
	{
        Itot[L] = Itot_vm[L] + Iinj[L] + Vm[L] / (0.001*Condition[1]);
		tempTot = fabs(Iinj[L]) + fabs(Vm[L] / (0.001*Condition[1])) + fabs(ii[3][4][L]) + fabs(ii[4][4][L]) + fabs(ii[5][4][L]) + fabs(ii[6][4][L]) + fabs(ii[7][4][L]) + fabs(ii[8][4][L]) + fabs(ii[9][4][L]) + fabs(ii[10][4][L]) + fabs(ii[11][4][L]) + fabs(ii[12][4][L]) + fabs(ii[18][4][L]) + fabs(ii[19][4][L]) + fabs(ii[20][4][L]) + fabs(ii[21][4][L]) + fabs(ii[22][4][L]);		
	}
    else
	{	
        Itot[L] = Itot_vm[L] + Icap[L] + Vm[L] / (0.001*Condition[1]);    
		tempTot = fabs(Icap[L]) + fabs(Vm[L] / (0.001*Condition[1])) + fabs(ii[3][4][L]) + fabs(ii[4][4][L]) + fabs(ii[5][4][L]) + fabs(ii[6][4][L]) + fabs(ii[7][4][L]) + fabs(ii[8][4][L]) + fabs(ii[9][4][L]) + fabs(ii[10][4][L]) + fabs(ii[11][4][L]) + fabs(ii[12][4][L]) + fabs(ii[18][4][L]) + fabs(ii[19][4][L]) + fabs(ii[20][4][L]) + fabs(ii[21][4][L]) + fabs(ii[22][4][L]);
	}
	Itot_up = (tempTot+Itot[L])*0.5;
	Itot_down = (-tempTot+Itot[L])*0.5;
	
}

}

void CHeart10Doc::RateConstantsDefault()
{
for (int L = 1;L<=cellNo;L++)
{
        //************* IRK1 CURRENT  ******************                    
		h[3][1][L] = 12.75*exp(0.035*(Vm[L]-VK[L]-10))/(1+exp(0.015*(Vm[L]-VK[L]-140)));
        h[3][2][L] = 3*exp(-0.048*(Vm[L]-VK[L]-10))*(1+exp(0.064*(Vm[L]-VK[L]-38)))/(1+exp(0.03*(Vm[L]-VK[L]-70)));
        h[3][3][L] = h[3][1][L] / (h[3][1][L] + h[3][2][L]);
        h[3][4][L] = 1 / (h[3][1][L] + h[3][2][L]);

		m[3][1][L] = 1.0/(8000*exp((Vm[L] - VK[L] - 97)/8.5)+7*exp((Vm[L] - VK[L] - 97)/300));
        m[3][2][L] = 1.0/(0.00014*exp((Vm[L] - VK[L] - 97)/(-9.1))+0.2*exp((Vm[L] - VK[L] - 97)/(-500)));       
		m[3][3][L] = m[3][1][L] / (m[3][1][L] + m[3][2][L]);
        m[3][4][L] = 1 / (m[3][1][L] + m[3][2][L]);

		//*************** INa (voltage gated Na current) from Luo and Rudy, circ. res, vol 74(6),1071-1113 ***************
        m[4][3][L] = 1.0 / (1.0 + exp((Vm[L] + 52.0) / (-5.27)));      //steady-state open of m-gate, 1999.4.27 modified from Luo and Rudy
        m[4][4][L] = 0.02 + 1.0 / (0.4 * exp((Vm[L] + 68.0) / (-2.9)) + 0.09 * exp((Vm[L] + 55.0) / 4.7) + 8.0); //tau of m-gate, 1999.4.27 modified
        m[4][1][L] = m[4][3][L] / m[4][4][L]; //alfa of m-gate
        m[4][2][L] = (1.0 - m[4][3][L]) / m[4][4][L]; //beta of m-gate
      
     if (Vm[L] >= -40.0)
	 {
        h[4][1][L] = 0.0;                    //alpha h
        h[4][2][L] = 1.0 / (0.13 * (1.0 + exp((Vm[L] + 10.66) / (-11.1))));   //beta h
        h[4][3][L] = h[4][1][L] / (h[4][1][L] + h[4][2][L]);
        h[4][4][L] = 1.0 / (h[4][1][L] + h[4][2][L]);
        hh[4][1][L] = 0.0;                    //alpha j
        hh[4][2][L] = 0.3 * exp(-0.0000002535 * Vm[L]) / (1.0 + exp(-0.1 * (Vm[L] + 32.0)));  //beta j
        hh[4][3][L] = hh[4][1][L] / (hh[4][1][L] + hh[4][2][L]);
        hh[4][4][L] = 1.0 / (hh[4][1][L] + hh[4][2][L]);
	 }
     else
	 {
        h[4][1][L] = 0.135 * exp((80.0 + Vm[L]) / (-6.8));              //alpha h
        h[4][2][L] = 3.56 * exp(0.079 * Vm[L]) + 310000.0 * exp(0.35 * Vm[L]);
        h[4][3][L] = h[4][1][L] / (h[4][1][L] + h[4][2][L]);
        h[4][4][L] = 1.0 / (h[4][1][L] + h[4][2][L]);
        hh[4][1][L] = (0.000012714 * exp(0.2444 * Vm[L]) - 0.00003474 * exp(-0.04391 * Vm[L])) * (Vm[L] + 37.78) / (1.0 + exp(0.311 * (Vm[L] + 79.23)));
        hh[4][2][L] = 0.1212 * exp(-0.01052 * Vm[L]) / (1.0 + exp(-0.1378 * (Vm[L] + 40.14)));
        hh[4][3][L] = hh[4][1][L] / (hh[4][1][L] + hh[4][2][L]);
        hh[4][4][L] = 1.0 / (hh[4][1][L] + hh[4][2][L]);
     }
       
       
    //------------------  Ik RAPID   -------------------------------------------//
    Painfinite = 1.0 / (1.0 + exp((-23.2 - Vm[L]) / 10.6));
    tauaf = 1000.0 / (37.2 * exp(Vm[L] / 15.9) + 0.96 * exp(-Vm[L] / 22.5));
    tauas = 1000.0 / (4.2 * exp(Vm[L] / 17.0) + 0.15 * exp(-Vm[L] / 21.6));
    m[5][1][L] = Painfinite / tauaf;
    m[5][2][L] = (1.0 - (1.0 / (1.0 + exp((-23.2 - Vm[L]) / 10.6)))) / (1000.0 / (37.2 * exp(Vm[L] / 15.9) + 0.96 * exp(-Vm[L] / 22.5)));
    m[5][3][L] = (1.0 - Painfinite) / tauaf;
    m[5][4][L] = 1.0 / (m[5][1][L] + m[5][2][L]);
    mm[5][1][L] = Painfinite / tauas;
    mm[5][2][L] = (1.0 - Painfinite) / tauas;
    mm[5][3][L] = mm[5][1][L] / (mm[5][1][L] + mm[5][2][L]);
    mm[5][4][L] = 1.0 / (mm[5][1][L] + mm[5][2][L]);
    Piinfinite = 1.0 / (1.0 + exp((Vm[L] + 28.6) / 17.1));
    taui = 2.0;
    h[5][1][L] = Piinfinite / taui;
    h[5][2][L] = (1 - Piinfinite) / taui;
    h[5][3][L] = h[5][1][L] / (h[5][1][L] + h[5][2][L]);
    h[5][4][L] = 1.0 / (h[5][1][L] + h[5][2][L]);
    
    /* ------------------------------- Ito  CURRENT  -----------------------------------
	Apkon M, Nerbonne JM (1991) Characterization of two distinct depolarization-activated
	K+ currents in isolated adult rat ventricular myocytes. J Gen Physiol 97: 973-1011
	1. Reversal potential: -74.2 mV(peak), -66 mV (plateau)
	-----------------------------------------------------------------------------------*/
    m[6][1][L] = 1 / (1.4 * exp(Vm[L]/(-14241)) + 0.35 * exp(Vm[L]/(-15)));
	m[6][2][L] = 1 / (22.7 * exp(Vm[L]/37.9) + 1775 * exp(Vm[L]/8.4));
	m[6][3][L] = m[6][1][L] / (m[6][1][L] + m[6][2][L]);
    m[6][4][L] = 1/ (m[6][1][L] + m[6][2][L]);	
	h[6][1][L] = 1 / (2.5 * exp(Vm[L]/3.2) + 2195 * exp(Vm[L]/23.6));	
	h[6][2][L] = 1 / (40.4 * exp(Vm[L]/(-76022)) + 0.29 * exp(Vm[L]/(-5.4)));
	h[6][3][L] = h[6][1][L] / (h[6][1][L] + h[6][2][L]);
    h[6][4][L] = 1 / (h[6][1][L] + h[6][2][L]);

    //**************Sustained Outward K+ current (Human atrium) **************    
	m[7][1][L] = 1 / (0.0002 * exp(Vm[L]/(-7.2)) + 1.37 * exp(Vm[L]/(-47.8)));
	m[7][2][L] = 1 / (1346 * exp(Vm[L]/(16.0)) + 1600 * exp(Vm[L]/(11.3)));
	m[7][3][L] = m[7][1][L] / (m[7][1][L] + m[7][2][L]);
    m[7][4][L] = 1/ (m[7][1][L] + m[7][2][L]);	
	h[7][1][L] = 1 / (6613 * exp(Vm[L]/135222) + 143392 * exp(Vm[L]/12.1));	
	h[7][2][L] = 1 / (4801 * exp(Vm[L]/(-125)) + 119 * exp(Vm[L]/(-10.3)));
	h[7][3][L] = h[7][1][L] / (h[7][1][L] + h[7][2][L]);
    h[7][4][L] = 1 / (h[7][1][L] + h[7][2][L]);

    
    //----------------- ICA L  CURRENT ------------------------------//
    if (Vm[L]== -30.0)
	{
        m[8][1][L] = 0.02792845;
	}
    else
	{
        m[8][1][L] = 0.01045 * (Vm[L] + 30.0) / (1.0 - exp(-(Vm[L] + 30.0) / 2.5));         //+ .03125 * E / (1 - EXP(-E / 4.8)) 'alpha, activation parameter for L-type Ca channel
	}
    

    if (Vm[L] == 0.0)
	{
        m[8][2][L] = 0.01052639;
	}
    else
	{
        m[8][2][L] = 0.00421 * Vm[L] / (exp(Vm[L] / 2.5) - 1.0);                 //beta
    }
    
    m[8][3][L] = m[8][1][L] / (m[8][1][L] + m[8][2][L]);
    m[8][4][L] = 1.0 / (m[8][1][L] + m[8][2][L]);
 
    if (Vm[L] == -34.0)
	{
        h[8][1][L] = 0.00200021;
	}
    else
	{
        h[8][1][L] = 0.000355 * (Vm[L] + 34.0) / (exp((Vm[L] + 34.0) / 5.633) - 1.0);
	}
    
    h[8][2][L] = 0.0007 * (Vm[L] + 64.0) / (1.0 + exp(-(Vm[L] + 44.0) / 4.16));       //beta
    h[8][3][L] = h[8][1][L] / (h[8][1][L] + h[8][2][L]);
    h[8][4][L] = 1.0 / (h[8][1][L] + h[8][2][L]);

    //************ ICA T  CURRENT *******************************
    DTinfinite = 1.0 / (1.0 + exp(-(Vm[L] + 23.0) / 6.1));
    tauDT = 0.6 + 5.4 / (1.0 + exp(0.03 * (Vm[L] + 100.0)));
    m[9][1][L] = DTinfinite / tauDT;
    m[9][2][L] = (1.0 - DTinfinite) / tauDT;
    m[9][3][L] = m[9][1][L] / (m[9][1][L] + m[9][2][L]);
    m[9][4][L] = 1.0 / (m[9][1][L] + m[9][2][L]);

    FTinfinite = 1.0 / (1 + exp((Vm[L] + 75) / 6.6));
    tauFT = 1.0 + 40.0 / (1 + exp(0.08 * (Vm[L] + 65.0)));
    h[9][1][L] = FTinfinite / tauFT;
    h[9][2][L] = (1.0 - FTinfinite) / tauFT;
    h[9][3][L] = h[9][1][L] / (h[9][1][L] + h[9][2][L]);
    h[9][4][L] = 1.0 / (h[9][1][L] + h[9][2][L]);

             
    //************* IKs CURRENT  *****************
    XsINF = 1.0 / (1.0 + exp(-(Vm[L] - 1.5) / 16.7));
    if (Vm[L] == -30.0)
	{
        TAUxs = 2058.4;
	}
    else
	{
        TAUxs = 0.0000719 * (Vm[L] + 30.0) / (1.0 - exp(-0.148 * (Vm[L] + 30.0)));
        TAUxs = TAUxs + 0.000131 * (Vm[L] + 30.0) / ((exp(0.0687 * (Vm[L] + 30.0)) - 1));
        TAUxs = 1.0 * 2.0 / TAUxs;
	}
    
    m[10][1][L] = XsINF / TAUxs;
    m[10][2][L] = 1.0 / TAUxs - m[10][1][L];
    m[10][3][L] = m[10][1][L] / (m[10][1][L] + m[10][2][L]);
    m[10][4][L] = 1.0 / (m[10][1][L] + m[10][2][L]);
    
    h[10][1][L] = XsINF / TAUxs;
    h[10][2][L] = 1.0 / TAUxs - h[10][1][L];
    h[10][3][L] = h[10][1][L] / (h[10][1][L] + h[10][2][L]);
    h[10][4][L] = 1.0 / (h[10][1][L] + h[10][2][L]);
}
}

void CHeart10Doc::RateConstantsUser()
{
  for (int L = 1;L<= cellNo;L++)
  {
	  for (int N = 3;N<=NOP-2;N++)  
	  {      
            m[N][3][L] = 1 / (1 + exp(-(Vm[L] - RateM[N][1]) / RateM[N][2]));      //voltage dependence of gate
            m[N][4][L] = (RateM[N][3] - RateM[N][4]) * exp(-pow(Vm[L] - RateM[N][5], 2) / RateM[N][6]) + RateM[N][4];   //time constants of gate
            m[N][1][L] = m[N][3][L] / (m[N][4][L] + pow(10,-20));
            m[N][2][L] = (1 - m[N][3][L]) / (m[N][4][L] + pow(10,-20));
            h[N][3][L] = 1 / (1 + exp(-(Vm[L] - RateH[N][1]) / RateH[N][2]));      //voltage dependence of gate
            h[N][4][L] = (RateH[N][3] - RateH[N][4]) * exp(-pow(Vm[L] - RateH[N][5], 2) / RateH[N][6]) + RateH[N][4];   //time constants of gate
            h[N][1][L] = h[N][3][L] / (h[N][4][L] + pow(10,-20));
            h[N][2][L] = (1 - h[N][3][L]) / (h[N][4][L] + pow(10,-20));
	  }
     
            h[3][3][L] = 1 / (1 + exp(-((Vm[L] - VK[L]) - RateH[3][1]) / (RateH[3][2] + pow(10,-20))));  //'voltage dependence of gate
            h[3][4][L] = (RateH[3][3] - RateH[3][4]) * exp(-pow((Vm[L] - VK[L]) - RateH[3][5], 2) / (RateH[3][6] + 1E-20)) + RateH[3][4]; //time constants of gate
            h[3][1][L] = Mgi * h[3][3][L] / (h[3][4][L] + pow(10,-20));
            h[3][2][L] = (1 - h[3][3][L]) / (h[3][4][L] + pow(10,-20));
            h[3][3][L] = h[3][1][L] / (h[3][1][L] + h[3][2][L]);
            h[3][4][L] = 1 / (h[3][1][L] + h[3][2][L]);
            
            m[3][3][L] = 0.5 / (1 + exp(-((Vm[L] - VK[L]) - RateM[3][1]) / (RateM[3][2] + pow(10,-20))));    //'voltage dependence of gate
            m[3][4][L] = (RateM[3][3] - RateM[3][4]) * exp(-pow((Vm[L]- VK[L]) - RateM[3][5], 2) / (RateM[3][6] + 1E-20)) + RateM[3][4]; //time constants of gate
            m[3][1][L] = m[3][3][L] / (m[3][4][L] + pow(10,-20));
            m[3][2][L] = (1 - m[3][3][L]) / (m[3][4][L] + pow(10,-20));
            
            hh[4][3][L] = 1 / (1 + exp(-(Vm[L] - RateHH[4][1]) / RateHH[4][2]));      //voltage dependence of gate
            hh[4][4][L] = (RateHH[4][3] - RateHH[4][4]) * exp(-pow(Vm[L] - RateHH[4][5], 2) / RateHH[4][6]) + RateHH[4][4];   //time constants of gate
            hh[4][1][L] = hh[4][3][L] / (hh[4][4][L] + pow(10,-20));
            hh[4][2][L] = (1 - hh[4][3][L]) / (hh[4][4][L] + pow(10,-20));
            
            mm[5][3][L] = 1 / (1 + exp(-(Vm[L] - RateMM[5][1]) / RateMM[5][2]));      //voltage dependence of gate
            mm[5][4][L] = (RateMM[5][3] - RateMM[5][4]) * exp(-pow(Vm[L] - RateMM[5][5], 2) / RateMM[5][6]) + RateMM[5][4];   //time constants of gate
            mm[5][1][L] = mm[5][3][L] / (mm[5][4][L] + pow(10,-20));
            mm[5][2][L] = (1 - mm[5][3][L]) / (mm[5][4][L] + pow(10,-20));
  }
}

void CHeart10Doc::MemoryCurrent()
{
for (int L = 1;L<=cellNo;L++)
{
 for (int N = 3;N<=NOP;N++)
 {
    ii[N][5][L] = ii[N][4][L];
 }
 
 for (N = 18;N<=22;N++)
 {
    ii[N][5][L] = ii[N][4][L];
 }
 
 Itotb[L] = Itot[L];
 Icapb[L] = Icap[L];
 Cafb[L] = Caf[L];
 Cafrelb[L] = Cafrel[L];
 Itot_downb = Itot_down;
 Itot_upb = Itot_up;
}
}

void CHeart10Doc::RUNGEKUTTA()
{       

//-------- temporary variables for Runge-Kutta integration ----------------------//
float TempNext_1[11], TempNext_2[11], TempNext_3[11], TempNext_4[11];
float TempRyROpen, TempRyRClose;

for (int L = 1;L<=cellNo;L++)
{
    for (int N = 3;N<=NOP;N++)  //dy*t
	{
           m[N][7][L] = m[N][6][L];
           h[N][7][L] = h[N][6][L];
           m[N][6][L] = m[N][7][L] + m[N][5][L] / (m[N][1][L] + m[N][2][L]) * (1 - exp(-(timeinterval) * (m[N][1][L] + m[N][2][L])));
           h[N][6][L] = h[N][7][L] + h[N][5][L] / (h[N][1][L] + h[N][2][L]) * (1 - exp(-(timeinterval) * (h[N][1][L] + h[N][2][L])));
    }
           mm[5][7][L] = mm[5][6][L];
           hh[4][7][L] = hh[4][6][L];
           mm[5][6][L] = mm[5][7][L] + mm[5][5][L] / (mm[5][1][L] + mm[5][2][L]) * (1 - exp(-(timeinterval) * (mm[5][1][L] + mm[5][2][L])));
           hh[4][6][L] = hh[4][7][L] + hh[4][5][L] / (hh[4][1][L] + hh[4][2][L]) * (1 - exp(-(timeinterval) * (hh[4][1][L] + hh[4][2][L])));        
           
           
    for (N = 1;N<=3;N++)           //dy*t
	{
           Org[N][7][L] = Org[N][6][L];
           Org[N][6][L] = Org[N][7][L] + Org[N][5][L] / (Org[N][1][L] + Org[N][2][L]) * (1 - exp(-(timeinterval) * (Org[N][1][L] + Org[N][2][L])));
    }
    
    //------------- Runge-Kutta Integration ----------------------------------------//

	//--------------1st integration
    for (N = 1;N<=5;N++)           //dy*t
	{
           C[N][7][L] = C[N][6][L];
		   TempNext_1[N] = C[N][5][L] * timeinterval;
           C[N][6][L] = C[N][7][L] + 0.5 * TempNext_1[N];	//limit positive number of concentration		   
	}    
    
    C[6][7][L] = C[6][6][L];
	TempNext_1[6] = C[6][5][L] * timeinterval;
    C[6][6][L] = C[6][7][L] + 0.5 * TempNext_1[6];

	//---------- RyR release kinetics --------------------//
	TempRyROpen = RyROpen[L];
	TempRyRClose = RyRClose[L];
	TempNext_1[7] = dRyROpen_dt[L] * timeinterval;
	RyROpen[L] = TempRyROpen + 0.5 * TempNext_1[7];
	TempNext_1[8] = dRyRClose_dt[L] * timeinterval;
	RyRClose[L] = TempRyRClose + 0.5 * TempNext_1[8];

	differen();
	
	//--------------2nd integration
    for (N = 1;N<=5;N++)           //dy*t
	{           
		   TempNext_2[N] = C[N][5][L] * timeinterval;
           C[N][6][L] = C[N][7][L] + 0.5 * TempNext_2[N];	//limit positive number of concentration		   
	}            
	TempNext_2[6] = C[6][5][L] * timeinterval;
    C[6][6][L] = C[6][7][L] + 0.5 * TempNext_2[6];
	//---------- RyR release kinetics --------------------//
	TempNext_2[7] = dRyROpen_dt[L] * timeinterval;
	RyROpen[L] = TempRyROpen + 0.5 * TempNext_2[7];
	TempNext_2[8] = dRyRClose_dt[L] * timeinterval;
	RyRClose[L] = TempRyRClose + 0.5 * TempNext_2[8];

	differen();

	//--------------3rd integration
    for (N = 1;N<=5;N++)           //dy*t
	{           
		   TempNext_3[N] = C[N][5][L] * timeinterval;
           C[N][6][L] = C[N][7][L] + 0.5 * TempNext_3[N];	//limit positive number of concentration		   
	}            
	TempNext_3[6] = C[6][5][L] * timeinterval;
    C[6][6][L] = C[6][7][L] + 0.5 * TempNext_3[6];
	//---------- RyR release kinetics --------------------//
	TempNext_3[7] = dRyROpen_dt[L] * timeinterval;
	RyROpen[L] = TempRyROpen + 0.5 * TempNext_3[7];
	TempNext_3[8] = dRyRClose_dt[L] * timeinterval;
	RyRClose[L] = TempRyRClose + 0.5 * TempNext_3[8];

	differen();

	//--------------4th integration
    for (N = 1;N<=5;N++)           //dy*t
	{           
		   TempNext_4[N] = C[N][5][L] * timeinterval;
           C[N][6][L] = C[N][7][L] + (TempNext_1[N] + 2.0*TempNext_2[N] + 2.0*TempNext_3[N] + TempNext_4[N])/6.0;	//limit positive number of concentration		   
	}            
	TempNext_4[6] = C[6][5][L] * timeinterval;
    C[6][6][L] = C[6][7][L] + (TempNext_1[6] + 2.0*TempNext_2[6] + 2.0*TempNext_3[6] + TempNext_4[6])/6.0;
	Vm[L] = C[6][6][L];
	//---------- RyR release kinetics --------------------//
	TempNext_4[7] = dRyROpen_dt[L] * timeinterval;
	RyROpen[L] = TempRyROpen + (TempNext_1[7] + 2.0*TempNext_2[7] + 2.0*TempNext_3[7] + TempNext_4[7])/6.0;
	TempNext_4[8] = dRyRClose_dt[L] * timeinterval;
	RyRClose[L] = TempRyRClose + (TempNext_1[8] + 2.0*TempNext_2[8] + 2.0*TempNext_3[8] + TempNext_4[8])/6.0;
	
}
}

void CHeart10Doc::differen()
{
	//----------- Determine dy/dt of Hodgkin-Huxley gating --------------------//
    for (int L = 1;L<=cellNo;L++)
	{
        for (int N = 3;N<=NOP;N++)         //NumberOfParameters
		{
            m[N][5][L] = m[N][1][L] * (1.0 - m[N][6][L]) - m[N][2][L] * m[N][6][L];
            h[N][5][L] = h[N][1][L] * (1.0 - h[N][6][L]) - h[N][2][L] * h[N][6][L];
        }
            mm[5][5][L] = mm[5][1][L] * (1.0 - mm[5][6][L]) - mm[5][2][L] * mm[5][6][L];
            hh[4][5][L] = hh[4][1][L] * (1.0 - hh[4][6][L]) - hh[4][2][L] * hh[4][6][L];
            m[3][5][L] = m[3][1][L] * (1.0 - m[3][6][L]) - m[3][2][L] * m[3][6][L] * pow((1.0 - h[3][3][L]),3.0);    
    
		for (N=1;N<=3;N++)         //NumberOfParameters
		{
			Org[N][5][L] = Org[N][1][L] * (1.0 - Org[N][6][L]) - Org[N][2][L] * Org[N][6][L];
		}        

		/*------------------ RyR and SR Ca2+ kinetics -------------------------------//
		RyR channel
		(1) C -> O
			kco = 280000*[Ca2+]i^2 - 150*ICaL*P(openCaL)	
		(2) O -> U
			kou = 0.08/(1+0.36/[Ca]rel)
		(3) U <-> C
			kuc = 0.000377*[Ca]rel^2
			kcu = 0.000849

		I(RyR) = P(RyR)*([Ca]rel - [Ca]i)*P(openRyR)
		P(RyR) = 62000
		//----------------------------------------------------------------------------*/
		dRyROpen_dt[L] = kco[L]*RyRClose[L] - kou[L]*RyROpen[L];
		dRyRClose_dt[L] = kuc[L]*(1-RyRClose[L]-RyROpen[L]) - (kco[L]+kcu[L])*RyRClose[L]; 
		

        C[1][5][L] = -IKnet[L] / Vtotal / F;
        C[2][5][L] = -INanet[L] / Vtotal / F;
        C[3][5][L] = -ICanet[L] / 2.0 / Vtotal / F;	//calculate ion concentration changes, d[I]/dt
        C[4][5][L] = (Iup[L] - Itr[L] - Ileak[L]) / 2.0 / Vup / F;
        C[5][5][L] = (Itr[L] - Irel[L]) / 2.0 / Vrel / F;
    
				//********  Determine dy/dt of Membrane Potential*******
        if (m_AP == 0)
		{
            C[6][5][L] = -1.0 / Cap * Itot[L];
		}
        else
		{
            C[6][5][L] = 1.0 / Cap * ((E - C[6][6][L]) / (0.001*Condition[0]) - Itot[L] + Icap[L]);
        }
    }	
}

void CHeart10Doc::PrepareNextPulse()
{
	if (iVariablePulse == 1)	//if step pulse is Pulse I
	{
		Pulse[2] = Pulse[2] + Pulse[13];
		Pulse[3] = Pulse[3] + Pulse[13];
		Pulse[4] = Pulse[4] + Pulse[14];
		Pulse[7] = Pulse[7] - Pulse[14];		
	}
	else if (iVariablePulse == 2)	//if step pulse is Pulse I
	{
		Pulse[5] = Pulse[5] + Pulse[13];
		Pulse[6] = Pulse[6] + Pulse[13];
		Pulse[7] = Pulse[7] + Pulse[14];
		Pulse[10] = Pulse[10] - Pulse[14];		
	}
	else if (iVariablePulse == 3)	//if step pulse is Pulse I
	{
		Pulse[8] = Pulse[8] + Pulse[13];
		Pulse[9] = Pulse[9] + Pulse[13];
		Pulse[10] = Pulse[10] + Pulse[14];
		Pulse[12] = Pulse[12] - Pulse[14];		
	}
	CurrentTime = 0;
	dataseparate();
	episodeN = episodeN + 1;	
}

void CHeart10Doc::SetTimeInterval()
{
    if (m_FixedTimeInterval<=0)
    {
		if (m_AP == 0)	//current clamp mode
		{		       
			if (fabs(Iinj[1])>0)
			{
				timeinterval =0.03; 
			}
			else
			{
				timeinterval = 0.2 / (1.0 + exp(-(((-fabs(TotalTime - 700.0) + fabs(TotalTime + 700.0)) / 2.0) - 500.0) / 200.0)) * (0.1 + 1.9 / (1 + exp(fabs((-fabs(C[6][5][1] - 0.1) + fabs(C[6][5][1] + 0.1)) / 2.0) / 0.12)));
			}
		}
		else	//voltage clamp mode
		{
 			timeinterval = 0.2 / (1.0 + exp(-(((-fabs(TotalTime - 2500.0) + fabs(TotalTime + 2500.0)) / 2.0) - 500.0) / 130.0)) * (0.1 + 1.9 / (1 + exp(fabs((-fabs(C[6][5][1] - 0.1) + fabs(C[6][5][1] + 0.1)) / 2.0)/ 0.12)));	
		}
     }
     else
     {
		timeinterval=m_FixedTimeInterval;		 
     }
	 timeintervalb = timeinterval;		                	
}

void CHeart10Doc::DefInitialVarPreset()
{
	for(int L=1;L<=cellNo;L++)
	{		
		//------------------- Initialize intracellular ion concentration ----------------------------//
		C[1][6][L] = Ion[3];				//intracellular K concentration
		C[2][6][L] = Ion[1];				//intracellular Na concentration
		C[3][6][L] = Ion[5];				//cytosolic total Ca concentration
		C[4][6][L] = Caupinitial;			//Ca concentration in Ca uptake pool
		C[5][6][L] = Carelinitial;			//Ca concentration of Ca release pool 		

		TRPNf[L] = TRPNt;       //FREE CONCENTRATION OF TROPONIN, mM/L  necessary to start calculation "buffer"
		CMDNf[L] = CMDNt;       //FREE CONCENTRATION OF CALMODULIN, mM/L

		
		//------ Initialize diferential value --------------//
		int N;
		for (N=3;N<=NOP;N++)  //dy*t
		{
           m[N][5][L] = 0;
        }
           mm[2][5][L] = 0;
           hh[1][5][L] = 0;
           
           
		for (N=1;N<=6;N++)           //dy*t
		{
           C[N][5][L] = 0;           
		}	
           
		for (N=1;N<=3;N++)           //dy*t
		{
           Org[N][5][L] = 0;
        }	

		//------ Initialize NaCa exchanger value --------------//		
		Org[1][6][L] = 0.9459136;	//INACA PXI				
		
		//------ Initialize RyR release kinetics ----------------//
		dRyROpen_dt[L] = 0;
		RyRClose[L] = 1;
		RyROpen[L] = 0;
		dRyRClose_dt[L] = 0; 


		// ---- Steady-state values --------------------------//
		C[1][6][L] = 133.300308228;				//intracellular K concentration
		C[2][6][L] = 5.757790565;				//intracellular Na concentration
		C[3][6][L] = 0.00019059;				//cytosolic total Ca concentration
		C[4][6][L] = 0.76;			//Ca concentration in Ca uptake pool
		C[5][6][L] = 5.59;			//Ca concentration of Ca release pool 	
		TRPNf[L] = 0.06984663;       //FREE CONCENTRATION OF TROPONIN, mM/L  necessary to start calculation "buffer"
		CMDNf[L] = 0.049964506;       //FREE CONCENTRATION OF CALMODULIN, mM/L
		Org[1][6][L] = 0.982397199;	
		
		RyRClose[L] = 0.000002070;
		RyROpen[L] = 0.0975252;
	}

	
		

	//----------------------- Setting for Calculation -----------------------------------//
	timeinterval = 0.01;              //0.01 msec
    timeintervalb = 0.01;    
    CurrentTime = 0.0;       //TIME temporally in msec for Runge kutta  

	//------------------- Initialize Difference value to calculate Vm by iterative method ------------------//
	d[1]=1;
	d[2]=0;
  
	//----------------------- Initial Voltage Clamp Setting -----------------------------//
    E = Pulse[0];    
    RTF =  R * (Condition[3]+273.15) / F;
    RTF2 = R * (Condition[3]+273.15) / F / 2.0;
	Ke = Ion[2];
    Nae =Ion[0];
    Cae =Ion[4];
    Mgi =Ion[6];
    Erev = RTF * log((Ke + Nae * 0.002 + Cae * 4 * 0.002) / (C[1][6][1] + C[2][6][1]*0.005 + C[3][6][1] * 4 * 0.005));    
}

void CHeart10Doc::DefSteps(int iAP)
{
    E0 = E;
	float StimulusAmplitude;
	float TimeElapseWithinPulse;	//Elapsed time within pulse	
	TimeElapseWithinPulse=(CurrentTime / Pulse[18] - int(CurrentTime / Pulse[18]))*Pulse[18];
	
    if ((TimeElapseWithinPulse >= 0.0) && (TimeElapseWithinPulse <= Pulse[1]))		
       StimulusAmplitude = Pulse[0];
    
    if ((TimeElapseWithinPulse > Pulse[1]) && (TimeElapseWithinPulse <= (Pulse[4] + Pulse[1])))
       StimulusAmplitude = (Pulse[3] - Pulse[2]) * (TimeElapseWithinPulse - Pulse[1]) / Pulse[4] + Pulse[2];
    
    if ((TimeElapseWithinPulse > (Pulse[1] + Pulse[4])) && (TimeElapseWithinPulse <= (Pulse[1] + Pulse[4] + Pulse[7])))
       StimulusAmplitude = (Pulse[6] - Pulse[5]) * (TimeElapseWithinPulse - Pulse[1] - Pulse[4]) / Pulse[7] + Pulse[5];

    if ((TimeElapseWithinPulse > (Pulse[1] + Pulse[4] + Pulse[7])) && (TimeElapseWithinPulse <= (Pulse[1] + Pulse[4] + Pulse[7] + Pulse[10])))
       StimulusAmplitude = (Pulse[9] - Pulse[8]) * (TimeElapseWithinPulse - Pulse[1] - Pulse[4] - Pulse[7]) / Pulse[10] + Pulse[8];
      
    if ((TimeElapseWithinPulse > (Pulse[1] + Pulse[4] + Pulse[7] + Pulse[10])) && (TimeElapseWithinPulse <= (Pulse[1] + Pulse[4] + Pulse[7] + Pulse[10] + Pulse[12])))
       StimulusAmplitude = Pulse[11];

    if (TimeElapseWithinPulse > (Pulse[1] + Pulse[4] + Pulse[7] + Pulse[10] + Pulse[12]))
	   StimulusAmplitude=Pulse[0];

	if (CurrentTime>(Pulse[18]*Pulse[17]))
	   StimulusAmplitude=Pulse[0];

    if (E == E0) {}
    else
	{
        //LabelCurrentTestPulse.Caption = E & " mV";
	}
	if (iAP==0)
	{
		Iinj[1]=StimulusAmplitude*1000.0;
	}
	else
	{
		E=StimulusAmplitude;
	}  

}