Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }