public void InputOutputTests() { GWModelLC gwlc = new GWModelLC(); IBaseLinkableComponent lc = gwlc; List<IArgument> arguments = CreateTestArguments(); lc.Initialize(arguments); IElementSet elementSet = ((ITimeSpaceExchangeItem)lc.Inputs[2]).ElementSet(); Quantity dischargeQuantity = new Quantity(new Unit(PredefinedUnits.CubicMeterPerSecond), null, "Discharge"); Quantity waterlevelQuantity = new Quantity(new Unit(PredefinedUnits.Meter), null, "Water Level"); ElementSet idBasedElementSetA = new ElementSet(null, "ElmSet-A", ElementType.IdBased); idBasedElementSetA.AddElement(new Element("elm-1")); Input waterLevelTriggerInput = new Input("Water level, to be retrieved from some output item", waterlevelQuantity, elementSet); waterLevelTriggerInput.TimeSet = new TimeSet(); SimpleOutput dischargeOutput = new SimpleOutput("Discharge, to be sent to GW model", dischargeQuantity, elementSet); dischargeOutput.ConstOutput = 6; dischargeOutput.TimeSet = new TimeSet(); ITimeSpaceInput gwInflow = UTHelper.FindInputItem(lc, "Grid.Inflow"); ITimeSpaceOutput gwLevel = UTHelper.FindOutputItem(lc, "Grid.gwLevel"); // Connect discharge gwInflow.Provider = dischargeOutput; dischargeOutput.AddConsumer(gwInflow); // Connect triggering input gwLevel.AddConsumer(waterLevelTriggerInput); lc.Validate(); lc.Prepare(); // specify query times double firstTriggerGetValuesTime = gwLevel.TimeSet.Times[0].StampAsModifiedJulianDay; double secondTriggerGetValuesTime = firstTriggerGetValuesTime + 3; double thirdTriggerGetValuesTime = firstTriggerGetValuesTime + 5; // check initial values Assert.AreEqual(8, gwLevel.Values.Values2D[0].Count); Assert.AreEqual(-10, (double)gwLevel.Values.GetValue(0, 0)); ITimeSpaceValueSet values; // get values for initial time, therefor intial values waterLevelTriggerInput.TimeSet.SetSingleTime(new Time(firstTriggerGetValuesTime)); values = gwLevel.GetValues(waterLevelTriggerInput); Assert.AreEqual(-10, values.GetValue(0, 0), "value for first query time"); // get values for second query time: -10 : base gw level. // 10 : storageHeight is multiplied by a factor of 10 // 3 days, 6 constant inflow, 3600*24 seconds in a day, 1000 L/M3, (100 x 200) grid cell size waterLevelTriggerInput.TimeSet.SetSingleTime(new Time(secondTriggerGetValuesTime)); values = gwLevel.GetValues(waterLevelTriggerInput); Assert.AreEqual(-10.0 + 10 * 3 * 6.0 * 60 * 60 * 24 / 1000 / (100 * 200), values.GetValue(0, 0), "value for first query time"); // get values for second query time: // 10 : storageHeight is multiplied by a factor of 10 // 5 days, 6 constant inflow, 3600*24 seconds in a day, 1000 L/M3, (100 x 200) grid cell size waterLevelTriggerInput.TimeSet.SetSingleTime(new Time(thirdTriggerGetValuesTime)); values = gwLevel.GetValues(waterLevelTriggerInput); Assert.AreEqual(-10.0 + 10 * 5 * 6.0 * 60 * 60 * 24 / 1000 / (100 * 200), values.GetValue(0, 0), "value for first query time"); lc.Finish(); }
/// <summary> /// Similar to the "old"/deprecated initialise method for an <see cref="IBaseLinkableComponent"/>. /// <para> /// It will call first <see cref="ApplyArguments"/>, and then call <see cref="IBaseLinkableComponent.Initialize()"/> /// </para> /// </summary> /// <param name="component">Component to initialise</param> /// <param name="arguments">Arguments to set to the component</param> public static void Initialize(this IBaseLinkableComponent component, IList <IArgument> arguments) { component.ApplyArguments(arguments); component.Initialize(); }