Propellant Characterization

From BurnSim Wiki
Jump to navigation Jump to search

In order to simulate a motor in BurnSim you need your propellant's characterization numbers. This consists of 4 things: Propellant density, C* / ISP*, Burn Rate Exponent (n) and Burn Rate Coefficient (a). Propellant density and C* / ISP* can be determined through ProPep software, or computed directly inside BurnSim 4 itself - see Propellant Thermochemistry. a and n cannot be computed from a formulation by any of those tools - they describe how fast your particular propellant actually burns, and only a real test firing can tell you that. BurnSim 4 can fit them for you from an imported test trace: see Characterizing a propellant inside BurnSim 4.

Using BurnSim 4's built-in thermochemistry

BurnSim 4 can compute C*, specific heat ratio, and molar mass directly from a propellant's ingredient recipe, without needing a separate program - click Ingredients... on the Propellant panel. See Propellant Thermochemistry for the full walkthrough. This is the same kind of calculation as ProPep3 below, powered by NASA's CEA thermochemical data rather than ProPep3's own database, so results are close to but not bit-identical with ProPep3's. Either approach gets you the same four fields; use whichever is more convenient, or cross-check one against the other if you want more confidence in an unusual formulation. Neither one gives you a and n - those still require real test data, see below.

Using ProPep3

ProPep3 is a free Windows program (XP through Windows 7, 32- and 64-bit, and it runs fine on modern Windows too) that computes a propellant's theoretical thermochemical performance from its ingredient formulation - the modern replacement for the original 1980s DOS ProPep. Download the installer (ProPEP3.msi) from that page and run it; a PDF manual is linked from the same page for the full reference. If you're upgrading from an older ProPep3 install, back up your existing database file first - installing the new version overwrites it.

Running an analysis

Enter your propellant as a formulation: each ingredient (oxidizer, fuel, binder, and any additives such as a burn-rate catalyst or opacifier) by weight percentage, along with the chamber pressure you're characterizing at - typically your expected working pressure, since these numbers do shift somewhat with pressure. ProPep3 runs a thermochemical equilibrium calculation on that formulation and reports theoretical performance for it.

If ProPep3 has an ingredient BurnSim's own table is missing, you do not have to retype it: BurnSim can read ProPep3's ingredient file (PEPCODED.DAF) directly and add entries from it to your table. See Importing ingredients from ProPEP for where that file lives and how to bring entries in.

Mapping the output to BurnSim

ProPep3's output covers everything BurnSim needs except a and n - those still require real test data (see below), since they describe how fast your particular propellant actually burns, not just the theoretical energy content of the formulation. From the ProPep3 report:

  • Density - the formulation's theoretical density. Enter it in BurnSim's Density field (lb/in^3) - convert if ProPep3 reports it in g/cc (1 g/cc = 0.036127 lb/in^3).
  • C* (characteristic velocity) - goes straight into BurnSim's C* field (ft/sec).
  • Specific heat ratio (gamma, sometimes labeled k) - goes into BurnSim's Specific heat ratio field.
  • Molar mass (molecular weight of the combustion products) - goes into BurnSim's Molar mass field (g/mol).

These four numbers - density, C*, specific heat ratio, molar mass - are BurnSim's ordinary characterization fields, required for any simulation regardless of erosive burning. Specific heat ratio and molar mass (together with C*) are also everything Lenoir-Robillard and Ma (2020) erosive burning need to derive their flame temperature / gas specific heat. There's nothing extra to look up for erosive burning to work with its defaults.

Optional: erosive burning overrides

The erosive burning override fields on the Propellant panel (beta, viscosity, Prandtl, surface temp, solid heat capacity, combustion temp, surface roughness) are meant to stay blank for most users - BurnSim derives reasonable defaults from the four numbers above. If your ProPep3 report includes a chamber/flame temperature and you'd rather pin BurnSim's Combustion temp override to that reported value instead of the derived one, you can, but it isn't required to get erosive burning working. Mukunda-Paul needs less of the above (see the note on C* on the Erosive Burning page - Mukunda-Paul skips specific heat ratio and molar mass specifically, not C*, which every BurnSim simulation needs): its only optional override, combustion-gas viscosity, isn't part of a standard ProPep3 report - leave it blank and BurnSim uses its nominal default.

Determining Burn Rate (a and n) from Test Data

To get the burn rate exponent (n) and burn rate coefficient (a) you need test data. Specifically, several burn rate / pressure data points. IE, at what rate does the propellant burn at various chamber pressures. A minimum of 3 data points must be used, more is better. The test data can be acquired through the use of a test motor. The design I use is a simple motor that uses 4" diameter end burning grains with interchangeable nozzles and a pressure transducer.

For a much more in-depth treatment of this whole topic - test motor design, strand burners, and the math behind fitting a and n - see Richard Nakka's Solid Propellant Burn Rate page.

Characterization test motor, end burning config.
Characterization test motor, end burning config. Note the ports in the top bulkhead for interchangeable nozzles and a pressure transducer.

Characterization_Motor

You can also use a simple bates grain motor that is designed to keep the Kn as constant as possible, a strand burner, or other techniques. What is important is to get as accurate as possible data points.

Example output of the propellant characterization spreadsheet
Example output of the propellant characterization spreadsheet

Once you have those data points there are several options for getting your Burn Rate Exponent and Coefficent. BurnSim 4 will do it for you from an imported pressure trace - see the next section. You can also use a spreadsheet in Microsoft Excel, which uses some advanced features in Excel to match the data points to a curve and provide the necessary values. Some versions of ProPep will also do this data crunching for you.

Characterizing a propellant inside BurnSim 4

BurnSim 4 fits a and n against a real static-test pressure trace for you. Open it from Action → Characterize Propellant....

Before the tool will open you need all of the following:

  • A motor with at least one grain, using the geometry and nozzle of the motor you actually fired. The fit is only as good as the geometry you give it.
  • An imported test data set, selected on the Test Data tab, with at least two points. Whichever set is selected in that dropdown is the one being fitted against - BurnSim will not pick one for you, because which firing you are fitting is the single most important input here.
  • A propellant assigned to the first grain, with a real C*. The fit needs a C* to work against; set one on the Propellant panel, or compute it from ingredients.
  • An activated copy of BurnSim. Characterization runs hundreds of simulations, far more than an unactivated session's trial limit allows.

The window is modeless, so the main window stays visible while it runs and you can watch the best fit so far being drawn on the graph against your test trace.

What is fitted, and what is not

Only a and n are fitted. C* is shown read-only and stays fixed for the whole run, and Density is an editable input rather than something searched for. That is deliberate: searching all four at once against a handful of aggregate numbers is under-determined - many combinations fit equally well and none of them mean anything. Fix C* and density from your thermochemistry, and let the search answer the one question test data can actually answer.

Three ways to fit

The window offers three buttons. They answer genuinely different questions, and the differences between their answers are informative in their own right.

Measure and Add Point

Start here. This is the one number a single static firing can establish without assuming anything about the propellant:

r̄ = web thickness ÷ burn time, at the mean chamber pressure over that same burn.

Web thickness comes from the grain geometry and burn time comes off the trace. No a, no n, no simulation - a ruler and a stopwatch. Everything else a firing appears to say about burn rate is routed through a simulated surface area, and is therefore only as true as the simulation. This is not.

It offers to store the result against the propellant, after showing you the numbers and warning about anything that makes the point worth less. It never writes to your propellant database on its own.

Collect one of these from each of several firings at different nozzle throat diameters and the ordinary multi-point fit becomes well posed - see Building a burn rate data set below. That is the route to a real characterization, and it accumulates as a side effect of firing motors you were going to fire anyway.

Fit Burn Rate Data

The Characterize Propellant window after Fit Burn Rate Data has run.
The Characterize Propellant window after Fit Burn Rate Data. The fit holds n at the propellant's value and solves for a; the floating-exponent result underneath is a sanity check, and the caveat below it names the reason this firing cannot determine the exponent.

Integrates the burn depth forward through your measured pressure trace, works out the burning surface area the geometry gives at each of those depths, and solves for a with n held at the propellant's current value.

Holding n is the honest answer from one firing. A firing determines a well; it does not determine n, for a reason worth understanding:

Chamber pressure follows Kn as Pc ∝ Kn1/(1−n), so the exponent is read off the shape of pressure against Kn. A single BATES grain sweeps Kn by only about 10% over its whole burn. Every systematic error in the experiment - nozzle erosion, a time-base offset, erosive burning, corner rounding as the grain regresses - is comparable to or larger than that signal. Firing at different throat diameters stretches the same lever arm to a factor of two or three, which is why real characterization is a firing series.

The floating-exponent fit is still computed and reported underneath, as a sanity check rather than a measurement. If it lands far from the held value, suspect the geometry or the trace before you suspect the propellant.

R² is reported, but never read on its own here. A degenerate fit on this kind of data can return a physically impossible exponent at an R² above 0.99 - the number looks like a quality score and is not one. The window prints the pressure span the exponent was measured over alongside it, plus a plain-language caveat whenever the result should not be taken at face value. Read those, not the R².

BurnSim sets the ignition and tail-off transients aside itself before fitting this curve - see Import the whole trace below.

Characterize

A grid search. It steps a from 0.008 to 0.04 and n from 0.2 to 0.6, runs a full simulation at every combination, and scores each one against four aggregate features of your measured trace:

Feature Weight in the score
Burn time 65%
Pressure impulse (area under the trace) 20%
Peak pressure 10%
Average pressure 5%

The score is a weighted sum of squared relative errors, so lower is better and 0 would mean the simulation matched the measured trace exactly on all four. After the coarse pass it runs a refinement pass re-centred on the best point at a tenth the step size. That is hundreds of simulations and it takes a while; Stop ends it early and keeps the best fit found so far, which is often good enough.

All four features are measured over the detected burn rather than over the whole imported file, on both traces - your measured one and each simulated candidate - using the same burn time convention as the other two buttons (Where to set the burn time). Lead-in and tail-off are excluded from all four, so a recording that runs on past burnout no longer tells the search the motor burned longer than it did. The result line reports the burn it measured, and what fraction of the imported file that was.

Changed in BurnSim 4. Earlier versions - and BurnSim 3 - took the measured burn time as simply the last row's time minus the first row's, across everything imported. Fits of a trace you had already trimmed to the burn are unaffected; fits of a trace with a tail on it will move, because the old ones were wrong.

Using the result

The fitted values appear in the Fitted a and Fitted n boxes, and you then have three choices:

  • Graph This Fit - simulates the motor with the fitted values and redraws the main graph, so you can judge the fit against your test trace by eye. Nothing is saved.
  • Save as New Propellant... - saves the fitted a and n as a new propellant (keeping the C* it was characterized against) and assigns it to every grain.
  • Close - throws the fit away and puts the motor back exactly as it was.

Nothing the tool does touches your propellant database until you press Save as New Propellant... (or accept the prompt from Measure and Add Point). While the window is open the fitted values are held on the grains as temporary overrides, so closing is always a clean revert, however many candidates were tried.

Import the whole trace

Import your pressure trace complete, from before ignition to after burnout, and let BurnSim find the burn in it. Earlier versions of this page told you to trim the ignition spike and the post-burnout tail off by hand before characterizing. Do not do that any more - on current versions it costs you accuracy rather than gaining it.

BurnSim finds the transients itself

A raw trace has two regions that are not steady motor operation: the ignition spike, where the igniter briefly over-pressurizes the chamber before the propellant settles, and the tail-off, where the chamber blows down through the nozzle after the propellant is gone.

Neither is burn rate data, and BurnSim excludes both from the curve fit automatically. It finds them by how fast the pressure is moving rather than by how low it is - a transient is a fast pressure, not a low one - so it works whatever your motor's operating pressure happens to be, and it only ever works inward from the two ends of the trace. A genuinely progressive or regressive burn in the middle is never mistaken for a transient.

Why trimming by hand now hurts

Burn rate here is web thickness over burn time, and that needs the whole burn. Cut the tail-off off and the web is unchanged while the burn time is short, so the measured rate comes out high - by roughly however much you cut, in a direction that is consistent enough to look believable. The same applies to Fit Burn Rate Data, which anchors its answer on the web being fully consumed over the burn you gave it.

Cutting the ignition spike costs less, but still shifts where the burn is judged to start.

Characterize is no longer an exception to this. It used to measure your burn time as the width of the whole imported file, which made trimming the tail off genuinely worth doing for that one tool; it now finds the burn the same way everything else does, so trimming gains it nothing either.

BurnSim warns you when an imported trace does not contain the end of the burn - it tells you what percentage of peak pressure the trace still reads at its last data point. That warning fires whether the tail is missing because the recording stopped early or because it was trimmed off; either way the consequence is the same.

Where to set the burn time

Settings → Measured Burn Time chooses how the start and end of the burn are read off the trace. This is not a presentational choice - burn time divides straight into every reported burn rate.

  • Bisected tail-off (default, recommended) - the burn starts where the ignition rise passes half the pressure at its steepest point, and ends where the tail-off falls through half the pressure at its steepest point. This is the standard in professional solid-motor work, and it is the least sensitive of the four to how fast a particular motor happens to decay - which is the thing that varies most between motors and says least about the propellant.
  • 10% of peak pressure / 5% of peak pressure - first crossing up and last crossing down through a fixed fraction of peak. Cruder, but unambiguous and easy to reproduce in a spreadsheet. A lower threshold measures a longer burn and therefore a slower rate.
  • Custom percent of peak... - your own threshold.

All three buttons on the Characterize window use this setting, and Characterize applies it to the simulated trace as well as to yours - so neither is charged for a tail the other does not have.

If a trace has no clear ignition rise and tail-off left to find - one already trimmed hard at both ends, typically - BurnSim measures the whole recorded span instead, exactly as it always did, and the result line says so. Nothing you already trimmed stops working; it simply stops being necessary.

Seeing the transients on the graph

Tick Imported Pressure above the graph, with Use in simulation checked on the Test Data tab. BurnSim draws your imported trace over its full recorded length, independently of how long the simulation ran - so the overhang on the right, past where the simulated pressure line drops to zero, is the tail-off, and the horn at the far left above the level the trace settles onto is the ignition spike.

Building a burn rate data set

A single firing establishes a burn rate at one pressure. Several firings at different nozzle throat diameters establish the curve.

BurnSim stores those measured points against the propellant itself. Open them with Burn Rate Data... on the Propellant panel:

The Burn Rate Data window, listing five firings with the fitted curve beside them.
Five firings at five different throat diameters. The header counts the points, how many are included, and how many distinct throat diameters they represent; the panel on the right reports the fit with the pressure span it was measured over.
  • Every stored firing is listed with its pressure, rate, web, burn time, throat diameter and provenance - which test data set and which motor file it came from - so a point stays auditable years later.
  • Include drops an outlier from the fit without destroying the record of a firing that happened.
  • The log-log scatter plot shows the points against the fitted curve, with excluded points drawn as open circles rather than hidden.
  • Export CSV... writes the set out for a spreadsheet doing full characterization, such as the Excel workbook linked above.
  • Apply Fit to Propellant writes the fitted a and n into the propellant.

The window tells you what the set still needs rather than printing four decimal places regardless:

Points What you get
0-1 No fit. One firing pins down the rate at its own operating pressure and says nothing about the exponent.
2 An exact solve with no residual left over, so there is no way to tell a good fit from a bad one. Provisional until there is a third.
3+ A log-log regression with R², the pressure span it was measured over, and a scatter plot.

Independently of the count, if all the points sit inside a narrow pressure range - less than about a factor of two between the lowest and the highest - the window says so instead of reporting an exponent. Five firings clustered at 230 psi cannot determine n, however good the R² looks. It also counts distinct throat diameters next to the point count, because three firings at the same throat give you one pressure, not three.

Duplicate firings

A repeated firing is legitimate, valuable data; the same firing added twice is not - and numerically the two can be identical. BurnSim checks provenance first and values second:

  • Same test data set from the same motor file - near-certainly a re-add. Blocked, offering Replace (the usual case, after correcting the geometry or changing the burn time convention), Add anyway, or Cancel.
  • Nearly identical values from different provenance - warned about, not blocked. If it is a separate firing, adding it is fine and tightens the estimate.
  • Same throat, similar pressure, different firing - not a duplicate at all. Noted in the summary, because it adds confidence in the rate there but does nothing to constrain n.

Motor files carry their firing history

Measured points travel in the .bsx file as well as in your propellant database, and the two merge when a motor file is loaded: points the file has that your database lacks are added, points your database has that the file lacks are picked up by the file next time it is saved, and duplicates are skipped. BurnSim tells you what moved. Firing records are the one propellant field where neither side is authoritative - every other field describes what the propellant is, but a firing record describes something that happened, so two differing sets are just two people holding different parts of the same history.

If you still run BurnSim 3

Measured burn rate points are stored as a section BurnSim 3 does not know about, in both your propellant database and your .bsx files. BurnSim 3 ignores it harmlessly when reading - a motor file or database with firing records in it opens in BurnSim 3 exactly as it always did.

But BurnSim 3 rewrites only what it knows. If you save your propellant database from BurnSim 3 - which happens any time you add, edit or delete a propellant there - every propellant's stored firing records are dropped, silently and for all propellants, not just the one you edited. The same is true of a .bsx saved from BurnSim 3, and of the ingredient recipes BurnSim 4 stores the same way.

This is not new behaviour and it is not a bug in either program; it is what happens when an older reader round-trips a newer file. If you alternate between the two:

  • Do your propellant editing in BurnSim 4 once you have started recording firings.
  • Keep a copy of burnsim3_propellants.xml (in your Documents folder, shared by both programs) before a session in BurnSim 3.
  • Export CSV... from the Burn Rate Data window is a copy of the measurements that no version of BurnSim can drop, and is worth keeping regardless.

Data problems the tools will reject

Characterization refuses to run on data it cannot interpret, and tells you which row is at fault. Fix these in the grid or the source file:

  • a pressure value that is zero or negative
  • a pressure or time value that isn't a number
  • a time value that does not increase from the row before it