ecFlow's documentation is now on readthedocs!

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Next »

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()
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() )
The name of the repeat defines an ECF variable.
We can write a ecf script /test/f4/f5/t1.ecf to use these variables
%include <head.h>
ecflow_client --label=info "My name is %NAME%" "My value is %VALUE%" "My date is %DATE%"
sleep %SLEEP%
%include <tail.h>

What to do:

  1. Type in the changes
  2. Load and begin the suite
  3. How many times will /test/f4/f5/t1 run?
  4. In ecflowview, try to modify the values of a repeat
  • No labels