/// <summary> /// Routes input series using lag coefficients /// </summary> /// <param name="s"></param> /// <param name="lagCoefficients"></param> public static Series RoutingWithLags(Series s, double[] lagCoefficients) { double[] result = new double[s.Count]; Series rval = s.Copy(); int sz = s.Count; Math.Multiply(rval, 0); Series.CopyAttributes(s, rval); for (int i = 0; i < s.Count; i++) { double v = s[i].Value; for (int j = 0; j < lagCoefficients.Length && i + j < sz; j++) { result[i + j] += v * lagCoefficients[j]; } } // put results back into Series format. rval.Values = result; return(rval); }
/// <summary> /// Converts series to specified units /// </summary> /// <param name="units"></param> public static void ConvertUnits(Series s, string units) { if (s.Count == 0) { return; } if (s.Units == "degrees C" && units == "degrees F") { for (int i = 0; i < s.Count; i++) { Point p = s[i]; if (p.IsMissing) { continue; } p.Value = p.Value * 9.0 / 5.0 + 32.0; s[i] = p; } s.Units = "degrees F"; return; } else if (s.Units.ToLower() == "degrees f" && units.ToLower() == "degrees c") { for (int i = 0; i < s.Count; i++) { Point p = s[i]; if (p.IsMissing) { continue; } p.Value = (p.Value - 32.0) * 5.0 / 9.0; s[i] = p; } s.Units = "degrees C"; return; } else if (s.Units == "acre-feet" && units == "cfs") { if (s.TimeInterval == TimeInterval.Daily) { Math.Multiply(s, ConvertUnitsFactor(s.TimeInterval, s.Units, units, DateTime.Now)); s.Units = "cfs"; return; } else if (s.TimeInterval == TimeInterval.Monthly) { for (int i = 0; i < s.Count; i++) { Point pt = s[i]; pt = pt * ConvertUnitsFactor(s.TimeInterval, s.Units, units, pt.DateTime); s[i] = pt; } s.Units = "cfs"; return; } } throw new NotImplementedException("cannot convert " + s.TimeInterval.ToString() + " " + s.Units + " to " + units); }