Skip to content
Snippets Groups Projects
Reac.cpp 4.01 KiB
Newer Older
/**********************************************************************
** This program is part of 'MOOSE', the
** Messaging Object Oriented Simulation Environment.
**           Copyright (C) 2003-2010 Upinder S. Bhalla. and NCBS
** It is made available under the terms of the
** GNU Lesser General Public License version 2.1
** See the file COPYING.LIB for the full notice.
**********************************************************************/

#include "header.h"
#include "ElementValueFinfo.h"
#include "lookupVolumeFromMesh.h"
#include "ReacBase.h"
#include "Reac.h"

#define EPSILON 1e-15

const Cinfo* Reac::initCinfo()
{
		//////////////////////////////////////////////////////////////
		// Field Definitions: All inherited from ReacBase
		//////////////////////////////////////////////////////////////
		//////////////////////////////////////////////////////////////
		// MsgDest Definitions: All inherited
		//////////////////////////////////////////////////////////////
		//////////////////////////////////////////////////////////////
		// Shared Msg Definitions: All inherited.
		//////////////////////////////////////////////////////////////
	static Dinfo< Reac > dinfo;
	static Cinfo reacCinfo (
		"Reac",
		ReacBase::initCinfo(),
		0,
		0,
		&dinfo
	);

	return &reacCinfo;
}

static const Cinfo* reacCinfo = Reac::initCinfo();

static const SrcFinfo2< double, double >* subOut =
 	dynamic_cast< const SrcFinfo2< double, double >* >(
					reacCinfo->findFinfo( "subOut" ) );

static const SrcFinfo2< double, double >* prdOut =
 	dynamic_cast< const SrcFinfo2< double, double >* >(
					reacCinfo->findFinfo( "prdOut" ) );

//////////////////////////////////////////////////////////////
// Reac internal functions
//////////////////////////////////////////////////////////////


Reac::Reac( )
		: kf_( 0.1 ), kb_( 0.2 ), sub_( 0.0 ), prd_( 0.0 )
{
	;
}

/*
Reac::Reac( double kf, double kb )
	: kf_( kf ), kb_( kb ), concKf_( 0.1 ), concKb_( 0.2 ),
		sub_( 0.0 ), prd_( 0.0 )
{
	;
}
*/

//////////////////////////////////////////////////////////////
// MsgDest Definitions
//////////////////////////////////////////////////////////////

void Reac::vSub( double v )
{
	sub_ *= v;
}

void Reac::vPrd( double v )
{
	prd_ *= v;
}

void Reac::vProcess( const Eref& e, ProcPtr p )
{
	prdOut->send( e, sub_, prd_ );
	subOut->send( e, prd_, sub_ );
	sub_ = kf_;
	prd_ = kb_;
}

void Reac::vReinit( const Eref& e, ProcPtr p )
{
	sub_ = kf_ = concKf_ /
		convertConcToNumRateUsingMesh( e, subOut, 0 );
	prd_ = kb_ = concKb_ /
		convertConcToNumRateUsingMesh( e, prdOut, 0 );
}

void Reac::vRemesh( const Eref& e )
{
	kf_ = concKf_ / convertConcToNumRateUsingMesh( e, subOut, 0 );
	kb_ = concKb_ / convertConcToNumRateUsingMesh( e, prdOut, 0 );
}

//////////////////////////////////////////////////////////////
// Field Definitions
//////////////////////////////////////////////////////////////

void Reac::vSetNumKf( const Eref& e, double v )
{
	sub_ = kf_ = v;
	double volScale = convertConcToNumRateUsingMesh( e, subOut, false );
	concKf_ = kf_ * volScale;
}

double Reac::vGetNumKf( const Eref& e) const
{
	double kf = concKf_ / convertConcToNumRateUsingMesh( e, subOut, false );
	return kf;
}

void Reac::vSetNumKb( const Eref& e, double v )
{
	prd_ = kb_ = v;
	/*
	double volScale = convertConcToNumRateUsingMesh( e, prdOut, true );
	vector< double > vols;
	getReactantVols( e, subOut, vols );
	assert( vols.size() > 0 );
	volScale /= (vols[0] * NA);
	*/

	double volScale = convertConcToNumRateUsingMesh( e, prdOut, false );
	concKb_ = kb_ * volScale;
}

double Reac::vGetNumKb( const Eref& e ) const
{
	double kb = concKb_ / convertConcToNumRateUsingMesh( e, prdOut, 0 );
	return kb;
}

void Reac::vSetConcKf( const Eref& e, double v )
{
	concKf_ = v;
	sub_ = kf_ = v / convertConcToNumRateUsingMesh( e, subOut, 0 );
}

double Reac::vGetConcKf( const Eref& e ) const
{
	return concKf_;
}

void Reac::vSetConcKb( const Eref& e, double v )
{
	concKb_ = v;
	prd_ = kb_ = v / convertConcToNumRateUsingMesh( e, prdOut, 0 );
}

double Reac::vGetConcKb( const Eref& e ) const
{
	return concKb_;
}