Tutorial: Advanced System Dynamics Modelling

From End-User Wiki
Revision as of 09:05, 3 December 2013 by Teemu Lempinen (talk | contribs) (Is output location changed from additional information to equation tab)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

In this tutorial, we are going to bild a work model with two projects and shared workforce. Both the workforce and a separate project (work) are going to be created as modules, so they can be reused several times. Actually the model doesn't limit the number of projects at all.

Creating model and modules

Let's start by creating the work model and the needed modules. First create a new model by right-clicking on the model browser and selecting New->Model. Alternatively you can select File->New Model from the main menu.

Then create two new modules to your model. Right-click on the Modules folder and select New->Module.

Name your model WorkModel and modules WorkforceModule and WorkModule. You can rename them by right-clicking on the item on the model browser and selecting Rename.

Creating a new model
Creating a new module
Model after renaming

Initial configuration

Workforce and Work modules

We will use a top-down approach in our model, so first we will make a simple model configuration with our modules. Open our model configuration by double-clicking Configuration in your model browser.

Drag one WorkforceModule and one WorkModule from your model browser to the WorkModel diagram. The modules are automatically named with a suffix number. Rename the modules to Workforce and Work1. You can rename objects on the diagram by double-clicking them or selecting them with one click and renaming them on the properties view below the diagram.

Workforce and Work modules, first inputs and connections

When the modules are on the diagram, we should think what values we would like to get from the modules and what values we would like to use in the modules.

Workforce needs to know, how much work is required and it should provide information on how much work can be done. To provide the information on how much work can be done, we need an Input variable. Variables can be dragged to the diagram from Symbols view or by using shortcut keys (Shift+I for Input variable). Drag an input variable to the diagram and name it TotalPossibleWorkingSpeed.

Work module on the other hand provides information on how much work is required in it and it needs to know when the work has to be ready. Create an input variable RequiredWorkingSpeed1 and an Auxiliary variable Work1CompletionTime and place all variables like in the picture on the right.

Connect the variables to modules using dependency connections (arrows). Connections are created by holding down Alt key and first clicking on the variable where to start the connection and then clicking on the variable where to end.

Now we have the initial idea of the model, so let's configure the modules.

Workforce module

Cloud, Valve, Flow and Stock

Open Workforce module by selecting it from the diagram, right-clicking it and selecting Show Module.

Create a Stock variable and name it WorkforceStock. Stock variables are created the same way as Input and Auxiliary variables. The level of the stock is controlled with a valve and a flow. To create the flow, hold down Alt and right-click on an empty space left of the stock. Then left-click on the stock. A cloud, valve and a flow is created. Rename the valve to NetResourcing.

Cloud, Valve, Flow and Stock. Flow works both on directions.

NetResourcing works both ways. To display this also visually, delete the cloud by selecting it and pressing delete on your keyboard. Then create a flow starting from NetResourcing valve and ending on an empty space next to it.

Auxiliaries in Workforce module

Now you have used all the basic components and connections. From now on the instructions will be a more simplified.

Next we will create four Auxiliary variables: TimeToAllocateResources, WorkforceRequired, Productivity and PossibleWorkingSpeed. Place and connect them according to the picture on the right.

To be able to simulate the model, all variables must have valid equations. To configure an equation, select a variable. Variable's properties are shown in the Property view and you can input the required equations in the text fields. You can copy the equations directly from here or type them manually. Variables connected to the selected variable are shown in the Variables list. To speed up typing, you can double click on a variable name and it will be inserted to the equation.

Initial value: 0

= (WorkforceRequired - WorkforceStock)/TimeToAllocateResources

= 2

= 1

= WorkforceStock * Productivity
Is Output

Variables can be set as output by selecting Is Output option from the Equation tab.


On a previous phase, we wanted to give the value of RequiredWorkingSpeed1 to this workforce module. To get that value, we need to create an input. Create input RequiredWorkingSpeedInput, connect it to WorkforceRequired and write the following equation to WorkforceRequired.

= RequiredWorkingSpeedInput/Productivity

Now this module is ready to be used as a part of the model.

Work module

Basic work with errors

Open Work1 module by selecting it from the WorkModel diagram, right-clicking it and selecting Show Module. Alternatively you can double click Work1 on the model browser.

Create the basic flow of work with stocks and flows like in the picture on the right.

The idea of the model is that first there is work. Work is done at a certain speed. When working, errors are also made. When errors are found, the amount of Errors is reduced, errors are removed from WorkDone and moved back to WorkToDo.

Smoothener for work is done

Work needs to be stopped when the project is ready. Since the simulator might face some difficulties to determine the projects readyness when project is almost ready, we need to implement some smoothing to the limit. OpenModelica doesn't yet have a builtin function for smoothing, so we need to implement our own. Create variables and connections according to the picture on the right.

Use the following equations for variables:

Initial value: 0

= (xidz(WorkDone, ProjectWorkAmount, 0.0) - ProjectIsReady) / 0.08

xidz is short for function X if devided by zero. This means that the simulation calculates WorkDone / ProjectWorkAmount. If ProjectWorkAmount is zero, the result is the third argument 0.0.

ProjectWorkAmount input variable

As you can see, ProjectWorkAmount is highlighted. Your model doesn't contain such variable and it is not connected to ProjectReadyness. Create an Input variable ProjectWorkAmount with default value 1000 and connect it to ProjectReadyness. The reason we are using input variable is that you can determine the default size of a project, but if you want to change it, you can change it from outside the module.

Variables needed for error handling

Next we need to define how errors are found. For that we need new variables: WorkQuality and ErrorsFoundTime. Create the variables and connections according to the picture and give variables their equations.

= (1-WorkQuality) * WorkingSpeed

= Errors/ErrorsFoundTime

= 0.9

Type: WithLookup
With Lookup: xidz(WorkDone, ProjectWorkAmount, 0.0)
Lookup table: {{0,5},{0.5,3},{1,0.5},{2,0.5}}

WithLookup is a variable type where the value is interpolated from a 2-dimensional table (Lookup table) using the value determined in the "With Lookup" field. Type can be changed from the drop-down menu Type.

WorkAllocation and RequiredWorkingSpeed

To calculate our own need for workforce we need to create and connect WorkCompletionTime input variable and the following auxliary variables:

= if ProjectIsReady < 1 then xidz(WorkToDo, TimeToDeadline, MaximumWorkingSpeed) else 0
Is Output

= 500

= max(0, WorkCompletionTime-time)

time is a universal variable that gives the current simulation time.

We need to decide how the workforce is allocated between all the work modules that are using the same workforce. For that we need to know how much work can be done and how much workforce other works require.

Create two Inputs, RequiredWorkingSpeedTotalInput and PossibleWorkingSpeedInput, and an auxiliary variable WorkAllocation. Connect the variables like int the picture.

= xidz(RequiredWorkingSpeed, RequiredWorkingSpeedTotalInput, 0.0) * PossibleWorkingSpeedInput

Finally let's give initial values for all the remaining variables:

= if ProjectIsReady < 1 then WorkAllocation else 0

Initial value: ProjectWorkAmount

Initial value: 0

Initial value: 0

Connecting modules

Our modules are complete. Let's get back to the WorkModel Configuration.

Set Work1CompletionTime to 10.

Module input connections

Connections between modules are made in the properties of the module. Select Work1 and open tab Inputs from the properties. The table lists all input variables in the module that are available. Clicking on the Refers to output column will open a drop-down menu that shows all available variables that are connected to the module. By selecting a variable, you connect that variable to the input.

Error creating thumbnail: /bin/bash: /usr/bin/convert: No such file or directory Error code: 127
Connection from RequiredWorkingSpeed to Work1
Module input connections

Work1 need also information on how much working speed is required by all works. Since Work1 is the only work, create a dependency connection from RequiredWorkingSpeed1 to Work1 and in Work1's properties connect it to RequiredWorkingSpeedTotalInput.

In Outputs tab, make the only possible connection: from RequiredWorkingSpeed to RequiredWorkingSpeed1.

Workforce module has only one input and one output. Create the only possible connections:
(Inputs) RequiredWorkingSpeedInput -> RequiredWorkingSpeed1
(Outputs) PossibleWorkingSpeed -> TotalPossibleWorkingSpeed

Now your model is ready for simulation!

Simulating the model

To make the simulation time longer, select Configuration on the model browser. Give the model Stop time 24.0

Experiment activation

To run simulations, you must activate an experiment. Expand the experiments folder on your model browser. There is one ready-made experiment. Double click on the experiment and the experiment control buttons appear on the toolbar. Press the play button ExperimentPlay.png.

System shows the simulation progress in the progress bar on the lower right corner of the screen.


When the progress indicator disappears, the simulation is complete.

If the Console view pops up and shows an error "Error: Too few equations, underdetermined system. The model has X equation(s) and Y variable(s)", the simulation has failed. The reason might be that you forgot to assign an equation to some variable or some connection in modules. See through all the variables, write the missing equation and simulate again.

After the simulation is succesfully run, you can select a variable and see its simulation results in the trend view. For example WorkDone variable in Work1 module will give the following graph.


Adding modules

Final configuration with two modules

We created the WorkModule to be reusable. To use two WorkModules in the model, you must do the following.

Populate a second WorkModule to WorkModel configuration and name it Work2.

Create RequiredWorkingSpeed2 input variable and Work2CompletionTime auxiliary variable.

We need a sum of all working speed requirements to give to the work modules. For this purpose, create an auxiliary variable RequiredWorkingSpeedTotal which sums the requirements.

You can also have a different size work. To make Work2 smaller, create an auxiliary variable Work2Amount.

Use the following equations:

= 13

= 800

= RequiredWorkingSpeed1 + RequiredWorkingSpeed2

Update connections to match connections shown in the picture and connect the inputs and outputs to the modules.

RequiredWorkingSpeedInput -> RequiredWorkingSpeedTotal

Work1 Inputs
RequiredWorkingSpeedTotalInput -> RequiredWorkingSpeedTotal

Work2 Outputs
RequiredWorkingSpeed -> RequiredWorkingSpeed2

Work2 Inputs

When all the connections are made, you can simulate the model again. Now you have model with two work modules. Select variables from both modules in model browser to display them in trend view.