It’s sometimes useful to create 1- 2- or higher-dimensional array/matrix variable for use in a model.  This can happen for instance when:

• Using TABLE statements in a model
• Modeling quantities which are fundamentally multi-dimensional (e.g., position or velocity in 3-D space)
• When building finite-difference models within Magnolia to approximate phenomena which requires solution of a PDE

The syntax for declaration and element retrieval of an array variable or constant is straightforward, but differs a little from legacy CSL implementations:

• Arrays are defined using the DIMENSION statement, but the shape of the array is denote using square brackets instead of parenthesis
• Arrays are 1-based (not zero-based as ini many populate languages)
• Lookup (indexing, retrieval) of an array element is also performed using the square bracket notation
• Index values for accessing an element in an array must be integer values, and thus need to be declared as such using a DIMENSION statement.
• Array variables/constants can be used by the INTEG operator directly.  Magnolia infers the shape of the argument to INTEG using the DIMENSION statements for the associated variables.


model ArraysExample

derivative

dimension x[2, 3], dx[2, 3], xic[2, 3], k[2, 3]
constant xic = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6
constant k = 1, 2, 3, 4, 5, 6
dimension integer i, j

! Wrap FOR loops in procedural to avoid any potential sorting errors
procedural(dx = x)
for i = 1, 2
for j = 1, 3
dx[i, j] = -k[i, j]*x[i, j]
end
end
end

! The INTEG statement can be used on vector states, as long
! as both arguments are also vector values
x = integ(dx, xic)

constant tstop = 2.0
termt(t >= tstop, 'Stopped on time limit')

! Save array elements to scalars so they can be displayed in the interactive plot
x11 = x[1, 1]
x21 = x[2, 1]
x12 = x[1, 2]
x22 = x[2, 2]
x13 = x[1, 3]
x23 = x[2, 3]

end ! derivative

end ! program