Seeing the Order of Process, Task and Module Execution

Now that you have learned how to add and prioritize processes with task lists, as well as assign Basilisk modules to the task for an ordered execution, it is nice to be able to see how the simulation is setup. The SimulationBaseClass defines a method ShowExecutionOrder which will print to the terminal window the process names and priorties as they are setup to be executed. For each process you will see the order with which the tasks will be called, and the order of task modules that will be executed. This is very handy to quickly validate that the simulation is setup as desired.

The sample script below creates two processes called dynamicsProcess and fswProcess. Note that because the fswProcess has a higher priority, it is executed first even though it is added second. The same two modules are added to a range of tasks in different orders and using different priorities.

 2from Basilisk.moduleTemplates import cModuleTemplate
 3from Basilisk.utilities import SimulationBaseClass
 4from Basilisk.utilities import macros
 7def run():
 8    """
 9    Controlling the simulation time
10    """
12    #  Create a sim module as an empty container
13    scSim = SimulationBaseClass.SimBaseClass()
15    #  create the simulation process
16    dynProcess = scSim.CreateNewProcess("dynamicsProcess")
17    fswProcess = scSim.CreateNewProcess("fswProcess", 10)
19    # create the dynamics task and specify the integration update time
20    fswProcess.addTask(scSim.CreateNewTask("fswTask1", macros.sec2nano(1.)))
21    fswProcess.addTask(scSim.CreateNewTask("fswTask2", macros.sec2nano(2.)))
22    fswProcess.addTask(scSim.CreateNewTask("fswTask3", macros.sec2nano(3.)), 10)
23    dynProcess.addTask(scSim.CreateNewTask("dynamicsTask1", macros.sec2nano(1.)))
24    dynProcess.addTask(scSim.CreateNewTask("dynamicsTask2", macros.sec2nano(5.)), 10)
25    dynProcess.addTask(scSim.CreateNewTask("dynamicsTask3", macros.sec2nano(10.)))
27    # create modules
28    mod1 = cModuleTemplate.cModuleTemplateConfig()
29    mod1Wrap = scSim.setModelDataWrap(mod1)
30    mod1Wrap.ModelTag = "cModule1"
32    mod2 = cModuleTemplate.cModuleTemplateConfig()
33    mod2Wrap = scSim.setModelDataWrap(mod2)
34    mod2Wrap.ModelTag = "cModule2"
36    # add modules to various task lists
37    scSim.AddModelToTask("dynamicsTask1", mod1Wrap, mod1, 4)
38    scSim.AddModelToTask("dynamicsTask1", mod2Wrap, mod2, 5)
39    scSim.AddModelToTask("dynamicsTask2", mod2Wrap, mod2)
40    scSim.AddModelToTask("dynamicsTask2", mod1Wrap, mod1)
41    scSim.AddModelToTask("dynamicsTask3", mod1Wrap, mod1)
42    scSim.AddModelToTask("dynamicsTask3", mod2Wrap, mod2)
44    scSim.AddModelToTask("fswTask1", mod1Wrap, mod1)
45    scSim.AddModelToTask("fswTask1", mod2Wrap, mod2, 2)
46    scSim.AddModelToTask("fswTask2", mod2Wrap, mod2)
47    scSim.AddModelToTask("fswTask2", mod1Wrap, mod1)
48    scSim.AddModelToTask("fswTask3", mod1Wrap, mod1)
49    scSim.AddModelToTask("fswTask3", mod2Wrap, mod2)
51    # print to the terminal window the execution order of the processes, task lists and modules
52    scSim.ShowExecutionOrder()
54    # uncomment this code to show the execution order figure and save it off
55    # fig = scSim.ShowExecutionFigure(False)
56    # fig.savefig("qs-bsk-2b-order.svg", transparent=True, bbox_inches = 'tight', pad_inches = 0)
58    return
61if __name__ == "__main__":
62    run()

To execute the code, this script doesn’t run the simulation itself. Rather, the simulation is setup and configured, and then the ShowExecutionOrder is called:


If you execute this python code you should see the following terminal output:

$ python3
Process Name: fswProcess , priority: 10
Task Name: fswTask3, priority: 10, TaskPeriod: 3.0s
ModuleTag: cModule1, priority: -1
ModuleTag: cModule2, priority: -1
Task Name: fswTask1, priority: -1, TaskPeriod: 1.0s
ModuleTag: cModule2, priority: 2
ModuleTag: cModule1, priority: -1
Task Name: fswTask2, priority: -1, TaskPeriod: 2.0s
ModuleTag: cModule2, priority: -1
ModuleTag: cModule1, priority: -1

Process Name: dynamicsProcess , priority: -1
Task Name: dynamicsTask2, priority: 10, TaskPeriod: 5.0s
ModuleTag: cModule2, priority: -1
ModuleTag: cModule1, priority: -1
Task Name: dynamicsTask1, priority: -1, TaskPeriod: 1.0s
ModuleTag: cModule2, priority: 5
ModuleTag: cModule1, priority: 4
Task Name: dynamicsTask3, priority: -1, TaskPeriod: 10.0s
ModuleTag: cModule1, priority: -1
ModuleTag: cModule2, priority: -1

The method ShowExecutionFigure(True) will perform the same Basilisk process, task and module order extraction process, but display is as a figure. The method returns a copy of the figure so it can be used in auto-documentation features or saved off for future use. For example, adding this command to this sample script will yields the following figure.