// ========================================================================== //
// Local libraries
#include "Splatter/Splatter.hpp"
#include "Options/options.hpp"
#include "Timer/Timer.hpp"

// Parallelisation
#if USE_MPI == 1
    #include <mpi.h>
#endif

// Macros
#ifndef MPI_VERSION
    #define MPI_VERSION 0
#endif

// ========================================================================== //
// Main

int main(int argc, char **argv) {

#if MPI_VERSION > 0
    // Startup the mpi instancing
    MPI_Init(&argc, &argv);
#endif

    // Setup variables and inputs
    Options opt = argc > 1 ? Options(argv[1]) : Options();

    // Initialize timer
    Timer timer;

    Splatter splat(opt);
    timer.add("Initialization");

    // Import surfaces
    splat.import_surfaces();
    timer.add("Import");

    // Run the splatting
    splat.splat_surfaces();
    timer.add("Splatter");

    // Add solid blocks
    splat.splat_solid();
    timer.add("Solids");

    // Extract the surface
    splat.extract_iso_contour();
    timer.add("Extraction");

    // Save the mesh
    splat.save_mesh();
    timer.add("Export");

    // Finalize
    timer.print();

#if MPI_VERSION > 0
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
#endif

    return 0;
}

// End of File
// ========================================================================== //