Project-4/README.md
2023-12-05 15:32:21 +01:00

203 lines
5.5 KiB
Markdown

# Ising Model
[Repo](https://github.uio.no/FYS3150-G2-2023/Project-4)
[Documentation](https://pages.github.uio.no/FYS3150-G2-2023/Project-4/)
## Requirements
### Operating systems
- Linux
- Has been tested on [Fedora 38](https://fedoraproject.org/)
- Will most likely work on other Linux distributions
- MacOS
- Will most likely not work due to the use of getopt, which is GNU specific.
- Windows
- Will most likely not work
### Tools
- Profiling
- [score-p](https://www.vi-hps.org/projects/score-p)
### Libraries
- Python
- [matplotlib](https://matplotlib.org/)
- [numpy](https://numpy.org/)
- C++
- [Openmp](https://www.openmp.org/)
- [OpenMPI](https://www.open-mpi.org/)
- [Armadillo](https://arma.sourceforge.net/)
## Compiling
The commands shown here should be run from the root of this project.
### Normal binaries
Compiling regular binaries is as easy as running this command:
```shell
make
```
The binaries will then be inside the **./bin** directory.
### Profiling binaries
If you want to profile the programs (specifically the MPI program), then run this command
```shell
make profile
```
The binaries will then be inside the **./prof** directory.
### Debugging binaries
If you want to debug the code, then use this command:
```shell
make debug
```
The binaries will then be inside the **./debug** directory.
## Running programs
### C++ binaries
To run any of the programs, just use the following command:
```shell
./<bin|prof|debug>/<program-name> <args>
```
If you need help with any of the programs, you can use the **-h** or **--help**
flag to show you how to use the programs. Here is an example:
```shell
./bin/main --help
```
### Python scripts
#### Install libraries
Before running the scripts, make sure that all libraries are installed.
Using pip, you can install all requirements like this:
```shell
pip install -r requirements.txt
```
This recursively install all the packages that are listed in **requirements.txt**.
#### Running scripts
For the Python scripts, run them from the root of the project:
```shell
python python_scripts/<script-name>
```
If you have any problems running the scripts, you might have to run this instead:
```shell
python3 python_scripts/<script-name>
```
### Batch system
For the **phase_transition_mpi** program, there are scripts in the **./slurm_scripts**
directory that come along with it. This is to be able to run it on a
batch system using Slurm if you have access to one.
The only program that should be executed by the user is the **./slurm_scripts/execute.script**
script. You can see how to use this script by doing:
```shell
./slurm_scripts/execute.script --help
```
This is the recommended way of using the program.
Here is a table using different parameters on the Fox cluster:
| Lattice size | Samples | Processes | threads | Time (seconds) |
| ------------ | ------- | --------- | ------- | -------------- |
| 20 | 1e7 | 10 | 10 | 133.735 |
| 40 | 1e7 | 10 | 10 | 814.126 |
| 60 | 1e7 | 10 | 10 | 2575.33 |
If you happen to have such a system available to you, then you should clone
this repo on that system, then compile the MPI program like this:
```shell
make bin/phase_transition_mpi
```
After compiling, you can schedule it by using the **./slurm_scripts/execute.script**:
```shell
./slurm_scripts/execute.script <parameters>
```
## Performance
This section aims to give an idea to the time it takes for the phase transition
program to run so that you know a bit what to expect if you decide to run it
for yourself.
### CPU
The times mentioned here are times achieved on a computer with these
specifications:
- CPU model
- Intel i7-9850H
- Threads
- 12
- Clock speed
- 4.6GHz
### Times
Note that all times here are recorded using the OpenMP implementation of the
MCMC algorithm.
| lattice size | points | samples | burn-in time | time (seconds) |
| ------------ | ------ | ------- | ------------ | -------------- |
| 20 | 20 | 100000 | 0 | 3.20 |
| 20 | 40 | 100000 | 0 | 6.17 |
| 20 | 80 | 100000 | 0 | 12.11 |
| lattice size | points | samples | burn-in time | time (seconds) |
| ------------ | ------ | ------- | ------------ | -------------- |
| 20 | 20 | 100000 | 0 | 3.20 |
| 40 | 20 | 100000 | 0 | 11.91 |
| 80 | 20 | 100000 | 0 | 47.88 |
| lattice size | points | samples | burn-in time | time (seconds) |
| ------------ | ------ | -------- | ------------ | -------------- |
| 20 | 20 | 100000 | 0 | 3.20 |
| 20 | 20 | 1000000 | 0 | 29.95 |
| 20 | 20 | 10000000 | 0 | 305.849 |
| lattice size | points | samples | burn-in time | time (seconds) |
| ------------ | ------ | ------- | ------------ | -------------- |
| 20 | 20 | 100000 | 0 | 3.20 |
| 20 | 20 | 100000 | 5000 | 4.93 |
| 20 | 20 | 100000 | 10000 | 6.58 |
We can see that changing the number of points, samples and burn-in time
changes the time in a linear fashion, while changing the size of the lattice
changes the time in a square fashion.
## Credits
The Doxygen theme used here is
[doxygen-awesome-css](https://github.com/jothepro/doxygen-awesome-css).