Page tree
Skip to end of metadata
Go to start of metadata
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.
You can iterate over sequences of:
  • strings
  • integers
  • dates
A sequence of integers or dates is created by specifying the
first and last element, with an optional increment (the default is one).
An ecFlow variable, whose name corresponds to the name of the repeat,
will be generated. This can be used in scripts or trigger expressions.
   

Ecf Script

We will add a new task /test/f4/f5/t1.
Create new ecf script file $HOME/course/test/f4/f5/t1.ecf to use these variables.

 

$HOME/course/test/f4/f5/t1.ecf
%include <head.h>
ecflow_client --label=info "My name is '%NAME%' " " My value is '%VALUE%' " " My date is '%DATE%' "
# Note the use of repeat date generated variables DATE_YYYY, DATE_MM, DATE_DD, DATE_DOW to automatically reference year,month,day of the month,day of the week 
# These can also be used in trigger expression.
ecflow_client --label=date "year(%DATE_YYYY%) month(%DATE_MM%) day of month(%DATE_DD%) day of week(%DATE_DOW%)"  
sleep %SLEEP%
%include <tail.h>

Text

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 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 20101230 20110105
             label info ""
             label date ""
     endfamily
 endfamily
endsuite

Python

$HOME/course/test.py
import os
from ecflow import Defs,Suite,Family,Task,Edit,Trigger,Complete,Event,Meter,Time,Day,Date,Label, \
                   RepeatString,RepeatInteger,RepeatDate
        
def create_family_f4():
    return Family("f4",
                Edit(SLEEP=2), 
                RepeatString("NAME", ["a", "b", "c", "d", "e", "f" ]),
                Family("f5",
                    RepeatInteger("VALUE", 1, 10),
                    Task("t1",
                        RepeatDate("DATE", 20101230, 20110105),
                        Label("info",""),
                        Label("date",""))))
 
print("Creating suite definition")  
home = os.path.join(os.getenv("HOME"), "course")
defs = Defs( 
        Suite("test",
            Edit(ECF_INCLUDE=home, ECF_HOME=home),
            create_family_f4()))
print(defs) 
print("Checking job creation: .ecf -> .job0")  
print(defs.check_job_creation())

print("Checking trigger expressions")
assert len(defs.check()) == 0,defs.check() 

print("Saving definition to file 'test.def'")
defs.save_as_defs("test.def")

What to do

  1. Type in the changes
  2. Replace the suite definition
  3. How many times will /test/f4/f5/t1 run?
  4. In ecflow_ui , try to modify the values of a repeat
  5. Since we are using 2 second delay, remember to use f5(refresh) to see the intermediate values. The default is to refresh every 60 seconds.



  

  • No labels

2 Comments

  1. repeat enumerated VAR a b c

    can also be used. It is widely appreciated when families must loop over an irregularly stepped list of dates (seasonal suites, eras)

    when a repeat variable is used in a trigger, its position is used for repeat string

    its value (when integer) of its position (otherwise) is used for repeat enumerated

    and its value is used for repeat date and integer.

  2. Alternative styles

    import os
    import ecflow as *
    
    print("Creating suite definition")
    home = os.path.join(os.getenv("HOME"), "course")
    defs = Defs(
            Suite("test",
                Edit(ECF_INCLUDE=home, ECF_HOME=home),
                Family("f4",
                    Edit(SLEEP=2), 
                    RepeatString("NAME", ["a", "b", "c", "d", "e", "f" ]),
                    Family("f5",
                        RepeatInteger("VALUE", 1, 10),
                        Task("t1",
                            RepeatDate("DATE", 20101230, 20110105),
                            Label("info", ""),
                            Label("data",""))))))
    print(defs)
    print("Checking trigger expressions")
    assert len(defs.check()) == 0,defs.check() 
    
    print("Checking job creation: .ecf -> .job0")
    result = defs.check_job_creation()
    
    print("Saving definition to file 'test.def'")
    defs.save_as_defs("test.def")
    defs.test.replace_on_server()
    import os
    import ecflow as *
    
    print("Creating suite definition")
    home = os.path.join(os.getenv("HOME"), "course")
    defs = Defs().add( Suite("test") )
    defs.test += [ {"ECF_INCLUDE":home,"ECF_HOME":home}, 
                   Family("f4") ]
    defs.test.f4 += [ Edit(SLEEP=2),
                      RepeatString("NAME", ["a", "b", "c", "d", "e", "f" ]),
                      Family("f5") ]
    defs.test.f4.f5 += [ RepeatInteger("VALUE", 1, 10),
                         Task("t1")]
    defs.test.f4.f5.t1 += [ RepeatDate("DATE", 20101230, 20110105),
                            Label("info", ""),
                            Label("data","") ]
    print(defs)
    print("Checking trigger expressions")
    assert len(defs.check()) == 0,defs.check() 
    
    print("Checking job creation: .ecf -> .job0")
    result = defs.check_job_creation()
    
    print("Saving definition to file 'test.def'")
    defs.save_as_defs("test.def")
    defs.test.replace_on_server()