Run SU2 Validation Test Cases #5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Run SU2 Validation Test Cases | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| branch_name: | |
| description: "SU2 Branch To Check Out (e.g. master, develop)" | |
| required: true | |
| type: string | |
| category: | |
| description: "Validation Test Case Category" | |
| required: true | |
| type: choice | |
| options: | |
| - Basic | |
| - All | |
| case_code: | |
| description: "Validation Test Case Code (e.g. 2DML)" | |
| required: true | |
| type: choice | |
| options: | |
| - 2DML | |
| - All | |
| turbulence_model: | |
| description: "Turbulence Model" | |
| required: true | |
| type: choice | |
| options: | |
| - SA | |
| - SST | |
| - All | |
| configuration: | |
| description: "Specific Configuration (e.g. Configuration1) or All" | |
| required: true | |
| type: string | |
| author_name: | |
| description: "Author's Name (e.g. Harsh)" | |
| required: true | |
| type: string | |
| env: | |
| SANITIZED_AUTHOR: "Automated_Update" | |
| SANITIZED_CONFIGURATION: "" | |
| jobs: | |
| validate: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Validate Inputs | |
| run: | | |
| if [ "${{ github.event.inputs.category }}" == "All" ] && [ "${{ github.event.inputs.case_code }}" != "All" ]; then | |
| echo "::error::Invalid Combination: 'All' category cannot be paired with a specific case code (${{ github.event.inputs.case_code }})" | |
| exit 1 | |
| fi | |
| - name: Sanitize Author's Name | |
| run: | | |
| SANITIZED=$(echo "${{ github.event.inputs.author_name }}" | | |
| tr -d '\n' | # Remove newlines | |
| tr ' ' '_' | # Convert spaces | |
| tr -s '_' | # Collapse multiple ____ | |
| sed 's/^_\+//; s/_\+$//' | # Trim leading/trailing _ | |
| tr -dc '[:alnum:]_' | # Strict character set | |
| head -c 50) | |
| # Fallback Conditions | |
| if [[ -z "$SANITIZED" || "$SANITIZED" =~ ^[0-9_]+$ ]]; then | |
| SANITIZED="Automated_Update" | |
| fi | |
| echo "SANITIZED_AUTHOR=${SANITIZED}" >> $GITHUB_ENV | |
| - name: Validate And Sanitize Configuration Input | |
| run: | | |
| CONFIGURATION="${{ github.event.inputs.configuration }}" | |
| CONFIG=$(echo "$CONFIGURATION" | xargs | head -c 20) | |
| # Validate and standardize format | |
| if [[ "$CONFIG" =~ ^[Cc]onfiguration[0-9]{1,4}$ ]]; then | |
| NUMBER=$(echo "$CONFIG" | grep -oE '[1-9][0-9]*') | |
| SANITIZED="Configuration$NUMBER" | |
| elif [[ "${CONFIG,,}" == "all" ]]; then | |
| SANITIZED="All" | |
| else | |
| echo "::error::Invalid configuration. Must be 'All' or 'ConfigurationX' (where X is a number)" | |
| exit 1 | |
| fi | |
| SANITIZED_CONFIG=$(echo "$SANITIZED" | tr -dc '[:alnum:]') | |
| echo "SANITIZED_CONFIGURATION=$SANITIZED_CONFIG" >> $GITHUB_ENV | |
| - name: Checkout Main Repo | |
| uses: actions/checkout@v4 | |
| with: | |
| path: main-repo | |
| #- name: Download All Mesh And Restart Files From Google Drive | |
| # run: | | |
| # pip install gdown | |
| # gdown --folder https://drive.google.com/drive/folders/1z6kSNo4Y62idDN3zTWsugMJhOEdpLt2r?usp=sharing -O turbmodels --fuzzy | |
| - name: Download Required Mesh And Restart Files | |
| run: | | |
| pip install gdown jq | |
| mkdir -p turbmodels/Mesh_Files turbmodels/Restart_Files | |
| CATEGORY="${{ github.event.inputs.category }}" | |
| CASE_CODE="${{ github.event.inputs.case_code }}" | |
| TURB_MODEL="${{ github.event.inputs.turbulence_model }}" | |
| CONFIG="${{ env.SANITIZED_CONFIGURATION }}" | |
| # Function to download files for a specific case | |
| download_case_files() { | |
| local cat_name=$1 | |
| local case_name=$2 | |
| local model=$3 | |
| local config=$4 | |
| echo "Downloading files for $cat_name/$case_name/$model/$config" | |
| # Create directories | |
| mkdir -p "turbmodels/Mesh_Files/$cat_name/$case_name" | |
| mkdir -p "turbmodels/Restart_Files/$cat_name/$case_name/$model/$config" | |
| # Download mesh files | |
| mesh_files=$(jq -r ".\"$cat_name\".\"$case_name\".mesh_files | to_entries[] | \"\(.key) \(.value)\"" main-repo/file_mapping.json) | |
| while IFS=' ' read -r resolution file_id; do | |
| if [ "$file_id" != "REPLACE_WITH_ACTUAL_FILE_ID" ] && [ -n "$file_id" ]; then | |
| echo "Downloading mesh file for resolution: $resolution" | |
| mkdir -p "turbmodels/Mesh_Files/$cat_name/$case_name/$resolution" | |
| gdown "$file_id" -O "turbmodels/Mesh_Files/$cat_name/$case_name/$resolution/mesh.su2" | |
| fi | |
| done <<< "$mesh_files" | |
| # Download restart files | |
| restart_files=$(jq -r ".\"$cat_name\".\"$case_name\".\"$model\".\"$config\".restart_files | to_entries[] | \"\(.key) \(.value)\"" main-repo/file_mapping.json) | |
| while IFS=' ' read -r resolution file_id; do | |
| if [ "$file_id" != "REPLACE_WITH_ACTUAL_FILE_ID" ] && [ -n "$file_id" ]; then | |
| echo "Downloading restart file for resolution: $resolution" | |
| mkdir -p "turbmodels/Restart_Files/$cat_name/$case_name/$model/$config/$resolution" | |
| gdown "$file_id" -O "turbmodels/Restart_Files/$cat_name/$case_name/$model/$config/$resolution/restart.dat" | |
| fi | |
| done <<< "$restart_files" | |
| } | |
| # Download based on user selection | |
| if [ "$CATEGORY" = "All" ] && [ "$CASE_CODE" = "All" ]; then | |
| # Download all files | |
| BASE_PATH_MAIN="main-repo/ValidationCases" | |
| for category_dir in "$BASE_PATH_MAIN"/*/; do | |
| if [ -d "$category_dir" ] && [[ "$(basename "$category_dir")" != .* ]]; then | |
| cat_name=$(basename "$category_dir") | |
| BASE_PATH="main-repo/ValidationCases/$cat_name" | |
| for case_dir in "$BASE_PATH"/*/; do | |
| if [ -d "$case_dir" ] && [[ "$(basename "$case_dir")" != .* ]]; then | |
| case_name=$(basename "$case_dir") | |
| if [ "$TURB_MODEL" = "All" ]; then | |
| for model in "SA" "SST"; do | |
| if [ "$CONFIG" = "All" ]; then | |
| BASE_PATH_CONFIG="main-repo/ValidationCases/$cat_name/$case_name/$model" | |
| for config_dir in "$BASE_PATH_CONFIG"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| config=$(basename "$config_dir") | |
| download_case_files "$cat_name" "$case_name" "$model" "$config" | |
| fi | |
| done | |
| else | |
| download_case_files "$cat_name" "$case_name" "$model" "$CONFIG" | |
| fi | |
| done | |
| else | |
| if [ "$CONFIG" = "All" ]; then | |
| BASE_PATH_CONFIG="main-repo/ValidationCases/$cat_name/$case_name/$TURB_MODEL" | |
| for config_dir in "$BASE_PATH_CONFIG"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| config=$(basename "$config_dir") | |
| download_case_files "$cat_name" "$case_name" "$TURB_MODEL" "$config" | |
| fi | |
| done | |
| else | |
| download_case_files "$cat_name" "$case_name" "$TURB_MODEL" "$CONFIG" | |
| fi | |
| fi | |
| fi | |
| done | |
| fi | |
| done | |
| else | |
| # Download specific files | |
| if [ "$CASE_CODE" = "All" ]; then | |
| BASE_PATH="main-repo/ValidationCases/$CATEGORY" | |
| for case_dir in "$BASE_PATH"/*/; do | |
| if [ -d "$case_dir" ] && [[ "$(basename "$case_dir")" != .* ]]; then | |
| case_name=$(basename "$case_dir") | |
| if [ "$TURB_MODEL" = "All" ]; then | |
| for model in "SA" "SST"; do | |
| if [ "$CONFIG" = "All" ]; then | |
| BASE_PATH_CONFIG="main-repo/ValidationCases/$CATEGORY/$case_name/$model" | |
| for config_dir in "$BASE_PATH_CONFIG"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| config=$(basename "$config_dir") | |
| download_case_files "$CATEGORY" "$case_name" "$model" "$config" | |
| fi | |
| done | |
| else | |
| download_case_files "$CATEGORY" "$case_name" "$model" "$CONFIG" | |
| fi | |
| done | |
| else | |
| if [ "$CONFIG" = "All" ]; then | |
| BASE_PATH_CONFIG="main-repo/ValidationCases/$CATEGORY/$case_name/$TURB_MODEL" | |
| for config_dir in "$BASE_PATH_CONFIG"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| config=$(basename "$config_dir") | |
| download_case_files "$CATEGORY" "$case_name" "$TURB_MODEL" "$config" | |
| fi | |
| done | |
| else | |
| download_case_files "$CATEGORY" "$case_name" "$TURB_MODEL" "$CONFIG" | |
| fi | |
| fi | |
| fi | |
| done | |
| else | |
| if [ "$TURB_MODEL" = "All" ]; then | |
| for model in "SA" "SST"; do | |
| if [ "$CONFIG" = "All" ]; then | |
| BASE_PATH_CONFIG="main-repo/ValidationCases/$CATEGORY/$CASE_CODE/$model" | |
| for config_dir in "$BASE_PATH_CONFIG"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| config=$(basename "$config_dir") | |
| download_case_files "$CATEGORY" "$CASE_CODE" "$model" "$config" | |
| fi | |
| done | |
| else | |
| download_case_files "$CATEGORY" "$CASE_CODE" "$model" "$CONFIG" | |
| fi | |
| done | |
| else | |
| if [ "$CONFIG" = "All" ]; then | |
| BASE_PATH_CONFIG="main-repo/ValidationCases/$CATEGORY/$CASE_CODE/$TURB_MODEL" | |
| for config_dir in "$BASE_PATH_CONFIG"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| config=$(basename "$config_dir") | |
| download_case_files "$CATEGORY" "$CASE_CODE" "$TURB_MODEL" "$config" | |
| fi | |
| done | |
| else | |
| download_case_files "$CATEGORY" "$CASE_CODE" "$TURB_MODEL" "$CONFIG" | |
| fi | |
| fi | |
| fi | |
| fi | |
| - name: Set Up Python 3.11 | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: "3.11" | |
| - name: Install System Dependencies | |
| run: | | |
| sudo apt update | |
| sudo apt install -y \ | |
| build-essential cmake ninja-build libopenmpi-dev openmpi-bin swig \ | |
| libboost-all-dev libmetis-dev libparmetis-dev libhdf5-dev zlib1g-dev \ | |
| python3-dev python3-pip git wget libgl1 | |
| - name: Install Python Dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install numpy matplotlib pyvista pandas | |
| - name: Install SU2 | |
| run: | | |
| git clone https://github.com/su2code/SU2.git | |
| cd SU2 | |
| # Check if branch exists | |
| if ! git show-ref --quiet refs/remotes/origin/${{ github.event.inputs.branch_name }}; then | |
| echo "::error::Branch ${{ github.event.inputs.branch_name }} not found in SU2 repository" | |
| exit 1 | |
| fi | |
| if [ "${{ github.event.inputs.branch_name }}" = "master" ]; then | |
| git reset --hard origin/master | |
| else | |
| git checkout -b ${{ github.event.inputs.branch_name }} origin/${{ github.event.inputs.branch_name }} | |
| fi | |
| python meson.py build -Dwith-mpi=disabled -Denable-pywrapper=true --prefix=/usr/local | |
| ninja -C build | |
| sudo ninja -C build install | |
| sudo ldconfig | |
| echo "PATH=/usr/local/bin:$PATH" >> $GITHUB_ENV | |
| - name: Process All Test Cases | |
| if: ${{ github.event.inputs.category == 'All' && github.event.inputs.case_code == 'All' }} | |
| run: | | |
| CATEGORY="${{ github.event.inputs.category }}" | |
| CASE_CODE="${{ github.event.inputs.case_code }}" | |
| TURB_MODEL="${{ github.event.inputs.turbulence_model }}" | |
| CONFIG="${{ env.SANITIZED_CONFIGURATION }}" | |
| AUTHOR="${{ env.SANITIZED_AUTHOR }}" | |
| # Create results directory | |
| mkdir -p results | |
| BASE_PATH_MAIN="main-repo/ValidationCases" | |
| ARTIFACT_NAME="ValidationCases_${AUTHOR}" | |
| mkdir -p "results/$ARTIFACT_NAME" | |
| for category_dir in "$BASE_PATH_MAIN"/*/; do | |
| if [ -d "$category_dir" ] && [[ "$(basename "$category_dir")" != .* ]]; then | |
| category_name=$(basename "$category_dir") | |
| echo "Processing category: $category_name" | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name" | |
| BASE_PATH="main-repo/ValidationCases/$category_name" | |
| for case_dir in "$BASE_PATH"/*/; do | |
| if [ -d "$case_dir" ] && [[ "$(basename "$case_dir")" != .* ]]; then | |
| case_name=$(basename "$case_dir") | |
| echo "Processing folder: $case_name" | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name" | |
| if [ "$TURB_MODEL" = "All" ]; then | |
| BASE_PATH_CASE="main-repo/ValidationCases/$category_name/$case_name" | |
| for turb_dir in "$BASE_PATH_CASE"/*/; do | |
| if [ -d "$turb_dir" ] && [[ "$(basename "$turb_dir")" != .* ]]; then | |
| turb_name=$(basename "$turb_dir") | |
| echo "Processing folder: $turb_name" | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name/$turb_name" | |
| BASE_PATH_TURB="main-repo/ValidationCases/$category_name/$case_name/$turb_name" | |
| MESH_BASE_PATH="turbmodels/Mesh_Files/$category_name/$case_name" | |
| RESTART_BASE_PATH="turbmodels/Restart_Files/$category_name/$case_name/$turb_name" | |
| if [ "$CONFIG" = "All" ]; then | |
| # Process all configurations | |
| for config_dir in "$BASE_PATH_TURB"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| CONFIG_NAME=$(basename "$config_dir") | |
| echo "Processing $CONFIG_NAME" | |
| # Create config-specific result directory | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name/$turb_name/$CONFIG_NAME" | |
| # Process this configuration | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$category_name" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$turb_name" \ | |
| --configuration "$CONFIG_NAME" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_TURB" \ | |
| --output-path "results/$ARTIFACT_NAME/$category_name/$case_name/$turb_name/$CONFIG_NAME" | |
| fi | |
| done | |
| else | |
| # Process specific configuration | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name/$turb_name/$CONFIG" | |
| echo "Processing $CONFIG" | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$category_name" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$turb_name" \ | |
| --configuration "$CONFIG" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_TURB" \ | |
| --output-path "results/$ARTIFACT_NAME/$category_name/$case_name/$turb_name/$CONFIG" | |
| fi | |
| fi | |
| done | |
| else | |
| BASE_PATH_CASE="main-repo/ValidationCases/$category_name/$case_name/$TURB_MODEL" | |
| MESH_BASE_PATH="turbmodels/Mesh_Files/$category_name/$case_name" | |
| RESTART_BASE_PATH="turbmodels/Restart_Files/$category_name/$case_name/$TURB_MODEL" | |
| if [ "$CONFIG" = "All" ]; then | |
| # Process all configurations | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name/$TURB_MODEL" | |
| for config_dir in "$BASE_PATH_CASE"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| CONFIG_NAME=$(basename "$config_dir") | |
| echo "Processing $CONFIG_NAME" | |
| # Create config-specific result directory | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name/$TURB_MODEL/$CONFIG_NAME" | |
| # Process this configuration | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$category_name" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$TURB_MODEL" \ | |
| --configuration "$CONFIG_NAME" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_CASE" \ | |
| --output-path "results/$ARTIFACT_NAME/$category_name/$case_name/$TURB_MODEL/$CONFIG_NAME" | |
| fi | |
| done | |
| else | |
| # Process specific configuration | |
| mkdir -p "results/$ARTIFACT_NAME/$category_name/$case_name/$TURB_MODEL/$CONFIG" | |
| echo "Processing $CONFIG" | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$category_name" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$TURB_MODEL" \ | |
| --configuration "$CONFIG" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_CASE" \ | |
| --output-path "results/$ARTIFACT_NAME/$category_name/$case_name/$TURB_MODEL/$CONFIG" | |
| fi | |
| fi | |
| fi | |
| done | |
| fi | |
| done | |
| - name: Process Specific Category | |
| if: ${{ github.event.inputs.category != 'All' && github.event.inputs.case_code == 'All' }} | |
| run: | | |
| CATEGORY="${{ github.event.inputs.category }}" | |
| CASE_CODE="${{ github.event.inputs.case_code }}" | |
| TURB_MODEL="${{ github.event.inputs.turbulence_model }}" | |
| CONFIG="${{ env.SANITIZED_CONFIGURATION }}" | |
| AUTHOR="${{ env.SANITIZED_AUTHOR }}" | |
| # Create results directory | |
| mkdir -p results | |
| BASE_PATH="main-repo/ValidationCases/$CATEGORY" | |
| ARTIFACT_NAME="ValidationCases_${AUTHOR}" | |
| mkdir -p "results/$ARTIFACT_NAME" | |
| for case_dir in "$BASE_PATH"/*/; do | |
| if [ -d "$case_dir" ] && [[ "$(basename "$case_dir")" != .* ]]; then | |
| case_name=$(basename "$case_dir") | |
| echo "Processing folder: $case_name" | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name" | |
| if [ "$TURB_MODEL" = "All" ]; then | |
| BASE_PATH_CASE="main-repo/ValidationCases/$CATEGORY/$case_name" | |
| for turb_dir in "$BASE_PATH_CASE"/*/; do | |
| if [ -d "$turb_dir" ] && [[ "$(basename "$turb_dir")" != .* ]]; then | |
| turb_name=$(basename "$turb_dir") | |
| echo "Processing folder: $turb_name" | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$turb_name" | |
| BASE_PATH_TURB="main-repo/ValidationCases/$CATEGORY/$case_name/$turb_name" | |
| MESH_BASE_PATH="turbmodels/Mesh_Files/$CATEGORY/$case_name" | |
| RESTART_BASE_PATH="turbmodels/Restart_Files/$CATEGORY/$case_name/$turb_name" | |
| if [ "$CONFIG" = "All" ]; then | |
| # Process all configurations | |
| for config_dir in "$BASE_PATH_TURB"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| CONFIG_NAME=$(basename "$config_dir") | |
| echo "Processing $CONFIG_NAME" | |
| # Create config-specific result directory | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$turb_name/$CONFIG_NAME" | |
| # Process this configuration | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$turb_name" \ | |
| --configuration "$CONFIG_NAME" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_TURB" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$turb_name/$CONFIG_NAME" | |
| fi | |
| done | |
| else | |
| # Process specific configuration | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$turb_name/$CONFIG" | |
| echo "Processing $CONFIG" | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$turb_name" \ | |
| --configuration "$CONFIG" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_TURB" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$turb_name/$CONFIG" | |
| fi | |
| fi | |
| done | |
| else | |
| BASE_PATH_CASE="main-repo/ValidationCases/$CATEGORY/$case_name/$TURB_MODEL" | |
| MESH_BASE_PATH="turbmodels/Mesh_Files/$CATEGORY/$case_name" | |
| RESTART_BASE_PATH="turbmodels/Restart_Files/$CATEGORY/$case_name/$TURB_MODEL" | |
| if [ "$CONFIG" = "All" ]; then | |
| # Process all configurations | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$TURB_MODEL" | |
| for config_dir in "$BASE_PATH_CASE"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| CONFIG_NAME=$(basename "$config_dir") | |
| echo "Processing $CONFIG_NAME" | |
| # Create config-specific result directory | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$TURB_MODEL/$CONFIG_NAME" | |
| # Process this configuration | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$TURB_MODEL" \ | |
| --configuration "$CONFIG_NAME" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_CASE" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$TURB_MODEL/$CONFIG_NAME" | |
| fi | |
| done | |
| else | |
| # Process specific configuration | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$TURB_MODEL/$CONFIG" | |
| echo "Processing $CONFIG" | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$case_name" \ | |
| --turbulence-model "$TURB_MODEL" \ | |
| --configuration "$CONFIG" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_CASE" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$case_name/$TURB_MODEL/$CONFIG" | |
| fi | |
| fi | |
| fi | |
| done | |
| - name: Process Specific Test Case | |
| if: ${{ github.event.inputs.category != 'All' && github.event.inputs.case_code != 'All' }} | |
| run: | | |
| CATEGORY="${{ github.event.inputs.category }}" | |
| CASE_CODE="${{ github.event.inputs.case_code }}" | |
| TURB_MODEL="${{ github.event.inputs.turbulence_model }}" | |
| CONFIG="${{ env.SANITIZED_CONFIGURATION }}" | |
| AUTHOR="${{ env.SANITIZED_AUTHOR }}" | |
| # Create results directory | |
| mkdir -p results | |
| ARTIFACT_NAME="ValidationCases_${AUTHOR}" | |
| mkdir -p "results/$ARTIFACT_NAME" | |
| if [ "$TURB_MODEL" = "All" ]; then | |
| BASE_PATH="main-repo/ValidationCases/$CATEGORY/$CASE_CODE" | |
| for turb_dir in "$BASE_PATH"/*/; do | |
| if [ -d "$turb_dir" ] && [[ "$(basename "$turb_dir")" != .* ]]; then | |
| turb_name=$(basename "$turb_dir") | |
| echo "Processing folder: $turb_name" | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$turb_name" | |
| BASE_PATH_TURB="main-repo/ValidationCases/$CATEGORY/$CASE_CODE/$turb_name" | |
| MESH_BASE_PATH="turbmodels/Mesh_Files/$CATEGORY/$CASE_CODE" | |
| RESTART_BASE_PATH="turbmodels/Restart_Files/$CATEGORY/$CASE_CODE/$turb_name" | |
| if [ "$CONFIG" = "All" ]; then | |
| # Process all configurations | |
| for config_dir in "$BASE_PATH_TURB"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| CONFIG_NAME=$(basename "$config_dir") | |
| echo "Processing $CONFIG_NAME" | |
| # Create config-specific result directory | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$turb_name/$CONFIG_NAME" | |
| # Process this configuration | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$CASE_CODE" \ | |
| --turbulence-model "$turb_name" \ | |
| --configuration "$CONFIG_NAME" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_TURB" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$turb_name/$CONFIG_NAME" | |
| fi | |
| done | |
| else | |
| # Process specific configuration | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$turb_name/$CONFIG" | |
| echo "Processing $CONFIG" | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$CASE_CODE" \ | |
| --turbulence-model "$turb_name" \ | |
| --configuration "$CONFIG" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH_TURB" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$turb_name/$CONFIG" | |
| fi | |
| fi | |
| done | |
| else | |
| BASE_PATH="main-repo/ValidationCases/$CATEGORY/$CASE_CODE/$TURB_MODEL" | |
| MESH_BASE_PATH="turbmodels/Mesh_Files/$CATEGORY/$CASE_CODE" | |
| RESTART_BASE_PATH="turbmodels/Restart_Files/$CATEGORY/$CASE_CODE/$TURB_MODEL" | |
| if [ "$CONFIG" = "All" ]; then | |
| # Process all configurations | |
| for config_dir in "$BASE_PATH"/Configuration*; do | |
| if [ -d "$config_dir" ]; then | |
| CONFIG_NAME=$(basename "$config_dir") | |
| echo "Processing $CONFIG_NAME" | |
| # Create config-specific result directory | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$TURB_MODEL/$CONFIG_NAME" | |
| # Process this configuration | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$CASE_CODE" \ | |
| --turbulence-model "$TURB_MODEL" \ | |
| --configuration "$CONFIG_NAME" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$TURB_MODEL/$CONFIG_NAME" | |
| fi | |
| done | |
| else | |
| mkdir -p "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$TURB_MODEL/$CONFIG" | |
| echo "Processing $CONFIG" | |
| python3 main-repo/ValidationCases/Automation.py \ | |
| --category "$CATEGORY" \ | |
| --case-code "$CASE_CODE" \ | |
| --turbulence-model "$TURB_MODEL" \ | |
| --configuration "$CONFIG" \ | |
| --mesh-path "$MESH_BASE_PATH" \ | |
| --restart-path "$RESTART_BASE_PATH" \ | |
| --main-path "$BASE_PATH" \ | |
| --output-path "results/$ARTIFACT_NAME/$CATEGORY/$CASE_CODE/$TURB_MODEL/$CONFIG" | |
| fi | |
| fi | |
| - name: Upload Results as Artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: "ValidationCases_${{ env.SANITIZED_AUTHOR }}" | |
| path: results/ | |
| retention-days: 7 | |
| - name: Deploy to Results Website | |
| if: success() | |
| run: | | |
| # Clone and checkout existing branch if it exists, or create new | |
| BRANCH_NAME="ValidationCases_${{ github.event.inputs.branch_name }}_${{ env.SANITIZED_AUTHOR }}" | |
| git clone --branch "$BRANCH_NAME" --single-branch https://${{ secrets.VANDV_ACTIONS }}@github.com/su2code/su2code.github.io.git website || \ | |
| git clone https://${{ secrets.VANDV_ACTIONS }}@github.com/su2code/su2code.github.io.git website | |
| cd website | |
| git config user.name "GitHub Actions" | |
| git config user.email "[email protected]" | |
| # If branch doesn't exist, create it | |
| if ! git rev-parse --verify "$BRANCH_NAME" >/dev/null 2>&1; then | |
| git checkout -b "$BRANCH_NAME" | |
| else | |
| git checkout "$BRANCH_NAME" | |
| git pull origin "$BRANCH_NAME" --rebase | |
| fi | |
| find ../results -name "plots" -type d | while read plot_dir; do | |
| config_name=$(basename $(dirname "${plot_dir%/}")) | |
| turb_name=$(basename $(dirname $(dirname "${plot_dir%/}"))) | |
| case_name=$(basename $(dirname $(dirname $(dirname "${plot_dir%/}")))) | |
| target_dir="vandv_files/${case_name}/${case_name}_${turb_name}_${config_name}" | |
| # Remove existing directory if present | |
| if [ -d "$target_dir" ]; then | |
| echo "Overwriting existing results at $target_dir" | |
| rm -rf "$target_dir" | |
| fi | |
| mkdir -p "$(dirname "$target_dir")" | |
| cp -r "$plot_dir" "$target_dir" | |
| done | |
| # Commit and push if there are changes | |
| if [ -n "$(git status --porcelain)" ]; then | |
| git add . | |
| git commit -m "Update validation results" | |
| git push --force origin "$BRANCH_NAME" | |
| else | |
| echo "No changes to commit" | |
| fi | |
| - name: Cleanup | |
| if: always() | |
| run: | | |
| BASE_PATH="main-repo/ValidationCases" | |
| find "$BASE_PATH" \ | |
| -type d \ | |
| -path "*/Configuration*" \ | |
| ! -path "*/.*" \ | |
| -exec sh -c ' | |
| for config_dir do | |
| find "$config_dir" \ | |
| \( -name "*.csv" -o -name "*.vtu" -o -name "*.dat" -o -name "*.su2" -o -name "Config.cfg" \) \ | |
| -delete 2>/dev/null | |
| done | |
| ' sh {} + | |
| echo "Cleanup completed - All mesh folders restored to original state" | |
| - name: Summary | |
| run: | | |
| echo "SU2 Validation Workflow Completed Successfully!" | |
| echo "Author: ${{ env.SANITIZED_AUTHOR }}" |