/// <summary>
 /// result = f0 * t0 + f1 * t1
 /// </summary>
 public static void AddScaled(this IDiscreteField <double> f0, IDiscreteField <double> t0, IDiscreteField <double> f1, IDiscreteField <double> t1, IDiscreteField <double> result, bool parallel = false)
 {
     if (parallel)
     {
         ArrayMath.Parallel.AddScaled(f0.Values, t0.Values, f1.Values, t1.Values, f0.Count, result.Values);
     }
     else
     {
         ArrayMath.AddScaled(f0.Values, t0.Values, f1.Values, t1.Values, f0.Count, result.Values);
     }
 }
 /// <summary>
 /// result = f0 + f1 * t
 /// </summary>
 public static void AddScaled(this IDiscreteField <Vec3d> f0, IDiscreteField <Vec3d> f1, double t, IDiscreteField <Vec3d> result, bool parallel = false)
 {
     if (parallel)
     {
         ArrayMath.AddScaledParallel(f0.Values, f1.Values, t, f0.Count, result.Values);
     }
     else
     {
         ArrayMath.AddScaled(f0.Values, f1.Values, t, f0.Count, result.Values);
     }
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="field"></param>
        /// <param name="deltas"></param>
        /// <param name="timeStep"></param>
        /// <param name="parallel"></param>
        public static void Update(IDiscreteField <Vec3d> field, Vec3d[] deltas, double timeStep, bool parallel = false)
        {
            var vals = field.Values;
            int n    = field.Count;

            if (parallel)
            {
                ArrayMath.Parallel.AddScaled(vals, deltas, timeStep, n, vals);
            }
            else
            {
                ArrayMath.AddScaled(vals, deltas, timeStep, n, vals);
            }

            Array.Clear(deltas, 0, n);
        }