Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin
scrollbar

See also: OATC Wiki Home

Date: April 21.4 - 23.4, 2009
Venue:DHI, Hørsholm, Agern Allé 5, Denmark

Participants:

Rob Knapen, Alterra, Wageningen UR (Rob.Knapen@wur.nl)
Standa Vanecek, DHI (s.vanecek@dhi.cz)
Adrian Harper, Wallingford Software (adrian.harper@wallingfordsoftware.com)
Stef Hummel, Deltares (stef.hummel@deltares.nl)
Unknown User (don), Deltares (gennadii.donchyts@deltares.nl)
Jesper Grooss, DHI (jgr@dhigroup.com)

Apologies:
Peter Schade, BAW (peter.schade@baw.de)
Andrea Antonello (andrea.antonello@hydrologis.eu)
Jan Gregersen, LicTek (gregersen@lictek.dk)
Unknown User (onnoroos), Alterra (Onno.Roosenschoon@wur.nl)
Unknown User (jnh@dhigroup.com) Johan Hartnack , DHI (jnh@dhigroup.com)

Documents:

http://www.openmi.org/
http://sourceforge.net/projects/openmi
wiki.openmi.org

...

2. Maintenance and support

3. OpenMI 2.0 Issues

3.1 Road map to 2.0 alpha version

3.1.1 Changest to the standard

  • Time interfaces, according to suggestion I, see Section 3.6.1
  • Elements - HasZ, HasM ....
  • Decorator - Factory,....
  • Keep, Save and Clear state, convert to/from byte[] to make persistent

To be done by: Gena
Will be finished by: april 27 th

3.1.2 Backbone

To be done by: Stef and/or Rob B.
Will be finished by: may 8 th

3.1.3 Buffer

To be done by: Stef and/or Rob B.
Will be finished by: may 8 th

3.1.3 Time interpolation Decorator

To be done by: Stef and/or Rob B.
Will be finished by: may 15 th

3.1.4 GUI

To be done by: Adrian
Will be finished by: try before the next meeting (june 8 th).

3.1.5 SimpleRiver Model - running in GUI

To be done by: Adrian
Will be finished by: try before the next meeting (june 8 th).

3.1.6 OpenMI 2.0 wrapper around OpenMI 1.4 Components

To be done by: Stef and Jesper
Will be finished by: try before the next meeting (june 8 th).
Schedule:

3.2 Pending Remarks on Standard as result of Java review

This led to some remarks, of which a few were "java only", but some of them reflected on the Standard in general. Items to be addressed at the next meeting:

  1. # Question: what does isAvailable() mean in case of multiple consumers. Do all consumers need to have the same time(s)?
    1. (question) Leave in for now, review after more implementation, one suggestion of modification bool isAvailable(whosAsking);
    2. (warning) Will be discussed later during the meeting, Stef will show an example of using isAvailable(whosAsking);
  2. Question: Collection or Set instead of List for (In|Out)putExchangeItems in LC?
    1. (question) Gena: I will check if changing it to ICollection<> works fineIt will be ICollection (thumbs up) .
  3. Question: Introduce IState instead of Object? This will emphasize the relation between IManageState and IPersistentState. Additional suggestion: IPersistentState extends IState.
    (b.t.w: makePersistent / readPersistentState are wrong names, should be something like getAsByteStream)
    1. Gena
    will discuss with Rob
    1. (question) Unresolved at this time, if Rob can convinve Gena then we can (thumbs up). The suggestion is the followinghas discussed with Rob between last and current meeting. After some discussion the final result (thumbs up) is described on: Suggestion about changed to state management
  4. To be discussed: Introduce generics in IOutputItem.Values()? i.e. weakly typed via <T>
    1. (question) Gena will implement examples in the SDK, but not, for now, in the standard(thumbs down) We will not introduce generics in the standard. However, they could be used in the SDK.
  5. Remark: Working with providers/consumers, we should take care that such a circularity might give garbage collection problems

    Implementing IDisposable and removing item from Provider/Consumers there might solve the problem

    . After a short discussion, we see no real general way so solve this risk, so it has been decided that we should leave this up to the Garbage Collector.
    • (question) Point noted, no aggreement specific agreement as to solution
  6. (thumbs up) We will introduce something like OpenMIException : Exception. However, first we will have a detailed look at the guidelines for introducing custom exceptions in both .Net and Java. Rob K. has added a page for this, Guidelines for introducing custom exceptions. It now includes Java suggestions, (warning) Gena will add .Net suggestions.

3.3 Suggestions for the states and possible transitions between the states of the ILinkableComponent

...

If component has Invalid status and we call Validate() - it may even call Update() on another components in order to validate itself.

3.4 Limitations of time representation in OpenMI (by W. de Winter (wim.dewinter@wur.nl))

The Limitations of time representation was discussed as part of the time issue, see 3.6.2.

3.5 More suggestions on v2.0 changes

  • Move IsAvailable to IExchangeItem. Is it only for a thread-safety? If yes than see also ICollection.IsSynchronized

    Stef: The question is confusing, the actual issue is that we should distinguish between IsAvailable and IsValid.
    We are now realized that there is a difference between IsAvailable (only for output item, means it is for consumers) IsValid (probably for IExchangeItem, meaning if item is valid in the context of current component, maybe updated during Validate() call)?

    (question) To discuss lator

  • Move Values { get; set; } to IExchangeItem

    Stef: alternative would be to add get to the IInputExchangeItem

    • (thumbs up) get accepted,
    • (question) set review lator
  • Change ID to Id - .NET Style Guidelines, FxCop
    • (thumbs up) , it is our intent to follow FxCop guidelines
  • ?
    • (warning) get; set; to be reviewed at this meeting

      When discussing get/set, the subject of the discussion graduallly moved to the pull versus loop driven approach. This led to an important decision (thumbs up) : We will introduce a boolean argument that indicates whether the component should run in a pull mode (like in OpenMI 1.4) or in loop mode

      : Discuss component operation mode here
  • Add params keyword to IArguments[] args parameter in Initialize(IArgument[] Wiki MarkupAdd *params* keyword to IArguments\[\] args parameter in Initialize(IArgument\[\] args).
    •  Adrian review, if happy then ... (question)(thumbs up)
    Wiki Markup
    Add IArguments\[\] Arguments \{ get; \} to ILinkableComponent
    • (thumbs up)
  • Change "string Validate()" to / "bool IsValid(IExchangeItem item)"

    Gena: probably the second one is not needed if we will have IsValid in IExchangeItem.
    string return type in the Validate() has to be changed to void.

    • (question) Requires review after more experiance with implementing standard
    )" / "IsAvailable()", etc.
    • (warning) to be reviewed at this meeting
  • (thumbs up) Add "params IOutputItem[] items" argument to Update() in order to specify explicitly what should be updated.
    • (warning) Maybe
    Wiki Markup
    Add "params IExchangeItem\[\] items" argument to Update() in order to specify explicitly what should be updated.

    Can be used for example to run analysis only in geographical specified area

    Can help in the optimizing of the buffer

    This will improve performance a lot if we call Update(items) via internet

    Should we use IExchangeItem there (meaning only value definition, times, elements) or IOutputItem

    • (thumbs up) as IOutputItem, maybe later generalise to IExchangeItem i.e. allow IInputItem
    Add WaitingForData status to the LinkableComponentStatus
    • (thumbs up) see previous item?
  • Remove AddConsumer/RemoveConsumer and use BindingList in the implementation instead to listen to IOutputItem.Consumer.Add() / Remove()
  • (question) Not critical yet, so leave for now, review again later
  • Temporal ==(rename)==> TimeSet and add Durations, TimeZone properties to it (see also changes from Rob in Java version)
  • (thumbs up) Rename
  • (question) Requires discussion in lator meetings

    We will leave AddConsumer/RemoveConsumer for now. The BindingList mechanism has been implemented, though, so anyone can use it

  • When we get loops in the compositions - we have to tell which component will be first! (WHAT SHOULD WE DO IN THIS SITUATAION?) Relevant when implementing the Runner process in GUI In the new GUI, we will let the user indicate the 'Start up component'.
     
  • Add Durations, TimeZone properties to ITimeSet? (see also changes from Rob in Java version)(question) Revisit in lator meeting
  • Replace all ITime, ITimeStamp, ITimeSpan by: System.DateTime, System.TimeSpan. Should be straightforward. For components working in Julian only time in FORTRAN CalendarConverter can be used. But for .NET all nice features of the .NET date time, time span will be available, e.g. DateTime.AddDays(int), DateTime.AddHours(int), time1 > time2, time1.AddDays(1) > DateTime.Now, and so on.
      Seems to be very straightforward and simple to implement.**
      •  (question) Review lator (today?)(warning) all time issues will be discussed at this meeting
         
    • Change XYPoint+XYZPoint, ZYPolyline+XYZPolyline => Point, Polyline (make it look more like OGC entities)
      • (question) Review Reviewed: OGC methods approach to see how we know when a Z coordinate exists?
    • Split IIdentity into class IIdentifiable { long Id { get; set; } } and class IDescribable { string Caption { get; set; } string Description { get; set; } }
      • (thumbs up) Splitting interfaces
      • (question) Make various interfaces derive from IIdentifiable, to review
    • Make ComponentId and InstanceId properties strings - currently it is a bit overkill.
      • (thumbs up) Properties on ILinkableComponent
        • IDescribable InstanceDescription { get;  }
        • IDescribable ComponentDescription { get; }
      • :
        (thumbs up) IElementSet.SpatialReferenceWkt contains Z (vertical reference) and M systems, see http://en.wikipedia.org/wiki/Well-known_text.
      • To get the M-coordinate, a method should be added:
        Code Block
        java
        java
        
                ...
                double GetVertexMCoordinate(int elementIndex, int vertexIndex);
                ...
        
                // proposal:
                // the four methods could be replaced with this:
                public enum SpatialDimension { X, Y, Z, M }
                public double getVertexCoordinate(int elementIndex, int vertexIndex, SpatialDimension dim);
        
        
    • IIdentity has been split in IIdentifiable and IDescribable. Some interfaces already have been derived from IIdentifiable and/or IDescribable** (question) At some stage, we should check all interfaces on whether to derive from IIdentifiable and/or IDescribable or not.
      • (thumbs up) At this meeting, we have checked that IIdentifiable and/or IDescribable are not used as seperate entities.
      Do we need a TimeHorizon in the ILinkableComponent ? Seems to be useless since we have ITemporal
      • (thumbs up) Move TimeHorizon to ITemporal
    • IArgument needs a mechanism for identifying the type of argument e.g. File, Path, int double etc Very usful for providing customised GUI functionality
      • (question) Adrian to come up with proposal for next meeting

    How IOutputExchangeItem.Values can be used, one possible way:

    • Component1 <>- OutputItem1 -> InputItem1 -<> Component2
    • Component2 updates and sets times, elements, quantity/quality which it needs in the IntputItem1
    • Component1 updates and sets new computed values into it's OutputItem1
    • Wiki Markup
      OutputItem1 (IOutputItem implementation) will check it's Consumers\[\], which are of course IInputItems, and if they are compatible - will set values into them
    • If IInputItems are not compatible - there should be a DataOperation / Decorator inserted in between (or more than one).

    We should have way in the decorator to trace it in the debugger, gui.

    • Make IOutputDecorator to be:
      • 's proposal is below
        • Code Block
          
          namespace OpenMI.Standard
          {
              public enum EArgType
              {
                  String = 0, // default
                  Bool,
                  Int,
                  Double,
                  Path, // presummed to exist and accessable
                  FilePath, // presummed to exist and accessable
                  PathNew,
                  FilePathNew,
                  XML, // Rob: can be used together with a schema for complex argument data
                  MIME, // Rob: might be useful to pass in images, or text documents, etc.
              }
          
              /// <summary>
              /// The IArgument interface defines a key - value pair. If the property ReadOnly is
              /// false the value is editable otherwise it is read-only.
              /// </summary>
              public interface IArgument : IDescribable
              {
                  /// <summary>
                  /// Type that string value represents and can be converted to
                  /// </summary>
                  EArgType ValueType { get; }
          
          	/// <summary>
                  /// The key (string) in key-value pair.
          	/// </summary>
          	string Key {get;}
          
          	/// <summary>
                  /// <para>The value (double) in key-value pair.</para>
                  ///
                  /// <para>If the ReadOnly property is true and the property is attempted to be changed
                  /// from outside an exception must be thrown.</para>
          	/// </summary>
          	string Value { get; set; }
          
          	/// <summary>
                  /// Defines whether the Values property may be edited from outside.
          	/// </summary>
          	bool ReadOnly {get;}
              }
          }
          
    • Using empty Temporal and ElementSet in the Input items.
      See http://public.wldelft.nl/display/OPENMI/Empty+Sets+in+the+Input+Items+-+Element+set+changing+in+time
    • Changing of the ElementSet during the time and different Times (steps) for different Elements
      • For the Time can be probably solved by missing values

    3.6 The ITime Issue

    Anchor
    timeInterfaces
    timeInterfaces
    3.6.1 Time Interface(s)

    After some discussions, their were four proposals. See list below (including the original 1.4 situation).
    Note: naming to be done yet.

    Code Block
    java
    java
    titleSuggestion 2.0, I
    
      public interface ITime {
          double StampAsModifiedJulianDay { get; }
          double DurationAsModifiedJulianDay { get; }
      }
      public interface ITimeSet {
          List<ITime> Times { get; }
          bool HasDurations
    Code Block
    javajava
    
    interface IDecorator : IOutputItem, IInputItem
    {
       IArgument[] Arguments { get; }
      }
    
    • (thumbs up) We need to address this
    • (question) Method: this is one possibility, others need review

      Discussed scenarios for using Temporal and ElementSet of the Input items

    Two components

    • C1 Provider of non-equidistant time series /100 steps/ for the set of the 30 XYpoints elements (for example database)
    • C2 Component using TS for computation (consumer)
    Case1
    • C1 - InputItem Temporal set of Time /5 steps equidistant /, ElementSet - 3 Elements
    • C2 - OutputItem after update - obtain values (time step) for the element in ElementSet 15 values
      Decorator can be needed for both Time and Space
    Case2
    • C1 - InputItem Temporal Empty, Element Set - 3 Elements
    • C2 - OutputItem after update - obtain All values (time steps) for the element in ElementSet 300 values
      Decorator can be needed for Space
    Case3
    • C1 - InputItem Temporal set of Time /5 steps - equidistant/, Element Set - empty
    • C2 - OutputItem after update - obtain 5 steps for all elements 150 values
      Decorator can be needed for Time
    Case 4
    • C1 - InputItem Temporal set empty, Element Set - empty
    • C2 - OutputItem after update - obtain 100 steps for all elements 3000 values
      Decorator not needed
    Suggestion

    Based on this - suggestion for possibility to

    • select using Time intervals // return all time steps in this interval "Time Decorator" not needed
    • select using Polygons - // return values only for XYpoints inside polygon "Space Decorator" not neededIf will be accepted this idea need to be formalized and include to the standard.

    Use Case: analytical function

    Info

    See Implementation of the AnalyticalFunction use case for unit tests showing different ways to implement components

    5. OATC Procedures

    Code Block
    java
    java
    titleSuggestion 2.0, II
    
      public interface ITime {
          double StampAsModifiedJulianDay { get; }
      }
      public interface ITimeSpan : ITime {
          double DurationAsModifiedJulianDay { get; }
      }
      public interface ITimeSet {
          List<ITime> Times { get; }
          bool HasDurations { get; }
      }
    
    Code Block
    java
    java
    titleSuggestion 2.0, III
    
      public interface ITimeSet
      {
          IList<double> TimeStamps { get; set; }
          IList<double> Durations { get; set; }
    
          TimeZoneInfo TimeZone { get; set; }
    
          bool HasDurations { get; }
      }
    
    Code Block
    java
    java
    titleSuggestion 2.0, IV
    
      public interface ITimeSet
      {
          IList<double> TimeStamps { get; }
          TimeZoneInfo TimeZone { get; }
      }
      public interface ITimeSpanSet : ITimeSet
      {
          IList<double> Durations { get; }
      }
    
    Code Block
    java
    java
    titleOriginal 1.4 situation
    
      public interface ITime
      {
      }
      public interface ITimeStamp : ITime
      {
          double ModifiedJulianDay {get;}
      }
      public interface ITimeSpan : ITime
      {
          ITimeStamp Start { get; }
          ITimeStamp End   { get; }
      }
    

    After studying the proposal, we have made a decision (thumbs up). We will take version I.

    Anchor
    timeAsMJD
    timeAsMJD
    3.6.2 Platform specific time or Modified Julian?

    Adrian suggested that we incorporate as less platform specific things in the Standard as possible. This also holds for Lists and events. (question) We will be put the issue on the agenda for next meeting.
    After some detailed discussion on the .Net.DateTime/Java.Date versus the MJD implementation, we have reached a conclusion (thumbs up) : We will keep using the Modified Julian Day.
    We should take into consideration whether we want to support a c++ version of the standard in the future.

    4. Decorators

    The decorators were discussed thouroughly, and we came up with some extensions to the standard.

    See list of questions discussed on the following page: Exchange item decorators.

    Current changes to the standard:

    Code Block
    java
    java
    
        // add a new interface:
        public interface IExchangeItemDecoratorFactory
        {
            IIdentifiable[] GetAvailableOutputDecorators(IOutputItem decoratedItem, IInputItem targetItem);
            IOutputItemDecorator CreateOutputItemDecorator(IIdentifiable decoratorId, IOutputItem decoratedItem, IInputItem targetItem);
    
            IDescribable GetDecoratorDescription(IIdentifiable id);
        }
    
        // add the following methods to the ILinkableComponent:
        public interface ILinkableComponent
        {
            ...
    
            IExchangeItemDecoratorFactory GetDecoratorFactory();
    
            void AddOutputItemDecorator(IOutputItemDecorator decorator);
    
            void RemoveOutputItemDecorator(IOutputItemDecorator decorator);
        }
    

    5. OATC Procedures

    We will keep track of a wish list for version 3.0.

    6. www.OpenMI.org and wiki.OpenMI.org

    Gena will move the content of the current wiki to the new wiki, and make a redirect page to the new wiki on the current one, and will ask the Greek to adjust the name server to let it refer to the new new wiki.

    7. Miscellaneous issues

    7.1. OpenMI Goes Linux

    7.1.1. The OpenMI Linux version ...

    Peter Schade achieved quite a bit of result, making nearly everything working. During a Skype session Peter explained the status to the other OATC members, who were quite impressed.

    The Linux version has been commited to SourceForge:http://openmi.svn.sourceforge.net/svnroot/openmi/branches/OpenMI-Version-1-Trunk/

    7.1.2. The Linux HowTo pages are on the wiki

    https://public.deltares.nl/display/OPENMI/How+to+port+the+OpenMI+from+Windows+to+Linux
    How to port the OpenMI environment from Linux to Windows:

    • OpenMI standard
    • sdk
    • ConfigurationEditor
    • some LCs of the examples

    A set of Mono dlls and exe files was generated and tested on openSUSE 11.0 Linux. Interested persons are invited to test the set, especially the ConfigurationEditor on further (Linux) platforms supported by Mono.

    https://public.deltares.nl/display/OPENMI/How+to+generate+a+LinkableComponent+with+a+Fortran+engine+on+Linux
    How to generate a LC (Fortran 90 engine and C# wrapper) on Linux

    Deltares will test the Linux version on Ubuntu and Fedora in about 3 weeks from now (say May 15 th ).
    Results will be reported at next meeting, after which Adrian will take care of the distribution.

    8. Tasks and unresolved issues

    All tasks are handled by sourceForge. GOTO: OpenMI Tasks on source forge

    9. Any other business

    • Check ideas mentioned in the poster of Jon Goodall :

    See goodall_poster.pdf

    ...

    • - see meeting 22