Search code examples
modelicadymolaopenmodelica

Function to Return a Replaceable Record in Modelica


I would like to define a function that returns a replaceable record (either MyRecord0, MyRecord1, or MyRecord2) given an input Integer index (0, 1, or 2).

Note that this is only a simple demonstration example case and in practice there may be many more records, each containing additional parameters.

The definition of the example records is shown below:

  record MyRecord0
    parameter Integer myIndex = 0;
    parameter Real myValue = 0;
  end MyRecord0;

  record MyRecord1
    extends MyRecord0(
      myIndex = 1,
      myValue = 1);
  end MyRecord1;

  record MyRecord2
    extends MyRecord0(
      myIndex = 2,
      myValue = 2);
  end MyRecord2;

I have been able to successfully return the appropriate record from a function using the getRecord function shown below, but I need to explicitly declare an object for each record type within the function.

function getRecord
  input Integer index "record index";
  replaceable output MyRecord0 myRecord;

  // Explicit declaration of instances for each possible record type
  MyRecord0 record0;
  MyRecord1 record1;
  MyRecord2 record2;

algorithm 
  if index == 1 then
    myRecord := record1;
  else
    if index == 2 then
      myRecord := record2;
    else
      myRecord := record0;
    end if;
  end if;   
end getRecord;

Can anyone suggest an alternate syntax that eliminates the need to declare instances of each possible record type within the function? For example, I have tried variations shown below but cannot find a satisfactory method that properly compiles.

function getRecord_Generic
  input Integer index "record index";
  replaceable output MyRecord0 myRecord;

  redeclare MyRecord1 myRecord if index == 1; else (redeclare MyRecord2 myRecord if index == 2 else redeclare MyRecord0 myRecord);
end getRecord_Generic;

Or

function getRecord_Generic2
  input Integer index "record index";
  replaceable output MyRecord0 myRecord;

algorithm 
  if index == 1 then
    redeclare MyRecord1 myRecord;
  else
    if index ==2 then
      redeclare MyRecord2 myRecord;
    else
      // default case
      redecalre MyRecord0 myRecord;
    end if;
  end if;      
end getRecord_Generic2;

Any tips or suggestions are appreciated!


Solution

  • Assuming the example is that simple you could do:

      function getRecord2
      input Integer index "record index";
      output MyRecord0 myRecord;
    
      algorithm 
        if index==1 then
          myRecord := MyRecord1();
      else
        if index == 2 then
          myRecord := MyRecord2();
        else
          myRecord := MyRecord0();
        end if;
      end if;   
    end getRecord2;
    

    (Only tested with Dymola.)

    If some of the different records contain additional fields there is no good solution.