#!/bin/bash

runCommand()
{
    sol=$(basename -- "$1")
    sol="${sol%.*}"
    if [ -f log."$sol" ]; then rm log."$sol"; fi
    "$@" 1> >(tee -a log."$sol") 2> >(tee -a log."$sol" >&2)
    err=$?
    if [ ! $err -eq 0 ]; then exit $err; fi
}

runParallel()
{
    nproc="$1"
    shift
    exe="$(which $1)"
    sol=$(basename -- "$1")
    sol="${sol%.*}"
    shift
    if [ -f log."$sol" ]; then rm log."$sol"; fi
    export OMPI_MCA_btl_vader_single_copy_mechanism=none  # Workaround for open-mpi/docker bug
    mpiexec -np $nproc "$exe" -parallel "$@" 1> >(tee -a log."$sol") 2> >(tee -a log."$sol" >&2)
    err=$?
    if [ ! $err -eq 0 ]; then exit $err; fi
}

GMSH_EXE='/tmp/.mount_FreeCAs0eOYR/usr/bin/gmsh'
NTHREADS=$(nproc)
runCommand "$GMSH_EXE" -nt $NTHREADS - "gmsh/Body_Geometry.geo"

# Unset and source bashrc
FOAMDIR="/usr/lib/openfoam/openfoam2312"
if [ ! -z "$FOAMDIR" ]
then
    source "$FOAMDIR/etc/config.sh/unset" 2> /dev/null
    source "$FOAMDIR/etc/bashrc"
fi

runCommand gmshToFoam "gmsh/Body_Geometry.msh"

if [ -z $FOAM_API ] && ( [ $WM_PROJECT_VERSION == "dev" ] || [ $WM_PROJECT_VERSION -ge 9 ] )
then
    runCommand transformPoints "scale=(0.001 0.001 0.001)"
else
    runCommand transformPoints -scale "(0.001 0.001 0.001)"
fi

cp system/extrudeMeshDict.0 system/extrudeMeshDict
# Refinement history is not processed by extrudeMesh
rm -f constant/polyMesh/{cellLevel,pointLevel,level0Edge,refinementHistory}
runCommand extrudeMesh
mv log.extrudeMesh log.extrudeMesh.0
rm system/extrudeMeshDict


# Extract surface mesh and convert to mm for visualisation in FreeCAD
runCommand foamToSurface -scale 1000 -tri surfaceMesh.vtk
