It is sometimes useful to repeat the same task or family several times,
looping on a specific value. You can do that by defining a repeat attribute.
There are three kinds of data you can loop on:
- strings
- integers
- dates
Integers and dates are specified as a range, with an optional increment (the default is one).
Let us modify the suite definition file again
# Definition of the suite test.
suite test
edit ECF_INCLUDE "$HOME/course"
edit ECF_HOME "$HOME/course"
family f1
edit SLEEP 20
task t1
meter progress 1 100 90
task t2
trigger t1 eq complete
event a
event b
task t3
trigger t2:a
task t4
trigger t2 eq complete
complete t2:b
task t5
trigger t1:progress ge 30
task t6
trigger t1:progress ge 60
task t7
trigger t1:progress ge 90
endfamily
family f2
edit SLEEP 20
task t1
time 00:30 23:30 00:30
task t2
day sunday
task t3
date 01.*.*
time 12:00
task t4
time +00:02
task t5
time 00:02
endfamily
family f3
task t1
label info ""
endfamily
family f4
edit SLEEP 2
repeat string NAME a b c d e f
family f5
repeat integer VALUE 1 10
task t1
repeat date DATE 19991230 20000105
label info ""
endfamily
endfamily
endsuite
In python this would be:
#!/usr/bin/env python2.5
import os
import ecflow
def list_to_str_vec( theList ):
"""Converts a python list to a C++ StrVec"""
strvec = ecflow.StrVec()
for theStr in theList:
ecflow.StrVec.append(strvec,theStr)
return strvec;
def create_family_f4():
f4 = ecflow.Family("f4")
f4.add_variable("SLEEP",2)
f4.add_repeat( ecflow.RepeatString("NAME", list_to_str_vec( ["a", "b", "c", "d", "e", "f" ] )) )
f5 = f4.add_family("f5")
f5.add_repeat( ecflow.RepeatInteger("VALUE",1,10) )
t1 = f5.add_task("t1")
t1.add_repeat( ecflow.RepeatDate("DATE",20101230,20110105) )
t1.add_label("info","")
return f4
defs = ecflow.Defs("test.def")
suite = defs.add_suite("test")
suite.add_variable("ECF_INCLUDE",os.getenv("HOME") + "/course")
suite.add_variable("ECF_HOME ",os.getenv("HOME") + "/course")
suite.add_family( create_family_f4() )
We can write a ecf script /test/f4/f5/t1.ecf to use these variables
%include <head.h>
ecf_client --label=info "My name is %NAME%" "My value is %VALUE%" "My date is %DATE%"
sleep %SLEEP%
%include <tail.h>
What to do:
- Type in the changes
- Load and begin the suite
- How many times will /test/f4/f5/t1 run?
- In ecFlowview, try to modify the values of a repeat