Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Include Page
OPENMI: 5.2 Implementation of the Initialize method
OPENMI: 5.2 Implementation of the Initialize method

5.2 Implementation of the Initialize method

The SimpleRiverEngineWrapper has two private field variables:

...

The _inputExchangeItems is a list of org.OpenMI.Backbone.InputExchangeItem objects and the _outputExchangeItems is a list of org.OpenMI.Backbone.OutputExchangeItem objects. These arraylists are populated in the Initialize method.

...

Code Block

public void Initialize(System.Collections.Hashtable properties) {    \_inputExchangeItems = new ArrayList(); //ArrayList of    Oatc.OpenMI.Sdk.Backbone.InputExchangeItem objects    \_outputExchangeItems = new ArrayList(); //ArrayList of    Oatc.OpenMI.Sdk.Backbone.OutputExchangeItem objects    // \-\\- Create and initialize the engine \-\\-    \_simpleRiverEngine = new SimpleRiverEngineDotNetAccess();    \_simpleRiverEngine.Initialize((string)properties\['FilePath'\]);    // \-\\- Simulation start time -    // The start time is obtained from the engine core as a string. This string is    // passed and converted to a System.DateTime. Then the    // Oatc.OpenMI.Sdk.DevelopmentSupport.CalendarConverter class is used to convert    // this time into the ModifiedJulianDay (this is the OpenMI standard time)    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 = Oatc.OpenMI.Sdk.DevelopmentSupport.CalendarConverter.Gregorian2ModifiedJulian(startDate);    // \-\\- Build exchange items \--\\-    Dimension flowDimension = new Dimension();    Unit flowUnit = new Unit('m3/sec',1,0,'m3/sec'); //The Simple River only uses    // quantities with the unit m3/sec.    Quantity flowQuantity = new Quantity(flowUnit,'description','Flow',    OpenMI.Standard.ValueType.Scalar,flowDimension);    Quantity inFlowQuantity = new Quantity(flowUnit,'description','InFlow',    OpenMI.Standard.ValueType.Scalar,flowDimension);    int numberOfNodes = \_simpleRiverEngine.GetNumberOfNodes();    for (int i = 0; i < numberOfNodes \-1; i++) //For each branch    {       OutputExchangeItem flowFromBranch = new OutputExchangeItem();       InputExchangeItem inFlowToBranch = new InputExchangeItem();       // One ElementSet is created for each branch. The ElementID's are       // Branch:<Branch number>. E.g. 'Branch:3'       ElementSet branch = new ElementSet('description','Branch:' + i.ToString(),ElementType.XYPolyLine,new SpatialReference('ref'));       branch.AddElement(new Element('Branch:' + i.ToString()));       branch.Elements\[0\].AddVertex(new Vertex(_simpleRiverEngine.       GetXCo-ordinate(i),_simpleRiverEngine.GetYCo-ordinate(i),0));       branch.Elements\[0\].AddVertex(new Vertex(_simpleRiverEngine.       GetXCo-ordinate(i+1),_simpleRiverEngine.GetYCo-ordinate(i+1),0));       flowFromBranch.ElementSet = branch;       flowFromBranch.Quantity = flowQuantity;       inFlowToBranch.ElementSet = branch;       inFlowToBranch.Quantity = inFlowQuantity;       \_outputExchangeItems.Add(flowFromBranch);       \_inputExchangeItems.Add(inFlowToBranch);    }    for (int i = 0; i < numberOfNodes; i++) //For all nodes    {       InputExchangeItem inflowToNode = new InputExchangeItem();       // Each node is a ID-based ElementSet. The ElementSet ID are       // Node:<node number>. E.g. 'Node:3'       ElementSet node = new ElementSet('description','Node:' +       i.ToString(),ElementType.IDBased,new SpatialReference('ref'));       node.AddElement(new Element('Node:' + i.ToString()));       inflowToNode.Quantity = inFlowQuantity;       inflowToNode.ElementSet = node;      \_inputExchangeItems.Add(inflowToNode);    }    ElementSet Branches = new ElementSet('description','AllBranches',    ElementType.XYPolyLine,new SpatialReference('ref'));    for (int i = 0; i < numberOfNodes - 1;i++) //Create an InputExchangeItem that    // has all branches in one ElementSet    {       Element branch = new Element('Branch: ' + i.ToString());       branch.AddVertex(new Vertex(_simpleRiverEngine.       GetXCo-ordinate(i),_simpleRiverEngine.GetYCo-ordinate(i),0));       branch.AddVertex(new Vertex(_simpleRiverEngine.       GetXCo-ordinate(i+1),_simpleRiverEngine.GetYCo-ordinate(i+1),0));       Branches.AddElement(branch);    }    InputExchangeItem inFlowToBranches = new InputExchangeItem();    inFlowToBranches.ElementSet = Branches;    inFlowToBranches.Quantity = inFlowQuantity;    \_inputExchangeItems.Add(inFlowToBranches); }

As you can see from the implementation of the Initialize method, some methods need to be implemented in the MyEngineDotNetAccess class, the MyEngineDLLAccess class and the engine core.

...

Image Removed
Fig. 14 Calling sequence for the initialize method

Note that no DataOperations are added to the OutputExchangeItems. The LinkableEngine class will complete the OutputExchangeItems for you by adding
spatial and temporal data operations to your OutputExchangeItems. You can still add your own data operations as well.

4.5 3 Implementing the SetValues method

...