Array Variables and Constants
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