Repeat

有时需要重复多次运行某些 taskfamily,按某指定值循环。 ecFlow 提供 repeat 属性实现该功能。

repeat 可以按下列类型的序列循环:

  • 字符串
  • 整数
  • 日期

整数和日期的序列由起始元素、终止元素和可选的间隔(默认为1)生成。 ecFlow 会创建一个与 repeat 名字对应的变量,可以在脚本或 trigger 表达式中使用。

Ecf脚本

创建一个新的脚本 $ECF_HOME/test/f4/f5/t1.ecf

  1. %include <head.h>
  2. ecflow_client --label=info "My name is %NAME%" "My value is %VALUE%" "My date is %DATE%"
  3. # 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
  4. # These can also be used in trigger expression.
  5. ecflow_client --label=date "year:%DATE_YYYY% month:%DATE_MM% day of month:%DATE_DD% day of week:%DATE_DOW%"
  6. sleep %SLEEP%
  7. %include <tail.h>

Suite definition

在 suite definition 中添加 repeat,省略前面的定义。

Text

repeat 定义语法:

  1. repeat ::= "repeat" >> repeat_type >> +nextline
  2. repeat_type ::= repeat_date | repeat_day | repeat_month | repeat_year | repeat_integer | repeat_enumerated | repeat_string
  3. repeat_day ::= "day" >> unsigned integer >> !ymd
  4. repeat_month ::= "month" >> unsigned integer >> !ymd
  5. repeat_year ::= "year" >> unsigned integer >> !ymd
  6. repeat_integer ::= "integer" >> identifier >> integer >> " " >> integer >> " " >> integer
  7. repeat_enumerated ::= "enumerated" >> identifier >> +identifier
  8. repeat_string ::= "string" >> identifier >> +identifier
  9. repeat_date ::= "date" >> identifier >> ymd >> ymd >> integer

下面以整型和日期为例说明。

  1. # Definition of the suite test.
  2. suite test
  3. edit ECF_INCLUDE "$ECF_HOME"
  4. edit ECF_HOME "$ECF_HOME"
  5. family f4
  6. edit SLEEP 2
  7. repeat string NAME a b c d e f
  8. family f5
  9. repeat integer VALUE 1 10
  10. task t1
  11. repeat date DATE 20101230 20110105
  12. label info ""
  13. label date ""
  14. endfamily
  15. endfamily
  16. endsuite

Python

  1. import os
  2. from pathlib import Path
  3. from ecflow import Defs, Suite, Task, Family, Edit, Trigger, \
  4. Event, Complete, Meter, Time, Day, Date, Cron, Label, \
  5. RepeatString, RepeatInteger, RepeatDate
  6. # ... skip ...
  7. def create_family_f4():
  8. return Family("f4",
  9. Edit(SLEEP=2),
  10. RepeatString("NAME", ["a", "b", "c", "d", "e", "f"]),
  11. Family("f5",
  12. RepeatInteger("VALUE", 1, 10),
  13. Task("t1",
  14. RepeatDate("DATE", 20101230, 20110105),
  15. Label("info", ""),
  16. Label("date", "")
  17. )
  18. )
  19. )
  20. print("Creating suite definition")
  21. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  22. defs = Defs(
  23. Suite('test',
  24. Edit(ECF_INCLUDE=home, ECF_HOME=home),
  25. create_family_f1(),
  26. create_family_house_keeping(),
  27. create_family_f3(),
  28. create_family_f4()))
  29. print(defs)
  30. print("Checking job creation: .ecf -> .job0")
  31. print(defs.check_job_creation())
  32. print("Saving definition to file 'test.def'")
  33. defs.save_as_defs(str(Path(home, "test.def")))
  34. # To restore the definition from file 'test.def' we can use:
  35. # restored_defs = ecflow.Defs("test.def")

注意下面的对应关系

  • 文本:ecflow.RepeatString
  • 整数:ecflow.RepeatInteger
  • 日期:ecflow.RepeatDate

运行脚本:

  1. $python test.py
  2. Creating suite definition
  3. # 4.8.0
  4. suite test
  5. edit ECF_INCLUDE '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  6. edit ECF_HOME '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  7. # ... skip ...
  8. family f4
  9. repeat string NAME "a" "b" "c" "d" "e" "f"
  10. edit SLEEP '2'
  11. family f5
  12. repeat integer VALUE 1 10
  13. task t1
  14. repeat date DATE 20101230 20110105 1
  15. label info ""
  16. label date ""
  17. endfamily
  18. endfamily
  19. endsuite
  20. Checking job creation: .ecf -> .job0
  21. Saving definition to file 'test.def'

Python API 说明

ecflow.RepeatDate 日期
  1. RepeatDate(variable,start,end,delta)
  2. string variable: The name of the repeat. The current date can referenced in
  3. in trigger expressions using the variable name
  4. int start: Start date, must have format: yyyymmdd
  5. int end: End date, must have format: yyyymmdd
  6. int delta: default = 1, Always in days. The increment used to update the date

示例

  1. rep = RepeatDate("YMD", 20050130, 20050203 )
  2. rep = RepeatDate("YMD", 20050130, 20050203, 2 )
ecflow.RepeatDay 天
  1. RepeatDay(step)
  2. int step: The step.

示例:

  1. rep = RepeatDay( 1 )
ecflow.RepeatEnumerated 数组
  1. RepeatEnumerated(variable,list)
  2. string variable: The name of the repeat. The current enumeration index can be
  3. referenced in trigger expressions using the variable name
  4. vector list: The list of enumerations

示例:

  1. rep = RepeatEnumerated("COLOR", [ 'red', 'green', 'blue' ] )
ecflow.RepeatInteger 整数
  1. RepeatInteger(variable,start,end,step)
  2. string variable: The name of the repeat. The current integer value can be
  3. referenced in trigger expressions using the variable name
  4. int start: Start integer value
  5. int end: End end integer value
  6. int step: Default = 1, The step amount

示例

  1. rep = RepeatInteger("HOUR", 6, 24, 6 )
ecflow.RepeatString 字符串
  1. RepeatString(variable,list)
  2. string variable: The name of the repeat. The current index of the string list can be
  3. referenced in trigger expressions using the variable name
  4. vector list: The list of enumerations

示例:

  1. rep = RepeatString("COLOR", [ 'red', 'green', 'blue' ] )

任务

  1. 完成修改
  2. 替换 suite definition

    Repeat - 图1

  3. /test/f4/f5/t1 将会运行多少次?

  4. 尝试在 ecflow_ui 中修改某个 repeat 的值。

    Repeat - 图2

    Repeat - 图3