public static Series HydrometRuleCurve(string curveName,Series residual) { var rval = new Series(); rval.TimeInterval = TimeInterval.Daily; if (residual.Count == 0) return rval; var m_ruleCurve = new HydrometRuleCurve(curveName); DateTime t = residual[0].DateTime.Date; DateTime t2 = residual.MaxDateTime.Date; if (t2 > DateTime.Now.Date.AddDays(-1)) t2 = DateTime.Now.Date.AddDays(-1); var req = Point.MissingValueFlag; string flag = ""; while (t <= t2) { req = m_ruleCurve.LookupRequiredSpace(t, residual[t].Value, out flag); rval.Add(t,req); t = t.AddDays(1); } return rval; }
/// <summary> /// Residual is forecast minus QU /// </summary> private void ComputeResidualAndRequiredSpace() { SpaceRequired.Clear(); SpaceRequired.Name = "Space Required"; Residual.Clear(); Residual.Name = "Residual"; DateTime t = _t1; double resid = 0; // 998877; int wy = t.Year; if (t.Month > 9) { wy++; } m_ruleCurve = RuleCurveFactory.Create(controlPoint, wy); while (t <= _t2) { if (controlPoint.FillType == FillType.Variable) { resid = ResetResidualBasedOnForecast(t, resid); if (resid != HydrometRuleCurve.MissingValue && t <= qu.MaxDateTime) { var quTemp = qu[t].Value; if (quTemp < 0) { quTemp = 0; } resid = resid - quTemp * 1.98347; if (resid < 0) { resid = 0; } Residual.Add(t, resid); } else { Residual.AddMissing(t); } } else { resid = HydrometRuleCurve.MissingValue; } var t2 = t; if (t.Month == 2 && t.Day == 29) { t2 = t.AddDays(-1); } string flag = ""; double req = 0; req = m_ruleCurve.LookupRequiredSpace(t2, resid, out flag); if (req == HydrometRuleCurve.MissingValue) { SpaceRequired.AddMissing(t); } else { req = req * controlPoint.PercentSpace / 100.0; if (req < 0) { req = 0; } SpaceRequired.Add(t, req); } flags.Add(flag); t = t.AddDays(1); } }