public override void Initialize() { var properties = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); foreach (IArgument argument in Arguments) { properties.Add(argument.Id, argument.Value); } string simFileName = "SimpleRiver.sim"; object value; if (properties.TryGetValue("SimFileName", out value) && value != null && value.ToString().Length > 1) { simFileName = value.ToString(); } // -- Create and initialize the engine -- if (properties.TryGetValue("FilePath", out value) && value != null && value.ToString().Length > 1) { _simpleRiverEngine.Initialize(value.ToString(), simFileName); } else { string currentDir = System.IO.Directory.GetCurrentDirectory(); _simpleRiverEngine.Initialize(currentDir, simFileName); //When running from the GUI, the assembly is started with the current dir //to the location of the OMI files. It is assumed that the data files are //located in the same directory. } if (properties.TryGetValue("TimeStepLength", out value) && value != null && ((double)value) > 0.0) { _simpleRiverEngine.SetTimeStepLength(Convert.ToDouble(value)); } if (properties.TryGetValue("ModelId", out value) && value != null) { // Note: This does strictly not set the id to the fortran engine (no setter available) Id = value.ToString(); } else { Id = _simpleRiverEngine.GetModelID(); } Description = _simpleRiverEngine.GetModelDescription(); // -- Time horizon -- char[] delimiter = new char[] { '-', ' ', ':' }; string[] strings = _simpleRiverEngine.GetSimulationStartDate().Split(delimiter); int StartYear = Convert.ToInt32(strings[0]); int StartMonth = Convert.ToInt32(strings[1]); int StartDay = Convert.ToInt32(strings[2]); int StartHour = Convert.ToInt32(strings[3]); int StartMinute = Convert.ToInt32(strings[4]); int StartSecond = Convert.ToInt32(strings[5]); DateTime startDate = new DateTime(StartYear, StartMonth, StartDay, StartHour, StartMinute, StartSecond); _simulationStartTime = new Time(startDate).StampAsModifiedJulianDay; // -- Build exchange items --- Dimension flowDimension = new Dimension(); flowDimension.SetPower(DimensionBase.Length, 3); flowDimension.SetPower(DimensionBase.Time, -1); Unit flowUnit = new Unit("m3/sec", 1, 0, "m3/sec"); flowUnit.Dimension = flowDimension; Quantity flowQuantity = new Quantity(flowUnit, "Flow description", "Flow"); Quantity inFlowQuantity = new Quantity(flowUnit, "Inflow description", "InFlow"); // ADH: Might not be unreasonable to set double as default in backbone constructor flowQuantity.ValueType = typeof(double); inFlowQuantity.ValueType = typeof(double); int numberOfNodes = _simpleRiverEngine.GetNumberOfNodes(); TimeSet timeset = new TimeSet(); timeset.TimeHorizon = GetTimeHorizon(); TimeSet extentTimeSet = new TimeSet(); extentTimeSet.TimeHorizon = GetTimeHorizon(); extentTimeSet.Times.Add(GetTimeHorizon()); _timeExtent = extentTimeSet; int nCount = 0; for (int i = 0; i < numberOfNodes - 1; i++) { ElementSet branch = new ElementSet("description", "Branch:" + i, ElementType.PolyLine, ""); branch.AddElement(new Element("Branch:" + i.ToString())); branch.Elements[0].AddVertex(new Coordinate(_simpleRiverEngine.GetXCoordinate(i), _simpleRiverEngine.GetYCoordinate(i), 0)); branch.Elements[0].AddVertex(new Coordinate(_simpleRiverEngine.GetXCoordinate(i + 1), _simpleRiverEngine.GetYCoordinate(i + 1), 0)); EngineEOutputItem flowFromBrach = new EngineEOutputItem("Branch:" + i + ":Flow", flowQuantity, branch, this); int branchIndex = i; EngineDInputItem inflowToBranch = new EngineDInputItem("Branch:" + i + ":InFlow", inFlowQuantity, branch, this); inflowToBranch.ValueSetter = delegate(ITimeSpaceValueSet values) { _simpleRiverEngine.AddInflow(branchIndex, (double)values.GetValue(0, 0)); }; flowFromBrach.TimeSet = timeset; EngineOutputItems.Add(flowFromBrach); EngineInputItems.Add(inflowToBranch); } for (int i = 0; i < numberOfNodes; i++) { ElementSet node = new ElementSet("description", "Node:" + i.ToString(), ElementType.IdBased, ""); node.AddElement(new Element("Node:" + i.ToString())); int nodeIndex = i; EngineDInputItem inflowToNode = new EngineDInputItem(node.Caption + ":InFlow", inFlowQuantity, node, this); inflowToNode.ValueSetter = delegate(ITimeSpaceValueSet values) { _simpleRiverEngine.AddInflow(nodeIndex, (double)values.GetValue(0, 0)); }; Inputs.Add(inflowToNode); } ElementSet branches = new ElementSet("description", "AllBranches", ElementType.PolyLine, ""); for (int i = 0; i < numberOfNodes - 1; i++) { Element branch = new Element("Branch: " + i.ToString()); branch.AddVertex(new Coordinate(_simpleRiverEngine.GetXCoordinate(i), _simpleRiverEngine.GetYCoordinate(i), 0)); branch.AddVertex(new Coordinate(_simpleRiverEngine.GetXCoordinate(i + 1), _simpleRiverEngine.GetYCoordinate(i + 1), 0)); branches.AddElement(branch); } EngineEInputItem inFlowToBraches = new EngineEInputItem(branches.Caption + ":inFlow", inFlowQuantity, branches, this); Inputs.Add(inFlowToBraches); Status = LinkableComponentStatus.Initialized; }
public override void Initialize() { Status = LinkableComponentStatus.Initializing; Hashtable hashtable = new Hashtable(); for (int i = 0; i < Arguments.Count; i++) { hashtable.Add(Arguments[i].Caption, Arguments[i].Value); } if (_engineApiAccess == null) { throw new Exception("Failed to assign the engine"); } _engineApiAccess.Initialize(hashtable); //foreach (InputItem inputItem in inputItems) //{ // TimeSet timeset = new TimeSet(); // timeset.Times.Add(TimeHelper.ConvertTime(_engineApiAccess.GetCurrentTime())); // inputItem.TimeSet = timeset; // // TODO inputItem.TimeSet = TimeSet for input item; //} //foreach (OutputItem outputItem in outputItems) //{ // TimeSet timeset = new TimeSet(); // timeset.Times.Add(TimeHelper.ConvertTime(_engineApiAccess.GetCurrentTime())); // outputItem.TimeSet = timeset; //} Id = _engineApiAccess.GetModelID(); Description = _engineApiAccess.GetModelDescription(); for (int i = 0; i < _engineApiAccess.GetOutputExchangeItemCount(); i++) { OutputExchangeItem output = _engineApiAccess.GetOutputExchangeItem(i); IQuantity quantity = output.Quantity; IElementSet elementSet = output.ElementSet(); String outputItemId = string.IsNullOrEmpty(output.Id) ? elementSet.Caption + ":" + quantity.Caption : output.Id; EngineOutputItem outputItem = new EngineEOutputItem(outputItemId, quantity, elementSet, this); outputItem.TimeSet.SetSingleTime(TimeHelper.ConvertTime(_engineApiAccess.GetTimeHorizon().Start)); outputItem.TimeSet.SetTimeHorizon(TimeHelper.ConvertTime(_engineApiAccess.GetTimeHorizon())); EngineOutputItems.Add(outputItem); } for (int i = 0; i < _engineApiAccess.GetInputExchangeItemCount(); i++) { InputExchangeItem input = _engineApiAccess.GetInputExchangeItem(i); IQuantity quantity = input.Quantity; IElementSet elementSet = input.ElementSet(); String inputItemId = string.IsNullOrEmpty(input.Id) ? elementSet.Caption + ":" + quantity.Caption : input.Id; EngineInputItem inputItem = new EngineEInputItem(inputItemId, quantity, elementSet, this); inputItem.TimeSet.SetSingleTime(TimeHelper.ConvertTime(_engineApiAccess.GetTimeHorizon().Start)); inputItem.TimeSet.SetTimeHorizon(TimeHelper.ConvertTime(_engineApiAccess.GetTimeHorizon())); EngineInputItems.Add(inputItem); } Status = LinkableComponentStatus.Initialized; _initializeWasInvoked = true; }