# 物理模拟参数配置
# 格式：YAML
# 用法：python run_dynamics.py

# ── 流程控制 ──────────────────────────────────
# 每步用 0/1 单独开关，1=执行，0=跳过
# 依赖关系：抽帧依赖模拟结果，绘图依赖模拟+抽帧
step_simulate:  1   # 运行物理模拟 → output/trajectory.txt
step_sample:    1   # 抽帧 → output/display.txt
step_plot:      1   # 绘制轨迹/能量图 → output/trajectory_plots.png
step_plot_wave: 0   # 绘制波形能量动画
plot_wave_save_gif: 0  # 输出波形 GIF（需 step_plot_wave=1）
plot_wave_save_mp4: 0  # 输出波形 MP4（需 step_plot_wave=1）
step_animation: 1   # 自动播放 VisPy 3D 动画窗口（需安装 vispy）
force_calc: 0       # 强制重新计算：1=跳过缓存强算，0=自动使用已有输出

# ── 计算引擎 ──────────────────────────────────
# 可选: python, c, cpp, fortran, java
# python = Python 参考实现(compute.py)
# c     = C 引擎 (engines/c/build/dynamics_c)
# cpp   = C++ 引擎 (engines/cpp/build/dynamics_cpp)
# fortran = Fortran 引擎 (engines/fortran/build/dynamics_f90)
engine: python        # 默认使用 Python 引擎

# ── 盒子 ──────────────────────────────────────
box_a: 20.0         # 立方体半边长，粒子被限制在 [-box_a, box_a]³ 内

# ── 初始构型 ──────────────────────────────────
# 坐标文件格式：
#   第一行：n mass radius x y z vx vy vz
#   后续行：原子序号 质量 半径 x y z vx vy vz
coord_file: input/coord.txt
connection_file: input/connection.txt
bond_file: input/bond.txt
driver_file: input/driver.txt     # 驱动力定义文件（driving_force=1 时生效）

# 绘图/动画展示的原子序号（对应 coord_file 第一列 n）
plot_atom: 1

# ── 物理参数 ──────────────────────────────────
# 三个方向分量分别对应 x, y, z
G: [0.0, 0.0, -9.8]   # 重力场分量 (m/s²)
# B: [0.5, 0.5, 0.5]    # 阻尼分量
B: [0.0, 0.0, 0.0]    # 阻尼分量

# ── 力开关（0=关闭, 1=开启）──────────────────
gravity_field: 0         # 均匀重力场 (G)
gravity_interaction: 1   # 原子间万有引力
elastic_force: 0         # 弹簧键力
damping_force: 0         # 阻尼 (B)
driving_force: 0         # 驱动力（需 driver_file 定义）
#
gravity_strength: 100.0    # 万有引力强度（仅 gravity_interaction=1 时有效）

# ── 数值算法 ──────────────────────────────────
# 可选：
#   explicit_euler  显式欧拉法
#   implicit_euler  隐式欧拉法
#   midpoint        中点法
#   leapfrog        蛙跳法
method: leapfrog

# ── 步骤控制 ──────────────────────────────────
# 以下参数控制哪些步骤被执行和保存

# 预热步数：模拟开始时跳过不保存的步数（用于稳定初始状态）
warmup_steps: 0           # 默认 0（立即开始记录）

# 总模拟时间（秒），程序自动计算 NT = T_total / DT
# 如果同时指定了 NT，以 NT 为准
T_total: 10.0

# 抽帧间隔（每 NSTEP 步取一帧用于动画）
NSTEP: 100

# ── 时间步长 ──────────────────────────────────
DT:    0.001         # 时间步长 (s)

# 抽帧范围：只保存 [sample_start, sample_end) 区间内的帧
sample_start: null        # null 表示从头开始（帧索引从 0 起）
sample_end: null           # null 表示到末尾



# ── 渲染方式 ──────────────────────────────────
# 3D 动画中原子渲染方式：
#   0 = Sphere （网格球体，效果精细，原子数少时推荐）
#   1 = Marker （GPU 实例化点，原子数多时性能更佳）
use_marker: 0

# ── 显示参数 ──────────────────────────────────
# 盒子透明度：单个数值（统一）或 6 个数的数组，按 [-x,+x,-y,+y,-z,+z] 顺序
alpha: [0.0, 0.0, 0.0, 0.0, 0.0, 0.5]

# 小球颜色
# 小球半径从 coord_file 的 radius 列读取
ball_color_r: 0.90  # R 分量 (0~1)
ball_color_g: 0.20  # G 分量
ball_color_b: 0.20  # B 分量

# 盒子面颜色
box_color_r:  0.80
box_color_g:  0.80
box_color_b:  0.85
