1919# unnecessarily large actuations and promotes efficient controllers.
2020#
2121# Usage:
22- # ./run_kolmogorov_docker.sh # Objective 1: minimize TKE
23- # ./run_kolmogorov_docker.sh maximize_tke # Objective 2: maximize TKE
24- # ./run_kolmogorov_docker.sh no_actuation # Baseline: zero action
22+ # ./run_kolmogorov_docker.sh [mode] [num_steps] [dtype]
23+ #
24+ # ./run_kolmogorov_docker.sh # minimize TKE, 10 steps, float64
25+ # ./run_kolmogorov_docker.sh maximize_tke # maximize TKE
26+ # ./run_kolmogorov_docker.sh no_actuation 500 # baseline, 500 steps
27+ # ./run_kolmogorov_docker.sh minimize_tke 1000 float32 # float32 (fast, may diverge)
2528#
2629# Actuation:
2730# The control input is the amplitude of four sinusoidal body-force modes
3033# with wavenumbers k1,k2,k3,k4 = 4,5,6,7 (above the base forcing wavenumber).
3134# Actions are clipped to [-0.5, 0.5].
3235#
33- # Output :
34- # kolmogorov_<mode>.png -- vorticity snapshots comparing baseline vs
35- # actuated trajectories
36+ # Precision :
37+ # float64 (default) -- required for JIT stability; matches non-JIT behavior
38+ # float32 -- faster but may produce NaNs due to solver instability under XLA
3639#
3740
3841set -e
@@ -45,114 +48,7 @@ source /home/easybuild/venvs/hydrogym_gpu/bin/activate
4548
4649SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
4750MODE=" ${1:- minimize_tke} "
48- NUM_STEPS=10
49-
50- echo " === Kolmogorov Flow JAX Environment ==="
51- echo " Mode: $MODE "
52- echo " Steps per run: $NUM_STEPS "
53- echo " "
54-
55- case " $MODE " in
56-
57- minimize_tke)
58- echo " Objective: Minimize TKE (suppress energy bursts)"
59- echo " reward_alpha = 1.0 -> reward = -(TKE + action_penalty)"
60- echo " Action: small forcing to damp energy transfer"
61- echo " "
62- python - << PYEOF
63- import jax
64- import jax.numpy as jnp
65- from hydrogym.jax.envs.kolmogorov import KolmogorovFlow
66-
67- env = KolmogorovFlow(env_config={}, flow_config={})
68-
69- # reward_alpha > 0: penalize TKE -> agent learns to suppress energy bursts
70- params = env.default_params.replace(reward_alpha=1.0)
71-
72- key = jax.random.PRNGKey(0)
73- obs, state = env.reset_env(key, params)
74-
75- action = jnp.array([-0.25, -0.03, 0.02, 0.01])
76-
77- print(f"{'Step':>5} {'mean_TKE':>12} {'reward':>12}")
78- print("-" * 35)
79- for i in range($NUM_STEPS ):
80- key, subkey = jax.random.split(key)
81- obs, state, reward, done, info = env.step_env(subkey, state, action, params)
82- print(f"{i:>5} {float(info['mean_tke']):>12.4f} {float(reward):>12.4f}")
83- PYEOF
84- ;;
85-
86- maximize_tke)
87- echo " Objective: Maximize TKE (enhance turbulent mixing)"
88- echo " reward_alpha = -1.0 -> reward = TKE - action_penalty"
89- echo " Action: forcing to drive the flow into a more turbulent regime"
90- echo " "
91- python - << PYEOF
92- import jax
93- import jax.numpy as jnp
94- from hydrogym.jax.envs.kolmogorov import KolmogorovFlow
95-
96- env = KolmogorovFlow(env_config={}, flow_config={})
97-
98- # reward_alpha < 0: reward proportional to TKE -> agent learns to increase mixing
99- params = env.default_params.replace(reward_alpha=-1.0)
100-
101- key = jax.random.PRNGKey(0)
102- obs, state = env.reset_env(key, params)
103-
104- action = jnp.array([0.25, 0.03, -0.02, -0.01])
105-
106- print(f"{'Step':>5} {'mean_TKE':>12} {'reward':>12}")
107- print("-" * 35)
108- for i in range($NUM_STEPS ):
109- key, subkey = jax.random.split(key)
110- obs, state, reward, done, info = env.step_env(subkey, state, action, params)
111- print(f"{i:>5} {float(info['mean_tke']):>12.4f} {float(reward):>12.4f}")
112- PYEOF
113- ;;
114-
115- no_actuation)
116- echo " Baseline: zero actuation (free turbulence evolution)"
117- echo " reward_alpha = 1.0, action = [0, 0, 0, 0]"
118- echo " Shows natural energy bursts without control"
119- echo " "
120- python - << PYEOF
121- import jax
122- import jax.numpy as jnp
123- from hydrogym.jax.envs.kolmogorov import KolmogorovFlow
124-
125- env = KolmogorovFlow(env_config={}, flow_config={})
126- params = env.default_params.replace(reward_alpha=1.0)
127-
128- key = jax.random.PRNGKey(0)
129- obs, state = env.reset_env(key, params)
130-
131- action = jnp.zeros((params.action_dim,))
132-
133- print(f"{'Step':>5} {'mean_TKE':>12} {'reward':>12}")
134- print("-" * 35)
135- for i in range($NUM_STEPS ):
136- key, subkey = jax.random.split(key)
137- obs, state, reward, done, info = env.step_env(subkey, state, action, params)
138- print(f"{i:>5} {float(info['mean_tke']):>12.4f} {float(reward):>12.4f}")
139- PYEOF
140- ;;
141-
142- * )
143- echo " Unknown mode: $MODE "
144- echo " Usage: $0 [minimize_tke|maximize_tke|no_actuation]"
145- exit 1
146- ;;
147- esac
148-
149- EXIT_CODE=$?
150-
151- echo " "
152- if [ $EXIT_CODE -eq 0 ]; then
153- echo " Completed successfully."
154- else
155- echo " Failed with exit code: $EXIT_CODE "
156- fi
51+ NUM_STEPS=" ${2:- 10} "
52+ DTYPE=" ${3:- float64} "
15753
158- exit $EXIT_CODE
54+ python " $SCRIPT_DIR /test_kolmogorov_env.py " " $MODE " --num-steps " $NUM_STEPS " --dtype " $DTYPE "
0 commit comments