Range Over Channels in Modelica

In a previous example, we saw how for loops provide iteration over basic data structures. In Modelica, we can use similar constructs to iterate over elements in arrays or lists.

model RangeOverChannels
  import Modelica.Utilities.Streams.*;

  function printArray
    input String[:] arr;
  algorithm
    for i in 1:size(arr, 1) loop
      print(arr[i] + "\n");
    end for;
  end printArray;

equation
  when initial() then
    // We'll create an array with 2 values
    String queue[2] = {"one", "two"};
    
    // This function call iterates over each element in the queue
    printArray(queue);
  end when;
end RangeOverChannels;

To run this model:

$ modelica RangeOverChannels.mo
one
two

In this Modelica example, we’ve created an array queue with two elements. We then use a for loop inside the printArray function to iterate over each element in the array and print it.

Note that Modelica doesn’t have built-in concepts of channels or goroutines like some other languages. Instead, we’ve used an array to represent our data structure and a function to process the elements.

The when initial() equation is used to ensure that our code runs once at the start of the simulation. In a more complex model, you might have other equations or algorithms that run continuously or at specific times during the simulation.

This example demonstrates how to iterate over elements in a data structure in Modelica, which is conceptually similar to ranging over channels in other languages, albeit with different syntax and mechanics due to Modelica’s equation-based nature.