.. _build_and_usage: ################# Build & Benutzung ################# .. contents:: Inhaltsverzeichnis :local: :depth: 2 Voraussetzungen =============== Folgende Software wird benoetigt: .. list-table:: :header-rows: 1 :widths: 25 35 40 * - Tool - Zweck - Installation (Ubuntu/WSL) * - GCC/G++ - C++11-Compiler - ``sudo apt install build-essential`` * - SCons - Build-System - ``pipx install scons`` * - Git - Versionskontrolle - ``sudo apt install git`` * - Doxygen + Graphviz - API-Dokumentation - ``sudo apt install doxygen graphviz`` * - Sphinx + RTD-Theme - Benutzer-Dokumentation - ``pip3 install sphinx sphinx_rtd_theme`` * - Python 3 - Fuer SCons und Sphinx - ``sudo apt install python3 python3-pip`` Repository einrichten ===================== Klonen und Submodule -------------------- .. code-block:: bash git clone https://git.uni-jena.de/na48gom/tsunami.git cd tsunami # Catch2 Test-Framework als Submodul initialisieren (wichtig!) git submodule init git submodule update Kompilierung ============ Das Projekt verwendet `SCons `_ als Build-System. Build-Modi ---------- .. code-block:: bash # Release-Build (optimiert, -O2) scons # Debug-Build (keine Optimierung, Debug-Symbole) scons mode=debug # Debug + Address- und Undefined-Behavior-Sanitizer scons mode=debug+san # Release + Sanitizer scons mode=release+san # Paralleler Build (z.B. mit 4 Threads) scons -j4 # Build aufraeumen (alle erzeugten Dateien loeschen) scons -c Unit-Tests ========== `Catch2 `_ als Test-Framework. Tests ausführen ----------------- .. code-block:: bash # Alle Tests ausfuehren ./build/tests # Nur Tests mit einem bestimmten Tag ./build/tests "[FWave]" ./build/tests "[RoeSpeeds]" # Einen einzelnen Test nach Name ausfuehren ./build/tests "Test f-wave net-updates for steady state" # Alle vorhandenen Tags auflisten ./build/tests --list-tags # Alle Tests mit ausfuehrlicher Ausgabe ./build/tests -s .. Simulation starten .. ================== .. Nach dem erfolgreichen Build kann die Simulation ausgefuehrt werden: .. .. code-block:: bash .. ./build/tsunami_lab N_CELLS .. Dabei ist ``N_CELLS`` die Anzahl der Zellen in x-Richtung. .. Beispiel mit 100 Zellen: .. .. code-block:: bash .. ./build/tsunami_lab 100 .. Die Simulation gibt waehrend der Berechnung den Fortschritt aus und schreibt .. in regelmaessigen Abstaenden CSV-Dateien (``solution_0.csv``, ``solution_1.csv``, ...), .. die den Zustand des Wellenfeldes enthalten. .. Ausgabeformat .. ------------- .. Die CSV-Dateien enthalten folgende Spalten: .. .. list-table:: .. :header-rows: 1 .. :widths: 20 80 .. * - Spalte .. - Beschreibung .. * - ``x`` .. - x-Position der Zellmitte .. * - ``y`` .. - y-Position der Zellmitte .. * - ``height`` .. - Wasserhoehe :math:`h` .. * - ``momentum_x`` .. - Impuls in x-Richtung :math:`hu` .. Dokumentation generieren .. ======================== .. API-Dokumentation (Doxygen) .. --------------------------- .. Doxygen erzeugt aus den Kommentaren im Quellcode eine HTML-Referenz .. aller Klassen, Funktionen und Parameter: .. .. code-block:: bash .. cd doxygen .. doxygen Doxyfile .. Die generierte Dokumentation liegt anschliessend unter ``doxygen/html/index.html``. .. Alle oeffentlichen Funktionen sollten mit Doxygen-Syntax dokumentiert werden: .. .. code-block:: cpp .. /** .. * @brief Berechnet die Net-Updates. .. * .. * @param i_hL Wasserhoehe links. .. * @param i_hR Wasserhoehe rechts. .. * @param o_netUpdateL Net-Update fuer die linke Zelle. .. */ .. Benutzer-Dokumentation (Sphinx) .. ------------------------------- .. Diese Dokumentation wird mit Sphinx aus ``.rst``-Dateien erzeugt: .. .. code-block:: bash .. cd sphinx .. make html .. Die generierte Dokumentation liegt unter ``sphinx/build/html/index.html``. .. Um ein neues Kapitel hinzuzufuegen: .. 1. Neue ``.rst``-Datei unter ``sphinx/source/chapters/`` anlegen. .. 2. Die Datei im ``toctree`` der ``sphinx/source/index.rst`` eintragen. .. 3. ``make html`` erneut ausfuehren. Verzeichnisstruktur =================== .. code-block:: text tsunami/ ├── SConstruct # Build-Einstiegspunkt (SCons) ├── shell.nix # Nix-Entwicklungsumgebung (Uni-Rechner) ├── submit.sh # Abgabe-Skript (erstellt tar.xz) ├── src/ │ ├── main.cpp # Simulations-Einstiegspunkt │ ├── tests.cpp # Catch2 Test-Runner │ ├── constants.h # Globale Konstanten (t_real, t_idx, g) │ ├── SConscript # Quell- und Testdatei-Listen │ ├── solvers/ # Riemann-Solver │ │ ├── Roe.h/.cpp # Roe-Solver (Referenzimplementierung) │ │ ├── FWave.h/.cpp # F-wave Solver │ │ └── *.test.cpp # zugehoerige Unit-Tests │ ├── patches/ # Wellen-Propagation │ ├── setups/ # Anfangsbedingungen (z.B. DamBreak) │ └── io/ # Ein-/Ausgabe (CSV) ├── submodules/Catch2/ # Catch2 Test-Framework (Git-Submodul) ├── sphinx/ # Sphinx-Dokumentation (dieses Dokument) ├── doxygen/ # Doxygen-Konfiguration + generierte API-Doku └── build/ # Erzeugte Binaries (nicht im Git) .. Abgabe erstellen .. ================ .. Das Skript ``submit.sh`` im Projektroot automatisiert die Erstellung des .. Abgabe-Archivs: .. .. code-block:: bash .. chmod +x submit.sh # einmalig: ausfuehrbar machen .. ./submit.sh .. Das Skript fuehrt folgende Schritte aus: .. 1. Baut den Code (Release-Modus). .. 2. Fuehrt alle Unit-Tests aus. .. 3. Generiert die Doxygen-Dokumentation. .. 4. Generiert die Sphinx-Dokumentation. .. 5. Fragt interaktiv nach weiteren Links (z.B. zu Daten oder Visualisierungen). .. 6. Erstellt ein ``.tar``-Archiv mit dem Namen .. ``tsunami_lab_DATUM_Moritz_Arnhold_&_Moritz_Martin.tar``. .. Das Git-Repository (https://git.uni-jena.de/na48gom/tsunami) wird automatisch .. eingetragen. Alle Links werden in ``SUBMISSION_LINKS.txt`` gespeichert und .. sind im Archiv enthalten. .. **Schnellmodus** (ohne Link-Abfrage): .. .. code-block:: bash .. ./submit.sh --skip-links .. Auf den Uni-Rechnern (NixOS) muss das Skript innerhalb der ``nix-shell`` .. ausgefuehrt werden.