Created
March 25, 2026 18:52
-
-
Save dineshadepu/986c5f897a6e8a51d5e7c7e98b2bc862 to your computer and use it in GitHub Desktop.
Rendering vtk files of AcoDyn and Jaali x Prestige particles
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
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| # ── ParaView (Linux custom install) ────────────────────────── | |
| PARAVIEW_DIR="/home/dineshadepu/life/softwares/paraview" | |
| export LD_LIBRARY_PATH="${PARAVIEW_DIR}/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" | |
| PVPYTHON="${PARAVIEW_DIR}/bin/pvpython" | |
| # ── Paths ──────────────────────────────────────────────────── | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| VIS="${SCRIPT_DIR}/visualize.py" | |
| VIDEO="${SCRIPT_DIR}/simulation.mp4" | |
| # ── Sanity checks ───────────────────────────────────────────── | |
| [[ -f "${VIS}" ]] || { echo "ERROR: vis script not found: ${VIS}"; exit 1; } | |
| [[ -x "${PVPYTHON}" ]] || { echo "ERROR: pvpython not found: ${PVPYTHON}"; exit 1; } | |
| command -v ffmpeg &>/dev/null || { echo "ERROR: ffmpeg not in PATH"; exit 1; } | |
| # Pick the best available video encoder | |
| FFMPEG_CODEC="" | |
| FFMPEG_EXTRA_ARGS="" | |
| _enc_list=$(ffmpeg -hide_banner -encoders 2>/dev/null | awk '{print $2}') | |
| for _codec in libx264 libx265 libvpx_vp9 libvpx mpeg4 mjpeg ffv1; do | |
| if echo "${_enc_list}" | grep -qx "${_codec}"; then | |
| FFMPEG_CODEC="${_codec}" | |
| break | |
| fi | |
| done | |
| [[ -n "${FFMPEG_CODEC}" ]] || { | |
| echo "ERROR: no suitable video encoder found in ffmpeg" | |
| exit 1 | |
| } | |
| case "${FFMPEG_CODEC}" in | |
| libx264|libx265) FFMPEG_EXTRA_ARGS="-crf 16 -pix_fmt yuv420p"; VIDEO_EXT="mp4" ;; | |
| libvpx_vp9) FFMPEG_EXTRA_ARGS="-crf 16 -b:v 0"; VIDEO_EXT="webm" ;; | |
| libvpx) FFMPEG_EXTRA_ARGS="-crf 16 -b:v 0"; VIDEO_EXT="webm" ;; | |
| mpeg4) FFMPEG_EXTRA_ARGS="-q:v 3"; VIDEO_EXT="mp4" ;; | |
| mjpeg) FFMPEG_EXTRA_ARGS="-q:v 3"; VIDEO_EXT="mp4" ;; | |
| ffv1) FFMPEG_EXTRA_ARGS=""; VIDEO_EXT="mkv" ;; | |
| esac | |
| VIDEO="${SCRIPT_DIR}/simulation.${VIDEO_EXT}" | |
| echo "ffmpeg encoder: ${FFMPEG_CODEC} container: .${VIDEO_EXT}" | |
| cd "${SCRIPT_DIR}" | |
| ENCODE_ONLY=0 | |
| [[ "${1:-}" == "--encode-only" ]] && ENCODE_ONLY=1 | |
| if [[ "${ENCODE_ONLY}" -eq 0 ]]; then | |
| # ── 1/2 Render frames ──────────────────────────────────────── | |
| echo "[1/2] Rendering frames with pvpython..." | |
| "${PVPYTHON}" --force-offscreen-rendering "${VIS}" | |
| else | |
| echo "[1/2] Skipping render (--encode-only)." | |
| fi | |
| N_FRAMES=$(ls frame.*.png 2>/dev/null | wc -l | tr -d ' ') | |
| echo " ${N_FRAMES} frame(s) found." | |
| if [[ "${N_FRAMES}" -eq 0 ]]; then | |
| echo "ERROR: no frames found, aborting." | |
| exit 1 | |
| fi | |
| # ── 2/2 Encode video ───────────────────────────────────────── | |
| echo "[2/2] Encoding → ${VIDEO} ..." | |
| # shellcheck disable=SC2086 | |
| ffmpeg -y \ | |
| -r 30 \ | |
| -i frame.%04d.png \ | |
| -c:v "${FFMPEG_CODEC}" \ | |
| ${FFMPEG_EXTRA_ARGS} \ | |
| "${VIDEO}" | |
| echo "" | |
| echo "Done: ${VIDEO}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment