diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d52d23a354a847da5a227e182a99e26655038ba2..40e74430867a295e19d0445c15db9a06e6fc8a1c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -47,19 +47,19 @@ building_stage:
       - cat /etc/os-release
       - cd src
       - echo "Running make with gnu compilers version 11..."
-      - make wipe && CXX=g++-11 FC=gfortran-11 make -j
+      - make clean && BUILDDIR=$PWD/../build_gnu11 CXX=g++-11 FC=gfortran-11 make
       - echo "Running make with gnu compilers version 12..."
-      - make wipe && CXX=g++-12 FC=gfortran-12 make -j
+      - make clean && BUILDDIR=$PWD/../build_gnu12 CXX=g++-12 FC=gfortran-12 make
       - echo "Running make with gnu fortran version 12 and clang version 13..."
-      - make wipe && CXX="clang++-13 -stdlib=libc++" FC=gfortran-12 make -j
+      - make clean && BUILDDIR=$PWD/../build_clang13 CXX="clang++-13 -stdlib=libc++" FC=gfortran-12 make
       - echo "Running make with gnu fortran version 12 and clang version 14..."
-      - make wipe && CXX="clang++-14 -stdlib=libc++" FC=gfortran-12 make -j
+      - make clean && BUILDDIR=$PWD/../build_clang14 CXX="clang++-14 -stdlib=libc++" FC=gfortran-12 make
       - echo "Running make with gnu fortran version 12 and clang version 15..."
-      - make wipe && CXX="clang++-15 -stdlib=libc++" FC=gfortran-12 make -j
+      - make clean && BUILDDIR=$PWD/../build_clang15 CXX="clang++-15 -stdlib=libc++" FC=gfortran-12 make
       - echo "Running make with gnu fortran version 12 and clang version 16..."
-      - make wipe && CXX="clang++-16 -stdlib=libc++" FC=gfortran-12 make -j
+      - make clean && BUILDDIR=$PWD/../build_clang16 CXX="clang++-16 -stdlib=libc++" FC=gfortran-12 make
       - echo "Finally running make with default compilers..."
-      - make wipe && make -j
+      - make clean && make
       - make docs -j && make -C ../doc/build/latex -j
 
 running_stage:
diff --git a/containers/singularity/np-tmcode-run.sif b/containers/singularity/np-tmcode-run.sif
index ef165c012d75f3722d7921179f09c9aea22ef58f..dd5129f356ed91f9477b7ee0c981b5b62cf6523d 100755
Binary files a/containers/singularity/np-tmcode-run.sif and b/containers/singularity/np-tmcode-run.sif differ
diff --git a/src/Makefile b/src/Makefile
index debe5eebe77aa8ab76f126de0c9561770f24cf96..0f1c707887fbd7c242a98a670274e662e5444135 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,26 +1,33 @@
 SUBDIRS := cluster sphere testing trapping
 SRCDIR=$(PWD)
 OBJDIR=$(SRCDIR)/objects
-BUILDDIR=$(SRCDIR)/../build
+ifndef BUILDDIR
+override BUILDDIR=$(SRCDIR)/../build
+endif
 DOCSDIR=$(SRCDIR)/../doc
 
-all: $(SUBDIRS)
+all: $(SUBDIRS) $(BUILDDIR)
 
 docs:
 	cd $(DOCSDIR)/src; doxygen config.dox
 
-$(SUBDIRS):
+$(BUILDDIR):
+	mkdir -p $(BUILDDIR)
+
+$(SUBDIRS): $(BUILDDIR)
 	$(MAKE) -C $@
 
-clean:
-	rm -f $(OBJDIR)/*.o
+clean: $(BUILDDIR)
+	$(MAKE) -C cluster clean
+	$(MAKE) -C sphere clean
+	$(MAKE) -C trapping clean
+	$(MAKE) -C testing clean
 
-wipe:
-	rm -f $(BUILDDIR)/cluster/*
-	rm -f $(BUILDDIR)/sphere/*
-	rm -f $(BUILDDIR)/testing/*
-	rm -f $(BUILDDIR)/trapping/*
-	rm -f $(OBJDIR)/*.o
+wipe: $(BUILDDIR)
+	$(MAKE) -C cluster wipe
+	$(MAKE) -C sphere wipe
+	$(MAKE) -C trapping wipe
+	$(MAKE) -C testing wipe
 	if [ -d $(DOCSDIR)/build/html ]; then rm -r $(DOCSDIR)/build/html; fi
 	if [ -d $(DOCSDIR)/build/latex ]; then rm -r $(DOCSDIR)/build/latex; fi
 
diff --git a/src/cluster/Makefile b/src/cluster/Makefile
index 82cd5f888bcc5ea9deb024b67116031080b856f5..a8da6ac5b9f241d109c7500c44419399f0e28e9a 100644
--- a/src/cluster/Makefile
+++ b/src/cluster/Makefile
@@ -1,5 +1,8 @@
 ifndef BUILDDIR
-override BUILDDIR=../../build/cluster
+override BUILDDIR=../../build
+endif
+ifndef BUILDDIR_CLU
+override BUILDDIR_CLU=$(BUILDDIR)/cluster
 endif
 ifndef OBJDIR
 override OBJDIR=../objects
@@ -13,20 +16,23 @@ F_CLU_OBJS=$(OBJDIR)/clu.o $(OBJDIR)/edfb_clu.o
 CXX_CLU_OBJS=$(OBJDIR)/np_cluster.o $(OBJDIR)/Commons.o $(OBJDIR)/Configuration.o $(OBJDIR)/file_io.o $(OBJDIR)/Parsers.o $(OBJDIR)/sph_subs.o $(OBJDIR)/clu_subs.o $(OBJDIR)/cluster.o $(OBJDIR)/TransitionMatrix.o
 
 
-all: $(BUILDDIR)/clu $(BUILDDIR)/edfb_clu $(BUILDDIR)/np_cluster
+all: $(BUILDDIR_CLU)/clu $(BUILDDIR_CLU)/edfb_clu $(BUILDDIR_CLU)/np_cluster
+
+$(BUILDDIR_CLU):
+	mkdir -p $(BUILDDIR_CLU)
 
-$(BUILDDIR)/clu: $(OBJDIR)/clu.o
-	$(FC) $(FCFLAGS) -o $(BUILDDIR)/clu $(OBJDIR)/clu.o $(LDFLAGS)
+$(BUILDDIR_CLU)/clu: $(OBJDIR)/clu.o $(BUILDDIR_CLU)
+	$(FC) $(FCFLAGS) -o $(BUILDDIR_CLU)/clu $(OBJDIR)/clu.o $(LDFLAGS)
 
-$(BUILDDIR)/edfb_clu: $(OBJDIR)/edfb_clu.o
-	$(FC) $(FCFLAGS) -o $(BUILDDIR)/edfb_clu $(OBJDIR)/edfb_clu.o $(LDFLAGS)
+$(BUILDDIR_CLU)/edfb_clu: $(OBJDIR)/edfb_clu.o $(BUILDDIR_CLU)
+	$(FC) $(FCFLAGS) -o $(BUILDDIR_CLU)/edfb_clu $(OBJDIR)/edfb_clu.o $(LDFLAGS)
 
-$(BUILDDIR)/np_cluster: $(CXX_CLU_OBJS)
-	$(CXX) $(CXXFLAGS) -o $(BUILDDIR)/np_cluster $(CXX_CLU_OBJS) $(CXXLDFLAGS) 
+$(BUILDDIR_CLU)/np_cluster: $(CXX_CLU_OBJS) $(BUILDDIR_CLU)
+	$(CXX) $(CXXFLAGS) -o $(BUILDDIR_CLU)/np_cluster $(CXX_CLU_OBJS) $(CXXLDFLAGS) 
 
 clean:
 	rm -f $(F_CLU_OBJS) $(CXX_CLU_OBJS)
 
 wipe:
-	rm -f $(BUILDDIR)/clu $(BUILDDIR)/edfb_clu $(F_CLU_OBJS) $(CXX_CLU_OBJS)
+	rm -f $(BUILDDIR_CLU)/clu $(BUILDDIR_CLU)/edfb_clu $(BUILDDIR_CLU)/np_cluster $(F_CLU_OBJS) $(CXX_CLU_OBJS)
 
diff --git a/src/sphere/Makefile b/src/sphere/Makefile
index 47293efc5427725e04025e4e783e97243e32acd3..d012622e1d346bceca21f3bcf3f819b8614b80b7 100644
--- a/src/sphere/Makefile
+++ b/src/sphere/Makefile
@@ -1,5 +1,8 @@
 ifndef BUILDDIR
-override BUILDDIR=../../build/sphere
+override BUILDDIR=../../build
+endif
+ifndef BUILDDIR_SPH
+override BUILDDIR_SPH=$(BUILDDIR)/sphere
 endif
 ifndef OBJDIR
 override OBJDIR=../objects
@@ -12,20 +15,23 @@ F_SPH_OBJS=$(OBJDIR)/edfb_sph.o $(OBJDIR)/sph.o
 
 CXX_SPH_OBJS=$(OBJDIR)/np_sphere.o $(OBJDIR)/Commons.o $(OBJDIR)/Configuration.o $(OBJDIR)/file_io.o $(OBJDIR)/Parsers.o $(OBJDIR)/sph_subs.o $(OBJDIR)/sphere.o $(OBJDIR)/TransitionMatrix.o
 
-all: $(BUILDDIR)/edfb_sph $(BUILDDIR)/sph $(BUILDDIR)/np_sphere
+all: $(BUILDDIR_SPH)/edfb_sph $(BUILDDIR_SPH)/sph $(BUILDDIR_SPH)/np_sphere
+
+$(BUILDDIR_SPH):
+	mkdir -p $(BUILDDIR_SPH)
 
-$(BUILDDIR)/edfb_sph: $(OBJDIR)/edfb_sph.o
-	$(FC) $(FCFLAGS) -o $(BUILDDIR)/edfb_sph $(OBJDIR)/edfb_sph.o $(LDFLAGS)
+$(BUILDDIR_SPH)/edfb_sph: $(OBJDIR)/edfb_sph.o $(BUILDDIR_SPH)
+	$(FC) $(FCFLAGS) -o $(BUILDDIR_SPH)/edfb_sph $(OBJDIR)/edfb_sph.o $(LDFLAGS)
 
-$(BUILDDIR)/sph: $(OBJDIR)/sph.o
-	$(FC) $(FCFLAGS) -o $(BUILDDIR)/sph $(OBJDIR)/sph.o $(LDFLAGS)
+$(BUILDDIR_SPH)/sph: $(OBJDIR)/sph.o $(BUILDDIR_SPH)
+	$(FC) $(FCFLAGS) -o $(BUILDDIR_SPH)/sph $(OBJDIR)/sph.o $(LDFLAGS)
 
-$(BUILDDIR)/np_sphere: $(CXX_SPH_OBJS)
-	$(CXX) $(CXXFLAGS) -o $(BUILDDIR)/np_sphere $(CXX_SPH_OBJS) $(CXXLDFLAGS) 
+$(BUILDDIR_SPH)/np_sphere: $(CXX_SPH_OBJS) $(BUILDDIR_SPH)
+	$(CXX) $(CXXFLAGS) -o $(BUILDDIR_SPH)/np_sphere $(CXX_SPH_OBJS) $(CXXLDFLAGS) 
 
 clean:
 	rm -f $(F_SPH_OBJS) $(CXX_SPH_OBJS)
 
 wipe:
-	rm -f $(BUILDDIR)/edfb_sph $(BUILDDIR)/sph $(F_SPH_OBJS) $(CXX_SPH_OBJS)
+	rm -f $(BUILDDIR_SPH)/edfb_sph $(BUILDDIR_SPH)/sph $(BUILDDIR_SPH)/np_sphere $(F_SPH_OBJS) $(CXX_SPH_OBJS)
 
diff --git a/src/testing/Makefile b/src/testing/Makefile
index de9a26d7f070decadead8901a7b32f0bb06c625b..9fff52e89e5c018b9aca391a6e736461ba389d00 100644
--- a/src/testing/Makefile
+++ b/src/testing/Makefile
@@ -1,5 +1,8 @@
 ifndef BUILDDIR
-override BUILDDIR=../../build/testing
+override BUILDDIR=../../build
+endif
+ifndef BUILDDIR_TEST
+override BUILDDIR_TEST=$(BUILDDIR)/testing
 endif
 ifndef OBJDIR
 override OBJDIR=../objects
@@ -12,16 +15,19 @@ CXX_TEDF_OBJS=$(OBJDIR)/test_TEDF.o $(OBJDIR)/Configuration.o $(OBJDIR)/file_io.
 
 CXX_TTMS_OBJS=$(OBJDIR)/test_TTMS.o $(OBJDIR)/file_io.o $(OBJDIR)/Parsers.o $(OBJDIR)/TransitionMatrix.o
 
-all: $(BUILDDIR)/test_TEDF $(BUILDDIR)/test_TTMS
+all: $(BUILDDIR_TEST)/test_TEDF $(BUILDDIR_TEST)/test_TTMS
+
+$(BUILDDIR_TEST):
+	mkdir -p $(BUILDDIR_TEST)
 
-$(BUILDDIR)/test_TEDF: $(CXX_TEDF_OBJS)
-	$(CXX) $(CXXFLAGS) -o $(BUILDDIR)/test_TEDF $(CXX_TEDF_OBJS) $(CXXLDFLAGS) 
+$(BUILDDIR_TEST)/test_TEDF: $(CXX_TEDF_OBJS) $(BUILDDIR_TEST)
+	$(CXX) $(CXXFLAGS) -o $(BUILDDIR_TEST)/test_TEDF $(CXX_TEDF_OBJS) $(CXXLDFLAGS) 
 
-$(BUILDDIR)/test_TTMS: $(CXX_TTMS_OBJS)
-	$(CXX) $(CXXFLAGS) -o $(BUILDDIR)/test_TTMS $(CXX_TTMS_OBJS) $(CXXLDFLAGS) 
+$(BUILDDIR_TEST)/test_TTMS: $(CXX_TTMS_OBJS) $(BUILDDIR_TEST)
+	$(CXX) $(CXXFLAGS) -o $(BUILDDIR_TEST)/test_TTMS $(CXX_TTMS_OBJS) $(CXXLDFLAGS) 
 
 clean:
 	rm -f $(CXX_TEDF_OBJS) $(CXX_TTMS_OBJS)
 
 wipe:
-	rm -f $(BUILDDIR)/test_TEDF $(BUILDDIR)/test_TTMS $(CXX_TEDF_OBJS) $(CXX_TTMS_OBJS)
+	rm -f $(BUILDDIR_TEST)/test_TEDF $(BUILDDIR_TEST)/test_TTMS $(CXX_TEDF_OBJS) $(CXX_TTMS_OBJS)
diff --git a/src/trapping/Makefile b/src/trapping/Makefile
index e9f114c692b2b985c7f34f9131e3bd70d4dff9d4..bf595535a3e401a2cb3fa84e949a89c157553bc5 100644
--- a/src/trapping/Makefile
+++ b/src/trapping/Makefile
@@ -1,5 +1,8 @@
 ifndef BUILDDIR
-override BUILDDIR=../../build/trapping
+override BUILDDIR=../../build
+endif
+ifndef BUILDDIR_TRA
+override BUILDDIR_TRA=$(BUILDDIR)/trapping
 endif
 ifndef OBJDIR
 override OBJDIR=../objects
@@ -12,20 +15,23 @@ F_TRAP_OBJS=$(OBJDIR)/frfme.o $(OBJDIR)/lffft.o
 
 CXX_TRAP_OBJS=$(OBJDIR)/np_trapping.o $(OBJDIR)/cfrfme.o $(OBJDIR)/clffft.o $(OBJDIR)/Parsers.o $(OBJDIR)/Commons.o $(OBJDIR)/Configuration.o $(OBJDIR)/file_io.o $(OBJDIR)/sph_subs.o $(OBJDIR)/tra_subs.o
 
-all: $(BUILDDIR)/frfme $(BUILDDIR)/lffft $(BUILDDIR)/np_trapping
+all: $(BUILDDIR_TRA)/frfme $(BUILDDIR_TRA)/lffft $(BUILDDIR_TRA)/np_trapping
+
+$(BUILDDIR_TRA):
+	mkdir -p $(BUILDDIR_TRA)
 
-$(BUILDDIR)/frfme: $(OBJDIR)/frfme.o
-	$(FC) $(FCFLAGS) -o $(BUILDDIR)/frfme $(OBJDIR)/frfme.o $(LDFLAGS)
+$(BUILDDIR_TRA)/frfme: $(OBJDIR)/frfme.o $(BUILDDIR_TRA)
+	$(FC) $(FCFLAGS) -o $(BUILDDIR_TRA)/frfme $(OBJDIR)/frfme.o $(LDFLAGS)
 
-$(BUILDDIR)/lffft: $(OBJDIR)/lffft.o
-	$(FC) $(FCFLAGS) -o $(BUILDDIR)/lffft $(OBJDIR)/lffft.o $(LDFLAGS)
+$(BUILDDIR_TRA)/lffft: $(OBJDIR)/lffft.o $(BUILDDIR_TRA)
+	$(FC) $(FCFLAGS) -o $(BUILDDIR_TRA)/lffft $(OBJDIR)/lffft.o $(LDFLAGS)
 
-$(BUILDDIR)/np_trapping: $(CXX_TRAP_OBJS)
-	$(CXX) $(CXXFLAGS) -o $(BUILDDIR)/np_trapping $(CXX_TRAP_OBJS) $(CXXLDFLAGS) 
+$(BUILDDIR_TRA)/np_trapping: $(CXX_TRAP_OBJS) $(BUILDDIR_TRA)
+	$(CXX) $(CXXFLAGS) -o $(BUILDDIR_TRA)/np_trapping $(CXX_TRAP_OBJS) $(CXXLDFLAGS) 
 
 clean:
 	rm -f $(F_TRAP_OBJS) $(CXX_TRAP_OBJS)
 
 wipe:
-	rm -f $(BUILDDIR)/frfme $(BUILDDIR)/lffft $(F_TRAP_OBJS) $(CXX_TRAP_OBJS)
+	rm -f $(BUILDDIR_TRA)/frfme $(BUILDDIR_TRA)/lffft $(BUILDDIR_TRA)/np_trapping $(F_TRAP_OBJS) $(CXX_TRAP_OBJS)