# HPC-I FAMIL build Answer
- [name=Jonathan Hsu]
[toc]
## Dependencies
### Variables
Modify with your own directory.
<!--
```bash=
export WORK_DIR=/work1/jonathan0hsu
export FAMIL_HOME=$WORK_DIR/ASC/FAMIL_v1
export SRC=$FAMIL_HOME/src
export PREFIX=$FAMIL_HOME/lib
export COMPILE_NP=4
```
-->
```bash=
export WORK_DIR=/home/jonathanhsu
export FAMIL_HOME=$WORK_DIR/FAMIL_v1
export SRC=$FAMIL_HOME/src
export PREFIX=$FAMIL_HOME/lib
export COMPILE_NP=4
```
### Intel compiler suit
- Intel oneAPI toolkit current version: 2025.1
- Fortran compiler: IFX
- MPI: Intel MPI
```bash=
# Download from intel website
sudo sh ./intel-oneapi-hpc-toolkit-2025.1.0.666_offline.sh
source /opt/intel/oneapi/setvars.sh
```
### Some tools
```bash=
sudo apt update
sudo apt install build-essential gcc g++ gfortran cmake curl libcurl4-openssl-dev flex csh
```
### Libraries
#### zlib
```bash=
cd $SRC
mkdir zlib-intel
wget https://zlib.net/zlib-1.3.1.tar.gz
tar xzf zlib-1.3.1.tar.gz --strip-components=1 -C zlib-intel
cd zlib-intel
./configure --prefix=$PREFIX/zlib-intel
make -j $COMPILE_NP && make install
export PATH=$PREFIX/bin/zlib-intel:$PATH
export LD_LIBRARY_PATH=$PREFIX/lib/zlib-intel:$LD_LIBRARY_PATH
```
#### hdf5 1.14.6
```bash=
cd $SRC
mkdir hdf5-intel
wget https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_5/downloads/hdf5-1.14.5.tar.gz
tar xzf hdf5-1.14.5.tar.gz --strip-components=1 -C hdf5-intel
cd hdf5-intel/hdf5-1.14.5
export CC=icx
export CXX=icpx
export FC=ifx
export F77=ifx
./configure --prefix=$PREFIX/hdf5-intel \
--with-zlib=$PREFIX/zlib-intel \
--enable-hl \
--enable-parallel \
--enable-fortran \
--enable-shared \
--disable-static \
CC=mpiicx CXX=mpiicpx FC=mpiifx F77=mpiifx
make -j $COMPILE_NP && make install
$PREFIX/hdf5-intel/bin/h5pcc -showconfig
```
#### netcdf
```bash=
cd $SRC
wget https://downloads.unidata.ucar.edu/netcdf-c/4.9.2/netcdf-c-4.9.2.tar.gz
mkdir netcdf-intel
tar xzf netcdf-c-4.9.2.tar.gz --strip-components=1 -C netcdf-intel
mkdir -p netcdf-intel/build && cd netcdf-intel/build
export I_MPI_CC=icx
export I_MPI_CXX=icpx
export I_MPI_F77=ifx
export I_MPI_FC=ifx
cmake .. \
-DHDF5_DIR=$PREFIX/hdf5-intel \
-DHDF5_INCLUDE_DIR=$PREFIX/hdf5-intel/include \
-DCMAKE_PREFIX_PATH=$PREFIX/hdf5-intel \
-DHDF5_ROOT=$PREFIX/hdf5-intel \
-DHDF5_LIBRARY=$PREFIX/hdf5-intel/lib/libhdf5.so \
-DHDF5_HL_LIBRARY=$PREFIX/hdf5-intel/lib/libhdf5_hl.so \
-DHDF5_VERSION_REQUIRED="1.14.0" \
-DCMAKE_C_COMPILER=$(which mpiicx) \
-DCMAKE_CXX_COMPILER=$(which mpiicpx) \
-DZLIB_ROOT=$PREFIX/zlib-intel \
-DCMAKE_INSTALL_PREFIX=$PREFIX/netcdf-intel \
-DENABLE_DAP=OFF \
-DENABLE_FORTRAN=ON
make -j $COMPILE_NP && make install
export NETCDFPATH=$PREFIX/netcdf-intel
export LD_LIBRARY_PATH=$PREFIX/netcdf-intel/lib:$LD_LIBRARY_PATH
# export LD_LIBRARY_PATH=$PREFIX/netcdf-intel/lib:$LD_LIBRARY_PATH
export PATH=$PREFIX/netcdf-intel/bin:$PATH
# nc-config --all
```
#### netcdf-f
```bash=
cd $SRC
wget https://downloads.unidata.ucar.edu/netcdf-fortran/4.6.1/netcdf-fortran-4.6.1.tar.gz
mkdir netcdf-fortran-intel
tar xzf netcdf-fortran-4.6.1.tar.gz --strip-components=1 -C netcdf-fortran-intel
mkdir -p $SRC/netcdf-fortran-intel/build && cd $SRC/netcdf-fortran-intel/build
export I_MPI_CC=icx
export I_MPI_CXX=icpx
export I_MPI_F77=ifx
export I_MPI_FC=ifx
cmake .. \
-DNETCDF_C_INCLUDE_DIR=$PREFIX/netcdf-intel/include \
-DNETCDF_C_LIBRARY=$PREFIX/netcdf-intel/lib/libnetcdf.so \
-DCMAKE_C_COMPILER=$(which mpiicx) \
-DCMAKE_Fortran_COMPILER=$(which mpiifx) \
-DMPI_Fortran_COMPILER=$(which mpiifx) \
-DCMAKE_INSTALL_PREFIX=$PREFIX/netcdf-fortran-intel
time make install -j $COMPILE_NP
mkdir -p $PREFIX/netcdf-intel/lib
# cp -r $PREFIX/netcdf-fortran-intel/lib/* $PREFIX/netcdf-intel/lib
export NETCDF_FORTRAN_ROOT=$PREFIX/netcdf-fortran-intel
export CPPFLAGS="-I$NETCDF_FORTRAN_ROOT/include $CPPFLAGS"
export LDFLAGS="-L$NETCDF_FORTRAN_ROOT/lib $LDFLAGS"
export LD_LIBRARY_PATH=$NETCDF_FORTRAN_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$NETCDF_FORTRAN_ROOT/bin:$PATH
```
#### nco
```bash=
cd $SRC
mkdir -p nco-intel
wget https://github.com/nco/nco/archive/refs/tags/5.1.2.tar.gz
tar xzf 5.1.2.tar.gz --strip-components=1 -C nco-intel
cd nco-intel
export NETCDFPATH=$PREFIX/netcdf-intel
./configure --prefix=$PREFIX/nco-intel --enable-netcdf4 \
CPPFLAGS="-I$NETCDFPATH/include" \
LDFLAGS="-L$NETCDFPATH/lib"
# ./configure --prefix=$PREFIX/nco-intel --enable-netcdf4 CPPFLAGS="-I$NETCDFPATH/include" LDFLAGS="-L$NETCDFPATH/lib"
make -j $COMPILE_NP && make install
$PREFIX/nco-intel/bin/ncks --version
export PATH=$PREFIX/nco-intel/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/nco-intel/lib:$LD_LIBRARY_PATH
```
## Famli build & run
### Need modify
#### Add run permission
```bash=
chmod +x f_create_earth
chmod +x tools/c*
```
#### `mkmf.template.ifc`
```bash=
FFLAGS = -O0 -assume byterecl -i4 -r8 -zero
# CPPFLAGS = -I${NETCDFPATH}/include -I${HDF5PATH}/include -I${ZLIBPATH}/include -I${MPI_INCLUDE}
CPPFLAGS = -I${NETCDFPATH}/include -I${NETCDF_FORTRAN_ROOT}/include -I${HDF5PATH}/include -I${ZLIBPATH}/include -I${MPI_INCLUDE}
FC = ${MPI_BIN}/mpiifx
LD = ${MPI_BIN}/mpiifx
# LDFLAGS = -L${NETCDFPATH}/lib -lnetcdf -lnetcdff -L${MPI_LIB} -L${HDF5PATH}/lib -lhdf5 -lhdf5_hl -L${ZLIBPATH}/lib -lz
LDFLAGS = -Wl,-rpath,${NETCDFPATH}/lib64 -Wl,-rpath,${NETCDFPATH}/lib -Wl,-rpath,${NETCDF_FORTRAN_ROOT}/lib64 -Wl,-rpath,${NETCDF_FORTRAN_ROOT}/lib -Wl,-rpath,${HDF5PATH}/lib \
-L${NETCDF_FORTRAN_ROOT}/lib64 -L${NETCDF_FORTRAN_ROOT}/lib -L${NETCDFPATH}/lib64 -L${NETCDFPATH}/lib -L${HDF5PATH}/lib -L${ZLIBPATH}/lib \
-lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lz -L${MPI_LIB} -lmpi
CFLAGS = -D__IFC
```
#### `utils/exp/namelists_earth`
All line about /path_to_famil/input/*,
change to yout own path
#### `f_create_earth`
```bash=
set WORK_DIR = /home/jonathanhsu
set FAMIL_HOME = $WORK_DIR/FAMIL_v1
set FAMIL_OPT = $FAMIL_HOME/lib
set NETCDFPATH = $FAMIL_OPT/netcdf-intel
set NETCDF_FORTRAN_ROOT = $FAMIL_OPT/netcdf-fortran-intel
set HDF5PATH = $FAMIL_OPT/hdf5-intel
set ZLIBPATH = $FAMIL_OPT/zlib-intel
set NCOPATH = $FAMIL_OPT/nco-intel
set netcdfpath = $NETCDFPATH
set netcdf_fortran_root = $NETCDF_FORTRAN_ROOT
set hdf5path = $HDF5PATH
set zlibpath = $ZLIBPATH
set ncopath = $NCOPATH
set mpipath = /opt/intel/oneapi/mpi/2021.15
set forpath = /opt/intel/oneapi/compiler/2025.1
set ccpath = /opt/intel/oneapi/compiler/2025.1
set gsl_lib = /usr/bin/gsl-config
set curl_lib = /usr/bin/curl
set udunits_lib = /usr/bin/udunits2
set mpi_include = $mpipath/include
set mpi_lib = $mpipath/lib
set mpi_bin = $mpipath/bin
set for_include = $forpath/include
set for_lib = $forpath/lib
set for_bin = $forpath/bin
set cc_include = $ccpath/include
set cc_lib = $ccpath/lib
set cc_bin = $ccpath/bin
```
```bash=
s#^ *setenv *NETCDF_FORTRAN_ROOT .*#setenv NETCDF_FORTRAN_ROOT $netcdf_fortran_root#g \
s#^ *setenv *LD_LIBRARY_PATH .*#setenv LD_LIBRARY_PATH /vol-th/lib\:$zlibpath/lib\:$hdf5path/lib\:$netcdfpath/lib\:$netcdf_fortran_root/lib\:$ncopath/lib\:$mpi_lib\:$cc_lib\:$gsl_lib\:$curl_lib\:$udunits_lib\:$LD_LIBRARY_PATH#g" \
```
#### `Make_fregrid_parallel.ifc`
```bash=
CFLAGS = -O2 -xHost -I${POSTP} -I${NETCDFPATH}/include -I${MPI_INCLUDE} -I${NETCDF_FORTRAN_ROOT}/include
# 修正 NetCDF 庫路徑
# LDFLAGS = -L${NETCDFPATH}/lib -lnetcdf -L${NETCDF_FORTRAN_ROOT}/lib -lnetcdff -L${HDF5PATH}/lib -lhdf5 -lhdf5_hl -L${ZLIBPATH}/lib -lz -L${MPI_LIB} -L/usr/lib64 -lm
LDFLAGS = -Wl,-rpath,${NETCDFPATH}/lib64 -Wl,-rpath,${NETCDFPATH}/lib -Wl,-rpath,${NETCDF_FORTRAN_ROOT}/lib64 -Wl,-rpath,${NETCDF_FORTRAN_ROOT}/lib -Wl,-rpath,${HDF5PATH}/lib \
-L${NETCDF_FORTRAN_ROOT}/lib64 -L${NETCDF_FORTRAN_ROOT}/lib -L${NETCDFPATH}/lib64 -L${NETCDFPATH}/lib -L${HDF5PATH}/lib -L${ZLIBPATH}/lib \
-lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lz -L${MPI_LIB} -L/usr/lib64 -lm
DEFFLAG = -Duse_netCDF -Duse_libMPI
# 移除了 -v 旗標以避免過多輸出
LNFLAGS =
```
#### modify `famil/utils/exp/f_compile`
```bash=
set netcdf_f_include = $NETCDF_FORTRAN_ROOT/include
gcc -O -o $mppnccombine -I$NETCDFPATH/include -L$NETCDFPATH/lib -L$NETCDFPATH/lib64 \
-I$NETCDF_FORTRAN_ROOT/include -L$NETCDF_FORTRAN_ROOT/lib -L$NETCDF_FORTRAN_ROOT/lib64 \
$POSTP/mppnccombine.c -L$NETCDFPATH/lib -lnetcdf -L$NETCDF_FORTRAN_ROOT/lib -lnetcdff \
-L$HDF5PATH/lib -lhdf5 -lhdf5_hl -L$ZLIBPATH/lib -lz
$mkmf -p $EXE1DIR/famil.x -t $template \
-c "-Duse_libMPI -Duse_netCDF -DSPMD" \
# -c "-Duse_libMPI -Duse_netCDF -DSPMD -DSW_DYNAMICS" \
$pathnames $mpp_include $famil_include $netcdf_include $netcdf_f_include \
$hdf5_include $zlib_include $MPI_INCLUDE
```
#### modify `famil/utils/exp/f_env`
```bash=
# Add a line
setenv NETCDF_FORTRAN_ROOT unset
```
#### Code
- `$FAMIL_HOME/utils/postp/fregrid.c`
add `#include "mosaic_util.h"`
- `mpp_domain.c`
Line 16: `extern int pe, npes, root_pe;`
### Compile & run
#### `f_compile`
This steps will take some time.
Have a drink ~~and pray for no error occur~~.
```bash=
cd $FAMIL_HOME/utils
export CASENAME=test1
rm -r $FAMIL_HOME/run/$CASENAME
rm -r $FAMIL_HOME/exp/$CASENAME
./f_create_earth -case $CASENAME -plat ifc -res C48 -np 24
cd ../exp/$CASENAME
./f_compile > fcompile_result.txt 2>&1
```
#### `f_run`
```bash=
# It will take some time
# Recommand use tmux
./f_run > $FAMIL_HOME/run/$CASENAME/work/f_run.log 2>&1
```
If you got the following error messeages
```
lin_cld_micrphys diagnostics initialized.
NOTE from PE 0: topography_mod: Reading NetCDF formatted input data file: /home/sysadmin/ASC/FAMIL_v1/input/atm/navy_topography.nc
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
libc.so.6 00007FF732445330 Unknown Unknown Unknown
famil.x 0000000000780AA7 Unknown Unknown Unknown
famil.x 000000000077DE56 Unknown Unknown Unknown
famil.x 00000000006EAABF Unknown Unknown Unknown
famil.x 00000000008763B7 Unknown Unknown Unknown
famil.x 00000000007EA7CB Unknown Unknown Unknown
famil.x 0000000000990369 Unknown Unknown Unknown
famil.x 000000000098EA5F Unknown Unknown Unknown
famil.x 0000000000410AFD Unknown Unknown Unknown
libc.so.6 00007FF73242A1CA Unknown Unknown Unknown
libc.so.6 00007FF73242A28B __libc_start_main Unknown Unknown
famil.x 0000000000410A15 Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred
```
Check `ulimit -s`, you may need more stack space.
Modify `f_run` line 97 with following command ensure all nodes have sufficient stack space.
`mpirun --host comp1:12,comp2:12 -np $NP bash -lc "ulimit -s unlimited && exec $WORKDIR/famil.x"`
## With Spack
Here's another method for building FAMIL's dependencies: using a tool we introduced in class — Spack.
You can refer to the following script:
If you're at the installation step, replace `spack install` with `spack location --first -i` to retrieve the installation path.
[f_create_earth_spack.csh](https://365nthu-my.sharepoint.com/:u:/g/personal/112062334_office365_nthu_edu_tw/EaTuyA0eS6lEpnggyo5_5RMBV2TgXi-3YdPZWP6eFKC3Fg?e=DkbW2M)
This method should be easier, but you'll need to experiment on your own.