#!/bin/sh
cd "${0%/*}" || exit                                # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions        # Tutorial run functions
#------------------------------------------------------------------------------

# settings

    # operand setups
    setups="
    kEpsilon-nutkWallFunction
    LaunderSharmaKE-nutkWallFunction
    "

    # flag to enable computations
    run=true

    # flag to enable computations in parallel mode
    parallel=false

    # flag to enable to use a common mesh
    common_mesh=true

    # flag to enable to use a common dynamic code
    common_dynamic_code=true

    # operand exponents of kinematic viscosity values
    nuExponents="2 3 4 5 6 7 8"


#------------------------------------------------------------------------------

#######################################
# Create the given setup
# Arguments:
#    $1 = Path to create the setup
# Outputs:
#    Writes info to stdout
#######################################
dry_run_setup() {

    [ $# -eq 0 ] && { echo "Usage error: $0"; exit 1; }

    setup="$1"
    exponent="$2"
    dirSetup="setups/$setup/$exponent"
    dirSetupOrig="setups.orig/$setup"
    dirOrig="$dirSetupOrig/0.orig"
    dirConstant="$dirSetupOrig/constant"
    dirSystem="$dirSetupOrig/system"

    printf "\n# Create the setup: %s %s\n" "$setup" nu=1e-"$exponent"

    if [ ! -d "$dirSetup" ]
    then
        mkdir -p "$dirSetup"

        cp -aRfL "setups.orig/common/." "$dirSetup"
        cp -afL "$dirSetupOrig"/All* "$dirSetup" 2>/dev/null || :
        [ -d "$dirOrig" ] && cp -aRfL "$dirOrig/." "$dirSetup/0.orig"
        [ -d "$dirConstant" ] && cp -aRfL "$dirConstant/." "$dirSetup/constant"
        [ -d "$dirSystem" ] && cp -aRfL "$dirSystem/." "$dirSetup/system"
    else
        printf "\n      # Directory %s already exists\n" "$dirSetup"
        printf "      # Skipping the creation of a new setup\n"
    fi
}


#######################################
# Run the given setup
# Arguments:
#    $1 = Path to the setup to run
# Outputs:
#    Writes info to stdout
#######################################
run_setup() {

    [ $# -eq 0 ] && { echo "Usage error: $0"; exit 1; }

    setup="$1"
    exponent="$2"
    dirSetup="setups/$setup/$exponent"
    dirResult="results/$setup/$exponent"

    dry_run_setup "$setup" "$exponent"
    [ -d results ] || mkdir -p results
    [ -d results/"$setup" ] || mkdir -p results/"$setup"

    printf "\n# Run the setup: %s %s\n\n" "$setup" nu=1e-"$exponent"

    if [ ! -d "$dirResult" ]
    then
        cp -Rf "$dirSetup" "$dirResult"

        if [ "$common_mesh" = true ]
        then
            if [ -d results/mesh ]
            then
                printf "## Copy the common mesh to the setup: %s\n\n" "$setup"
                cp -Rf results/mesh/polyMesh "$dirResult"/constant/.
            fi
        fi

        if [ "$common_dynamic_code" = true ]
        then
            if [ -d results/dynamicCode ]
            then
                printf "## Copy the common dynamic code to the setup: %s\n\n" "$setup"
                cp -Rf results/dynamicCode "$dirResult"/.
            fi
        fi


        if [ "$parallel" = true ]
        then
            ( cd "$dirResult" && ./Allrun-parallel )
        else
            ( cd "$dirResult" && ./Allrun )
        fi


        if [ "$common_mesh" = true ]
        then
            if [ ! -d results/mesh ]
            then
                printf "\n## Store the mesh of %s as the common mesh\n\n" "$setup"
                mkdir -p results/mesh
                cp -Rf "$dirResult"/constant/polyMesh results/mesh/.
            fi
        fi

        if [ "$common_dynamic_code" = true ]
        then
            if [ ! -d results/dynamicCode ] && [ -d "$dirResult"/dynamicCode ]
            then
                printf "\n## Store the dynamic code of %s as the common dynamic code\n\n" "$setup"
                cp -Rf "$dirResult"/dynamicCode results/.
            fi
        fi


    else
        printf "      # Directory %s already exists\n" "$dirResult"
        printf "      # Skipping the computation of the given setup\n"
    fi
}


#------------------------------------------------------------------------------

[ "$parallel" = true ] && {
    echo "boundaryFoam has no parallel option - skipping the execution" 1>&2
    exit 1
}


#------------------------------------------------------------------------------

for exponent in $nuExponents
do
    sed "s|EXPONENT|$exponent|g" \
        setups.orig/common/constant/transportProperties.template > \
        setups.orig/common/constant/transportProperties

    for setup in $setups
    do
        dirSetupOrig="setups.orig/$setup"

        if [ ! -d "$dirSetupOrig" ]
        then
            echo "Setup directory: $dirSetupOrig" \
                "could not be found - skipping execution" 1>&2
            continue
        fi

        if [ "$run" = true ]
        then
            run_setup "$setup" "$exponent"
        else
            dry_run_setup "$setup" "$exponent"
        fi
    done
done


if notTest "$@" && [ "$run" = true ]
then
    ./plot
fi


#------------------------------------------------------------------------------
