The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Physics::Ballistics::Terminal -- Terminal ballistics formulae.

ABSTRACT

Terminal ballistics is the study of what happens when a projectile impacts its target. This module implements a variety of functions and mathematical formulae useful in the analysis and prediction of terminal ballistic effects.

TWO DOMAINS OF VELOCITY

Some of these functions pertain to the "ballistic" domain, and others pertain to the "hypervelocity" domain. These refer to two different and somewhat ill-defined ranges of velocity. "Ballistic" velocity ranges from about 300 to 1100 meters per second, while "Hypervelocity" ranges from about 1100 meters per second to several tens of thousands of meters per second.

Why does this matter? Because successful models of ballistic interactions are not accurate in the hypervelocity domain, and successful models of hypervelocty interactions are not accurate in the ballistic domain. Thus it is crucial to use the model which is valid for the velocity of interaction you are attempting to predict.

Functions which are only valid in one domain or the other will be thus marked.

REGARDING BULLET DIAMETERS

Some of these functions require the diameter of a projectile as a parameter. Please note that bullet diameters are usually different from the names of their calibers. NATO 5.56mm bullets are actually 5.70mm in diameter, while Russian 5.45mm bullets are actually 5.62mm. .308 caliber bullets really are 0.308 inches in diameter (7.82mm), but .22 Long Rifle bullets are 0.222 inches across. Please do not make assumptions; check before plugging it in!

DEFINITIONS

DU

DU is short for "Depleted Uranium". This denotes any of a number of metallic alloys containing a high fraction of Uranium, the most common of which is 99.25% Uranium and and 0.75% Titanium. This material is extremely dense and hard, and somewhat ductile, making it excellent for armor-piercing projectiles. Contrary to popular myth, DU projectiles are not "nuclear" and do not explode, though in the hypervelocity domain they can be pyrophoric. Nor is DU highly radioactive. It is, however, a heavy metal (like lead, mercury, and arsenic) and therefore toxic.

MILD STEEL

There are many thousands of steel formulations and treatments, resulting in myriad different strengths and hardnesses. "Mild Steel" is a general term for any of a number of inexpensive steels of moderate to low strength and hardness. The steels used in rebar, trench plates, automotive bodies, and other commodity and construction applications tend to be of this type. Mild steels are an inferior material for armor, providing only about 80% of the protection as an equivalent thickness of RHA. Mild steel is often used in military projectile cores (as in America's 7.62mm M80 "Ball") because it is cheap and much more ductile than hardened steels. This ductility makes it less likely to fracture while penetrating its target (whether the target is made of flesh or harder stuff).

RHA

RHA is short for "Rolled Homogenous Armor". It is a commonly-used term for hardened steel armor material in general, or for armor steel which complies with the military specification MIL-A-12560. RHA is also a common standard material for normalizing depth of penetration. It is roughly equivalent to AISI 4340 steel in character, and AISI 4340 is often used in lieu of "real" RHA in laboratory experiments.

Unless otherwise noted, return values representing a depth of penetration should be understood to represent depth of penetration into an RHA target. It is common for armor systems to represent their resistance to penetration in terms of RHA thickness.

WC

WC is short for "Tungsten Carbide". This is a technical ceramic of tungsten and carbon, a dense and hard material of relatively low expense. WC has seen prolific use in armor-piercing projectiles because high density and hardness are both desirable qualities in that role. Being a ceramic, however, it is also brittle, and thus vulnerable to modern composite armors, which use synergistic effects to break up projectiles and thus degrade their penetration capabilities. Thus, WC penetrators are less capable of penetrating composite armor systems than indicated by their RHA equivalence ratings (since their brittleness plays less of a role in limiting their penetration into monolithic steel targets).

WHA

WHA is short for "Tungsten-Heavy Alloy". This denotes any of several metallic alloys containing a high fraction of Tungsten. Some formulations offer high density, hardness and resilience (such as 90% W / 7% Ni / 3% Fe) making them excellent materials for armor-piercing projectiles. Unlike WC, appropriate WHA formulations are not brittle, and are unlikely to break from passing through composite armor systems.

ANNOTATIONS OF SOURCES

Regarding their source, these functions fall into three categories: Some are simple encodings of basic physics (like energy = 1/2 * mass * velocity**2), and these will not be cited. Others are from published works, such as books or trade journals, and these will be cited when possible. A few are products of my own efforts, and will be thus annotated.

OOP INTERFACE

A more integrated, object-oriented interface for these functions is under development.

FUNCTIONS

anderson (length_cm, diam_cm, vel_kps, [penetrator_material,] [deg_angle,] [scaling_factor])

Attempts to estimate how deeply a long-rod projectile will penetrate into RHA (semi-infinite penetration).

This function is based on Anderson's _Accuracy of Perforation Equations_, less 11% correction per that paper's conclusions, and including adjustments from Lakowski for scale, material, and backsurface effects. qv: http://www.tank-net.com/forums/index.php?showtopic=10482&&page=7

ONLY VALID IN HYPERVELOCITY DOMAIN.

    parameter: (float) penetrator length (in cm)

    parameter: (float) penetrator diameter (in cm)

    parameter: (float) penetrator velocity (in kilometers per second)

    parameter: (float or string) OPTIONAL: penetrator material or material multiplier. (defaults to 1.0) Valid values are:

      * an integer, for custom material factors

      * "steel": Hardened steel == 0.50

      * "wha": Tungsten-heavy alloy (NOT tungsten carbide) == 1.00

      * "wc": Tungsten Carbide == 0.72

      * "du": Depleted uranium alloy == 1.13

    parameter: (float) OPTIONAL: angle of impact, 0 == perpendicular to target surface (in degrees, defaults to 0)

    parameter: (float) OPTIONAL: scaling effect, relative to M829A2 dimensions (unitless, defaults to 1.0)

    returns: (float) Depth of penetration (in cm)

boxes (length, width, height, front thickness, back thickness, side thickness, top thickness, underside thickness, density)

Calculates the volumes, mass, and volume-to-mass ratio of a hollow box of rectangular cross-sections.

    parameter: (float) interior distance from front to back (in cm)

    parameter: (float) interior distance from left to right (in cm)

    parameter: (float) interior distance from top to bottom (in cm)

    parameter: (float) thickness of front wall (in cm)

    parameter: (float) thickness of back wall (in cm)

    parameter: (float) thickness of side walls (in cm)

    parameter: (float) thickness of bottom wall (in cm)

    parameter: (float) specific density of wall material (g/cc)

    returns:

      * (float) interior volume (in cc)

      * (float) exterior volume (in cc)

      * (float) total wall mass (in grams)

      * (float) ratio of interior volume to mass (cc/g)

heat_dop(diameter_mm, standoff_distance, [target_density,] [precision_bool], [target_hardness_bhn])

Attempts to predict the depth of penetration of a copper-lined conical shaped charge into steel.

Based on Ogorkiewicz's book, _Design and Development of Fighting Vehicles_, and modified as per _Journal of Battlefield Technology_ Vol 1-1 pp 1. A copy of the JBT chart may be found at:

http://ciar.org/ttk/mbt/news/news.smm.ww2-armor-plate.de5bf54f.0110271532.871cbf@posting.google.com.txt

The author has modified this formula slightly to account for errors observed in Ogorkiewicz's results, relative to empirically derived results.

For better understanding of shaped charge penetration, please review:

http://www.globalsecurity.org/military/systems/munitions/bullets2-shaped-charge.htm

    parameter: (float) cone diameter (in mm)

    parameter: (float or str) standoff distance (multiple of cone diameter if float, else in mm, for instance "80.5mm")

    parameter: (float) OPTIONAL: density of target material (in g/cc, default is 7.86, the density of RHA)

    parameter: (boolean) OPTIONAL: assume precision shaped charge (default is False)

    parameter: (float) OPTIONAL: hardness of target material (in BHN, default is 300, low in the range of RHA hardnesses)

    returns: (int) depth of penetration (in mm)

me2te (mass_efficiency, density)

Given the mass efficiency of a material, returns its thickness efficiency.

This function is used when comparing armor materials on the basis of their RHA equivalence. Mass efficiency is a factor of how much armor mass than RHA mass provides the same resistance to penetration. Conversely, thickness efficiency is a factor of how much less armor thickness than RHA thickness provides the same resistance to penetration.

For instance, if an armor material has a mass efficiency of 4.0, then only a quarter as much mass is needed to provide a given protection level compared to RHA of equivalent protection. A pound of the armor material provides the same protection as four pounds of RHA.

Similarly, if an armor material has a thickness efficiency of 3.0, then only a third as much thickness is needed to provide a given protection level compared to RHA of equivalent protection. An inch of the armor material provides the same protection as three inches of RHA.

If the density of the armor material is known, me2te() and te2me() may be used to convert back and forth between mass efficiency or thickness efficiency, depending on which is known.

    parameter: (float) armor material mass efficiency (unitless, factor relative to RHA)

    parameter: (float) armor material density (g/cc)

    returns: (float) armor material thickness efficiency (unitless, factor relative to RHA)

me2ce (mass_efficiency, cost_usd_per_pound)

Given the mass efficiency of a material, returns its cost efficiency.

See the description of me2te() for more explanation.

This actually returns the cost efficiency relative to AISI 4340 steel, which is often used as a close approximation to RHA. The costs of actual MIL-A-12560 compliant steel are dominated by political factors, which are beyond the scope of this module.

    parameter: (float) armor material mass efficiency (unitless, factor relative to RHA)

    parameter: (float) armor material cost (USA dollars / pound)

    returns: (float) armor material cost efficiency (unitless, factor relative to RHA)

me2cem (mass_efficiency, cost_usd_per_pound)

Given the mass efficiency of a material, returns its cost efficiency relative to mild steel.

See the description of me2ce() for more explanation.

    parameter: (float) armor material mass efficiency (unitless, factor relative to RHA)

    parameter: (float) armor material cost (USA dollars / pound)

    returns: (float) armor material cost efficiency (unitless, factor relative to mild steel)

odermatt (length_cm, diam_cm, vel_mps, target_density, target_uts_kpsi, rod_density, deg_angle, kps_drop_per_km, range_km, target_thickness_cm, [tip_length_cm, kA1, kA2])

Attempts to estimate perforation limit for a long-rod projectile penetrating RHA. Produces more accurate results than Anderson, but also requires more hard-to-get information, and doesn't exactly measure the same thing (perforation limit, vs depth into semi-infinite target).

This function is based on Lanz and Odermatt's paper _Post Perforation Length & Velocity of KE Projectiles with single Oblique Targets_, published in the 15th International Symposium of Ballistics.

ONLY VALID IN HYPERVELOCITY DOMAIN.

Only valid for penetrator length/diameter ratios of 10.0 or higher, unless kA1 and kA2 are provided (which afaik can only be derived empirically, so good luck).

    parameter: (float) penetrator length (in cm)

    parameter: (float) penetrator diameter (in cm)

    parameter: (float) penetrator velocity (in meters per second)

    parameter: (float) target density (in g/cc)

    parameter: (float) target ultimate tensile strength (in kpsi)

    parameter: (float) penetrator density (in g/cc)

    parameter: (float) angle of impact (in degrees, 0 == perpendicular to target surface)

    parameter: (float) target thickness (in cm)

    parameter: (float) OPTIONAL: penetrator tip length (in cm, defaults to three times penetrator diameter)

    parameter: (float) OPTIONAL: kA1 empirically discovered constant (only required for L/D < 10.0)

    parameter: (float) OPTIONAL: kA2 empirically discovered constant (only required for L/D < 10.0)

    returns: (float) Target's perforation limit (in cm)

pc (mass_grains, velocity_fps, distance_feet, diameter_inches, bullet_shape_str, [target_material])

Attempts to estimate how deeply a small-arms projectile will penetrate into a target.

Optimized for projectiles near 7.5mm in diameter, works okay for projectiles as small as 5mm or as large as 14mm.

This function attempts to account for effects of projectile wobble (yaw instability) and the different effects wobble has on different target materials. The bullet is assumed to stabilize eventually, the stabilization distance depending on projectile mass. This feature is a work-in-progress, and should be taken with generous salt.

This function is the original work of the author.

ONLY VALID IN BALLISTIC DOMAIN.

Not recommended for masses outside 55..450 grains range,

Not recommended for velocities outside 1200..3500 feet per second.

Not recommended for unjacketed lead projectiles.

    parameter: (float) penetrator mass (in grains)

    parameter: (float) penetrator velocity (in feet per second)

    parameter: (float) distance between muzzle and target (in feet)

    parameter: (float) penetrator diameter (in inches)

    parameter: (string) penetrator type, describing very approximately the general shape and composition of the projectile. Valid values are:

      * "hp": Hollowpoint, composed of thin brass lining over lead core.

      * "sp": Softpoint (exposed lead tip), composed of thin brass lining over lead core.

      * "bp": FMJ "ball", composed of thin brass lining over lead core.

      * "ms": Mild steel core, with ogival nose shape.

      * "sc": Hard steel core, with truncated-cone nose shape.

      * "hc": Synonym for "sc".

      * "tc": Tungsten-carbide core (not WHA), with truncated-cone nose shape.

      * "wc": Synonym for "tc".

      * "wha": Tungsten heavy alloy core (eg, 90% W / 7% Ni / 3% Fe), with truncated-cone nose shape.

      * "du": Depleted uranium alloy core (99.25% U / 0.75% Ti), with truncated-cone nose shape.

      The hash table mapping these type strings to their numeric penetration factors is available as %Physics::Ballistics::Terminal::Penetrator_Types_H, for ease of reference and modification.

    parameter: (OPTIONAL) (string) target material. Valid target materials are:

      * "pine": Soft, green pine wood.

      * "sand": Loose-packed, dry sand.

      * "brick": Typical firebrick, as often used in residential exterior wall construction.

      * "cinder": Cinderblock, as often used in inexpensive non-residential exterior wall construction.

      * "concrete": Reinforced concrete, poured-in-place.

      * "mild": Mild steel, as often used in civilian construction or automotive body manufacture.

      * "hard": Hardened steel of at least 250BHN, akin to RHA.

    returns: (float) estimated depth of penetration (in mm), rounded to the nearest tenth of a mm.

pc_simple (mass_grains, velocity_fps, diameter_inches, shape_str)

Simple penetration calculator. Attempts to estimate how deeply a small-arms projectile will penetrate into RHA. Optimized for projectiles near 7.5mm in diameter, works okay for projectiles as small as 5mm or as large as 14mm.

This function is the original work of the author.

ONLY VALID IN BALLISTIC DOMAIN.

Not recommended for masses outside 55..450 grains range,

Not recommended for velocities outside 1200..3500 fps range,

Not recommended for unjacketed lead projectiles.

    parameter: (float) penetrator mass (in grains)

    parameter: (float) penetrator velocity (in feet per second)

    parameter: (float) penetrator diameter (in inches)

    parameter: (string) penetrator type, describing very approximately the general shape and composition of the projectile. Valid values are:

      * "hp": Hollowpoint, composed of thin brass lining over lead core.

      * "sp": Softpoint (exposed lead tip), composed of thin brass lining over lead core.

      * "bp": FMJ "ball", composed of thin brass lining over lead core.

      * "ms": Mild steel core, with ogival nose shape.

      * "sc": Hard steel core, with truncated-cone nose shape.

      * "hc": Synonym for "sc".

      * "tc": Tungsten-carbide core (not WHA), with truncated-cone nose shape.

      * "wc": Synonym for "tc".

      * "wha": Tungsten heavy alloy core (eg, 90% W / 7% Ni / 3% Fe), with truncated-cone nose shape.

      * "du": Depleted uranium alloy core (99.25% U / 0.75% Ti), with truncated-cone nose shape.

      The hash table mapping these type strings to their numeric penetration factors is available as %Physics::Ballistics::Terminal::Penetrator_Types_H, for ease of reference and modification.

    parameter: (OPTIONAL) (string or float) thickness efficiency of target material (as ratio to RHA). Defaults to 1.0 (target is RHA).

    returns: (float) estimated depth of penetration into RHA (in mm), rounded over to the nearest tenth of a mm.

hits_score (mass_grains, velocity_fps, diameter_inches)

Computes a projectile's Hornady Index of Terminal Standards (H.I.T.S.) score, an approximation of its lethality.

Personally I think H.I.T.S. severely over-emphasizes bullet mass (the score is proportional to the SQUARE of the bullet mass, times velocity, divided by bullet sectional area). It is included here anyway because there are no really good lethality models, and many big-game hunters like H.I.T.S. (and it is possible that bullet mass really is that important when taking down very large animals).

See also:

http://www.hornady.com/hits

http://www.hornady.com/hits/calculator

http://www.rathcoombe.net/sci-tech/ballistics/myths.html

    parameter: (float) projectile mass (in grains)

    parameter: (float) projectile velocity (in feet per second)

    parameter: (float) projectile diameter (in inches)

    returns: (integer) lethality (HITS score, qv table in http://www.hornady.com/hits)

poncelet(diameter_mm, mass_grains, velocity_fps, target_shear_strength_psi, target_density)

Jean-Victor Poncelet was one of the first to attempt mathematical models of depth of penetration. His formula, developed in the 19th century, attempts to predict the penetration of bullets into flesh-like materials. It is not very good, failing to take into account such factors as bullet nose shape, bullet tumbling within the target, and impacts with bone, horn, or cartilage.

ONLY VALID IN BALLISTIC DOMAIN.

    parameter: (float) penetrator diameter (in mm)

    parameter: (float) penetrator mass (in grains)

    parameter: (float) penetrator velocity (in feet per second)

    parameter: (float) target material shearing strength (in PSI)

    parameter: (float) target density (in g/cc)

    returns: (int) depth of penetration (in mm)

te2me (thickness_efficiency, density)

Given the mass efficiency of a material, returns its thickness efficiency.

See the description of me2te() for more explanation.

    parameter: (float) armor material thickness efficiency (unitless, factor relative to RHA)

    parameter: (float) armor material density (g/cc)

    returns: (float) armor material mass efficiency (unitless, factor relative to RHA)

lethality (grains, velocity_fps)

Approximates the lethality of a projectile impacting a living creature.

THIS FUNCTION IS A WORK IN PROGRESS and currently extremely simple.

Its parameters and output are likely to change in incompatible ways in future releases.

Note the caveats enumerated at http://www.rathcoombe.net/sci-tech/ballistics/myths.html

This function assumes nontrivial tissue penetration occurs. For the moment it is based on observations of a very rough correlation between velocity and mass and permanent tissue cavity volume.

See also Fackler: http://www.ciar.org/ttk/mbt/papers/misc/paper.x.small-arms.wounding-ballistics.patterns_of_military_rifle_bullets.fackler.unk.html

    parameter: (integer) projectile weight (in grains)

    parameter: (integer) projectile velocity (in feet/second)

    returns: (float) lethality relative to 5.56x45mm at point blank range.

hv2bhn (hardness_vickers)

Given a Vickers hardness rating, approximates the equivalent Brinell Hardness Number (via 10/3000 WC method).

Vickers can be converted to other hardness ratings by first converting to BHN, and then converting from BHN to the desired hardness rating.

    parameter: (integer) Vickers Hardness rating

    returns: (float) Brinell Hardness Number (BHN)

bhn2hv (brinell_hardness_number)

Given a Brinell Hardness Number hardness rating (via 10/3000 WC method), approximates the equivalent Vickers Hardness rating.

    parameter: (integer) Brinell Hardness Number (BHN)

    returns: (float) Vickers Hardness rating

hrc2bhn (rockwell_hardness_C)

Given a Rockwell Hardness C rating, approximates the equivalent Brinell Hardness Number (via 10/3000 WC method).

HRC can be converted to other hardness ratings by first converting to BHN, and then converting from BHN to the desired hardness rating.

    parameter: (integer) Rockwell Hardness C, valid ONLY in the range 15..65.

    returns: (float) Brinell Hardness Number (BHN)

bhn2hrc (brinell_hardness_number)

Given a Brinell Hardness Number hardness rating (via 10/3000 WC method), approximates the equivalent Rockwell Hardness C rating.

Approximation is accurate to within 5% near the low end, 2% everywhere else.

    parameter: (integer) Brinell Hardness Number (BHN), valid ONLY in the range 200..770

    returns: (float) Rockwell Hardness C rating

psi2bhn (pounds_per_square_inch)

Given the ultimate tensile strength of a steel formulation in PSI, approximates the equivalent Brinell Hardness Number (via 10/3000 WC method).

Steel UTS PSI can be converted to other hardness ratings by first converting to BHN, and then converting from BHN to the desired hardness rating.

Approximation is accurate to within 2%.

See also:

http://www.monachos.gr/en/resources/hardness_conversion.asp

http://mdmetric.com/tech/hardness.htm

    parameter: (integer) Pounds per square inch

    returns: (float) Brinell Hardness Number (BHN)

bhn2psi (brinell_hardness_number)

Given a Brinell Hardness Number hardness rating (via 10/3000 WC method), approximates the equivalent steel ultimate tensile strength in pounds per square inch.

Approximation is accurate to within 2%.

See also:

http://www.monachos.gr/en/resources/hardness_conversion.asp

http://mdmetric.com/tech/hardness.htm

    parameter: (integer) Brinell Hardness Number (BHN)

    returns: (float) Steel ultimate tensile strength (psi)

TODO

The pc function needs a lot of improvement.

Need a pc function for larger penetrators (for the ballistic domain, as anderson and odermatt suffices for hypervelocity domain).

The stabilization_distance_meters function should take projectile composition into account.

To be really useful the lethality function needs to take wobble, fragmentation and permanent wound cavity volume into account (per Fackler).

The hardness unit conversion functions should be based on Vickers, not Brinell, as Vickers has the wider valid range.