void testVolSort()
{
	vector< unsigned int > findVolOrder( const vector< double >& vols );
	vector< double > vols( 8 );
	vols[0] = 7;
	vols[1] = 8;
	vols[2] = 6;
	vols[3] = 5;
	vols[4] = 1;
	vols[5] = 2;
	vols[6] = 3;
	vols[7] = 4;
	vector< unsigned int > order = findVolOrder( vols );
	// The order is the rank of the volume entry, largest should be 0.
	assert( order[0] == 1 );
	assert( order[1] == 0 );
	assert( order[2] == 2 );
	assert( order[3] == 3 );
	assert( order[4] == 7 );
	assert( order[5] == 6 );
	assert( order[6] == 5 );
	assert( order[7] == 4 );

	// This is a sequence which failed in a model test, despite the
	// above test working.
	vols.resize(5);
	vols[0] = 1e-15;
	vols[1] = 3e-15;
	vols[2] = -1;
	vols[3] = 2e-15;
	vols[4] = 5e-15;
	order = findVolOrder( vols );
	assert( order[0] == 4 );
	assert( order[1] == 1 );
	assert( order[2] == 3 );
	assert( order[3] == 0 );
	assert( order[4] == 2 );
}
Ejemplo n.º 2
0
// We assume that the biggest compartment contains all the rest.
// This is not true in synapses, where they are adjacent.
void ReadKkit::assignPoolCompartments()
{
	Id kinetics = Neutral::child( baseId_.eref(), "kinetics" );
	assert( kinetics != Id() );
	vector< unsigned int > volOrder = findVolOrder( vols_ );
	assert( volCategories_.size() == vols_.size() );
	assert( volCategories_.size() == volOrder.size() );

	for ( unsigned int j = 0 ; j < volOrder.size(); ++j ) {
		unsigned int i = volOrder[j];
		if ( vols_[i] < 0 ) // Special case for enz complexes: vol == -1.
			continue;
		string name;
		Id kinId = Neutral::child( baseId_.eref(), "kinetics" );
		assert( kinId != Id() );
		Id comptId;
		// if ( i == maxi )
		if ( j == 0 ) {
			comptId = kinId;
		} else {
			stringstream ss;
			ss << "compartment_" << j;
			name = ss.str();
			comptId = Neutral::child( baseId_.eref(), name );
			if ( comptId == Id() ) 
				comptId = shell_->doCreate( "CubeMesh", baseId_, name, 1 );
		}
		SetGet1< double >::set( comptId, "setVolumeNotRates",vols_[i]);
		/*
		if ( comptId.element()->cinfo()->isA( "CubeMesh" ) ) {
			double side = pow( vols_[i], 1.0 / 3.0 );
			vector< double > coords( 9, side );
			coords[0] = coords[1] = coords[2] = 0;
			// Field< double >::set( comptId, "volume", vols_[i] );
			Field< vector< double > >::set( comptId, "coords", coords );
		} else {
		}
		*/
		// compartments_.push_back( comptId );
		for ( vector< Id >::iterator k = volCategories_[i].begin();
			k != volCategories_[i].end(); ++k ) {
			if ( moveOntoCompartment_ ) {
				if ( ! (getCompt( *k ).id == comptId ) )
					shell_->doMove( *k, comptId );
			}
		}
	}
}