set -e # exit on error set -x # for debugging #also install ngsMumps? install_ngsmumps="n" # "i" (interactive) vs. "y" (yes) vs. "n" (no) install_ngsxfem="y" # "i" (interactive) vs. "y" (yes) vs. "n" (no) install_ngstrefftz="y" # "i" (interactive) vs. "y" (yes) vs. "n" (no) install_ngspetsc="n" # "i" (interactive) vs. "y" (yes) vs. "n" (no) use_mkl="y" # "y" (yes) vs. "n" (no) use_mumps="y" # "y" (yes) vs. "n" (no) use_occ="y" # "y" (yes) vs. "n" (no) ## base directory (change if you want the everything in a different directory) BASEDIR="`pwd`" SRCDIR="${BASEDIR}/src" BUILDDIR="${BASEDIR}/build/ngsolve" PACKAGESDIR="${BASEDIR}/packages" MODULESDIR="${BASEDIR}/modules" if [[ -L ${SRCDIR} ]]; then SRCDIR=`readlink ${SRCDIR}` fi if [[ -L ${BUILDDIR} ]]; then BUILDDIR=`readlink ${BUILDDIR}` fi if [[ -L ${PACKAGESDIR} ]]; then PACKAGESDIR=`readlink ${PACKAGESDIR}` fi if [[ -L ${MODULESDIR} ]]; then MODULESDIR=`readlink ${MODULESDIR}` fi PYTHONMODULE="python/3.11.6" PYTHONVER="3.11" GCCMODULE="gcc/11.4.0" MPIMODULE="openmpi/4.1.6-ucx" MKLMODULE="intel-oneapi-mkl/2023.2.0-ucx" export CMAKE_BUILD_PARALLEL_LEVEL=12 mkdir -p $BASEDIR/src # pull ngsolve if user has not already done so: if [ ! -d "${SRCDIR}/ngsolve" ]; then echo "No source directory found at ${SRCDIR}/ngsolve. Cloning from GitHub..." git clone https://github.com/ngsolve/ngsolve.git $BASEDIR/src/ngsolve cd $BASEDIR/src/ngsolve git submodule update --init --recursive fi ##generate BUILDTYPE tag from type, date, branch and commit: TYPE="" # give the build an additional tag if helpful (e.g. "mpi" or "serial") TAG=`cd ${SRCDIR}/ngsolve && git describe --tags` BRANCH=`cd ${SRCDIR}/ngsolve && git rev-parse --abbrev-ref HEAD` DATE=`date +%Y-%m-%d` #DATE="2025-02-24" if [ -n "${TYPE}" ]; then BUILDTYPE=${DATE}-${TYPE}-${BRANCH}-${TAG} else BUILDTYPE=${DATE}-${BRANCH}-${TAG} fi ##load modules module load ${MPIMODULE} module load ${PYTHONMODULE} module load ${GCCMODULE} module load ${MKLMODULE} module load cmake #make sure to get pip (fitting to loaded python module) python -m ensurepip export PYTHONPATH="${PYTHONPATH}:$BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages" export C_INCLUDE_PATH="${C_INCLUDE_PATH}:$BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/petsc/include" export LIBRARY_PATH="${LIBRARY_PATH}:$BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/petsc/lib" export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/petsc/lib" export PYTHONPATH="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages:${PYTHONPATH}" export PYTHONEXE=`which python` export PYTHONROOT=`dirname ${PYTHONEXE}`/../ export MPIRUNEXE=`which mpirun` export MPIROOT=`dirname ${MPIRUNEXE}`/../ #export MKLROOT="${BASEDIR}/intel/oneapi/mkl/2025.0" export PATH=${PYTHONROOT}/bin:$PATH export PYTHONHOME=${PYTHONROOT} rm -rf $BASEDIR/packages/ngsolve/${BUILDTYPE} mkdir -p $BASEDIR/packages/ngsolve mkdir -p $BASEDIR/packages/ngsolve/${BUILDTYPE} mkdir -p $BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/ mkdir -p $BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER} mkdir -p $BASEDIR/packages/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages # schrustengs (for `from schrustengs import patchvtk`): python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ mpi4py pybind11-stubgen numpy #git+https://github.com/schruste/schrustengs ##generate build dir mkdir -p ${BUILDDIR} cd ${BUILDDIR} rm -rf ${BUILDTYPE} mkdir ${BUILDTYPE} cd ${BUILDTYPE} #PATH="/opt/sw/rev/23.12/linux-scientific7-cascadelake/gcc-11.4.0/python-3.11.6-jylgod/include/python3.11/" \ #VERBOSE=1 \ # :${PATH}" \ ##configure the build MKLOPTS="-DUSE_MKL=ON -DMKL_ROOT=${MKLROOT} -DMKL_SDL=OFF -DMKL_LINK=dynamic -DMKL_MPI=openmpi" if [ "$use_mkl" != "y" ]; then MKLOPTS="-DUSE_MKL=OFF" fi ##configure the build MUMPS_SWITCH="-DUSE_MUMPS=OFF" if [ "$use_mumps" = "y" ]; then MUMPS_SWITCH="-DUSE_MUMPS=ON" fi OCC_SWITCH="-DBUILD_OCC=OFF -DUSE_OCC=OFF" if [ "$use_occ" = "y" ]; then OCC_SWITCH="-DBUILD_OCC=ON -DUSE_OCC=ON" fi #-DCMAKE_FIND_DEBUG_MODE=1 \ CC=gcc CXX=g++ \ cmake \ -DPython3_ROOT_DIR=${PYTHONROOT} \ -DCMAKE_PREFIX_PATH=${PYTHONROOT} \ -DPYBIND11_FINDPYTHON=ON \ -DUSE_GUI=OFF \ -DUSE_UMFPACK=ON \ ${MUMPS_SWITCH} \ -DUSE_HYPRE=OFF \ -DUSE_MPI=ON \ ${OCC_SWITCH} \ -DCMAKE_BUILD_TYPE=RELEASE \ -DBUILD_JUPYTER_WIDGETS=ON \ -DBUILD_STUB_FILES=OFF \ -DCMAKE_CXX_FLAGS="-ffast-math" \ -DCMAKE_INSTALL_PREFIX=${PACKAGESDIR}/ngsolve/${BUILDTYPE} \ -DCMAKE_CXX_COMPILER=g++ \ -DCMAKE_C_COMPILER=gcc \ -DUSE_NATIVE_ARCH=OFF \ ${MKLOPTS} \ ${SRCDIR}/ngsolve/ ##build and install VERBOSE=1 make -j${CMAKE_BUILD_PARALLEL_LEVEL} VERBOSE=1 make install cd .. ##register as new module: mkdir -p ${MODULESDIR}/ngsolve echo "-- -*- lua -*- help([[\nSets up environment for NGSolve\n]]) whatis(\"NGSolve\") -- Load required modules depends_on(\"${GCCMODULE}\") depends_on(\"${PYTHONMODULE}\") depends_on(\"${MKLMODULE}\") depends_on(\"${MPIMODULE}\") depends_on(\"cmake\") -- Conflict with another NGSolve module conflict(\"ngsolve\") -- Define base directory local base = \"${PACKAGESDIR}/ngsolve/${BUILDTYPE}\" -- Set environment variables setenv(\"NETGEN_DIR\", pathJoin(base, \"bin\")) setenv(\"NGSCXX_DIR\", pathJoin(base, \"bin\")) -- Append to PYTHONPATH append_path(\"PYTHONPATH\", pathJoin(base, \"lib/python${PYTHONVER}/site-packages\")) -- Print a greeting message when loading the module LmodMessage(\"Loaded NGSolve module ${BUILDTYPE}.\") " > ${MODULESDIR}/ngsolve/${BUILDTYPE}.lua if [ "$install_ngsmumps" = "i" ]; then read -p "Do you want to install ngsMumps as well? (y/[n]): " install_ngsmumps fi if [ "$install_ngsmumps" = "y" ]; then echo "Attempting to install ngsMumps..." if [ ! -d "${SRCDIR}/ngsMumps" ]; then echo "No source directory found at $BASEDIR/src/ngsMumps. Cloning from GitHub..." git clone https://github.com/NGSolve/ngsMumps.git $BASEDIR/src/ngsMumps sed -i 's/>=3\.12/>=3\.11/g' $BASEDIR/src/ngsMumps/pyproject.toml fi cd ${SRCDIR}/ngsMumps echo "Installing dependencies" python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ scikit-build-core pybind11_stubgen toml --upgrade echo "Installing ngsMumps" NGSolve_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/ngsolve/" \ Netgen_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/netgen/" \ python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ --no-build-isolation . else echo "not installing ngsMumps." fi if [ "$install_ngsxfem" = "i" ]; then read -p "Do you want to install ngsxfem as well? (y/[n]): " install_ngsxfem fi if [ "$install_ngsxfem" = "y" ]; then echo "Attempting to install ngsxfem..." if [ ! -d "${SRCDIR}/ngsxfem" ]; then echo "No source directory found at ${SRCDIR}/ngsxfem. Cloning from GitHub..." git clone https://github.com/ngsxfem/ngsxfem.git $BASEDIR/src/ngsxfem cd $BASEDIR/src/ngsxfem git submodule update --init --recursive fi cd ${SRCDIR}/ngsxfem echo "Installing dependencies" python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ \ scikit-build-core pybind11_stubgen toml setuptools setuptools_scm echo "Installing ngsxfem" NGSolve_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/ngsolve/" \ Netgen_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/netgen/" \ python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ --no-build-isolation --no-deps . else echo "not installing ngsxfem." fi if [ "$install_ngstrefftz" = "i" ]; then read -p "Do you want to install ngstrefftz as well? (y/[n]): " install_ngstrefftz fi if [ "$install_ngstrefftz" = "y" ]; then echo "Attempting to install ngstrefftz..." if [ ! -d "${SRCDIR}/ngstrefftz" ]; then echo "No source directory found at ${SRCDIR}/ngstrefftz. Cloning from GitHub..." git clone https://github.com/PaulSt/NGSTrefftz.git ${SRCDIR}/ngstrefftz cd $BASEDIR/src/ngstrefftz git submodule update --init --recursive fi cd ${SRCDIR}/ngstrefftz echo "Installing dependencies" python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ \ scikit-build-core pybind11_stubgen toml setuptools setuptools_scm echo "Installing ngstrefftz" NGSolve_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/ngsolve/" \ Netgen_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/netgen/" \ python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ --no-build-isolation --no-deps . else echo "not installing ngstrefftz." fi if [ "$install_ngspetsc" = "i" ]; then read -p "Do you want to install ngspetsc as well? (y/[n]): " install_ngspetsc fi if [ "$install_ngspetsc" = "y" ]; then echo "Attempting to install ngspetsc..." if [ ! -d "${SRCDIR}/ngspetsc" ]; then echo "No source directory found at ${SRCDIR}/ngspetsc. Cloning from GitHub..." git clone https://github.com/UZerbinati/ngsPETSc.git ${SRCDIR}/ngspetsc fi cd ${SRCDIR}/ngspetsc echo "Installing dependencies" python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ \ scikit-build-core pybind11_stubgen toml setuptools setuptools_scm poetry petsc petsc4py slepc slepc4py echo "Installing ngspetsc" NGSolve_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/ngsolve/" \ Netgen_DIR="${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/cmake/netgen/" \ python -m pip install --verbose -t ${PACKAGESDIR}/ngsolve/${BUILDTYPE}/lib/python${PYTHONVER}/site-packages/ --no-build-isolation --no-deps . else echo "not installing ngspetsc." fi echo "ngsolve/${BUILDTYPE} installed." if [ -n "${TYPE}" ]; then rm -f ${MODULESDIR}/ngsolve/${TYPE} rm -f ${MODULESDIR}/ngsolve/${TYPE}-${BRANCH} ln -s ${MODULESDIR}/ngsolve/${BUILDTYPE}.lua ${MODULESDIR}/ngsolve/${TYPE}.lua ln -s ${MODULESDIR}/ngsolve/${BUILDTYPE}.lua ${MODULESDIR}/ngsolve/${TYPE}-${BRANCH}.lua echo "linking ngsolve/${TYPE} -> ngsolve/${BUILDTYPE}" echo "linking ngsolve/${TYPE}-${BRANCH} -> ngsolve/${BUILDTYPE}" else rm -f ${MODULESDIR}/ngsolve/${BRANCH} ln -s ${MODULESDIR}/ngsolve/${BUILDTYPE}.lua ${MODULESDIR}/ngsolve/${BRANCH}.lua echo "linking ngsolve/${BRANCH} -> ngsolve/${BUILDTYPE}" fi