# 3. Installation ## 3.1 Requirement - C++ compiler (gcc is recommended) - Cmake - MPI library (openmpi is recommended) - Linux environment is recommended ## 3.2 Install and compile ### Step 1. Install all required packages All packages are widely used packages. The installation of these packages can be easily found in web. **Ensure that the C++ compiler is installed** Type in command line `$ g++ -v` Correct output like: `gcc version x.x.x xxxxxx` **Ensure that the MPI library is installed** Type in command line `$ which mpirun` Correct output like: `/usr/bin/mpirun` **Ensure that the Cmake is installed** Type in command line `$ which cmake` Correct output like: `$ /usr/bin/cmake` ### Step 2. Download source You can download the package from the 'master' branch (or latest released version) of the git repository as: [https://github.com/GiftBTE-developer/GiftBTE](https://github.com/GiftBTE-developer/GiftBTE) `$ unzip GiftBTE-master.zip` Or directly clone the repository by git (may need installation) ``` $ git clone https://github.com/Gift-BTE-developer/Gift-BTE.git ``` ### Step 3. Build by CMake Type in the command line under the GiftBTE folder\ ``` $ cd GiftBTE $ cmake -B cpu-build -S. -DCMAKE_BUILD_TYPE=Release $ cd cpu-build $ make ``` Correct output in command line ``` -- The CXX compiler identification is GNU 8.3.1 -- The C compiler identification is GNU 8.3.1 -- The Fortran compiler identification is GNU 8.3.1 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting Fortran compiler ABI info -- Detecting Fortran compiler ABI info - done -- Check for working Fortran compiler: /usr/bin/gfortran - skipped -- Checking whether /usr/bin/gfortran supports Fortran 90 -- Checking whether /usr/bin/gfortran supports Fortran 90 - yes -- Found MPI_C: /dssg/opt/icelake/linux-centos8-icelake/gcc-8.3.1/openmpi-4.1.1-me4z4iiamxv3l6efci5wcmjd2pk4rvye/lib/libmpi.so (found version "3.1") -- Found MPI_CXX: /dssg/opt/icelake/linux-centos8-icelake/gcc-8.3.1/openmpi-4.1.1-me4z4iiamxv3l6efci5wcmjd2pk4rvye/lib/libmpi_cxx.so (found version "3.1") -- Found MPI_Fortran: /dssg/opt/icelake/linux-centos8-icelake/gcc-8.3.1/openmpi-4.1.1-me4z4iiamxv3l6efci5wcmjd2pk4rvye/lib/libmpi_usempif08.so (found version "3.1") -- Found MPI: TRUE (found version "3.1") -- Configuring done -- Generating done -- Build files have been written to: /dssg/home/acct-umjbh/umjbh-b/GiftBTE/cpu-build [ 3%] Building CXX object src/utility/CMakeFiles/BTEutility.dir/utility.cpp.o [ 7%] Linking CXX static library ../../../lib/libBTEutility.a [ 7%] Built target BTEutility [ 11%] Building CXX object src/BTEAngle/CMakeFiles/BTEAngle.dir/BTEAngle.cpp.o [ 15%] Linking CXX static library ../../../lib/libBTEAngle.a [ 15%] Built target BTEAngle [ 19%] Building CXX object src/BTEBand/CMakeFiles/BTEBand.dir/BTEBand.cpp.o [ 23%] Linking CXX static library ../../../lib/libBTEBand.a [ 23%] Built target BTEBand [ 26%] Building CXX object src/BTEBoundaryCondition/CMakeFiles/BTEBoundaryCondition.dir/BTEBoundaryCondition.cpp.o [ 30%] Linking CXX static library ../../../lib/libBTEBoundaryCondition.a [ 30%] Built target BTEBoundaryCondition [ 34%] Building CXX object src/BTEMesh/CMakeFiles/BTEMesh.dir/BTEMesh.cpp.o [ 38%] Building CXX object src/BTEMesh/CMakeFiles/BTEMesh.dir/COMSOL.cpp.o [ 42%] Building CXX object src/BTEMesh/CMakeFiles/BTEMesh.dir/oneD.cpp.o [ 46%] Building CXX object src/BTEMesh/CMakeFiles/BTEMesh.dir/Distribute.cpp.o [ 50%] Building CXX object src/BTEMesh/CMakeFiles/BTEMesh.dir/ReadinMesh.cpp.o [ 53%] Linking CXX static library ../../../lib/libBTEMesh.a [ 53%] Built target BTEMesh [ 57%] Building CXX object src/StaticBTESynthetic/CMakeFiles/StaticBTESynthetic.dir/StaticBTESynthetic.cpp.o [ 61%] Building CXX object src/StaticBTESynthetic/CMakeFiles/StaticBTESynthetic.dir/StaticBTESyntheticSolver.cpp.o [ 65%] Linking CXX static library ../../../lib/libStaticBTESynthetic.a [ 65%] Built target StaticBTESynthetic [ 69%] Building CXX object src/StaticFourier/CMakeFiles/StaticFourier.dir/StaticFourier.cpp.o [ 73%] Linking CXX static library ../../../lib/libStaticFourier.a [ 73%] Built target StaticFourier [ 76%] Building CXX object src/TransientBTE/CMakeFiles/TransientBTE.dir/transient.cpp.o [ 80%] Building CXX object src/TransientBTE/CMakeFiles/TransientBTE.dir/TransientSolver.cpp.o [ 84%] Linking CXX static library ../../../lib/libTransientBTE.a [ 84%] Built target TransientBTE [ 88%] Building CXX object src/Solution/CMakeFiles/Solution.dir/Solution.cpp.o [ 92%] Linking CXX static library ../../../lib/libSolution.a [ 92%] Built target Solution [ 96%] Building CXX object src/CMakeFiles/BTE_CPU.dir/BTEMain.cpp.o [100%] Linking CXX executable ../../bin/BTE_CPU [100%] Built target BTE_CPU ``` An executable file **BTE_CPU** is created in bin/ Common error: - C++ compiler not found: the C++ compiler is not installed - MPI not found: the MPI library is not installed - If the CMake fails, please delete the cpu-build folder ($ rm -rf cpu-build) before retries. ### Step 4. Run example GiftBTE provides many examples under bin/examples. One can choose an example to test. For example: ``` $ cd bin $ cd examples $ cd FinFET $ cd 1e-7 $ mpirun -np 4 ../../../BTE_CPU ```