diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000000000000000000000000000000000000..cbbbea7b2a182967a0dcbf28c87837608e2046e6
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+    "cSpell.enableFiletypes": [
+        "!markdown"
+    ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 81e65f5705669eec764c741f73d269a9e7c2a1fe..afeb8e7f6868c0cad7355b3e1c4727a5ed6a4c8d 100644
--- a/README.md
+++ b/README.md
@@ -15,11 +15,19 @@ Find the thesis at:
 As a numerical solver, mainly FEniCSx was used and installed via conda.
 
 ```
-conda create -n fenicsx-env
+conda create -n fenicsx-env python=3.12.13
 conda activate fenicsx-env
 conda install -c conda-forge fenics-dolfinx=0.8.0 mpich=4.2.1 pyvista=0.43.10 matplotlib=3.8.4 numpy=2.0.1 scipy=1.14.0
 ```
 
+### Alternative installation
+
+Use the "environment.yml" file to install all necessary environments
+
+```
+conda env create -f environment.yml
+```
+
 ## Usage
 
 
diff --git a/environment.yml b/environment.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ca883de5d046d3ffdf80828e59397290b68f4a1b
--- /dev/null
+++ b/environment.yml
@@ -0,0 +1,318 @@
+name: fenicsx
+channels:
+  - conda-forge
+  - defaults
+dependencies:
+  - _libgcc_mutex=0.1=conda_forge
+  - _openmp_mutex=4.5=2_gnu
+  - aiohttp=3.9.5=py312h98912ed_0
+  - aiosignal=1.3.1=pyhd8ed1ab_0
+  - alsa-lib=1.2.12=h4ab18f5_0
+  - aom=3.9.1=hac33072_0
+  - asttokens=2.4.1=pyhd8ed1ab_0
+  - attr=2.5.1=h166bdaf_1
+  - attrs=23.2.0=pyh71513ae_0
+  - binutils_impl_linux-64=2.40=ha1999f0_7
+  - binutils_linux-64=2.40=hb3c18ed_9
+  - blosc=1.21.5=hc2324a3_1
+  - brotli=1.1.0=hd590300_1
+  - brotli-bin=1.1.0=hd590300_1
+  - brotli-python=1.1.0=py312h30efb56_1
+  - bzip2=1.0.8=hd590300_5
+  - c-ares=1.28.1=hd590300_0
+  - c-blosc2=2.14.4=hb4ffafa_1
+  - ca-certificates=2024.6.2=hbcca054_0
+  - cairo=1.18.0=h3faef2a_0
+  - certifi=2024.6.2=pyhd8ed1ab_0
+  - cffi=1.16.0=py312hf06ca03_0
+  - charset-normalizer=3.3.2=pyhd8ed1ab_0
+  - comm=0.2.2=pyhd8ed1ab_0
+  - contourpy=1.2.1=py312h8572e83_0
+  - cycler=0.12.1=pyhd8ed1ab_0
+  - dav1d=1.2.1=hd590300_0
+  - dbus=1.13.6=h5008d03_3
+  - debugpy=1.8.1=py312h30efb56_0
+  - decorator=5.1.1=pyhd8ed1ab_0
+  - double-conversion=3.3.0=h59595ed_0
+  - eigen=3.4.0=h00ab1b0_0
+  - exceptiongroup=1.2.0=pyhd8ed1ab_2
+  - executing=2.0.1=pyhd8ed1ab_0
+  - expat=2.6.2=h59595ed_0
+  - fenics-basix=0.8.0=py312h2492b07_1
+  - fenics-dolfinx=0.8.0=py312hb4760eb_103
+  - fenics-ffcx=0.8.0=pyh4af843d_0
+  - fenics-libbasix=0.8.0=h9187eef_1
+  - fenics-libdolfinx=0.8.0=h714c792_103
+  - fenics-ufcx=0.8.0=h22f594c_0
+  - fenics-ufl=2024.1.0=pyhd8ed1ab_0
+  - ffmpeg=6.1.1=gpl_he44c6f3_112
+  - fftw=3.3.10=mpi_mpich_hbcf76dd_10
+  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
+  - font-ttf-inconsolata=3.000=h77eed37_0
+  - font-ttf-source-code-pro=2.038=h77eed37_0
+  - font-ttf-ubuntu=0.83=h77eed37_2
+  - fontconfig=2.14.2=h14ed4e7_0
+  - fonts-conda-ecosystem=1=0
+  - fonts-conda-forge=1=0
+  - fonttools=4.53.0=py312h9a8786e_0
+  - freetype=2.12.1=h267a509_2
+  - fribidi=1.0.10=h36c2ea0_0
+  - frozenlist=1.4.1=py312h98912ed_0
+  - gcc_impl_linux-64=12.3.0=h58ffeeb_11
+  - gcc_linux-64=12.3.0=h9528a6a_9
+  - gettext=0.22.5=h59595ed_2
+  - gettext-tools=0.22.5=h59595ed_2
+  - gl2ps=1.4.2=h0708190_0
+  - glew=2.1.0=h9c3ff4c_2
+  - glib=2.80.2=hf974151_0
+  - glib-tools=2.80.2=hb6ce0ca_0
+  - gmp=6.3.0=hac33072_2
+  - gnutls=3.7.9=hb077bed_0
+  - graphite2=1.3.13=h59595ed_1003
+  - gst-plugins-base=1.24.4=h9ad1361_0
+  - gstreamer=1.24.4=haf2f30d_0
+  - gxx_impl_linux-64=12.3.0=h2a574ab_11
+  - gxx_linux-64=12.3.0=ha28b414_9
+  - harfbuzz=8.5.0=hfac3d4d_0
+  - hdf4=4.2.15=h2a13503_7
+  - hdf5=1.14.3=mpi_mpich_h0f54ddc_5
+  - hypre=2.31.0=mpi_mpich_hd1da18f_1
+  - icu=73.2=h59595ed_0
+  - idna=3.7=pyhd8ed1ab_0
+  - importlib-metadata=7.2.0=pyha770c72_0
+  - importlib_metadata=7.2.0=hd8ed1ab_0
+  - ipykernel=6.29.4=pyh3099207_0
+  - ipython=8.25.0=pyh707e725_0
+  - jedi=0.19.1=pyhd8ed1ab_0
+  - jsoncpp=1.9.5=h4bd325d_1
+  - jupyter_client=8.6.2=pyhd8ed1ab_0
+  - jupyter_core=5.7.2=py312h7900ff3_0
+  - kahip=3.16=h6a42626_3
+  - kahip-python=3.16=py312had6fb94_3
+  - kernel-headers_linux-64=2.6.32=he073ed8_17
+  - keyutils=1.6.1=h166bdaf_0
+  - kiwisolver=1.4.5=py312h8572e83_1
+  - krb5=1.21.2=h659d440_0
+  - lame=3.100=h166bdaf_1003
+  - lcms2=2.16=hb7c19ff_0
+  - ld_impl_linux-64=2.40=hf3520f5_7
+  - lerc=4.0.0=h27087fc_0
+  - libabseil=20240116.2=cxx17_h59595ed_0
+  - libadios2=2.10.0=mpi_mpich_h3e60829_3
+  - libaec=1.1.3=h59595ed_0
+  - libasprintf=0.22.5=h661eb56_2
+  - libasprintf-devel=0.22.5=h661eb56_2
+  - libass=0.17.1=h8fe9dca_1
+  - libblas=3.9.0=22_linux64_openblas
+  - libboost=1.84.0=hba137d9_3
+  - libboost-devel=1.84.0=h00ab1b0_3
+  - libboost-headers=1.84.0=ha770c72_3
+  - libbrotlicommon=1.1.0=hd590300_1
+  - libbrotlidec=1.1.0=hd590300_1
+  - libbrotlienc=1.1.0=hd590300_1
+  - libcap=2.69=h0f662aa_0
+  - libcblas=3.9.0=22_linux64_openblas
+  - libclang-cpp18.1=18.1.7=default_h9bb3924_0
+  - libclang13=18.1.7=default_h087397f_0
+  - libcups=2.3.3=h4637d8d_4
+  - libcurl=8.8.0=hca28451_0
+  - libdeflate=1.20=hd590300_0
+  - libdrm=2.4.121=h4ab18f5_0
+  - libedit=3.1.20191231=he28a2e2_2
+  - libev=4.33=hd590300_2
+  - libexpat=2.6.2=h59595ed_0
+  - libffi=3.4.2=h7f98852_5
+  - libflac=1.4.3=h59595ed_0
+  - libgcc-devel_linux-64=12.3.0=h6b66f73_111
+  - libgcc-ng=13.2.0=h77fa898_11
+  - libgcrypt=1.10.3=hd590300_0
+  - libgettextpo=0.22.5=h59595ed_2
+  - libgettextpo-devel=0.22.5=h59595ed_2
+  - libgfortran-ng=13.2.0=h69a702a_11
+  - libgfortran5=13.2.0=h3d2ce59_11
+  - libglib=2.80.2=hf974151_0
+  - libglu=9.0.0=hac7e632_1003
+  - libgomp=13.2.0=h77fa898_11
+  - libgpg-error=1.49=h4f305b6_0
+  - libhwloc=2.10.0=default_h5622ce7_1001
+  - libiconv=1.17=hd590300_2
+  - libidn2=2.3.7=hd590300_0
+  - libjpeg-turbo=3.0.0=hd590300_1
+  - liblapack=3.9.0=22_linux64_openblas
+  - libllvm18=18.1.7=hb77312f_0
+  - libnetcdf=4.9.2=nompi_h135f659_114
+  - libnghttp2=1.58.0=h47da74e_1
+  - libnsl=2.0.1=hd590300_0
+  - libogg=1.3.4=h7f98852_1
+  - libopenblas=0.3.27=pthreads_h413a1c8_0
+  - libopenvino=2024.1.0=h2da1b83_7
+  - libopenvino-auto-batch-plugin=2024.1.0=hb045406_7
+  - libopenvino-auto-plugin=2024.1.0=hb045406_7
+  - libopenvino-hetero-plugin=2024.1.0=h5c03a75_7
+  - libopenvino-intel-cpu-plugin=2024.1.0=h2da1b83_7
+  - libopenvino-intel-gpu-plugin=2024.1.0=h2da1b83_7
+  - libopenvino-intel-npu-plugin=2024.1.0=he02047a_7
+  - libopenvino-ir-frontend=2024.1.0=h5c03a75_7
+  - libopenvino-onnx-frontend=2024.1.0=h07e8aee_7
+  - libopenvino-paddle-frontend=2024.1.0=h07e8aee_7
+  - libopenvino-pytorch-frontend=2024.1.0=he02047a_7
+  - libopenvino-tensorflow-frontend=2024.1.0=h39126c6_7
+  - libopenvino-tensorflow-lite-frontend=2024.1.0=he02047a_7
+  - libopus=1.3.1=h7f98852_1
+  - libpciaccess=0.18=hd590300_0
+  - libpng=1.6.43=h2797004_0
+  - libpq=16.3=ha72fbe1_0
+  - libprotobuf=4.25.3=h08a7969_0
+  - libptscotch=7.0.4=h2376d02_5
+  - libsanitizer=12.3.0=hb8811af_11
+  - libscotch=7.0.4=h3055ed5_5
+  - libsndfile=1.2.2=hc60ed4a_1
+  - libsodium=1.0.18=h36c2ea0_1
+  - libsqlite=3.46.0=hde9e2c9_0
+  - libssh2=1.11.0=h0841786_0
+  - libstdcxx-devel_linux-64=12.3.0=h6b66f73_111
+  - libstdcxx-ng=13.2.0=hc0a3c3a_11
+  - libsystemd0=255=h3516f8a_1
+  - libtasn1=4.19.0=h166bdaf_0
+  - libtheora=1.1.1=h7f98852_1005
+  - libtiff=4.6.0=h1dd3fc0_3
+  - libunistring=0.9.10=h7f98852_0
+  - libuuid=2.38.1=h0b41bf4_0
+  - libva=2.21.0=h4ab18f5_2
+  - libvorbis=1.3.7=h9c3ff4c_0
+  - libvpx=1.14.1=hac33072_0
+  - libwebp-base=1.4.0=hd590300_0
+  - libxcb=1.15=h0b41bf4_0
+  - libxcrypt=4.4.36=hd590300_1
+  - libxkbcommon=1.7.0=h662e7e4_0
+  - libxml2=2.12.7=hc051c1a_1
+  - libzip=1.10.1=h2629f0a_3
+  - libzlib=1.2.13=h4ab18f5_6
+  - loguru=0.7.2=py312h7900ff3_1
+  - lz4-c=1.9.4=hcb278e6_0
+  - matplotlib-base=3.8.4=py312h20ab3a6_2
+  - matplotlib-inline=0.1.7=pyhd8ed1ab_0
+  - metis=5.1.0=h59595ed_1007
+  - mpfr=4.2.1=h9458935_1
+  - mpg123=1.32.6=h59595ed_0
+  - mpi=1.0=mpich
+  - mpi4py=3.1.6=py312h60e9011_1
+  - mpich=4.2.1=h63d650b_101
+  - msgpack-python=1.0.8=py312h2492b07_0
+  - multidict=6.0.5=py312h98912ed_0
+  - mumps-include=5.7.2=ha770c72_0
+  - mumps-mpi=5.7.2=h09c71e5_0
+  - munkres=1.1.4=pyh9f0ad1d_0
+  - mysql-common=8.3.0=hf1915f5_4
+  - mysql-libs=8.3.0=hca2cd23_4
+  - ncurses=6.5=h59595ed_0
+  - nest-asyncio=1.6.0=pyhd8ed1ab_0
+  - nettle=3.9.1=h7ab15ed_0
+  - nlohmann_json=3.11.3=h59595ed_0
+  - numpy=1.26.4=py312heda63a1_0
+  - ocl-icd=2.3.2=hd590300_1
+  - openh264=2.4.1=h59595ed_0
+  - openjpeg=2.5.2=h488ebb8_0
+  - openssl=3.3.1=h4ab18f5_0
+  - p11-kit=0.24.1=hc5aa10d_0
+  - packaging=24.1=pyhd8ed1ab_0
+  - parmetis=4.0.3=h583469f_1006
+  - parso=0.8.4=pyhd8ed1ab_0
+  - pcre2=10.43=hcad00b1_0
+  - petsc=3.21.2=real_h7906ff3_102
+  - petsc4py=3.21.2=py312hf1b966b_1
+  - pexpect=4.9.0=pyhd8ed1ab_0
+  - pickleshare=0.7.5=py_1003
+  - pillow=10.3.0=py312hdcec9eb_0
+  - pip=24.0=pyhd8ed1ab_0
+  - pixman=0.43.2=h59595ed_0
+  - pkg-config=0.29.2=h36c2ea0_1008
+  - platformdirs=4.2.2=pyhd8ed1ab_0
+  - pooch=1.8.2=pyhd8ed1ab_0
+  - proj=9.3.1=h1d62c97_0
+  - prompt-toolkit=3.0.47=pyha770c72_0
+  - psutil=5.9.8=py312h98912ed_0
+  - pthread-stubs=0.4=h36c2ea0_1001
+  - ptscotch=7.0.4=h23d43cc_5
+  - ptyprocess=0.7.0=pyhd3deb0d_0
+  - pugixml=1.14=h59595ed_0
+  - pulseaudio-client=17.0=hb77b528_0
+  - pure_eval=0.2.2=pyhd8ed1ab_0
+  - pycparser=2.22=pyhd8ed1ab_0
+  - pygments=2.18.0=pyhd8ed1ab_0
+  - pyparsing=3.1.2=pyhd8ed1ab_0
+  - pysocks=1.7.1=pyha2e5f31_6
+  - python=3.12.3=hab00c5b_0_cpython
+  - python-dateutil=2.9.0=pyhd8ed1ab_0
+  - python_abi=3.12=4_cp312
+  - pyvista=0.43.10=pyhd8ed1ab_0
+  - pyzmq=26.0.3=py312h8fd38d8_0
+  - qt6-main=6.7.1=h2471661_2
+  - readline=8.2=h8228510_1
+  - requests=2.32.3=pyhd8ed1ab_0
+  - scalapack=2.2.0=h417d24c_2
+  - scooby=0.10.0=pyhd8ed1ab_0
+  - scotch=7.0.4=h23d43cc_5
+  - setuptools=70.1.0=pyhd8ed1ab_0
+  - six=1.16.0=pyh6c4a22f_0
+  - slepc=3.21.1=real_h97ad6bc_302
+  - slepc4py=3.21.1=py312h68801f8_102
+  - snappy=1.2.0=hdb0a2a9_1
+  - sqlite=3.46.0=h6d4b2fc_0
+  - stack_data=0.6.2=pyhd8ed1ab_0
+  - suitesparse=7.7.0=hf4753ba_1
+  - superlu=5.2.2=h00795ac_0
+  - superlu_dist=9.0.0=h3feb4ed_1
+  - svt-av1=2.1.0=hac33072_0
+  - sysroot_linux-64=2.12=he073ed8_17
+  - tbb=2021.12.0=h297d8ca_1
+  - tbb-devel=2021.12.0=h7c56ddd_1
+  - tk=8.6.13=noxft_h4845f30_101
+  - tornado=6.4.1=py312h9a8786e_0
+  - traitlets=5.14.3=pyhd8ed1ab_0
+  - typing_extensions=4.12.2=pyha770c72_0
+  - tzdata=2024a=h0c530f3_0
+  - urllib3=2.2.2=pyhd8ed1ab_0
+  - utfcpp=4.0.5=ha770c72_0
+  - vtk=9.3.0=qt_py312h1234567_200
+  - vtk-base=9.3.0=qt_py312h1234567_200
+  - vtk-io-ffmpeg=9.3.0=qt_py312h1234567_200
+  - wayland=1.23.0=h5291e77_0
+  - wcwidth=0.2.13=pyhd8ed1ab_0
+  - wheel=0.43.0=pyhd8ed1ab_1
+  - wslink=2.1.1=pyhd8ed1ab_0
+  - x264=1!164.3095=h166bdaf_2
+  - x265=3.5=h924138e_3
+  - xcb-util=0.4.0=hd590300_1
+  - xcb-util-cursor=0.1.4=hd590300_1
+  - xcb-util-image=0.4.0=h8ee46fc_1
+  - xcb-util-keysyms=0.4.0=h8ee46fc_1
+  - xcb-util-renderutil=0.3.9=hd590300_1
+  - xcb-util-wm=0.4.1=h8ee46fc_1
+  - xkeyboard-config=2.42=h4ab18f5_0
+  - xorg-fixesproto=5.0=h7f98852_1002
+  - xorg-kbproto=1.0.7=h7f98852_1002
+  - xorg-libice=1.1.1=hd590300_0
+  - xorg-libsm=1.2.4=h7391055_0
+  - xorg-libx11=1.8.9=h8ee46fc_0
+  - xorg-libxau=1.0.11=hd590300_0
+  - xorg-libxdmcp=1.1.3=h7f98852_0
+  - xorg-libxext=1.3.4=h0b41bf4_2
+  - xorg-libxfixes=5.0.3=h7f98852_1004
+  - xorg-libxrender=0.9.11=hd590300_0
+  - xorg-libxt=1.3.0=hd590300_1
+  - xorg-renderproto=0.11.1=h7f98852_1002
+  - xorg-xextproto=7.3.0=h0b41bf4_1003
+  - xorg-xproto=7.0.31=h7f98852_1007
+  - xz=5.2.6=h166bdaf_0
+  - yaml=0.2.5=h7f98852_2
+  - yarl=1.9.4=py312h98912ed_0
+  - zeromq=4.3.5=h75354e8_4
+  - zfp=0.5.5=h9c3ff4c_8
+  - zipp=3.19.2=pyhd8ed1ab_0
+  - zlib=1.2.13=h4ab18f5_6
+  - zlib-ng=2.0.7=h0b41bf4_0
+  - zstd=1.5.6=ha6fb4c9_0
+  - pip:
+      - scipy==1.14.0
+prefix: /home/janha/anaconda3/envs/fenicsx