Skip to content

Instantly share code, notes, and snippets.

@dineshadepu
Created March 25, 2026 18:52
Show Gist options
  • Select an option

  • Save dineshadepu/986c5f897a6e8a51d5e7c7e98b2bc862 to your computer and use it in GitHub Desktop.

Select an option

Save dineshadepu/986c5f897a6e8a51d5e7c7e98b2bc862 to your computer and use it in GitHub Desktop.
Rendering vtk files of AcoDyn and Jaali x Prestige particles
#!/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