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 ); }
// 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 ); } } } }