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 4 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("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() )

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>

ecf_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