Hi,

First, thank you to all who answered my query, especially Jon for the details on the new tanking system.

I've designed a slightly different system that you all might want to consider.  A small portion of the code is in FG.

Starting in controls.cxx  (version 2.4) you will find at

line #312
        _tiedProperties.Tie( "feed_tank", this, index, &FGControls::get_feed_tank, &FGControls::set_feed_tank )
            ->setAttribute( SGPropertyNode::ARCHIVE, true );

then at line #944
void
FGControls::set_feed_tank( int engine, int tank )
{
    if ( engine == ALL_ENGINES ) {
        for ( int i = 0; i < MAX_ENGINES; i++ ) {
            feed_tank[i] = tank;
            SG_CLAMP_RANGE<int>( feed_tank[i], -1, 8 );
        }
    } else {
        if ( (engine >= 0) && (engine < MAX_ENGINES) ) {
            feed_tank[engine] = tank;
            SG_CLAMP_RANGE<int>( feed_tank[engine], -1, 8 );
        }
    }
}

where the value of feed_tank[engine] is the number of the tank that feeds the engine.   This also provided the ability to set the value via a network interface.  See line #389 in native_ctrls.cxx.  At init time all feed_tank values are set to -1.

        node->getChild( "feed_tank" )->setIntValue( net->feed_tank_to[i] );

This code was incorporated as part of FG back in 2.2 IIRC.

Now here is where things got messy.  Since JSBSim uses a table lookup method for engine models and we were using a physical model it did not fit well into the JSBSim modeling system.  We essentially replaced FGTurbine.cpp with our physical model and made the following changes in the JSBSim code.  In JSBSim.cxx we added at line #635

    eng->SetFuelTank( globals->get_controls()->get_feed_tank(i) ); //JW

and pretty much iviscerated the ConsumeFuel() method in FGEngine.cpp and replaced it with

   if ( Active_Tank >= 0 ) {

             Tank = Propulsion->GetTank(Active_Tank);
            if (Tank->GetType() == FGTank::ttFUEL) {
       //Fshortage += Tank->Drain(CalcFuelNeed()/TanksWithFuel);  // SEE NOTE ABOVE
                Fshortage += Tank->Drain(CalcFuelNeed() );
        }
      } else Starved = true;
  if (Fshortage < 10.00) Starved = true;

so if an engine did not have a tank value of 0 or greater it flamed out or would not start.  This essentially moved all the logic and control of the fuel system out of FG and JSBSim over to the 747 simulator side.  We made one "messy" accomodation for the 737 and added the fuel transfer function for the version of FG that runs the 737 sim. 

    Tank_0 = Propulsion->GetTank(0);
    double center_fuel = Tank_0->GetContents();
    if ( center_fuel < 6000.0 ) transfer = true;
        else if ( center_fuel > 9000.0 ) transfer = false;
    if ( transfer ) {
        Tank_1 = Propulsion->GetTank(1);
        if ( Tank_1->GetContents() > 100.0 ) {
            Tank_0->Fill( 0.040 );
            Tank_1->Drain( 0.040 );
            }
        Tank_2 = Propulsion->GetTank(2);
        if ( Tank_2->GetContents() > 100.0 ) {
            Tank_0->Fill( 0.0401 );
            Tank_2->Drain( 0.0401 );  // just a little nuisance to create an imbalance ;-)
            }
        }

In the 747 sim the hardware fuel control panel, fuel cutoff switches, and software determined which tanks fed which engines and fuel transfers.  This, in turn, was sent via the network interface to FG and onto JSBSim.

With all due respect to Jon and Dave, I think this is a simpler scheme than a priority system, requirinfg less code and logic and greater flexibility for modeling fuel malfunctions external to Fg and JSBSim.  So I throw this idea out there as an alternative.