Accurate TSFC - Thrust Specific Fuel Consumption #381
Replies: 26 comments 29 replies
-
Can't you get your thrust and specific fuel consumption data into the turbine engine model? In which case the mass would decrease correctly as the turbine ran? |
Beta Was this translation helpful? Give feedback.
-
So taking a look at the CFM56 as an example, is the issue that the turbine model only allows you to specify a single value for TSFC and you need it to vary based on Mach and altitude? While the thrust can be specified based on Mach and altitude. Lines 14 to 59 in d1ca6eb |
Beta Was this translation helpful? Give feedback.
-
So currently the turbine source code assumes a single value for TFSC (and ATFSC - augmented thrust). jsbsim/src/models/propulsion/FGTurbine.cpp Lines 455 to 458 in d1ca6eb So my thinking was the user could optionally provide a function for TFSC instead of a single value, much along the lines of the function that is currently supplied for IdleThrust, MilThrust etc. In your case in addition to Mach and altitude as independent variables you could also include engine rating etc. |
Beta Was this translation helpful? Give feedback.
-
@agodemar I've just prototyped and done some basic testing of adding support for TSFC to be optionally specified as a function in the engine model file. Take a look at - seanmcleod@f2c23a9 For testing I added a TSFC function to the CFM56 engine model and tested it with the 737 cruise script. <function name="TSFC">
<table>
<independentVar lookup="row">velocities/mach</independentVar>
<independentVar lookup="column">atmosphere/density-altitude</independentVar>
<tableData>
-10000 0 10000 20000 30000 40000 50000 60000
0.0 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
0.4 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1
0.6 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2
0.8 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3
1.0 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4
</tableData>
</table>
</function> The TSFC element can be left in the engine model file, it will simply be overridden/ignored if there is also a TSFC function. For your case where you have different data for each engine 'rating' then you would simply create a 3D table using breakpoints which map to your |
Beta Was this translation helpful? Give feedback.
-
Currently JSBSim only supports a single static value for TSFC for an engine. <turbine_engine name="CFM56">
<tsfc> 0.657 </tsfc> However it looks like the TSFC value can vary during flight by quite a lot, so providing the ability to specify a function to calculate TSFC during flight would allow users who want to model TSFC more accurately the ability to do so, e.g. as in - seanmcleod@f2c23a9 Some references to the amount of variation in TSFC during flight. Characteristics of the Specific Fuel Consumption for Jet Engines |
Beta Was this translation helpful? Give feedback.
-
@seanmcleod Thank you for working on this. Yes TSFC do vary with flight conditions, Mach number and altitude, and with enging setting a.k.a. "engine rating". This feature that you implemented in your fork enables those users who have these maps of thrust and TSFC to get much more realistic simulations. Especially for turboprops and turbofans. Do we go for a pull request? |
Beta Was this translation helpful? Give feedback.
-
I'm happy to submit a pull request. I've pushed another commit which exposes read-only properties for TSFC and ATSFC so you can easily confirm what value is being used. Repeating Notify (Event 2) executed at time: 100.004333
propulsion/engine[0]/n2 = 97.211420
propulsion/engine[1]/n2 = 97.211420
propulsion/engine[0]/thrust-lbs = 6996.344735
propulsion/engine[1]/thrust-lbs = 6996.344735
velocities/vc-kts = 283.100665
propulsion/engine[0]/tsfc = 0.976481
propulsion/engine[1]/tsfc = 0.976481 One thing I noticed in the source code is the calculation of a jsbsim/src/models/propulsion/FGTurbine.cpp Lines 238 to 239 in d1ca6eb Part of it appears to be a temperature compensation? Not sure about the reasoning behind the 0.84 constant and N2norm values. |
Beta Was this translation helpful? Give feedback.
-
@agodemar you had mentioned originally:
Are you happy that the 'correction' being applied to the supplied TSFC is correct and will give the correct/expected results in terms of the amount of fuel mass burnt per delta-T? |
Beta Was this translation helpful? Give feedback.
-
Doing a quick search on 'corrected TSFC` in the repo I came across this issue with commentary by @bcoconni and @Mike402. Note the mention regarding a number of 'magic' numbers, and wondering where the temperature value of 389.7 comes from in terms of the formula for calculating the corrected TSFC value. |
Beta Was this translation helpful? Give feedback.
-
In terms of corrected TSFC, it looks to me like the JSBSim correction to TFSC is based on the Husk Plot section of https://en.wikipedia.org/wiki/Jet_engine_performance? |
Beta Was this translation helpful? Give feedback.
-
My one concern, when I was implementing the TSFC function option, was whether the user would supply a TSFC function/map that implemented things like temperature correction/denormalisation within it, but then the current code would go ahead and apply it again via the correction TSFC code we have. |
Beta Was this translation helpful? Give feedback.
-
@bcoconni mentioned the following in - #196 (comment) jsbsim/src/models/propulsion/FGTurbine.cpp Lines 238 to 239 in d1ca6eb
And the recent reference: And from https://en.wikipedia.org/wiki/Jet_engine_performance So yes, when we are applying a correction I wonder if T0 really should be 518.4 rather than 389.7. |
Beta Was this translation helpful? Give feedback.
-
I think that's a good idea. If their TSFC data is temperature normalised then they could apply the temperature correction/denormalisation as part of their TSFC function. |
Beta Was this translation helpful? Give feedback.
-
If the TSFC function/table makes use of thrust, e.g. the x-axis in the bucket shaped graph example you posted earlier, or the Husk plot then would there need to be a relationship between |
Beta Was this translation helpful? Give feedback.
-
@agodemar can you post a snippet of some of the TSFC data table/graph etc. that you're using that triggered this discussion? Is it a Husk plot, or does it look similiar to the graph that @bcoconni posted earlier showing the bucket shape? Or something else? |
Beta Was this translation helpful? Give feedback.
-
Talking of using the current thrust as an input to a TSFC function how do you go about ensuring that the thrust value is for the current engine in a multi-engine setup in the engine model file? For example let's say I wanted to replace <function name="TSFC">
<table>
<independentVar lookup="row">velocities/mach</independentVar>
<independentVar lookup="column">atmosphere/density-altitude</independentVar>
<tableData>
-10000 0 10000 20000 30000 40000 50000 60000
0.0 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
0.4 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1
0.6 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2
0.8 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3
1.0 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4
</tableData>
</table>
</function> |
Beta Was this translation helpful? Give feedback.
-
This is an example of nondimensional thrust: |
Beta Was this translation helpful? Give feedback.
-
@bcoconni you seem to have posted the same graph twice. Edit -- actually I mean @agodemar. I presume the |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
@agodemar the pull request was merged last night. I've just submitted another pull request which bypasses the TSFC correction if the user supplies a TSFC function. The assumption is we don't know what corrections/denormalisations may or may not be required, so the user needs to provide them in the TSFC function if need be. Based on the source code implementation we went with it does mean the example I posted earlier won't work as is. So previously I suggested you would add your TSFC function along these lines in the turbine engine model file. <function name="TSFC">
<table>
<independentVar lookup="row">velocities/mach</independentVar>
<independentVar lookup="column">atmosphere/density-altitude</independentVar>
<tableData>
-10000 0 10000 20000 30000 40000 50000 60000
0.0 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
0.4 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1
0.6 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2
0.8 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3
1.0 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4
</tableData>
</table>
</function> Now with the latest commit you would replace the current <tsfc>
<table>
<independentVar lookup="row">velocities/mach</independentVar>
<independentVar lookup="column">propulsion/engine[#]/thrust-lbs</independentVar>
<tableData>
-10000 0 10000 20000 30000 40000 50000 60000
0.0 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
0.4 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1
0.6 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2
0.8 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3
1.0 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4
</tableData>
</table>
</tsfc> I've replaced @bcoconni although I like the <function name="MilThrust">
<table>
<independentVar lookup="row">velocities/mach</independentVar>
<independentVar lookup="column">atmosphere/density-altitude</independentVar>
<tableData>
-10000 0 10000 20000 30000 40000 50000 60000
0.0 1.2600 1.0000 0.7400 0.5340 0.3720 0.2410 0.1490 0.0
0.2 1.1710 0.9340 0.6970 0.5060 0.3550 0.2310 0.1430 0.0
0.4 1.1500 0.9210 0.6920 0.5060 0.3570 0.2330 0.1450 0.0
0.6 1.1810 0.9510 0.7210 0.5320 0.3780 0.2480 0.1540 0.0
0.8 1.2580 1.0200 0.7820 0.5820 0.4170 0.2750 0.1700 0.0
1.0 1.3690 1.1200 0.8710 0.6510 0.4750 0.3150 0.1950 0.0
1.2 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0
</tableData>
</table>
</function> |
Beta Was this translation helpful? Give feedback.
-
Well there is some sort of similar precedent 😉 In terms of a <turbine_engine name="CFM56">
<milthrust> 20000.0 </milthrust>
<bypassratio> 5.9 </bypassratio>
<tsfc> 0.657 </tsfc>
<bleed> 0.04 </bleed>
<function name="MilThrust">
<table>
<independentVar lookup="row">velocities/mach</independentVar>
<independentVar lookup="column">atmosphere/density-altitude</independentVar>
<tableData>
-10000 0 10000 20000 30000 40000 50000 60000
0.0 1.2600 1.0000 0.7400 0.5340 0.3720 0.2410 0.1490 0.0
0.2 1.1710 0.9340 0.6970 0.5060 0.3550 0.2310 0.1430 0.0
0.4 1.1500 0.9210 0.6920 0.5060 0.3570 0.2330 0.1450 0.0
0.6 1.1810 0.9510 0.7210 0.5320 0.3780 0.2480 0.1540 0.0
0.8 1.2580 1.0200 0.7820 0.5820 0.4170 0.2750 0.1700 0.0
1.0 1.3690 1.1200 0.8710 0.6510 0.4750 0.3150 0.1950 0.0
1.2 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0
</tableData>
</table>
</function>
|
Beta Was this translation helpful? Give feedback.
-
Yep, that's why I mentioned 'some sort of similar..', in terms of a user taking a look at an example engine model file and seeing an element and a function with the same name, in this case internally they're multiplied. In my original implementation rather than a multiplication if both were specified the function overrode the element, potentially confusing, or either one could be specified. In the current implementation if both a |
Beta Was this translation helpful? Give feedback.
-
@agodemar the commit to only perform the temperature and thrust correction/denormalisation when using the single tsfc value in the |
Beta Was this translation helpful? Give feedback.
-
Correct, although to be pedantic there may not be any interpolation going on depending on the nature of the user supplied function, i.e. there is no requirement for there to be a table with interpolation, the function may simply be a formula using some input properties without any table lookups. |
Beta Was this translation helpful? Give feedback.
-
Oh, @agodemar one more thing, as @bcoconni pointed out there is one more case where there is some code/logic currently that will override what you may want to achieve with a TSFC function, and that's the idle fuel flow case.
jsbsim/src/models/propulsion/FGTurbine.cpp Line 525 in a00129a jsbsim/src/models/propulsion/FGTurbine.cpp Line 225 in a00129a
|
Beta Was this translation helpful? Give feedback.
-
Been wondering how much C02 we generate for each commit... |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Suppose I have maps of Thrust and Specific Fuel Consumptions, as functions of Mach number, altitude, and engine ratings.
Is it possible to model that?
Beta Was this translation helpful? Give feedback.
All reactions