Horizontal Navigation Bar |
---|
Button Group |
---|
Button Hyperlink |
---|
title | Previous |
---|
type | standard |
---|
url | https://softwareconfluence.ecmwf.int/wiki/display/ECFLOW/LabelsAdvanced+Topics |
---|
|
Button Hyperlink |
---|
title | Up |
---|
type | standard |
---|
url | https://softwareconfluence.ecmwf.int/wiki/display/ECFLOW/Advanced+Topics |
---|
|
Button Hyperlink |
---|
title | Next |
---|
type | standard |
---|
url | https://softwareconfluence.ecmwf.int/wiki/display/ECFLOW/Limits |
---|
|
|
|
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:
...
A sequence of integers or dates is created by specifying the
first and the last element, with an optional increment (the default is one).
From ecflow5 we can also loop over an arbitrary list of dates.
Code Block |
---|
|
repeat datelist YMD 20130101 20130102 20130103 20200101 20190101 |
An ecFlow variable, whose name corresponds to the name of the repeat,
will be generated. This can be used in scripts or
trigger expressions
. .
Note |
---|
If repeat date, or repeat datelist are used in trigger expressions, they will use date arithmetic. |
Repeat with day/date
The behaviour of day/date attribute under a repeat has changed from ecflow 4.0. Take the example below.
In ecflow 4.0, if task t1 took longer than 1-hour task t2 would not run. (i.e. because we strayed over to the next day)
In ecflow 5.0, once the day monday is free on family f1, it stays free until the automatic re-queue caused by the parent repeat. The net effect being that task t2 will still run, even if we have strayed into Tuesday.
Code Block |
---|
title | day/date remain free until re-queue |
---|
|
suite s1
family f
repeat integer rep 0 7
family f1
day monday
time 23:00
task t1
task t2
trigger t1 == complete
... |
Repeat increment
A repeat under a family node will only increment when all the child nodes are complete.
In the example above, once task t1, and t2 are complete, the repeat integer rep will increment to the next value.
-
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.
Code Block |
---|
language | bash |
---|
title | $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
Code Block |
---|
# 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 endfamilydate ""
endfamily
endfamily
endsuite |
Python
#!/usr/bin/env python2.7
Python
Code Block |
---|
language | py |
---|
title | $HOME/course/test.py |
---|
|
import os
from ecflow import |
ecflow
Defs,Suite,Family,Task,Edit,Trigger,Complete,Event,Meter,Time,Day,Date,Label, \
RepeatString,RepeatInteger,RepeatDate
def create_family_f4():
|
f4 =ecflow.)
f4.add_variable("SLEEP", 2)f4.add_repeat( ecflow. RepeatString("NAME", ["a", "b", "c", "d", "e", "f" ] |
) )
f5=f4.add_family)
f5.add_repeat(ecflow.RepeatInteger("VALUE", 1, 10) |
)
t1=f5.add_task)
t1.add_repeat(ecflow.RepeatDate("DATE", 20101230, 20110105) |
)
t1.add_label
returnf4
print"Creatingsuitedefinition"
defs=ecflow.Defs()
suite=defs.add_suite("test")
suite.add_variable("ECF_INCLUDE",Label("date",""))))
print("Creating suite definition")
home = os.path.join(os.getenv("HOME"), |
)
suite.add_variable("ECF_HOME",
defs = Defs(
Suite("test",
|
os.path.join(os.getenv("HOME"), "course"))
suite.add_family(Edit(ECF_INCLUDE=home, ECF_HOME=home),
create_family_f4()) |
defs
("Checking job creation: .ecf -> .job0" |
(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
- Type in the changes
- Replace the suite definition
- How many times will /test/f4/f5/t1 run?
- In ecflow_ui , try to modify the values of a repeat
- Since we are using a 2-second delay, remember to use f5(refresh) to see the intermediate values. The default is to refresh every 60 seconds.
Horizontal Navigation Bar |
---|
Button Group |
---|
Button Hyperlink |
---|
title | Previous |
---|
type | standard |
---|
url | https://softwareconfluence.ecmwf.int/wiki/display/ECFLOW/LabelsAdvanced+Topics |
---|
|
Button Hyperlink |
---|
title | Up |
---|
type | standard |
---|
url | https://softwareconfluence.ecmwf.int/wiki/display/ECFLOW/Advanced+Topics |
---|
|
Button Hyperlink |
---|
title | Next |
---|
type | standard |
---|
url | https://softwareconfluence.ecmwf.int/wiki/display/ECFLOW/Limits |
---|
|
|
|