Control Flow Statements
The CSL language supplies statements for conditional execution and iterative executions of statements/equations. These are described below.
Conditionals (IF/ELSE)
Conditionals in the CSL language are used to indicate the conditions under which certain statements/equations should be evaluated:
- Each branch of the conditional is denoted by the IF keyword, followed by a parenthesized logical expression (typically containing logical and/or relational operators)
- Alternative branches are denoted by the ELSE keyword, followed by another IF expression
- A default alternative is denoted by the final ELSE keyword in the overall conditional statement; the fact that the ELSE statement is not followed by another IF expression indicates that this is a default branch.
- The overall statement is terminated by the END keyword. Note that this differs from legacy implementation of the CSL language, in which a conditional was terminated with the ENDIF keyword.
model ConditionalExample
derivative
! Conditionals are defined by sections of statements
! contained within "if", "else if" and "else" clauses.
! The conditional statement is now terminated with the
! "end" keyword
if (t < 1.0)
x = t^2
else if ( t < 1.35)
x = exp(t)
else if (t < 7.29)
x = sin(t)
else
x = sqrt(t)
end
constant tstop = 10.0
termt(t >= tstop, 'Stopped on time limit')
end ! derivative
end ! program
FOR Loops
Iterating over a set of statements/equations (which typically involve array or matrix variables/constants) is accomplished with the FOR statement:
- The set of equations to be iterated over is delimited by the initial FOR statement and the enclosing END statement
- The FOR statement requires at least two arguments: the limits over which iterations should take place, and an optional step size.
- The iterator of the for statement can be an integer data type (used, for example, to index elements in an array), or a floating point value. The example below uses and integer value, which is declared via the DIMENSION statement just above the loop.
- For sitting purposes, the FOR loop is treated as a single statement; overall input and output dependencies are automatically detected by Magnolia. No sorting is performed within the FOR loop itself.
- If the FOR loop is not sorted as intended by default, it can be wrapped in a PROCEDURAL section to enforce an alternate sorting with respect to other statements in the model.
- FOR loops may be nested, and are allowed in any code section.
model LoopExample
initial
! Declare an array that will be iterated over
! by a for loop
! Note that arrays are now declared and indexed using
! square brackets, not parentheses
dimension resetTimes[5]
constant resetTimes = 1.1, 2.8, 3.8, 4.93, 7.4343
constant ntimes = 5
! The end of a loop statement is now denoted with the "end"
! keyword. Labeled statements and "continue" are no longer
! supported.
! The loop index shold be declared if it's an integer
dimension integer i
for i = 1, ntimes
schedule reset at resetTimes[i]
end
end
derivative
constant k = 1.0
xd = k
x = integ(xd, 0.0)
constant tstop = 10.0
termt(t >= tstop, 'Stopped on time limit')
end ! derivative
discrete reset
x = 0.0
end
end ! program