public void AddStructureReachGetter(IEnumerable <string> reaches, string quantity = "Discharge") { var engineReachesToAdd = Simulator.EngineNet.Reaches.Where(r => reaches.Contains(r.LocationSpan.ID) && r.IsStructureReach); foreach (var engineReach in engineReachesToAdd) { var getterKey = engineReach.LocationSpan.ID + quantity; for (var gridPointIndex = 0; gridPointIndex < engineReach.GridPoints.Count; gridPointIndex++) { //var gridPoint = engineReach.GridPoints[gridPointIndex]; //var getter = M1DEngine.Getter(engineReach, 1, ParseQuantity(quantity)); IDoubleGetter reachGetter = M1DEngine.Getter(engineReach, gridPointIndex, ParseQuantity(quantity)); if (reachGetter != null) { _reachStructureGetters[getterKey] = reachGetter; } } if (!_reachStructureGetters.ContainsKey(getterKey)) { throw new Exception("Structure reach " + engineReach.LocationSpan.ID + " has no " + quantity + "."); } } ValidateAdd(_reachStructureGetters.Keys, reaches, quantity); }
/// <summary> /// In PostTimeStepEvent event, update the weir coefficient /// Note that this could even be made time dependent. /// </summary> private void UpdateWeirCoefficients(DateTime time) { for (int i = 0; i < _weirCoefficients.Count; i++) { HonmaWeir weir = _weirCoefficients[i].Weir; XYTable table = _weirCoefficients[i].Coefficient; IDoubleGetter getter = _weirCoefficients[i].Getter; // Update weir coefficient if (getter != null) { double upstreamWaterLevel = getter.GetValue(); double depthOverCrest = upstreamWaterLevel - weir.CrestLevel; weir.WeirCoefficient = table.YFromX(depthOverCrest, ExtrapolationTypes.Nearest); } } }