Commit 831d08e5 authored by Jan Oliver Oelerich's avatar Jan Oliver Oelerich

Merge branch 'devel' into pasmons

# Conflicts:
#	examples/all_default_parameters.cfg
#	src/CMakeLists.txt
#	src/classes/Crystal.cpp
#	src/classes/Crystal.hpp
#	src/classes/GridManager.hpp
#	src/classes/IO.cpp
#	src/classes/Params.cpp
#	src/classes/Params.hpp
#	src/classes/Simulation.cpp
#	src/libatomic/Element.hpp
#	src/libatomic/elements_json.hpp
parents 9b2d1586 bffc152e
......@@ -2,7 +2,7 @@ image: gcc:7
before_script:
- apt update
- apt -y install cmake libconfig++-dev libfftw3-dev libnetcdf-dev libcurl4-openssl-dev libopenmpi-dev doxygen openmpi-bin
- apt -y install cmake libconfig++-dev libfftw3-dev libnetcdf-dev libcurl4-openssl-dev libopenmpi-dev openmpi-bin
build:
stage: build
......@@ -13,9 +13,12 @@ build:
- make VERBOSE=yes
artifacts:
paths:
- build/src/stemsalabim
- build/src/libstemsalabim_lib.so
- build/tests/stemsalabim_test
- build/src/stemsalabim
- build/tests/ssb-test
- build/src/ssb-mkin
- build/src/ssb-chk
- build/src/ssb-run
expire_in: 2h
cache:
paths:
......
What's new
==========
STEMsalabim 5.0.0
-----------------
January XX, 2019
**IMPORTANT**
I'm releasing this version as 5.0.0, but neither the input nor output files changed (significantly).
The parameters `application.verbose` and `simulation.skip_simulation` are deprecated now.
Highlights
^^^^^^^^^^
- Speed improvements by increasing the grid sizes to match efficient FFT sizes. Note, that this may result
in a higher simulation grid density than specified in `grating.density` parameter!
- Alternative parallelization scheme, see :ref:`parallelization-scheme`. When appropriate, different MPI procs
now calculate different frozen phonon configurations / defoci in parallel. This reduces the required amount
of communication between the processors.
- Automatic calculation of `center of mass` of the CBEDs for all ADF points. The COMs are calculated when
`adf.enabled = true` and stored in the NC file next to `adf/adf_intensities` in `adf/center_of_mass`. Unit is mrad.
- New executables `ssb-mkin` and `ssb-run`. The former prepares an **input** NC file from which the latter can run
the simulation. This has multiple advantages. See :ref:`simulation-structure` for more information.
Other changes
^^^^^^^^^^^^^
- Removed `application.verbose` parameter.
- Removed `simulation.skip_simulation`.
- Ability to disable thermal displacements via `frozen_phonon.enable = false` parameter.
- Fixed a serious bug with the integrated defocus averaging.
- Input XYZ files can now contain more than one space or TAB character for column separation.
- Removed Doxygen documentation and doc string comments.
- Default FFTW planning is now `FFTW_MEASURE`. This improves startup times of the simulation slightly.
- Changed the chunking of the `adf/adf_intensities` and `cbed/cbed_intensities` variables for faster write speed.
- Added `AMBER/slice_coordinates` variable to the output file, that contains the `z` coordinate of the upper boundary
of each slice in nm.
- Removed HTTP reporting and CURL dependency.
- Significant code refactoring and some minor bugs fixed.
- Improved documentation.
STEMsalabim 4.0.1, 4.0.2
------------------------
......
......@@ -7,9 +7,9 @@
# version, package name and cmake version
# when you change logic here, don't forget to change the stuff in Sphinx conf.py!!
set(PACKAGE_VERSION_MAJOR "4")
set(PACKAGE_VERSION_MAJOR "5")
set(PACKAGE_VERSION_MINOR "0")
set(PACKAGE_VERSION_PATCH "2")
set(PACKAGE_VERSION_PATCH "0b")
set(PACKAGE_NAME "STEMsalabim")
set(PACKAGE_DESCRIPTION "A high-performance computing cluster friendly code for scanning transmission electron microscopy image simulations of thin specimens")
set(PACKAGE_AUTHOR "Jan Oliver Oelerich")
......@@ -18,7 +18,9 @@ set(PACKAGE_AUTHOR_EMAIL "[email protected]")
project(STEMsalabim CXX)
cmake_minimum_required(VERSION 3.3)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
string(TIMESTAMP DATE "%Y-%m-%dT%H:%M:%S")
......@@ -73,14 +75,6 @@ find_package(NetCDF REQUIRED)
include_directories(${NETCDF_INCLUDE_DIR})
set(LIBS ${LIBS} ${NETCDF_LIBRARIES})
# look for CURL
find_package(CURL)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIRS})
set(LIBS ${LIBS} ${CURL_LIBRARIES})
set(HAVE_CURL 1)
endif(CURL_FOUND)
# MPI
find_package(MPI REQUIRED)
include_directories(${MPI_INCLUDE_PATH})
......
# Tries to find Gperftools.
#
# Usage of this module as follows:
#
# find_package(Gperftools)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# Gperftools_ROOT_DIR Set this variable to the root installation of
# Gperftools if the module has problems finding
# the proper installation path.
#
# Variables defined by this module:
#
# GPERFTOOLS_FOUND System has Gperftools libs/headers
# GPERFTOOLS_LIBRARIES The Gperftools libraries (tcmalloc & profiler)
# GPERFTOOLS_INCLUDE_DIR The location of Gperftools headers
find_library(GPERFTOOLS_TCMALLOC
NAMES tcmalloc
HINTS ${Gperftools_ROOT_DIR}/lib)
find_library(GPERFTOOLS_PROFILER
NAMES profiler
HINTS ${Gperftools_ROOT_DIR}/lib)
find_library(GPERFTOOLS_TCMALLOC_AND_PROFILER
NAMES tcmalloc_and_profiler
HINTS ${Gperftools_ROOT_DIR}/lib)
find_path(GPERFTOOLS_INCLUDE_DIR
NAMES gperftools/heap-profiler.h
HINTS ${Gperftools_ROOT_DIR}/include)
set(GPERFTOOLS_LIBRARIES ${GPERFTOOLS_TCMALLOC_AND_PROFILER})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
Gperftools
DEFAULT_MSG
GPERFTOOLS_LIBRARIES
GPERFTOOLS_INCLUDE_DIR)
mark_as_advanced(
Gperftools_ROOT_DIR
GPERFTOOLS_TCMALLOC
GPERFTOOLS_PROFILER
GPERFTOOLS_TCMALLOC_AND_PROFILER
GPERFTOOLS_LIBRARIES
GPERFTOOLS_INCLUDE_DIR)
\ No newline at end of file
......@@ -23,7 +23,7 @@ IF( LIBCONFIG_ROOT )
FIND_LIBRARY(
LIBCONFIG_LIBRARIES
NAMES "config++"
NAMES "config++" "libconfig++"
PATHS ${LIBCONFIG_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
......@@ -41,7 +41,7 @@ ELSE( LIBCONFIG_ROOT )
FIND_LIBRARY(
LIBCONFIG_LIBRARIES
NAMES "config++"
NAMES "config++" "libconfig++"
PATHS ${PKG_LIBCONFIG_LIBRARY_DIRS} ${INCLUDE_INSTALL_DIR}
)
......
......@@ -18,8 +18,6 @@ include(FindPackageHandleStandardArgs)
if((NOT MKL_ROOT) AND (DEFINED ENV{MKLROOT}))
set(MKL_ROOT $ENV{MKLROOT} CACHE PATH "Folder contains MKL")
else()
message( FATAL_ERROR "MKL not found! Specify MKL_ROOT!" )
endif()
if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
......
# add a target to generate API documentation with Doxygen
find_package(Doxygen)
set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
configure_file(${doxyfile_in} ${doxyfile} @ONLY)
add_custom_target(docs-source
COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating API documentation with Doxygen")
add_custom_target(docs-manual
add_custom_target(docs
COMMAND sphinx-build -c ${CMAKE_CURRENT_SOURCE_DIR} -b html ${PROJECT_SOURCE_DIR}/docs manual
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Build html documentation"
VERBATIM)
add_custom_target(docs-manual-tex
COMMAND sphinx-build -c ${CMAKE_CURRENT_SOURCE_DIR} -b latex ${PROJECT_SOURCE_DIR}/docs manual-tex
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Build html documentation"
VERBATIM)
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
#wrap {
width:1170px;
margin:0 auto;
position:relative;
}
#titlearea {
padding-bottom:20px;
}
#MSearchBox {
top:10px;
}
.ui-resizable-handle.ui-resizable-e {
background-image: none;
background-color: #5373B4;
cursor: default;
width:1px;
}
#side-nav {
padding-right:0px;
}
#nav-sync {
display:none;
}
#nav-tree, .header {
background-image:none !important;
}
#nav-tree .selected {
background-image:none;
background-color: #5373B4;
text-shadow: none;
}
.navpath ul {
background-image:none;
background-color: #F9FAFC;
border: none;
border-top:1px solid #5373B4;
padding: 10px 0 10px 0;
}
#nav-path li {
background-image:none;
}
<!-- HTML footer for doxygen 1.8.13-->
<!-- start footer part -->
<!--BEGIN GENERATE_TREEVIEW-->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li>
<div id="version">
Documentation Version: $projectnumber
</div>
</li>
$navpath
<li class="footer">$generatedby
<a href="http://www.doxygen.org/index.html">Doxygen</a> $doxygenversion </li>
</ul>
</div>
<!--END GENERATE_TREEVIEW-->
<!--BEGIN !GENERATE_TREEVIEW-->
<hr class="footer"/><address class="footer"><small>
$generatedby &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
</a> $doxygenversion
</small></address>
</div>
<!--END !GENERATE_TREEVIEW-->
<!--CUSTOMJS-->
</body>
</html>
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
<script>
$(document).ready(function() {
$(".side-nav-resizable").resizable('disable').removeClass('ui-state-disabled');
});
</script>
</head>
<body>
<div id="wrap">
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<!--BEGIN PROJECT_LOGO-->
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
<!--END PROJECT_LOGO-->
<!--BEGIN PROJECT_NAME-->
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">$projectname
<!--BEGIN PROJECT_NUMBER-->&#160;<!--END PROJECT_NUMBER-->
</div>
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
</td>
<!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME-->
<!--BEGIN PROJECT_BRIEF-->
<td style="padding-left: 0.5em;">
<div id="projectbrief">$projectbrief</div>
</td>
<!--END PROJECT_BRIEF-->
<!--END !PROJECT_NAME-->
<!--BEGIN DISABLE_INDEX-->
<!--BEGIN SEARCHENGINE-->
<td>$searchbox</td>
<!--END SEARCHENGINE-->
<!--END DISABLE_INDEX-->
</tr>
</tbody>
</table>
</div>
<!--END TITLEAREA-->
<!-- end header part -->
File formats
============
A *STEMsalabim* simulation is set-up via **input files** and its results are stored in an **output file**. The file for
A STEMsalabim simulation is set-up via **input files** and its results are stored in an **output file**. The file for
configuring a simulation is described in detail at :ref:`parameter-file`. Here, we describe the format of the **crystal
file**, i.e., the atomic information about the specimen, and the **output file**, in which the results are stored.
......@@ -46,42 +46,247 @@ Below is a very brief, artificial example (without custom slicing): ::
Output file format
------------------
All results of a *STEMsalabim* simulation are written to a binary `NetCDF <https://en.wikipedia.org/wiki/NetCDF>`_ file.
All results of a STEMsalabim simulation are written to a binary `NetCDF <https://en.wikipedia.org/wiki/NetCDF>`_ file.
The NetCDF format is based on the `Hierarchical Data Format <https://en.wikipedia.org/wiki/Hierarchical_Data_Format>`_
and there are libraries to read the data for many programming languages.
The structure of NetCDF files is hierarchical and organized in groups. The following groups are written by
*STEMsalabim*:
The structure of NetCDF files can be inspected using the handy tool ``ncdump -h YOUR_FILE.nc`` (don't forget the ``-h``
parameter, otherwise the whole content of the file is dumped!). Here is the output of an example run: ::
runtime
~~~~~~~
This group contains information about the program and the simulation, such as version, UUID and so on.
netcdf TestRUN {
group: AMBER {
dimensions:
atom = 320 ;
elements = 1 ;
spatial = 3 ;
cell_spatial = 3 ;
cell_angular = 3 ;
label = 6 ;
frame = 4 ;
slices = 11 ;
grid_x = 336 ;
grid_y = 336 ;
variables:
char spatial(spatial) ;
char cell_spatial(cell_spatial) ;
char cell_angular(cell_angular, label) ;
float coordinates(frame, atom, spatial) ;
coordinates:unit = "nanometer" ;
float lattice_coordinates(frame, atom, spatial) ;
float cell_lengths(frame, cell_spatial) ;
cell_lengths:unit = "nanometer" ;
float cell_angles(frame, cell_angular) ;
cell_angles:unit = "degree" ;
float radius(frame, atom) ;
radius:unit = "nanometer" ;
float msd(frame, atom) ;
int slice(frame, atom) ;
float slice_coordinates(slices) ;
short element(frame, atom) ;
float system_lengths(cell_spatial) ;
float system_angles(cell_spatial) ;
char atom_types(elements, label) ;
// group attributes:
:Conventions = "AMBER" ;
:ConventionVersion = "1.0" ;
:program = "STEMsalabim" ;
:programVersion = "5.0.0" ;
:title = "sim" ;
} // group AMBER
group: runtime {
// group attributes:
:programVersionMajor = "5" ;
:programVersionMinor = "0" ;
:programVersionPatch = "0" ;
:gitCommit = "5575906360b70117dffa4f5ae31d4eb3af34c5fa" ;
:title = "TestRUN" ;
:UUID = "22720f20-4816-4732-b287-627027bdcaff" ;
:time_start = "2019-01-24 14:23:09" ;
} // group runtime
group: params {
dimensions:
defocus = 2 ;
variables:
float defocus(defocus) ;
float defocus_weights(defocus) ;
// group attributes:
:program_arguments = "--num-threads 8 -p TestRUN.cfg -o TestRUN.nc" ;
:config_file_contents = "..." ;
group: application {
// group attributes:
:random_seed = 2984830537U ;
} // group application
group: simulation {
// group attributes:
:title = "sim" ;
:normalize_always = 0US ;
:bandwidth_limiting = 1US ;
:output_file = "TestRUN.nc" ;
:output_compress = 0US ;
} // group simulation
group: probe {
// group attributes:
:c5 = 5000000. ;
:cs = 2000. ;
:astigmatism_ca = 0. ;
:defocus = -2. ;
:fwhm_defoci = 6. ;
:num_defoci = 2U ;
:astigmatism_angle = 0. ;
:min_apert = 0. ;
:max_apert = 15.07 ;
:beam_energy = 200. ;
:scan_density = 40. ;
} // group probe
group: specimen {
// group attributes:
:max_potential_radius = 0.3 ;
:crystal_file = "crystal.xyz" ;
} // group specimen
group: grating {
// group attributes:
:density = 300. ;
:nx = 336U ;
:ny = 336U ;
:slice_thickness = 0.5431 ;
} // group grating
group: adf {
// group attributes:
:enabled = 1US ;
:x = 0.5, 0.7 ;
:y = 0.5, 0.7 ;
:detector_min_angle = 0. ;
:detector_max_angle = 200. ;
:detector_num_angles = 201U ;
:detector_interval_exponent = 1.f ;
:average_configurations = 0US ;
:average_defoci = 0US ;
:save_slices_every = 0U ;
} // group adf
group: cbed {
// group attributes:
:enabled = 1US ;
:x = 0., 1. ;
:y = 0., 1. ;
:size = 0U, 0U ;
:average_configurations = 1US ;
:average_defoci = 1US ;
:save_slices_every = 0U ;
} // group cbed
group: frozen_phonon {
// group attributes:
:number_configurations = 2U ;
:fixed_slicing = 1US ;
:enabled = 1US ;
} // group frozen_phonon
} // group params
group: adf {
dimensions:
adf_position_x = 9 ;
adf_position_y = 9 ;
adf_detector_angle = 201 ;
adf_defocus = 2 ;
adf_phonon = 2 ;
adf_slice = 1 ;
coordinate_dim = 2 ;
variables:
float adf_intensities(adf_defocus, adf_position_x, adf_position_y, adf_phonon, adf_slice, adf_detector_angle) ;
float center_of_mass(adf_defocus, adf_position_x, adf_position_y, adf_phonon, adf_slice, coordinate_dim) ;
double adf_probe_x_grid(adf_position_x) ;
double adf_probe_y_grid(adf_position_y) ;
double adf_detector_grid(adf_detector_angle) ;
double adf_slice_coords(adf_slice) ;
} // group adf
group: cbed {
dimensions:
cbed_position_x = 43 ;
cbed_position_y = 43 ;
cbed_k_x = 224 ;
cbed_k_y = 224 ;
cbed_defocus = 1 ;
cbed_phonon = 1 ;
cbed_slice = 1 ;
variables:
float cbed_intensities(cbed_defocus, cbed_position_x, cbed_position_y, cbed_phonon, cbed_slice, cbed_k_x, cbed_k_y) ;
double cbed_probe_x_grid(cbed_position_x) ;
double cbed_probe_y_grid(cbed_position_y) ;
double cbed_x_grid(cbed_k_x) ;
double cbed_y_grid(cbed_k_y) ;
double cbed_slice_coords(cbed_slice) ;
} // group cbed
}
The structure of NetCDF files is hierarchical and organized in groups. The following groups are written by
STEMsalabim:
AMBER
~~~~~
This group contains the atomic coordinates, species, displacements, radii, etc. for the complete crystal for each single
calculated frozen lattice configuration, as well as for each calculated defocus value. The AMBER group content is
compatible with the `AMBER specifications <http://ambermd.org/netcdf/nctraj.xhtml>`_. A *STEMsalabim* NetCDF file can
compatible with the `AMBER specifications <http://ambermd.org/netcdf/nctraj.xhtml>`_. A STEMsalabim NetCDF file can
be opened seamlessly with the `Ovito <http://www.ovito.org/>`_ crystal viewer.
.. csv-table::
:file: table_nc_amber.csv
runtime
~~~~~~~
.. csv-table::
:file: table_nc_runtime.csv
params
~~~~~~
All simulation parameters are collected in the ``params`` group as attributes.
.. note:: The ``params`` group contains subgroups with attributes that correspond exactly to the simulation
parameters as written, except
- ``/params/application/random_seed`` is set to the generated random seed
- ``/params/grating/nx`` and ``/params/grating/ny`` contain the simulation grid size used.
.. csv-table::
:file: table_nc_params.csv
adf
~~~
This group contains the simulated ADF intensities, the coordinates of the electron probe beam during scanning, the
detector angle grid that is used, and coordinates of the slices as used in the multi-slice algorithm.
.. csv-table::
:file: table_nc_adf.csv
cbed
~~~~
This group contains the simulated CBED intensities, the coordinates of the electron probe beam during scanning, k-space
grid, and coordinates of the slices as used in the multi-slice algorithm.
.. csv-table::
:file: table_nc_cbed.csv
Reading NC Files
----------------
......
......@@ -7,11 +7,11 @@ General information
Throughout this documentation we assume that you are familiar with the theoretical background behind the scanning
transmission electron microscope (STEM) to some degree. Also, we assume that you have some knowledge about the
UNIX/Linux command line and parallelized computation. *STEMsalabim* is currently not intended to be run on a desktop
UNIX/Linux command line and parallelized computation. STEMsalabim is currently not intended to be run on a desktop
computer. While that is possible and works, the main purpose of the program is to be used in a highly parallelized
multi-computer environment.
We took great care of making *STEMsalabim* easy to install. You can find instructions at :ref:`installing`. However, if
We took great care of making STEMsalabim easy to install. You can find instructions at :ref:`installing`. However, if
you run into technical problems you should seek help from an administrator of your computer cluster first.
.. _simulation-structure:
......@@ -19,7 +19,7 @@ you run into technical problems you should seek help from an administrator of yo
Structure of a simulation
-------------------------
There essence of *STEMsalabim* is to model the interaction of a focused electron beam with a bunch of atoms, typically
There essence of STEMsalabim is to model the interaction of a focused electron beam with a bunch of atoms, typically
in the form of a crystalline sample. Given the necessary input files, the simulation crunches numbers for some time,
after which all of the calculated results can be found in the output file. Please refer to :ref:`running` for notes
how to start a simulation.
......@@ -28,7 +28,7 @@ Input files
~~~~~~~~~~~
All information about the specimen are listed in the :ref:`crystal-file`, which is one of the two required input files
for *STEMsalabim*. It contains each atom's species (element), coordinates, and `mean square displacement
for STEMsalabim. It contains each atom's species (element), coordinates, and `mean square displacement
<https://en.wikipedia.org/wiki/Mean_squared_displacement>`_ as it appears in the `Debye-Waller factors
<https://en.wikipedia.org/wiki/Debye%E2%80%93Waller_factor>`_.
......@@ -39,7 +39,7 @@ microscope, detector, and all required simulation parameters. All these paramete
Output files
~~~~~~~~~~~~
The complete output of a *STEMsalabim* simulation is written to a `NetCDF
The complete output of a STEMsalabim simulation is written to a `NetCDF
<https://www.unidata.ucar.edu/software/netcdf/>`_ file. NetCDF is a binary, hierarchical file format for scientific
data, based on `HDF5 <https://support.hdfgroup.org/HDF5/>`_. NetCDF/HDF5 allow us to compress the output data and store
it in machine-readable, organized format while still only having to deal with a single output file.
......@@ -51,7 +51,7 @@ You can read more about the output file structure at :ref:`output-file`.
Hybrid Parallelization model
----------------------------
*STEMsalabim* simulations can be parallelized both via `POSIX threads <https://en.wikipedia.org/wiki/POSIX_Threads>`_
STEMsalabim simulations is parallelized both via `POSIX threads <https://en.wikipedia.org/wiki/POSIX_Threads>`_
and via `message passing interface (MPI) <https://en.wikipedia.org/wiki/Message_Passing_Interface>`_. A typical
simulation will use both schemes at the same time: MPI is used for communication between the computing nodes, and
threads are used for intra-node parallelization, the usual multi-cpu/multi-core structure.
...