Monte Carlo is an advanced simulation capability provided by Trick that allows users to repeatedly run copies of a simulation with different input values. Users can vary the input space of a simulation via input file, random value generation, or by calculating values from previous Monte Carlo runs in a process called optimization. This tutorial will show you how to modify the cannon_numeric simulation to take advantage of this capability.
**For a thorough explanation of Monte Carlo and its features, read the [Monte Carlo User Guide](/trick/documentation/simulation_capabilities/UserGuide-Monte-Carlo).**
<aid=example-task></a>
## Example Task
**What would be the optimal launch angle required to ensure our cannonball travels the furthest distance?** Let us assume that we have no conception of physics or trigonometry and that we don't already know the answer.
Input files allow you to specify the exact values you want on a particular simulation run. Input files are the most precise implementation, but they require more effort to setup and modify later down the road. Input files can contain multiple (tab or space) delimited columns filled with numerical information.
### Value List
Create the following text file in your simulation directory with the name **angle\_value\_list**:
<aid=listing-value-list></a>
**Listing - angle_value_list**
```
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
```
This text file will be used to assign the cannon's initial angle. Remember that this angle is in radians.
### Updating our Input File
The simulation input file must be adjusted to run the simulation using Monte Carlo techniques.
```
% cd $HOME/trick_sims/SIM_cannon_analytic/RUN_test
% vi input.py
```
The simulation must be told to enable Monte Carlo, recognize a Monte Carlo variable, and use the angle_value_list file created above. To accomplish this, change the input file to include the following:
<aid=listing-input_1></a>
**Listing - input.py**
```python
exec(open("Modified_data/cannon.dr").read())
# Enable Monte Carlo.
trick.mc_set_enabled(1)
# Sets the number of runs to perform to 15. Trick will not exceed the number of values in an input file.
trick.mc_set_num_runs(15)
# Create and add a new Monte Carlo File variable to the simulation.
# Stop Monte Carlo runs after 25 seconds of simulation time
trick.stop(25)
# Stop Monte Carlo runs if they take longer than 1 second of real time
trick.mc_set_timeout(1)
```
After the file has been adjusted, save it and run the simulation.
```
% cd ..
% ./S_main*.exe RUN_test/input.py
```
The terminal will display a fairly verbose Monte Carlo process detailing each run. After completion, information about each run will be put into a MONTE_RUN_test directory.
In order to complete our task of finding the optimal launch angle, it will be necessary to plot each run to compare the distance achieved by each cannon. Open up the Trick Data Product application with the following command.
```
trick-dp &
```
<palign="center">
<imgsrc="images/Trick-DP.png"width=750px/>
</p>
Right click the MONTE_RUN_test directory and select **Add run(s)**. Then open quick plot by clicking the blue lightning bolt. Expand the dyn.cannon.pos[0-1] variable in the left pane and create a curve with pos[1] as the Y axis and pos[0] as the X axis. Finally, click the **comparison plot** button in the actions menu.
<palign="center">
<imgsrc="images/MONTE_list_plot.png"width=750px/>
</p>
The various curves show the trajectories of each cannon run. It may be necessary to hide the legend if all the run names cover up the plot.
<aid=random-input-generation></a>
## Random Input Generation
Random Input Generation provides users with the ability to statistically generate input values along a Gaussian or Poisson distribution. Random generation is less precise than an input file, but it is more extensible and much easier to modify. Modify the input file again to use a gaussian distribution to generate launch angles.
Optimization is the process of evaluating the previous run's data for use in the next run. In essence, you are optimizing each subsequent run and closing in on a specific value; in this instance, we are closing in on the optimal launch angle.
<aid=listing-optimization-h></a>
**Listing - optimization.h**
### optimization.h
We need to create two new Trick jobs to house our optimization logic. Create this file in your include directory.
What we are doing in these two functions is sending the slave's cannon structure from after the run has completed back to the master. The master then analyzes the data and sends the new run information to the slave. This cycles over and over again until we hit the number of runs specified in our input script. Create this file in your src directory.
# Stop Monte Carlo runs after 25 seconds of simulation time
trick.stop(25)
# Stop Monte Carlo runs if they take longer than 1 second of real time
trick.mc_set_timeout(1)
```
### Modifications to S_Define
The last thing that we need to do is modify our simulation definition file and add the two new Trick jobs. As you can see, we have added a new library dependency, a new ## inclusion, and two new constructor jobs.