Internally, BlasterSim simulate blasters using control volumes with arbitrary flow connections between control volumes. This allows BlasterSim to simulates spring and pneumatic blasters with the same core simulation code. This also allows simulating more atypical blasters without major code changes.
An isolated control volume numbered is shown in figure 2.1. A single flow connection to the control volume numbered is shown with mass flow rate , a projectile/plunger labeled p with mass , a spring with stiffness , mass , and spring precompression (see figure 1.2 for a graphical definition), cross-sectional area , projectile/plunger position and velocity , and gas mass and energy .
The integers and will be used as indices for control volumes.
Gas mass and energy as chosen as these are conserved variables and it is believed that using conserved variables will lead to better conservation properties in the numerical methods.
A control volume represented like this can be used to represent a variety of scenarios relevant to gas gun interior ballistics, including:
a barrel, where p represents the projectile, represents the projectile location, and and are set to zero;
a plunger tube for springers where p represents the plunger head, and represents the plunger head location;
a constant volume chamber for pneumatics where p represents a solid wall, is set to infinity, and and are set to zero;
a piston tube used in HPA Nerf blasters similar to a plunger tube; and
a constant pressure atmosphere where is arbitrary, and and are set to zero.
The gas mass could be composed of multiple species in BlasterSim. At the moment, the pneumatic and springer modes of BlasterSim use only dry air, but humidity and alternative gases are intended to be added in the future. For completeness, this guide will be written as if multiple gas species are present. The mass fraction and gas species index which identifies the gas are used.
| (2.1) |
| (2.2) |
| (2.3) |
| (2.4) |
| (2.5) |
| (2.6) |
Beater [1, ch. 5]
Valves do not open instantaneously, and sometimes slow opening has a significant impact on performance. BlasterSim models how far a valve is open with a prescribed valve opening model. is the valve opening fraction, which is how open the valve is. is fully closed and is fully open. The specific equation BlasterSim uses is
| (2.7) |
for . For , . is the initial (time zero) valve opening fraction (useful when a valve isn’t used like in a springer). is the initial valve opening rate. is the valve opening time, the time it takes for the valve to fully open (reach ).
This equation may seem overly complicated, but is the simplest polynomial equation that satisfies a few constraints:
| (2.8) | ||||
| (2.9) | ||||
| (2.10) | ||||
| (2.11) |
When the valve is fully open, no longer changes with time, so its derivative is zero. Consequently, the last constraint listed is needed to match the derivative at , which is necessary for automatic differentiation. See § 2.3.2 for more about automatic differentiation in BlasterSim. The last constraint prevents a simple linear model () from being used.
Note that to ensure monotonicity of (in other words, avoid oscillations of the valve opening fraction), must satisfy the inequality .
The pneumatic and springer cases will now be discussed, with the subscript dropped for simplicity as there is only one flow restriction in both cases.
For pneumatics, and . The second condition approximates a simple linear model. In the future may become an input parameter if deemed necessary to improve accuracy. The SpudFiles Wiki [10] gives some estimated opening times:
Burst disks: likely under 1 ms
Pilot-operated valves (like QEVs, “back-pressure tanks”, “cores”): 3–5 ms
Ball valves: about 100 ms if hand activated
These values are recommended as starting points only. For modeling any particular blaster, it is better to try to independently determine the valve opening time through something like high speed video.
For springers, and . As there is no valve in a springer, this simply sets the flow restriction to always be open.
This simple valve opening model is most accurate for manually operated valves. More detailed modeling of pilot-operated valves could make determining the valve opening time unnecessary, but this alternative valve opening model has not yet been added to BlasterSim.
| (2.12) | ||||
| (2.13) |
The effective mass of the projectile/plunger factors in the spring mass. The spring is not moving at a uniform velocity as one end is stationary, so it would be incorrect to add all the spring mass to the effective mass. The effective mass equation used is
| (2.14) |
where as suggested by Ruby [8] for a stiff spring.
Consider a projectile/plunger p with both static and dynamic friction. BlasterSim uses an effective friction pressure defined to oppose the direction of motion. Using a pressure instead of force allows for more familiar units and is conventional in spud guns. The maximum static friction pressure is and the magnitude of the dynamic friction pressure is . When static friction is active, the actual static friction force is just enough force to equilibrate the forces so that p doesn’t move (where ; see equation 2.13), until the force exceeds the maximum static friction force. In other words, the actual static friction pressure is the minimum of the equilibrium pressure or the maximum static friction pressure, and in the direction of the equilibrium pressure. Mathematically, this can be stated as
| (2.15) |
The actual dynamic friction pressure is , taking into account both the magnitude of the dynamic friction pressure and the direction.
The effective friction pressure then will switch between static and dynamic friction depending on the velocity:
| (2.16) |
BlasterSim does not use this model because it is not smooth. Smooth functions are useful for automatic differentiation (see § 2.3.2) and beneficial for numerical stability. Also, the use of strict floating point equality in the branch can lead to numerical reproducibility issues. BlasterSim uses a smoothed version of this model which avoids these problems.
To create a smoothed version of equation 2.16, it’s helpful to first rewrite equation 2.16 in terms of the function:
| (2.17) |
The smooth approximation to equation 2.16 will be made by noting that
| (2.18) |
where is a small scale over which the function changes from -1 to 1.
Consequently, the function implemented in cva.f90 as p_f is
| (2.19) |
Making a smooth approximation for is more difficult. Rather than replacing a single part of equation 2.15, an new function was constructed that does not resemble equation 2.15 algebraically but takes similar values. A piecewise function is implemented in cva.f90 as p_f0 so that the actual static friction pressure equals the equilibrium pressure for small values of :
| (2.20) |
where is chosen to be a somewhat arbitrary fraction of and
| (2.21) |
Note that despite the appearance of and , equation 2.20 is continuous and has continuous derivatives as those terms only become discontinuous at and do not appear in the branch where .
At the moment, BlasterSim does not handle plunger impact with the end of the plunger tube, and will crash if that occurs. Plunger impact will be handled in a future version of BlasterSim. Plunger impact does not appear to be necessary in the springers simulated so far, but certainly it is a factor in some springers.