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