e3a6e463bfe25a3ffa34e32c475a7429905ea491
[dealii.wiki.git] / deal.II-in-Spack.md
1 # Using deal.II on Mac OS X and Linux via Spack
2
3 The deal.II suite is also available on Spack (https://github.com/LLNL/spack) -- a flexible package manager developed with High-Perfomance-Computing in mind. It is intended to let you build for many combinations of compiler, architectures, dependency libraries, and build configurations, all with a friendly, intuitive user interface.
4
5 ## Quick installation
6
7 Add the following to `~/.bash_profile` (or equivalent)
8 ```
9 SPACK_ROOT=/path/to/spack
10 export PATH=$SPACK_ROOT/bin:$PATH
11 ```
12 `SPACK_ROOT` is the destination where you want Spack to be installed (i.e. `/Users/john/spack`).
13
14 Now clone Spack
15 ```
16 git clone https://github.com/llnl/spack.git $SPACK_ROOT
17 ```
18 **Make sure C/C++/Fortran compilers are in path** (if that's not the case, see [below](#install-gcc)),
19 and install the complete deal.II suite
20 ```
21 spack install dealii
22 ```
23 **DONE**! No extra (preliminary) configuration steps are needed on most Linux distributions. You may jump ahead and read [best practices using spack](#best-practices-using-spack).
24
25 For macOS read further.
26
27 ## Environment Modules
28 Spack provides some integration with Environment Modules and Dotkit to make it easier to use the packages it installs. For a full description, read http://software.llnl.gov/spack/basic_usage.html#installing-environment-modules
29
30 To add the support for Environment Modules run
31 ```
32 spack install environment-modules
33 ```
34 and then add to `~/.bash_profile` (or equivalent)
35 ```
36 MODULES_HOME=`spack location -i environment-modules`
37 source ${MODULES_HOME}/Modules/init/bash
38 . $SPACK_ROOT/share/spack/setup-env.sh
39 ```
40
41 If you install `deal.II` before setting up environment modules,
42 the module files have to be regenerated
43 ```
44 spack module refresh
45 ```
46
47 Then run
48 ```
49 spack load dealii
50 spack load cmake
51 ```
52 Now `DEAL_II_DIR` environment variable should be set appropriately and `cmake` executable will be available in path.
53
54 ## System provided packages
55 Spack is flexible to use both self-compiled and system provided packages. One can also specify which packages should be used for `mpi`, `blas/lapack` and alike. For more details, see [Spack documentation](http://software.llnl.gov/spack/features.html). Below is a self-explanatory example of a configuration file `~/.spack/package.yaml` to use `openblas`, `openmpi` and system provided `python`:
56 ```
57 packages:
58   all:
59     compiler: [gcc,clang]
60     providers:
61       mpi: [openmpi]
62       blas: [openblas]
63       lapack: [openblas]
64   python:
65     version: [2.7.11]
66     paths:
67       python@2.7.11: /usr
68 ```
69
70 ## Installing GCC
71 If your system does not provide any Fortran compiler or you want to have the most recent `gcc`,
72 you can install it by
73 ```
74 spack install gcc
75 ```
76
77 Assuming that you configured [Environment Modules](#environment-modules), load `gcc` and let Spack find the newly installed compilers:
78 ```
79 spack load gcc
80 spack compiler find
81 ```
82 Now you can install deal.II with `gcc`
83 ```
84 spack install dealii%gcc
85 ```
86
87 ## Mixing GCC and Clang on OSX
88
89 At the time of writing this page, Spack does not provide a native way to mix C/C++ and Fortran compilers from different families (e.g. `gcc` and `clang`). However, that can be done by manually changing few lines of `python` code as described below:
90
91 (i) Edit `~/.spack/compilers.yaml` to provide path to gfortran compiler within the `clang@x.y.z-apple` entry:
92 ```
93 compilers:
94 - compiler:
95     modules: []
96     operating_system: elcapitan
97     paths:
98       cc: /usr/bin/clang
99       cxx: /usr/bin/clang++
100       f77: /path/to/bin/gfortran
101       fc: /path/to/bin/gfortran
102     spec: clang@7.3.0-apple
103 ```
104
105 (ii) Create a symlink inside clang environement
106 ```
107 cd $SPACK_ROOT/lib/spack/env/clang
108 ln -s ../cc gfortran
109 ```
110
111 (iii) Finally, apply the following patch to `lib/spack/spack/compilers/clang.py`
112 ```
113 diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py
114 index e406d86..cf8fd01 100644
115 --- a/lib/spack/spack/compilers/clang.py
116 +++ b/lib/spack/spack/compilers/clang.py
117 @@ -35,17 +35,17 @@ class Clang(Compiler):
118      cxx_names = ['clang++']
119
120      # Subclasses use possible names of Fortran 77 compiler
121 -    f77_names = []
122 +    f77_names = ['gfortran']
123
124      # Subclasses use possible names of Fortran 90 compiler
125 -    fc_names = []
126 +    fc_names = ['gfortran']
127
128      # Named wrapper links within spack.build_env_path
129      link_paths = { 'cc'  : 'clang/clang',
130                     'cxx' : 'clang/clang++',
131                     # Use default wrappers for fortran, in case provided in compilers.yaml
132 -                   'f77' : 'f77',
133 -                   'fc'  : 'f90' }
134 +                   'f77' : 'clang/gfortran',
135 +                   'fc'  : 'clang/gfortran' }
136
137      @classmethod
138      def default_version(self, comp):
139 ```
140
141 Now you can install deal.II with clang+gfortran
142 ```
143 spack install dealii%clang
144 ```
145
146 ## Best practices using Spack:
147
148 Spack is complicated and flexible package manager primarily aimed at High-Perfomance-Computing.
149 Below are some examples of using Spack to build and develop deal.II:
150
151 ### Extra options:
152 One can specify extra options for packages in the deal.II suite. For example if you want to have boost with `python` module, this can be done by
153 ```
154 spack install dealii@develop+mpi ^boost+python
155 ```
156
157 If you want to specify blas/lapack/mpi implementations, this can be done similarly
158 ```
159 spack install dealii@develop+mpi ^mpich
160 ```
161 To check which packages implement `mpi` run
162 ```
163 spack providers mpi
164 ```
165 One can also specify which Blas/Lapack implementation to use. For example to build deal.II suite with `atlas` run
166 ```
167 spack install dealii ^atlas
168 ```
169
170 ### Different versions coexisting:
171 One can easily have slightly different versions of deal.II side-by-side, e.g. to compile development version of deal.II with complex-valued PETSc and `gcc` compiler run
172 ```
173 spack install dealii@develop+mpi+petsc%gcc ^petsc+complex~hypre
174 ```
175 The good thing is that if you already have deal.ii built with real-valued petsc, then only `petsc`, `slepc` and `deal.ii` itself will be rebuild. Everything else (`trilinos`, `mumps`, `metis`, etc) will be reused.
176
177 One can use `environement-modules` (see above) to automatically set `DEAL_II_DIR` to the complex version: 
178 ```
179 spack load dealii%gcc^petsc+complex
180 ```
181
182 ### Filesystem Views:
183 If you prefer to haave the whole dealii suite (and possible something else) symlinked into a single path (like `/usr/local`), one can use [Filesystem Views](http://software.llnl.gov/spack/basic_usage.html#filesystem-views):
184 ```
185 spack view -v symlink dealii_suite dealii@develop
186 ```
187 You can also add to this view other packages, i.e.
188 ```
189 spack view -v symlink dealii_suite the_silver_searcher
190 ```
191
192
193 ### Check before build:
194 It is often convenient to check which version of packages, compilers, variants etc will be used before actually starting installation. That can be done by examining the conretized spec via `spack spec` command, e.g. 
195 ```
196 spack spec dealii@develop+mpi+petsc%gcc ^petsc+complex~hypre
197 ```
198
199 ### Develop using Spack
200 There are several ways to use Spack while contributing patches to the deal.II. The simplest is to create a [Filesystem vew](#filesystem-views) for an already installed library and then compile patched version of deal.II manually by providing path to the view for each dependency. For example on macOS with `openblas`:
201 ```
202 export DEAL_II_VIEW=/Users/davydden/spack/_dealii_suite
203 cmake -DCMAKE_FIND_FRAMEWORK=LAST -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=FALSE -DCMAKE_INSTALL_RPATH=${DEAL_II_VIEW} -DCMAKE_BUILD_TYPE=DebugRelease -DDEAL_II_COMPONENT_EXAMPLES=ON -DDEAL_II_WITH_THREADS:BOOL=ON -DBOOST_DIR=${DEAL_II_VIEW} -DBZIP2_DIR=${DEAL_II_VIEW} -DLAPACK_FOUND=true -DLAPACK_INCLUDE_DIRS=${DEAL_II_VIEW}/include -DLAPACK_LIBRARIES=${DEAL_II_VIEW}/lib/libopenblas.dylib -DMUPARSER_DIR=${DEAL_II_VIEW} -DUMFPACK_DIR=${DEAL_II_VIEW} -DTBB_DIR=${DEAL_II_VIEW} -DZLIB_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_MPI:BOOL=ON -DCMAKE_C_COMPILER=${DEAL_II_VIEW}/bin/mpicc -DCMAKE_CXX_COMPILER=${DEAL_II_VIEW}/bin/mpic++ -DCMAKE_Fortran_COMPILER=${DEAL_II_VIEW}/bin/mpif90 -DGSL_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_GSL:BOOL=ON -DHDF5_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_HDF5:BOOL=ON -DP4EST_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_P4EST:BOOL=ON -DPETSC_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_PETSC:BOOL=ON -DSLEPC_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_SLEPC:BOOL=ON -DTRILINOS_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_TRILINOS:BOOL=ON -DMETIS_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_METIS:BOOL=ON -DDEAL_II_COMPONENT_DOCUMENTATION=OFF -DARPACK_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_ARPACK=ON -DDEAL_II_ARPACK_WITH_PARPACK=ON -DNETCDF_DIR=${DEAL_II_VIEW} -DOPENCASCADE_DIR=${DEAL_II_VIEW} -DDEAL_II_WITH_OPENCASCADE=ON ../
204 ```
205
206 ### MKL and Licensed software
207 Spack supports installation of [licensed software](http://software.llnl.gov/spack/packaging_guide.html#licensed-software). For example in order to install MKL on Linux:
208
209 1. add the `license.lic` file to `${SPACK_ROOT}/etc/spack/licenses/intel/`.
210 2. manually download Intel MKL archive `l_mkl_11.3.2.181.tgz`
211 3. `cd` to the folder with archive and run `spack install mkl@11.3.2.181`.
212
213 One can then run `spack install dealii ^mkl@11.3.2.181`.

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.