private void AddByScalar() { float[] a = new[] { 1f, 0f, 15f, 2f, 100f, 0.1f, 1234f, 678.234f, }; const float b = 100f; float[] r = new[] { 101f, 100f, 115f, 102f, 200f, 100.1f, 1334f, 778.234f, }; Span <float> s = stackalloc float[r.Length]; NumericsHelpers.Add(a, b, s); EqualsApprox(r, s); }
/// <summary> /// Divides a source gas mixture into several recipient mixtures, scaled by their relative volumes. Does not /// modify the source gas mixture. Used for pipe network splitting. Note that the total destination volume /// may be larger or smaller than the source mixture. /// </summary> public void DivideInto(GasMixture source, List <GasMixture> receivers) { var totalVolume = 0f; foreach (var receiver in receivers) { if (!receiver.Immutable) { totalVolume += receiver.Volume; } } float?sourceHeatCapacity = null; var buffer = new float[Atmospherics.AdjustedNumberOfGases]; foreach (var receiver in receivers) { if (receiver.Immutable) { continue; } var fraction = receiver.Volume / totalVolume; // Set temperature, if necessary. if (MathF.Abs(receiver.Temperature - source.Temperature) > Atmospherics.MinimumTemperatureDeltaToConsider) { // Often this divides a pipe net into new and completely empty pipe nets if (receiver.TotalMoles == 0) { receiver.Temperature = source.Temperature; } else { sourceHeatCapacity ??= GetHeatCapacity(source); var receiverHeatCapacity = GetHeatCapacity(receiver); var combinedHeatCapacity = receiverHeatCapacity + sourceHeatCapacity.Value * fraction; if (combinedHeatCapacity > 0f) { receiver.Temperature = (GetThermalEnergy(source, sourceHeatCapacity.Value * fraction) + GetThermalEnergy(receiver, receiverHeatCapacity)) / combinedHeatCapacity; } } } // transfer moles NumericsHelpers.Multiply(source.Moles, fraction, buffer); NumericsHelpers.Add(receiver.Moles, buffer); } }
public void Merge(GasMixture receiver, GasMixture giver) { if (receiver.Immutable) { return; } if (MathF.Abs(receiver.Temperature - giver.Temperature) > Atmospherics.MinimumTemperatureDeltaToConsider) { var combinedHeatCapacity = GetHeatCapacity(receiver) + GetHeatCapacity(giver); if (combinedHeatCapacity > 0f) { receiver.Temperature = (GetThermalEnergy(giver) + GetThermalEnergy(receiver)) / combinedHeatCapacity; } } NumericsHelpers.Add(receiver.Moles, giver.Moles); }
private void Add() { float[] a = new[] { 1f, 0f, 1f, 2f, 100f, 0.1f, 1234f, 678.234f, }; float[] b = new[] { 1f, 1f, 2f, 2f, 10f, 1f, 4321f, 567.123f, }; float[] r = new[] { 2f, 1f, 3f, 4f, 110f, 1.1f, 5555f, 1245.357f, }; Span <float> s = stackalloc float[r.Length]; NumericsHelpers.Add(a, b, s); EqualsApprox(r, s); }