File 0001-Improve-cMake-and-docker-builds.patch of Package sparselizard

From 2b5518cd7526a58bbfc16496e5866ab69a53b70e Mon Sep 17 00:00:00 2001
From: Pascal Thibaudeau <pascal.thibaudeau@cea.fr>
Date: Fri, 8 Oct 2021 09:38:12 +0200
Subject: [PATCH] Improve cMake and docker builds

---
 .github/workflows/compile.yaml     |  53 +++++++++++++
 .gitignore                         |  41 ++++++++++
 CMakeLists.txt                     | 120 ++++++++++++++++++++++-------
 Dockerfile                         |  45 +++++++++++
 Makefile                           |  72 -----------------
 cMake/SetupBLAS.cmake              |  47 -----------
 cMake/SetupGMSH.cmake              |  43 -----------
 cMake/SetupMETIS.cmake             |  47 -----------
 cMake/SetupMPI.cmake               |  49 ------------
 cMake/SetupMUMPS.cmake             |  47 -----------
 cMake/SetupPETSC.cmake             |  60 ---------------
 cMake/SetupSLEPC.cmake             |  47 -----------
 cMake/functions.cmake              |  45 -----------
 cmake/FindGMSH.cmake               |  17 ++++
 cmake/FindMETIS.cmake              |  17 ++++
 cmake/FindPETSC.cmake              |  21 +++++
 cmake/FindSLEPC.cmake              |  25 ++++++
 simulations/default/CMakeLists.txt |   8 +-
 src/CMakeLists.txt                 |  76 ------------------
 19 files changed, 316 insertions(+), 564 deletions(-)
 create mode 100644 .github/workflows/compile.yaml
 create mode 100644 Dockerfile
 delete mode 100755 Makefile
 delete mode 100644 cMake/SetupBLAS.cmake
 delete mode 100644 cMake/SetupGMSH.cmake
 delete mode 100644 cMake/SetupMETIS.cmake
 delete mode 100644 cMake/SetupMPI.cmake
 delete mode 100644 cMake/SetupMUMPS.cmake
 delete mode 100644 cMake/SetupPETSC.cmake
 delete mode 100644 cMake/SetupSLEPC.cmake
 delete mode 100644 cMake/functions.cmake
 create mode 100644 cmake/FindGMSH.cmake
 create mode 100644 cmake/FindMETIS.cmake
 create mode 100644 cmake/FindPETSC.cmake
 create mode 100644 cmake/FindSLEPC.cmake
 delete mode 100644 src/CMakeLists.txt

diff --git a/.github/workflows/compile.yaml b/.github/workflows/compile.yaml
new file mode 100644
index 00000000..c98181f9
--- /dev/null
+++ b/.github/workflows/compile.yaml
@@ -0,0 +1,53 @@
+name: Sparselizard Compilation
+
+on: [push]
+
+jobs:
+  Compilation-Actions:
+    runs-on: ubuntu-22.04
+
+    env:
+      CCACHE_COMPRESS: "true"
+      CCACHE_MAXSIZE: 500M
+      CC: gcc-12
+      CXX: g++-12
+      OMPI_CC: gcc-12
+      OMPI_CXX: g++-12
+
+    steps:
+      - name: Check out repository code
+        uses: actions/checkout@v2
+      - run: echo "The ${{ github.repository }} repository has been cloned to the runner."
+      - run: echo "The workflow is now ready to test the code on the runner."
+
+      - name: install ccache
+        run: sudo apt-get install ccache
+
+      - name: identify machine architecture
+        run: |
+          gcc -### -E -march=native - &> machine-type.txt
+          cat machine-type.txt
+
+      - name: restore cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ccache-${{ hashFiles('machine-type.txt') }}-${{ github.sha }}
+          restore-keys: ccache-${{ hashFiles('machine-type.txt') }}-
+
+      - name: Install mandatory packages
+        run: sudo apt-get install -y libomp-dev ninja-build cmake libopenblas-dev libmetis-dev libopenmpi-dev libmumps-dev petsc-dev slepc-dev libgmsh-dev
+
+      - name: build
+        run: |
+          export PATH="/usr/lib/ccache:$PATH"
+          mkdir build
+          cmake -G Ninja -S . -B build
+          cmake --build build -- -j $(getconf _NPROCESSORS_ONLN)
+
+      - name: show ccache stats
+        run: |
+          ccache --show-stats
+          ccache --zero-stats
+
+      - run: echo "🍏 This job's status is ${{ job.status }}."
diff --git a/.gitignore b/.gitignore
index 2630aa78..ffdca098 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,44 @@ build/
 
 # CCLS cache
 .ccls-cache/
+machine-type.txt
+
+CMakeLists.txt.user
+CMakeCache.txt
+CMakeFiles
+CMakeScripts
+Testing
+Makefile
+cmake_install.cmake
+install_manifest.txt
+compile_commands.json
+CTestTestfile.cmake
+_deps
+
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aeeed1d0..90eed8bd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,43 +1,107 @@
 # Thanks to S. Matsievskiy for bringing cmake to the project.
 
-cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.23 FATAL_ERROR)
 
 project(Sparselizard LANGUAGES CXX)
 
 set(DEFAULT_BUILD_TYPE "Release")
 set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build" FORCE)
 
-set(PETSC_PATH "~/SLlibs/petsc" CACHE STRING "Provide the path to the petsc folder")
-set(GMSH_PATH "~/SLlibs/gmsh" CACHE STRING "Provide the path to the gmsh folder")
-set(MPI_PATH "" CACHE STRING "Provide the path to the mpi folder")
-
 # Place library in build folder:
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+SET(CMAKE_CXX_STANDARD 17)
+SET(CMAKE_CXX_FLAGS_DEBUG "-g -Og -Wall -Wextra -Wpedantic")
+SET(CMAKE_CXX_FLAGS_RELEASE "-O3")
+
+if(NOT BLA_VENDOR)
+    set(BLA_VENDOR CACHE STRING OpenBLAS)
+endif()
 
-# Default flags:
-set(BLAS_FOUND NO)
-set(GMSH_FOUND NO)
-set(METIS_FOUND NO)
-set(MPI_FOUND NO)
-set(MUMPS_FOUND NO)
-set(PETSC_FOUND NO)
-set(SLEPC_FOUND NO)
+if(NOT PETSC_DIR AND NOT(APPLE))
+    set(PETSC_DIR CACHE STRING /usr/lib/petscdir)
+endif()
+
+# Add cmake packages
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+list(APPEND CMAKE_PREFIX_PATH $<$<BOOL:${APPLE}>:/opt/homebrew/opt/openblas> ${PETSC_DIR})
 
 # Installation definitions
 include(GNUInstallDirs)
-# Aux functions
-include(cMake/functions.cmake)
-include(cMake/SetupBLAS.cmake)
-include(cMake/SetupGMSH.cmake)
-include(cMake/SetupMETIS.cmake)
-include(cMake/SetupMPI.cmake)
-include(cMake/SetupMUMPS.cmake)
-include(cMake/SetupPETSC.cmake)
-include(cMake/SetupSLEPC.cmake)
-
-# Add libsparselizard target
-add_subdirectory(src)
-
-# Add simulations targets
-add_subdirectory(simulations)
 
+# this is not the cmake-official way but it's a lot easier
+set(INCLUDE_DIRS
+    src
+    src/mesh
+    src/gausspoint
+    src/io
+    src/io/paraview
+    src/io/nastran
+    src/io/gmsh
+    src/field
+    src/resolution
+    src/geometry
+    src/expression
+    src/expression/operation
+    src/shapefunction
+    src/shapefunction/hierarchical
+    src/shapefunction/hierarchical/h1
+    src/shapefunction/hierarchical/hcurl
+    src/shapefunction/lagrange
+    src/formulation
+)
+file(GLOB_RECURSE SRC_FILES "src/*.cpp")
+file(GLOB_RECURSE SRC_HEADERS "src/*.h")
+add_library(sparselizard SHARED ${SRC_FILES})
+# Note: the following would allow hierarchical install, but sparselizard acts as if it's flattened
+# target_sources(sparselizard PUBLIC FILE_SET HEADERS FILES ${SRC_HEADERS} BASE_DIRS src)
+target_precompile_headers(sparselizard PUBLIC ${SRC_HEADERS})
+target_include_directories(sparselizard PUBLIC ${INCLUDE_DIRS})
+set_target_properties(sparselizard PROPERTIES PUBLIC_HEADER "${SRC_HEADERS}")
+
+target_compile_options(sparselizard PUBLIC -fPIC -O3)
+
+find_package(OpenMP REQUIRED)
+target_link_libraries(sparselizard PUBLIC OpenMP::OpenMP_CXX)
+
+find_package(MPI REQUIRED)
+target_link_libraries(sparselizard PUBLIC MPI::MPI_CXX)
+
+find_package(BLAS REQUIRED)
+target_link_libraries(sparselizard PUBLIC BLAS::BLAS)
+
+find_package(PETSC REQUIRED)
+target_link_libraries(sparselizard PUBLIC PETSC::PETSC)
+
+find_package(SLEPC)
+target_link_libraries(sparselizard PUBLIC SLEPC::SLEPC)
+
+find_package(GMSH)
+if(GMSH_FOUND)
+    target_link_libraries(sparselizard PUBLIC GMSH::GMSH)
+    target_compile_definitions(sparselizard PRIVATE -DHAVE_GMSH)
+endif()
+
+find_package(METIS)
+
+if(METIS_FOUND)
+    target_link_libraries(sparselizard PUBLIC METIS::METIS)
+    target_compile_definitions(sparselizard PRIVATE -DHAVE_METIS)
+endif()
+
+target_link_libraries(sparselizard PUBLIC cmumps)
+target_compile_definitions(sparselizard PRIVATE
+    -DHAVE_BLAS
+    -DHAVE_MPI
+    -DHAVE_MUMPS
+    -DHAVE_PETSC
+    -DHAVE_SLEPC
+)
+
+install(TARGETS sparselizard LIBRARY PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include/sparselizard)
+
+set(BUILD_SIMULATIONS YES)
+
+if(BUILD_SIMULATIONS)
+    add_subdirectory(simulations)
+    message(STATUS "Building simulations")
+endif()
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..c8c47138
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,45 @@
+FROM debian:testing-slim as build
+
+LABEL maintainer="pascal.thibaudeau@cea.fr"
+LABEL version="0.2"
+LABEL description="Sparselizard on docker. See https://github.com/pthibaud/dockerlizard"
+
+# Disable prompt during packages installation
+ARG DEBIAN_FRONTEND=noninteractive
+
+# Update ubuntu software repository
+# Install additional repository
+RUN apt-get update && \
+    apt-get -y upgrade && \
+    apt-get -y dist-upgrade && \
+    apt-get install -y apt-utils build-essential cmake  \
+    libopenblas-dev \
+    libopenmpi-dev \
+    libmumps-dev \
+    libmetis-dev \
+    petsc-dev \
+    slepc-dev \
+    libgmsh-dev \
+    libomp-dev \
+    ninja-build
+
+# Clean the installation
+RUN apt-get clean
+
+
+WORKDIR /sparselizard
+COPY CMakeLists.txt .
+COPY src src
+COPY cmake cmake
+COPY simulations simulations
+RUN mkdir build
+# Prepare compilation environment
+RUN cmake -G Ninja -S . -B build
+RUN cmake --build build -- -j 8
+
+RUN mkdir -p /usr/local
+RUN cmake --install build -v --prefix /usr/local
+
+# Install the library and headers; Put the env variables
+# RUN make install
+ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
diff --git a/Makefile b/Makefile
deleted file mode 100755
index 97bd64c6..00000000
--- a/Makefile
+++ /dev/null
@@ -1,72 +0,0 @@
-UNAME := $(shell uname)
-
-ifeq ($(UNAME), Linux)
-# With or without the GMSH API:
-ifneq ("$(wildcard ~/SLlibs/gmsh)","")
-    LIBS = -L ~/SLlibs/gmsh/lib -l gmsh -L ~/SLlibs/petsc/arch-linux-c-opt/lib -l openblas -l petsc -l slepc -D HAVE_GMSH
-    INCL = -I ~/SLlibs/gmsh/include -I ~/SLlibs/petsc/include/petsc/mpiuni -I ~/SLlibs/petsc/arch-linux-c-opt/externalpackages/git.openblas -I ~/SLlibs/petsc/include/ -I ~/SLlibs/petsc/arch-linux-c-opt/include/
-else
-    LIBS = -L ~/SLlibs/petsc/arch-linux-c-opt/lib -l openblas -l petsc -l slepc
-    INCL = -I ~/SLlibs/petsc/include/petsc/mpiuni -I ~/SLlibs/petsc/arch-linux-c-opt/externalpackages/git.openblas -I ~/SLlibs/petsc/include/ -I ~/SLlibs/petsc/arch-linux-c-opt/include/
-endif
-endif
-ifeq ($(UNAME), Darwin)
-LIBS = -L ~/SLlibs/petsc/arch-darwin-c-opt/lib -l openblas -l petsc -l slepc
-INCL = -I ~/SLlibs/petsc/include/petsc/mpiuni -I ~/SLlibs/petsc/arch-darwin-c-opt/externalpackages/git.openblas -I ~/SLlibs/petsc/include/ -I ~/SLlibs/petsc/arch-darwin-c-opt/include/
-endif
-
-
-# $@ is the filename representing the target.
-# $< is the filename of the first prerequisite.
-# $^ the filenames of all the prerequisites.
-# $(@D) is the file path of the target file. 
-# D can be added to all of the above.
-
-CXX = g++ -fopenmp -fPIC -no-pie # openmp is used for parallel sorting on Linux
-CXX_FLAGS= -std=c++11 -O3
-
-# List of all directories containing the headers:
-INCLUDES = -I src -I src/field -I src/expression -I src/expression/operation -I src/shapefunction -I src/formulation -I src/shapefunction/hierarchical -I src/shapefunction/hierarchical/h1 -I src/shapefunction/hierarchical/hcurl -I src/gausspoint -I src/shapefunction/lagrange -I src/mesh -I src/io -I src/io/gmsh -I src/io/paraview -I src/io/nastran -I src/resolution -I src/geometry
-
-# List of all .cpp source files:
-CPPS= $(wildcard src/*.cpp) $(wildcard src/field/*.cpp) $(wildcard src/expression/*.cpp) $(wildcard src/expression/operation/*.cpp) $(wildcard src/shapefunction/*.cpp) $(wildcard src/formulation/*.cpp) $(wildcard src/shapefunction/hierarchical/*.cpp) $(wildcard src/shapefunction/hierarchical/h1/*.cpp) $(wildcard src/shapefunction/hierarchical/hcurl/*.cpp) $(wildcard src/gausspoint/*.cpp) $(wildcard src/shapefunction/lagrange/*.cpp) $(wildcard src/mesh/*.cpp) $(wildcard src/io/*.cpp) $(wildcard src/io/gmsh/*.cpp) $(wildcard src/io/paraview/*.cpp) $(wildcard src/io/nastran/*.cpp) $(wildcard src/resolution/*.cpp) $(wildcard src/geometry/*.cpp)
-
-# Final binary name:
-BIN = sparselizard
-# Put all generated stuff to this build directory:
-BUILD_DIR = ./build
-
-
-# Same list as CPP but with the .o object extension:
-OBJECTS=$(CPPS:%.cpp=$(BUILD_DIR)/%.o)
-# Gcc/Clang will create these .d files containing dependencies.
-DEP = $(OBJECTS:%.o=%.d)
-
-all: $(OBJECTS) libsparselizard.so
-	@# The main is always recompiled (it could have been replaced):
-	@$(CXX) $(CXX_FLAGS) $(LIBS) $(INCL) $(INCLUDES) -c main.cpp -o $(BUILD_DIR)/main.o
-	@echo "Linking."
-	@$(CXX) $(BUILD_DIR)/main.o $(OBJECTS) $(LIBS) -o $(BIN)
-	@echo "Done."
-	
-# Include all .d files
--include $(DEP)
-
-$(BUILD_DIR)/%.o: %.cpp
-	@echo "Compiling" $<
-	@# Create the folder of the current target in the build directory:
-	@mkdir -p $(@D)
-	@# Compile .cpp file. MMD creates the dependencies.
-	@$(CXX) $(CXX_FLAGS) $(LIBS) $(INCL) $(INCLUDES) -MMD -c $< -o $@
-	
-
-clean :
-	# Removes all files created.
-	rm -rf $(BUILD_DIR)
-	rm -f $(BIN)
-	rm -f libsparselizard.so
-
-LDFLAGS= -shared
-libsparselizard.so : $(OBJECTS)
-	@echo "Creating shared library."
-	@$(CXX) $(CXX_FLAGS) $(OBJECTS) -o $@ $(LDFLAGS)
diff --git a/cMake/SetupBLAS.cmake b/cMake/SetupBLAS.cmake
deleted file mode 100644
index 39fa672e..00000000
--- a/cMake/SetupBLAS.cmake
+++ /dev/null
@@ -1,47 +0,0 @@
-function(ConfigureBLAS TARGET)
-
-
-# Find blas headers:
-FIND_PATH(BLAS_INCLUDE_PATH
-    NAMES cblas.h
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/include"
-    "${PETSC_PATH}/arch-linux2-c-opt/include"
-    "${PETSC_PATH}/arch-darwin-c-opt/include"
-    NO_DEFAULT_PATH
-    )
-
-if(BLAS_INCLUDE_PATH)
-    message(STATUS "Blas header cblas.h found at " ${BLAS_INCLUDE_PATH})
-else()
-    message(STATUS "BLAS HEADER CBLAS.H NOT FOUND")
-endif()
-
-
-# Find blas library:
-FIND_LIBRARY(BLAS_LIBRARIES
-    NAMES openblas
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/lib"
-    "${PETSC_PATH}/arch-linux2-c-opt/lib"
-    "${PETSC_PATH}/arch-darwin-c-opt/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(BLAS_LIBRARIES)
-    message(STATUS "Blas library found at " ${BLAS_LIBRARIES})
-else()
-    message(STATUS "BLAS LIBRARY NOT FOUND")
-endif()
-
-
-if(BLAS_INCLUDE_PATH AND BLAS_LIBRARIES)
-    SET(BLAS_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${BLAS_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${BLAS_LIBRARIES})
-endif()
-
-
-endfunction(ConfigureBLAS)
-
diff --git a/cMake/SetupGMSH.cmake b/cMake/SetupGMSH.cmake
deleted file mode 100644
index d3b0ba3b..00000000
--- a/cMake/SetupGMSH.cmake
+++ /dev/null
@@ -1,43 +0,0 @@
-function(ConfigureGMSH TARGET)
-
-
-# Find gmsh headers:
-FIND_PATH(GMSH_INCLUDE_PATH
-    NAMES gmsh.h
-    PATHS
-    "${GMSH_PATH}/include"
-    NO_DEFAULT_PATH
-    )
-
-if(GMSH_INCLUDE_PATH)
-    message(STATUS "Gmsh headers found at " ${GMSH_INCLUDE_PATH})
-else()
-    message(STATUS "GMSH HEADERS NOT FOUND (OPTIONAL)")
-endif()
-
-
-# Find gmsh library:
-FIND_LIBRARY(GMSH_LIBRARIES
-    NAMES gmsh
-    PATHS
-    "${GMSH_PATH}/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(GMSH_LIBRARIES)
-    message(STATUS "Gmsh library found at " ${GMSH_LIBRARIES})
-else()
-    message(STATUS "GMSH LIBRARY NOT FOUND (OPTIONAL)")
-endif()
-
-
-if(GMSH_INCLUDE_PATH AND GMSH_LIBRARIES)
-    SET(GMSH_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${GMSH_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${GMSH_LIBRARIES})
-endif()
-
-
-endfunction(ConfigureGMSH)
-
diff --git a/cMake/SetupMETIS.cmake b/cMake/SetupMETIS.cmake
deleted file mode 100644
index c1ff084b..00000000
--- a/cMake/SetupMETIS.cmake
+++ /dev/null
@@ -1,47 +0,0 @@
-function(ConfigureMETIS TARGET)
-
-
-# Find metis headers:
-FIND_PATH(METIS_INCLUDE_PATH
-    NAMES metis.h
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/include"
-    "${PETSC_PATH}/arch-linux2-c-opt/include"
-    "${PETSC_PATH}/arch-darwin-c-opt/include"
-    NO_DEFAULT_PATH
-    )
-
-if(METIS_INCLUDE_PATH)
-    message(STATUS "Metis headers found at " ${METIS_INCLUDE_PATH})
-else()
-    message(STATUS "METIS HEADERS NOT FOUND")
-endif()
-
-
-# Find metis library:
-FIND_LIBRARY(METIS_LIBRARIES
-    NAMES metis
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/lib"
-    "${PETSC_PATH}/arch-linux2-c-opt/lib"
-    "${PETSC_PATH}/arch-darwin-c-opt/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(METIS_LIBRARIES)
-    message(STATUS "Metis library found at " ${METIS_LIBRARIES})
-else()
-    message(STATUS "METIS LIBRARY NOT FOUND")
-endif()
-
-
-if(METIS_INCLUDE_PATH AND METIS_LIBRARIES)
-    SET(METIS_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${METIS_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${METIS_LIBRARIES})
-endif()
-
-
-endfunction(ConfigureMETIS)
-
diff --git a/cMake/SetupMPI.cmake b/cMake/SetupMPI.cmake
deleted file mode 100644
index f3fad061..00000000
--- a/cMake/SetupMPI.cmake
+++ /dev/null
@@ -1,49 +0,0 @@
-# Run the default example with MPICH using:
-#
-# module avail mpi
-# module load mpi/mpich-x86_64
-# mpirun -n 4 ./default
-
-function(ConfigureMPI TARGET)
-
-
-# Find mpi headers:
-FIND_PATH(MPI_INCLUDE_PATH
-    NAMES mpi.h
-    PATHS
-    "${MPI_PATH}/include"
-    NO_DEFAULT_PATH
-    )
-
-if(MPI_INCLUDE_PATH)
-    message(STATUS "MPI headers found at " ${MPI_INCLUDE_PATH})
-else()
-    message(STATUS "MPI HEADERS NOT FOUND (OPTIONAL)")
-endif()
-
-
-# Find mpi library:
-FIND_LIBRARY(MPI_LIBRARIES
-    NAMES mpi
-    PATHS
-    "${MPI_PATH}/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(MPI_LIBRARIES)
-    message(STATUS "MPI library found at " ${MPI_LIBRARIES})
-else()
-    message(STATUS "MPI LIBRARY NOT FOUND (OPTIONAL)")
-endif()
-
-
-if(MPI_INCLUDE_PATH AND MPI_LIBRARIES)
-    SET(MPI_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${MPI_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${MPI_LIBRARIES})
-endif()
-
-
-endfunction(ConfigureMPI)
-
diff --git a/cMake/SetupMUMPS.cmake b/cMake/SetupMUMPS.cmake
deleted file mode 100644
index ee442e39..00000000
--- a/cMake/SetupMUMPS.cmake
+++ /dev/null
@@ -1,47 +0,0 @@
-function(ConfigureMUMPS TARGET)
-
-
-# Find mumps headers:
-FIND_PATH(MUMPS_INCLUDE_PATH
-    NAMES cmumps_c.h
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/include"
-    "${PETSC_PATH}/arch-linux2-c-opt/include"
-    "${PETSC_PATH}/arch-darwin-c-opt/include"
-    NO_DEFAULT_PATH
-    )
-
-if(MUMPS_INCLUDE_PATH)
-    message(STATUS "Mumps headers found at " ${MUMPS_INCLUDE_PATH})
-else()
-    message(STATUS "MUMPS HEADERS NOT FOUND")
-endif()
-
-
-# Find mumps library:
-FIND_LIBRARY(MUMPS_LIBRARIES
-    NAMES cmumps
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/lib"
-    "${PETSC_PATH}/arch-linux2-c-opt/lib"
-    "${PETSC_PATH}/arch-darwin-c-opt/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(MUMPS_LIBRARIES)
-    message(STATUS "Mumps library found at " ${MUMPS_LIBRARIES})
-else()
-    message(STATUS "MUMPS LIBRARY NOT FOUND")
-endif()
-
-
-if(MUMPS_INCLUDE_PATH AND MUMPS_LIBRARIES)
-    SET(MUMPS_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${MUMPS_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${MUMPS_LIBRARIES})
-endif()
-
-
-endfunction(ConfigureMUMPS)
-
diff --git a/cMake/SetupPETSC.cmake b/cMake/SetupPETSC.cmake
deleted file mode 100644
index 24bd6081..00000000
--- a/cMake/SetupPETSC.cmake
+++ /dev/null
@@ -1,60 +0,0 @@
-function(ConfigurePETSC TARGET)
-
-
-# Find petsc headers:
-FIND_PATH(PETSC_INCLUDE_PATH
-    NAMES petsc.h
-    PATHS
-    "${PETSC_PATH}/include"
-    NO_DEFAULT_PATH
-    )
-
-if(PETSC_INCLUDE_PATH)
-    message(STATUS "Petsc header petsc.h found at " ${PETSC_INCLUDE_PATH})
-else()
-    message(STATUS "PETSC HEADER PETSC.H NOT FOUND")
-endif()
-
-FIND_PATH(PETSCCONF_INCLUDE_PATH
-    NAMES petscconf.h
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/include"
-    "${PETSC_PATH}/arch-linux2-c-opt/include"
-    "${PETSC_PATH}/arch-darwin-c-opt/include"
-    NO_DEFAULT_PATH
-    )
-
-if(PETSCCONF_INCLUDE_PATH)
-    message(STATUS "Petsc header petscconf.h found at " ${PETSCCONF_INCLUDE_PATH})
-else()
-    message(STATUS "PETSC HEADER PETSCCONF.H NOT FOUND")
-endif()
-
-
-# Find petsc library:
-FIND_LIBRARY(PETSC_LIBRARIES
-    NAMES petsc
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/lib"
-    "${PETSC_PATH}/arch-linux2-c-opt/lib"
-    "${PETSC_PATH}/arch-darwin-c-opt/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(PETSC_LIBRARIES)
-    message(STATUS "Petsc library found at " ${PETSC_LIBRARIES})
-else()
-    message(STATUS "PETSC LIBRARY NOT FOUND")
-endif()
-
-
-if(PETSC_INCLUDE_PATH AND PETSCCONF_INCLUDE_PATH AND PETSC_LIBRARIES)
-    SET(PETSC_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${PETSC_INCLUDE_PATH} ${PETSCCONF_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${PETSC_LIBRARIES})
-endif()
-
-
-endfunction(ConfigurePETSC)
-
diff --git a/cMake/SetupSLEPC.cmake b/cMake/SetupSLEPC.cmake
deleted file mode 100644
index e57dbff8..00000000
--- a/cMake/SetupSLEPC.cmake
+++ /dev/null
@@ -1,47 +0,0 @@
-function(ConfigureSLEPC TARGET)
-
-
-# Find slepc headers:
-FIND_PATH(SLEPC_INCLUDE_PATH
-    NAMES slepc.h
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/include"
-    "${PETSC_PATH}/arch-linux2-c-opt/include"
-    "${PETSC_PATH}/arch-darwin-c-opt/include"
-    NO_DEFAULT_PATH
-    )
-
-if(SLEPC_INCLUDE_PATH)
-    message(STATUS "Slepc headers found at " ${SLEPC_INCLUDE_PATH})
-else()
-    message(STATUS "SLEPC HEADERS NOT FOUND")
-endif()
-
-
-# Find slepc library:
-FIND_LIBRARY(SLEPC_LIBRARIES
-    NAMES slepc
-    PATHS
-    "${PETSC_PATH}/arch-linux-c-opt/lib"
-    "${PETSC_PATH}/arch-linux2-c-opt/lib"
-    "${PETSC_PATH}/arch-darwin-c-opt/lib"
-    NO_DEFAULT_PATH
-    )
-
-if(SLEPC_LIBRARIES)
-    message(STATUS "Slepc library found at " ${SLEPC_LIBRARIES})
-else()
-    message(STATUS "SLEPC LIBRARY NOT FOUND")
-endif()
-
-
-if(SLEPC_INCLUDE_PATH AND SLEPC_LIBRARIES)
-    SET(SLEPC_FOUND YES PARENT_SCOPE)
-
-    TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${SLEPC_INCLUDE_PATH})
-    TARGET_LINK_LIBRARIES(${TARGET} PUBLIC ${SLEPC_LIBRARIES})
-endif()
-
-
-endfunction(ConfigureSLEPC)
-
diff --git a/cMake/functions.cmake b/cMake/functions.cmake
deleted file mode 100644
index cbb7657f..00000000
--- a/cMake/functions.cmake
+++ /dev/null
@@ -1,45 +0,0 @@
-# Add library for dirs
-function(custom_add_library_from_dir TARGET DIRLIST)
-    foreach(d IN LISTS DIRLIST)
-        file(GLOB SRC "${d}/*.cpp" "${d}/*.h" "${d}/*.hpp")
-        list(APPEND TARGET_SRC ${SRC})
-    endforeach()
-    add_library(${TARGET} SHARED ${TARGET_SRC})
-endfunction(custom_add_library_from_dir)
-
-# Add executable for dirs
-function(custom_add_executable_from_dir TARGET DIRLIST)
-    foreach(d IN LISTS DIRLIST)
-        file(GLOB SRC "${d}/*.cpp" "${d}/*.h" "${d}/*.hpp")
-        list(APPEND TARGET_SRC ${SRC})
-    endforeach()
-    add_executable(${TARGET} ${TARGET_SRC})
-endfunction(custom_add_executable_from_dir)
-
-function(custom_copy_file TARGET FROMDIRS TODIR GLOBS)
-    foreach(d IN LISTS FROMDIRS)
-        foreach(g IN LISTS GLOBS)
-            file(GLOB SRC "${d}/${g}")
-            foreach(f IN LISTS SRC)
-                string(REGEX REPLACE "^.*/" "" DEST ${f})
-                configure_file(${f} ${TODIR}/${DEST} COPYONLY)
-            endforeach()
-        endforeach()
-    endforeach()
-endfunction(custom_copy_file)
-
-function(custom_symlink_file TARGET FROMDIRS TODIR GLOBS)
-    foreach(d IN LISTS FROMDIRS)
-        foreach(g IN LISTS GLOBS)
-            file(GLOB SRC "${d}/${g}")
-            foreach(f IN LISTS SRC)
-                get_filename_component(filename ${f} NAME)
-                if(NOT ${filename} STREQUAL "CMakeLists.txt")
-                    string(REGEX REPLACE "^.*/" "" DEST ${f})
-                    file(CREATE_LINK ${f} ${TODIR}/${DEST} SYMBOLIC)
-                endif()
-            endforeach()
-        endforeach()
-    endforeach()
-endfunction(custom_symlink_file)
-
diff --git a/cmake/FindGMSH.cmake b/cmake/FindGMSH.cmake
new file mode 100644
index 00000000..1ad4e727
--- /dev/null
+++ b/cmake/FindGMSH.cmake
@@ -0,0 +1,17 @@
+include(FindPackageHandleStandardArgs)
+
+find_library(GMSH_LIBRARY NAMES gmsh)
+find_path(GMSH_INCLUDE_DIR NAMES gmsh.h)
+
+find_package_handle_standard_args(GMSH DEFAULT_MSG GMSH_LIBRARY GMSH_INCLUDE_DIR)
+
+if(GMSH_FOUND)
+    mark_as_advanced(GMSH_INCLUDE_DIR)
+    mark_as_advanced(GMSH_LIBRARY)
+endif()
+
+IF(GMSH_FOUND AND NOT TARGET GMSH::GMSH)
+    add_library(GMSH::GMSH IMPORTED SHARED)
+    set_property(TARGET GMSH::GMSH PROPERTY IMPORTED_LOCATION ${GMSH_LIBRARY})
+    target_include_directories(GMSH::GMSH INTERFACE ${GMSH_INCLUDE_DIR})
+endif()
diff --git a/cmake/FindMETIS.cmake b/cmake/FindMETIS.cmake
new file mode 100644
index 00000000..9354fa8f
--- /dev/null
+++ b/cmake/FindMETIS.cmake
@@ -0,0 +1,17 @@
+include(FindPackageHandleStandardArgs)
+
+find_library(METIS_LIBRARY NAMES metis)
+find_path(METIS_INCLUDE_DIR NAMES metis.h)
+
+find_package_handle_standard_args(METIS DEFAULT_MSG METIS_LIBRARY METIS_INCLUDE_DIR)
+
+if(METIS_FOUND)
+    mark_as_advanced(METIS_INCLUDE_DIR)
+    mark_as_advanced(METIS_LIBRARY)
+endif()
+
+IF(METIS_FOUND AND NOT TARGET METIS::METIS)
+    add_library(METIS::METIS IMPORTED SHARED)
+    set_property(TARGET METIS::METIS PROPERTY IMPORTED_LOCATION ${METIS_LIBRARY})
+    target_include_directories(METIS::METIS INTERFACE ${METIS_INCLUDE_DIR})
+endif()
diff --git a/cmake/FindPETSC.cmake b/cmake/FindPETSC.cmake
new file mode 100644
index 00000000..77a67f16
--- /dev/null
+++ b/cmake/FindPETSC.cmake
@@ -0,0 +1,21 @@
+include(FindPackageHandleStandardArgs)
+
+find_library(PETSC_LIBRARY NAMES petsc petsc_real)
+find_path(PETSC_INCLUDE_DIR NAMES petsc.h HINTS
+  /usr/include/petsc
+  /usr/lib/petscdir
+  $<$<BOOL:${APPLE}>:/opt/homebrew/opt/petsc/include >
+)
+
+find_package_handle_standard_args(PETSC DEFAULT_MSG PETSC_LIBRARY PETSC_INCLUDE_DIR)
+
+if(PETSC_FOUND)
+  mark_as_advanced(PETSC_INCLUDE_DIR)
+  mark_as_advanced(PETSC_LIBRARY)
+endif()
+
+IF(PETSC_FOUND AND NOT TARGET PETSC::PETSC)
+  add_library(PETSC::PETSC IMPORTED SHARED)
+  set_property(TARGET PETSC::PETSC PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARY})
+  target_include_directories(PETSC::PETSC INTERFACE ${PETSC_INCLUDE_DIR})
+endif()
diff --git a/cmake/FindSLEPC.cmake b/cmake/FindSLEPC.cmake
new file mode 100644
index 00000000..47092f67
--- /dev/null
+++ b/cmake/FindSLEPC.cmake
@@ -0,0 +1,25 @@
+include(FindPackageHandleStandardArgs)
+
+find_library(SLEPC_LIBRARY NAMES slepc slepc_real)
+find_path(SLEPC_INCLUDE_DIR NAMES slepcsys.h HINTS
+  /usr/lib/slepcdir
+  /usr/include/slepc)
+
+find_path(SLEPC_INCLUDE_DIR_PRIVATE NAMES slepcversion.h HINTS
+  /usr/lib/slepcdir
+  /usr/include/slepc
+)
+
+find_package_handle_standard_args(SLEPC DEFAULT_MSG SLEPC_LIBRARY SLEPC_INCLUDE_DIR)
+
+if(SLEPC_FOUND)
+  mark_as_advanced(SLEPC_INCLUDE_DIR)
+  mark_as_advanced(SLEPC_INCLUDE_DIR_PRIVATE)
+  mark_as_advanced(SLEPC_LIBRARY)
+endif()
+
+IF(SLEPC_FOUND AND NOT TARGET SLEPC::SLEPC)
+  add_library(SLEPC::SLEPC IMPORTED SHARED)
+  set_property(TARGET SLEPC::SLEPC PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARY})
+  target_include_directories(SLEPC::SLEPC INTERFACE ${SLEPC_INCLUDE_DIR})
+endif()
diff --git a/simulations/default/CMakeLists.txt b/simulations/default/CMakeLists.txt
index 49cf00a2..983cd918 100644
--- a/simulations/default/CMakeLists.txt
+++ b/simulations/default/CMakeLists.txt
@@ -1,4 +1,6 @@
-custom_add_executable_from_dir(default ${CMAKE_CURRENT_SOURCE_DIR})
-target_link_libraries(default sparselizard)
-custom_symlink_file(default ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} "*.msh;*.geo;*.txt;*.csv;*.nas;*.slz")
 
+add_executable(default main.cpp)
+target_link_libraries(default PUBLIC sparselizard)
+install(TARGETS default RUNTIME)
+set(DATA disk.geo disk.msh)
+install(FILES ${DATA} DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
deleted file mode 100644
index f0242d80..00000000
--- a/src/CMakeLists.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-set(SRC_DIR_LIST
-  ${CMAKE_CURRENT_SOURCE_DIR}
-  ${CMAKE_CURRENT_SOURCE_DIR}/resolution
-  ${CMAKE_CURRENT_SOURCE_DIR}/shapefunction
-  ${CMAKE_CURRENT_SOURCE_DIR}/shapefunction/lagrange
-  ${CMAKE_CURRENT_SOURCE_DIR}/shapefunction/hierarchical
-  ${CMAKE_CURRENT_SOURCE_DIR}/shapefunction/hierarchical/h1
-  ${CMAKE_CURRENT_SOURCE_DIR}/shapefunction/hierarchical/hcurl
-  ${CMAKE_CURRENT_SOURCE_DIR}/mesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/formulation
-  ${CMAKE_CURRENT_SOURCE_DIR}/field
-  ${CMAKE_CURRENT_SOURCE_DIR}/io
-  ${CMAKE_CURRENT_SOURCE_DIR}/io/nastran
-  ${CMAKE_CURRENT_SOURCE_DIR}/io/paraview
-  ${CMAKE_CURRENT_SOURCE_DIR}/io/gmsh
-  ${CMAKE_CURRENT_SOURCE_DIR}/geometry
-  ${CMAKE_CURRENT_SOURCE_DIR}/expression
-  ${CMAKE_CURRENT_SOURCE_DIR}/expression/operation
-  ${CMAKE_CURRENT_SOURCE_DIR}/gausspoint)
-
-custom_add_library_from_dir(sparselizard "${SRC_DIR_LIST}")
-
-custom_copy_file(sparselizard "${SRC_DIR_LIST}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/include" "*.h")
-
-target_include_directories(sparselizard PUBLIC ${SRC_DIR_LIST})
-
-target_compile_features(sparselizard PRIVATE cxx_std_11)
-target_compile_options(sparselizard PUBLIC -fPIC -no-pie -O3)
-
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
-
-ConfigureMPI(sparselizard)
-ConfigureGMSH(sparselizard)
-ConfigureBLAS(sparselizard)
-ConfigureMETIS(sparselizard)
-ConfigureMUMPS(sparselizard)
-ConfigurePETSC(sparselizard)
-ConfigureSLEPC(sparselizard)
-
-# Optional for std::thread
-# find_package(Threads)
-# target_link_libraries(sparselizard PUBLIC ${CMAKE_THREAD_LIBS_INIT})
-
-if(NOT (${BLAS_FOUND} AND ${METIS_FOUND} AND ${MUMPS_FOUND} AND ${PETSC_FOUND} AND ${SLEPC_FOUND}))
-    message(FATAL_ERROR "\nAt least one required package (blas, metis, mumps, petsc, slepc) not found.")
-endif()
-
-# set configure file
-if(${BLAS_FOUND})
-    add_definitions(-DHAVE_BLAS)
-endif()
-if(${GMSH_FOUND})
-    add_definitions(-DHAVE_GMSH)
-endif()
-if(${METIS_FOUND})
-    add_definitions(-DHAVE_METIS)
-endif()
-if(${MPI_FOUND})
-    add_definitions(-DHAVE_MPI)
-endif()
-if(${MUMPS_FOUND})
-    add_definitions(-DHAVE_MUMPS)
-endif()
-if(${PETSC_FOUND})
-    add_definitions(-DHAVE_PETSC)
-endif()
-if(${SLEPC_FOUND})
-    add_definitions(-DHAVE_SLEPC)
-endif()
-
-target_include_directories(sparselizard PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
-
-install(TARGETS sparselizard)
-install(DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/include/"
-        DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/sparselizard"
-        FILES_MATCHING PATTERN "*.h")
-- 
2.35.3

openSUSE Build Service is sponsored by