This document tries to summarize the steps necessary to setup SPEC on your machine.
Two approaches are discussed.
The first one is the CMake setup.
The second one is the more classical Makefile
setup.
The Anaconda system provides an ecosystem of compilers, precompiled libraries and python packages ready to be used. The main goal is to decouple the conda environment from the host system, so that you can use modern software and tools also on machines with outdated local software.
This guide was written while testing the commands on a Debian 9 x86_64 Linux system. This should be deemed old enough to demonstrate the weirdest errors if something is not under control, hence facilitating the correctness of these instructions.
The Anaconda installer is available from the Anaconda website. At the time of writing, the URL to the actual file is: https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh
Go into folder where the anaconda installer will be downloaded to and download the Anaconda installer:
cd ~/Downloads
wget https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh
Launch the Anaconda installer:
bash Anaconda3-2021.11-Linux-x86_64.sh
- press ENTER to contine
- Accept License Agreement:
yes
- Confirm the default installation location (here:
/home/IPP-HGW/jons/anaconda3
==~/anaconda3
) - Allow the installer to run
conda init
:yes
At this point, the Anaconda installer will modify your ~/.bashrc
.
In order to make these changes take effect, you can logout and log back in,
close and re-open your Terminal window or do:
source ~/.bashrc
Disable the activation of the Anaconda base environment on login:
conda config --set auto_activate_base False
Anaconda works in so-called virtual environments, where environment variables get managed by Anaconda to setup paths to compilers, libraries and include directories semi-automagically.
For SPEC, it is suggested to create a new conda environment. A setup script to perform these actions is provided in the SPEC repository. Thus, we need to clone the SPEC repository now.
In this guide, we assume that your copy of SPEC will be located at ~/SPEC
.
If you want to upload your changes to the SPEC repository,
you should setup your SSH key in your GitHub Settings and use the following
URL for the repository instead: [email protected]:PrincetonUniversity/SPEC.git
Clone the repository from GitHub into a folder SPEC
in your home directory::
cd ~
git clone https://github.com/PrincetonUniversity/SPEC.git
The conda environment setup needed to compile and run SPEC is in setup_conda.sh
.
This scripts takes a specification of the conda packages to install from spec_conda_env.yml
and created a conda environment called spec_env
.
Also, two scripts are created in etc/conda/activate.d
and etc/conda/deactivate.d
of the spec_env
environment to mask the system's LD_LIBRARY_PATH
when entering the conda environment and to restore it to its previous value
when leaving the spec_env
environment.
Also, the environment variable FFTW_ROOT
is set to the conda environment
to tell SPEC to use the conda-provided version of FFTW.
Change into the freshly-cloned SPEC repository and run this script:
cd ~/SPEC
./setup_conda.sh
This might take a while, but at the end you should end up with a message similar to this:
... lots of stuff above here ...
done
#
# To activate this environment, use
#
# $ conda activate spec_env
#
# To deactivate an active environment, use
#
# $ conda deactivate
~/anaconda3/envs/spec_env ~/SPEC
~/SPEC
Activate the conda environment for SPEC:
conda activate spec_env
A forked version of f90wrap
is required to build the SPEC Python wrapper (for now).
Install that next (inside the spec_env
conda environment !!!):
pip install -U git+https://github.com/zhucaoxiang/f90wrap
The CMake setup is controlled via the setup.py
Python script from the SPEC repository.
It parses the CMAKE_ARGS
environment variable provided by conda.
Additional machine-dependent CMake options are loaded from cmake_config.json
.
This is a soft-link to a file in cmake_machines
.
Anaconda provides all libraries required to build SPEC,
but we still need to make sure that the cmake_config.json
link points to
cmake_machines/conda_debian.json
.
Note that conda.json
in cmake_machines
is outdated, as it includes machine-dependent options (-DHDF5_ROOT=~/opt/miniconda3/envs/simsopt/
).
Now force the cmake_config.json
link to point to the correct file:
ln -sf cmake_machines/conda_debian.json cmake_config.json
This concludes the preliminary setup steps and we can progress by starting the build process:
python setup.py bdist_wheel
This step also takes quite a while.
At the end, the SPEC python package (spec-0.0.1-cp310-cp310-linux_x86_64.whl
or similar) should be available in dist
.
Install it now:
pip install dist/*.whl
Note that the Python package you just installed also contains the regular stand-alone SPEC executable xspec
,
which gets installed into bin/xspec
of your conda environment.
Verify this by calling which xspec
.
You should get a message similar to:
/home/IPP-HGW/jons/anaconda3/envs/spec_env/bin/xspec
First, verify that the stand-alone executable is usable.
A few test cases are provided in InputFiles/TestCases
.
Create a new directory for SPEC runs and change into it
mkdir ~/SPEC_runs
cd ~/SPEC_runs
Copy a demo input file into the current working directory:
cp ~/SPEC/InputFiles/TestCases/G3V01L0Fi.001.sp .
Call SPEC with an input file (*.sp
) as argument on the command line:
xspec G3V01L0Fi.001.sp
You should see the screen output of the SPEC run. Among the last lines should be something similar to this:
ending : 0.88 : myid= 0 ; completion ; time= 0.88s = 0.01m = 0.00h = 0.00d ; date= 2022/02/17 ; time= 17:35:33 ; ext = G1V02L0Fi.001
ending : :
xspech : :
xspech : 0.88 : myid= 0 : time= 0.01m = 0.00h = 0.00d ;
This indicates that the stand-alone executable is usable.
Next, the python wrapper is tested.
-
Check that the SPEC version can be found:
python -c "from spec import spec_f90wrapped as spec; print('SPEC version: {:}'.format(spec.constants.version))"
This should print a message like "SPEC version: 3.1" on the screen.
-
Check that the Python wrapper can be used as a stand-alone code:
OMP_NUM_THREADS=1 python ~/SPEC/Utilities/python_wrapper/spec/core.py G3V01L0Fi.001.sp
This should conclude with the message
SPEC called from python finished!
. -
Run the optimization example code:
OMP_NUM_THREADS=1 python ~/SPEC/Utilities/python_wrapper/examples/example.py
This should run a basic optimization problem, where the SPEC inputs are controlled via
scipy.optimize
. -
Run the interactive re-convergence example code:
OMP_NUM_THREADS=1 python ~/SPEC/Utilities/python_wrapper/examples/example_2.py
This should compute a SPEC equilibrium, then change the central pressure, re-converge SPEC, etc. for a set of five values of the central pressure in a two-volume classical Stellarator case. After the pressure scan with re-convergence, a plot of the MHD energy vs. the central pressure is shown.
Here are a few links that proved useful in setting this up:
- https://docs.anaconda.com/anaconda/install/linux/
- https://www.anaconda.com/products/individual
- https://www.rosehosting.com/blog/how-to-install-anaconda-python-on-debian-9/
- RcppCore/Rcpp#770 (comment)
- https://computing.docs.ligo.org/conda/compiling/
- https://stackoverflow.com/a/64253999
- https://stackoverflow.com/a/46833531
- https://stackoverflow.com/a/49238956
- https://conda.io/projects/conda-build/en/latest/resources/use-shared-libraries.html
In order to run SPEC, you need a copy of the HDF5 libraries installed, which has the Fortran interface enabled.
Using CMake, SPEC can be built as a stand-alone executable and as a python extension, where SPEC can be run directly from python, with all variables passed directly in memory.
Download the package from git. And change to the root directory of SPEC source code by running
cd <SPEC_ROOT>
Compiling SPEC requires MPI, HDF5, and numerical libraries such as BLAS, LAPACK, FFTW. For numerical libraries, you could use system supplied libraries or you could use intel math kernel library (MKL).
Machine-specific settings when building the python wrapper are put into separate json
files in the cmake_machines
directory.
For building the regular SPEC executable, the default settings should work.
In order to select a machine-specific settings file, create a soft link to the indented file in cmake_machines
:
ln -sf cmake_machines/gfortran_ubuntu.json cmake_config.json
Here instructions are given for CentOS 7
Install OpenBLAS, FFTW3, and hdf5 using the command
yum install -y gcc-gfortran openmpi openmpi-devel hdf5 hdf5-devel fftw3 fftw3-devel openblas openblas-devel python3 python3-devel cmake ninja-build
If you don't have the latest version of cmake avaialable on your system, you can create a python virtual environment (instructions are here), activate it, and then install cmake in that virtual environment using pip
pip install cmake ninja
When using cmake to build SPEC, the first step is to configure compilers and the locations of libraries. Cmake can detect compilers and libraries at standard locations easily but needs hand-holding when the required libraries are non-standard locations.
The following command was used to configure cmake build setup for SPEC on Centos
cmake -S. -Bbuild -GNinja -DCMAKE_Fortran_COMPILER=mpifort -DBLA_VENDOR=OpenBLAS -DHDF5_NO_FIND_PACKAGE_CONFIG_FILE=TRUE -DHDF5_PREFER_PARALLEL=TRUE -DCMAKE_INSTALL_PREFIX=${SPEC_ROOT}/install --trace-source=CMakeLists.txt 2>&1 | tee log
There are few points to note on the above command
- All the build related files will be in build folder.
- Ninja build system is used. If your system doesn't have ninja installed, remove the -G option. The default is the standard
make
tool. - We ae using OpenBLAS for BLAS and LAPACK and MPI fortran compiler
- Since most of the libraries are in standard location, we don't have to specify them. We are giving couple of options related to HDF5 libraries.
- The installation path is install subfolder location within SPEC folder.
- We are interested in a verbose output and also want to store the output in
log
file.
After successful completion of cmake configuration step, building is trivial
cmake --build build
The last step is to install the executable by running
cmake --install build
That's it! If all the above steps completed without errors, you have the SPEC executable xspec
installed at install/bin
folder
Building the SPEC python extension will also build the SPEC executable.
In the SPEC root folder, edit the cmake_config.json
as necessary for your system. Few example .json
files are provided in the cmake_machines
folder.
It is strongly suggested to use a python virtual environment either conda or python venv. After virtual environment is installed and activated, install the python related dependencies. Please note that these are in addition to the dependencies listed earlier in stand-alone installation steps. If you are using conda virtual environment try installing the dependencies using conda install
command
conda install -n <your_venv> numpy f90nml scikit-build cmake ninja
If you are using venv virtual environment, run
pip install numpy f90nml scikit-build cmake ninja
Now install f90wrap. Please keep in mind that numpy has to be installed before installing f90wrap.
pip install -U git+https://github.com/zhucaoxiang/f90wrap
Now install the SPEC extension by running the setup.py script present in the SPEC root folder.
python setup.py bdist_wheel; cd dist/; pip install *.whl
in succession. At this point, you should be able to import the spec
module in python. To test this, you can try the following command from the shell:
python -c "import spec; print('success')"
If you want editable install, run
python setup.py develop
Below are the steps to build python wrappers for SPEC on stellar.
-
Needed modules are
i. hdf5/gcc/1.10.6 ii. intel-mkl/2021.1.1 iii. openmpi/gcc/4.1.0 iv. anaconda3/2021.5.
Note
FFTW is supplied as part of Intel MKL and we just need to link against MKL.
Load the modules by running
module load hdf5/gcc/1.10.6 intel-mkl/2021.1.1 openmpi/gcc/4.1.0 anaconda3/2021.5
-
Create conda virtual environment.
conda create -n spec_ve python=3.8
You have to press enter twice. Here a conda virtual environment named
spec_ve
is created with python version 3.8 and lot of packages are installed. Activate by runningconda activate spec_ve
-
Install
cmake
,ninja
,scikit-build
,numpy
using either conda or pip.conda install cmake ninja scikit-build numpy
or
pip install cmake ninja scikit-build numpy
-
Install
f90wrap
by runningpip install git+https://github.com/zhucaoxiang/f90wrap.git
-
Clone the spec repo from github
git clone https://github.com/PrincetonUniversity/SPEC.git
Change the working directory by running
cd SPEC
. -
Edit the cmake_config.json to populate correct cmake_flags. For stellar, cmake_config.json should look like
{ "cmake_args": [ "-DCMAKE_C_COMPILER=mpicc", "-DCMAKE_CXX_COMPILER=mpicxx", "-DCMAKE_Fortran_COMPILER=mpifort", "-DBLA_VENDOR=Intel10_64lp", "-DHDF5_ROOT=/usr/local/hdf5/gcc/1.10.6", "-DHDF5_PREFER_PARALLEL=False"] }
-
Then build the python wheel for SPEC wrapper using
python setup.py bdist_wheel
The resulting wheel is located in
dist
folder. Install SPEC python wrapper by runningpip install dist/spec*.whl
-
Install mpi4py using pip/conda. If using pip, don't forget to use
--no-cache-dir
flagpip install --no-cache-dir mpi4py
or
conda install mpi4py
The python wrapper builds spec executable but it gets installed at an obscure location. If you mainly want SPEC executable xspec
, the steps are similar.
- Load the required modules. Refer to the first step in the python wrapper instructions.
- Clone the SPEC repo and make SPEC as working directory. Refer to the 5th step above.
- Run the cmake configuration by running
Please note SPEC gets installed at
cmake -Bbuild -S . -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_Fortran_COMPILER=mpifort -DBLA_VENDOR=Intel10_64lp \ -DHDF5_ROOT=/usr/local/hdf5/gcc/1.10.6 -DHDF5_PREFER_PARALLEL=False -DCMAKE_INSTALL_PREFIX=<SPEC_install_location>
<SPEC_install_location>/bin
, where<SPEC_install_location>
is the folder of your choice. Building of SPEC library will be done in the folderbuild
, where all the intermediary compilation files will be located. - Compile the code by running
This command will invoke
cmake --build build
make
build generator. Alternatively, you can switch to build folder and run make utility manually.cd build make
- Install the SPEC executable by running
SPEC library gets installed
cmake --install build
<SPEC_install_location>/lib
and SPEC executable get installed at<SPEC_install_location>/bin
Here is how to build the HDF5 library :
- download
hdf5-1.10.5.tar.gz
from https://www.hdfgroup.org/downloads/hdf5/source-code/ - extract:
tar xzf hdf5-1.10.5.tar.gz
- cd into source folder:
cd hdf5-1.10.5
- make a build folder:
mkdir build
- cd into build folder:
cd build
- run cmake with options for the Fortran interface:
cmake -DHDF5_BUILD_FORTRAN:BOOL=ON ..
- actually build the HDF5 library:
make
This should leave you with a file "hdf5-1.10.5.dmg" or similar, which you can install just as any other Mac application. See e.g. this document for more detailed instructions: https://support.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/INSTALL_CMake.txt
The compilation of SPEC itself then proceeds as usual.
You then only need to specify the HDF5 folder in the Makefile, which will likely be
/Applications/HDF_Group/HDF5/1.10.5
.