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;
        }