Adding a meter
A meter is very similar to an event, but instead of a boolean value (true/false) it can take a range of integer values. Other tasks can be triggered when the meter reaches a certain value. Like an event, a meter has a name and a task can have several of them.
Update Task Script
Create new tasks t5, t6 and t7 that will be triggered when the meter in task t1 reaches certain values.
To notify ecflow_server, update the task t1 to use the ecflow_client with the --meter option (this is one of the child commands).
%include <head.h>
echo "I will now sleep for %SLEEP% seconds"
sleep %SLEEP%
n=1
while [[ $n -le 100 ]] # Loop 100 times
do
sleep 1 # Wait a short time
ecflow_client --meter=progress $n # Notify ecFlow
(( n = $n + 1 ))
done
%include <tail.h>
Update Suite Definition
Update the suite definition to add the meter to task t1 and the new tasks t5, t6 and t7.
# Definition of the suite test.
suite test
edit ECF_INCLUDE "{{HOME}}/course" # replace '{{HOME}}' appropriately
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
endsuite
import os
from ecflow import Defs, Suite, Family, Task, Edit, Trigger, Complete, Event, Meter
def create_family_f1():
return Family(
"f1",
Edit(SLEEP=20),
Task("t1", Meter("progress", 1, 100, 90)),
Task("t2", Trigger("t1 == complete"), Event("a"), Event("b")),
Task("t3", Trigger("t2:a")),
Task("t4", Trigger("t2 == 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")),
)
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_f1()))
print(defs)
print("Checking job creation: .ecf -> .job0")
print(defs.check_job_creation())
print("Saving definition to file 'test.def'")
defs.save_as_defs("test.def")
What to do:
Create the new task scripts, as described above.
Modify the task script
t1.ecfto use the--meteroption, as shown above.Modify the suite definition, as shown above.
Replace the suite, using:
ecflow_client --suspend /test ecflow_client --replace /test test.def
python3 test.py python3 client.py
Observe the tasks in ecflow_ui.
Inspect the meter as it changes.
Inspect the triggers by selecting progress and clicking on the Triggers icon.
Modify the value of the meter using the context menu in the progress icon.