docs: case05纵波 + case06横波一维原子链
- case05 Readme.md 更新为纵波模拟描述 - case05 run_dynamics.py 注释更新 - case06 创建为一维原子链横波模拟 - coord.txt: fix_x=1, fix_y=1, fix_z=0 (z方向自由) - driver.txt: amp_z=0.5, freq_z=0.1, phi_z=90° - input.txt: 横波配置 + step_plot_wave - Readme.md + doc/index.html + run_dynamics.py - 模拟验证通过 (50000步/30s)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# case05: 一维原子链驱动力学模拟
|
# case05: 一维原子链纵波模拟
|
||||||
|
|
||||||
60 个原子沿 x 轴排列,相邻原子用弹簧连接。原子 1 受驱动力作用。
|
60 个原子沿 x 轴排列,相邻原子用弹簧连接。原子 1 受 x 方向驱动力作用,产生沿链传播的纵波。
|
||||||
|
|
||||||
## 物理设定
|
## 物理设定
|
||||||
|
|
||||||
@@ -8,12 +8,12 @@
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 原子数 | 60 |
|
| 原子数 | 60 |
|
||||||
| 排列 | 沿 x 轴等间距排列,间距为 1 |
|
| 排列 | 沿 x 轴等间距排列,间距为 1 |
|
||||||
| 约束 | 原子**只沿 z 方向**振动(fix_x=1, fix_y=1, fix_z=0) |
|
| 约束 | 原子**沿 x 方向自由振动**(fix_x=0, fix_y=1, fix_z=1),y, z 锁定 |
|
||||||
| 弹簧 | 劲度系数 k=1.0,原长 L₀=1.0 |
|
| 弹簧 | 劲度系数 k=1.0,原长 L₀=1.0 |
|
||||||
| 重力 | 无 |
|
| 重力 | 无 |
|
||||||
| 万有引力 | 无 |
|
| 万有引力 | 无 |
|
||||||
| 阻尼 | 无 |
|
| 阻尼 | 无 |
|
||||||
| 驱动力 | 原子 1(详见 driver.txt) |
|
| 驱动力 | 原子 1(x 方向驱动) |
|
||||||
| 算法 | leapfrog(蛙跳法,能量守恒) |
|
| 算法 | leapfrog(蛙跳法,能量守恒) |
|
||||||
|
|
||||||
## 驱动力
|
## 驱动力
|
||||||
@@ -21,16 +21,14 @@
|
|||||||
原子 1 的位置由 `input/driver.txt` 中的驱动力公式决定:
|
原子 1 的位置由 `input/driver.txt` 中的驱动力公式决定:
|
||||||
|
|
||||||
```math
|
```math
|
||||||
z(t) = A_z \cdot \cos(2\pi f_z t + \phi_z)
|
x(t) = A_x \cdot \cos(2\pi f_x t + \phi_x)
|
||||||
```
|
```
|
||||||
|
|
||||||
当前参数:A_z = 5.0, f_z = 1.0 Hz, φ_z = 90°(全程驱动)。
|
当前参数:A_x = 0.5, f_x = 1.0 Hz, φ_x = 0°, period = all(全程驱动)。
|
||||||
|
|
||||||
受驱原子完全忽略 coord.txt 中的初始坐标和 fix 约束,位置/速度由驱动力解析确定。
|
|
||||||
|
|
||||||
## 动力学行为
|
## 动力学行为
|
||||||
|
|
||||||
原子 1 的受迫振动通过弹簧逐次传递给相邻原子,形成沿链传播的横波。由于横向振动的几何非线性(弹簧张力主要在 x 方向),z 方向有效刚度低,波速较慢,呈现 FPU 型非线性动力学特征。
|
原子 1 沿 x 方向的受迫振动通过弹簧逐次传递给相邻原子,形成沿链传播的**纵波**(压缩波/疏密波)。由于 x 方向的弹簧力是线性的(F ≈ k·Δx),纵波的传播速度较快,能量沿链高效传递。
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Case runner for Dynamics case05 — 1D atomic chain.
|
Case runner for Dynamics case05 — 1D atomic chain (longitudinal wave).
|
||||||
|
|
||||||
This script keeps program and data separated:
|
This script keeps program and data separated:
|
||||||
- program: ../../dynamics.py
|
- program: ../../dynamics.py
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# case05: 一维原子链驱动力学模拟
|
# case06: 一维原子链横波模拟
|
||||||
|
|
||||||
60 个原子沿 x 轴排列,相邻原子用弹簧连接。原子 1 受驱动力作用。
|
60 个原子沿 x 轴排列,相邻原子用弹簧连接。原子 1 受 z 方向驱动力作用,产生沿链传播的横波。
|
||||||
|
|
||||||
## 物理设定
|
## 物理设定
|
||||||
|
|
||||||
@@ -8,12 +8,12 @@
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 原子数 | 60 |
|
| 原子数 | 60 |
|
||||||
| 排列 | 沿 x 轴等间距排列,间距为 1 |
|
| 排列 | 沿 x 轴等间距排列,间距为 1 |
|
||||||
| 约束 | 原子**只沿 z 方向**振动(fix_x=1, fix_y=1, fix_z=0) |
|
| 约束 | 原子**沿 z 方向自由振动**(fix_x=1, fix_y=1, fix_z=0),x, y 锁定 |
|
||||||
| 弹簧 | 劲度系数 k=1.0,原长 L₀=1.0 |
|
| 弹簧 | 劲度系数 k=1.0,原长 L₀=1.0 |
|
||||||
| 重力 | 无 |
|
| 重力 | 无 |
|
||||||
| 万有引力 | 无 |
|
| 万有引力 | 无 |
|
||||||
| 阻尼 | 无 |
|
| 阻尼 | 无 |
|
||||||
| 驱动力 | 原子 1(详见 driver.txt) |
|
| 驱动力 | 原子 1(z 方向驱动) |
|
||||||
| 算法 | leapfrog(蛙跳法,能量守恒) |
|
| 算法 | leapfrog(蛙跳法,能量守恒) |
|
||||||
|
|
||||||
## 驱动力
|
## 驱动力
|
||||||
@@ -24,18 +24,16 @@
|
|||||||
z(t) = A_z \cdot \cos(2\pi f_z t + \phi_z)
|
z(t) = A_z \cdot \cos(2\pi f_z t + \phi_z)
|
||||||
```
|
```
|
||||||
|
|
||||||
当前参数:A_z = 5.0, f_z = 1.0 Hz, φ_z = 90°(全程驱动)。
|
当前参数:A_z = 0.5, f_z = 0.1 Hz, φ_z = 90°, period = all(全程驱动)。
|
||||||
|
|
||||||
受驱原子完全忽略 coord.txt 中的初始坐标和 fix 约束,位置/速度由驱动力解析确定。
|
|
||||||
|
|
||||||
## 动力学行为
|
## 动力学行为
|
||||||
|
|
||||||
原子 1 的受迫振动通过弹簧逐次传递给相邻原子,形成沿链传播的横波。由于横向振动的几何非线性(弹簧张力主要在 x 方向),z 方向有效刚度低,波速较慢,呈现 FPU 型非线性动力学特征。
|
原子 1 沿 z 方向的受迫振动通过弹簧逐次传递给相邻原子,形成沿链传播的**横波**。由于 z 方向的振动是横向的,弹簧大部分张力在 x 方向,z 方向的有效刚度是非线性的——等效于一个三次方恢复力(FPU 型非线性),因此波速较慢。
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd examples/case05
|
cd examples/case06
|
||||||
python run_dynamics.py
|
python run_dynamics.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>case05 — 一维原子链驱动力学模拟 | 物理原理 & 使用文档</title>
|
<title>case06 — 一维原子链驱动力学模拟 | 物理原理 & 使用文档</title>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
--bg: #f8f9fa;
|
--bg: #f8f9fa;
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
<header class="hero">
|
<header class="hero">
|
||||||
<h1>一维原子链驱动力学模拟</h1>
|
<h1>一维原子链驱动力学模拟</h1>
|
||||||
<p class="subtitle">60 个原子沿 x 轴排列 · 弹簧连接 · z 方向受迫振动</p>
|
<p class="subtitle">60 个原子沿 x 轴排列 · 弹簧连接 · z 方向受迫振动</p>
|
||||||
<span class="badge">case05 · examples/case05</span>
|
<span class="badge">case06 · examples/case06</span>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h3>4.1 完整运行(模拟 + 动画)</h3>
|
<h3>4.1 完整运行(模拟 + 动画)</h3>
|
||||||
<pre>cd examples/case05
|
<pre>cd examples/case06
|
||||||
python run_dynamics.py</pre>
|
python run_dynamics.py</pre>
|
||||||
<p>这步会依次执行:物理模拟 → 抽帧 → 打开 VisPy 3D 动画窗口。</p>
|
<p>这步会依次执行:物理模拟 → 抽帧 → 打开 VisPy 3D 动画窗口。</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -356,9 +356,11 @@ step_animation: 1 # 播放动画</pre>
|
|||||||
<tr><th>操作</th><th>效果</th></tr>
|
<tr><th>操作</th><th>效果</th></tr>
|
||||||
<tr><td>鼠标拖动</td><td>旋转视角</td></tr>
|
<tr><td>鼠标拖动</td><td>旋转视角</td></tr>
|
||||||
<tr><td>滚轮</td><td>缩放</td></tr>
|
<tr><td>滚轮</td><td>缩放</td></tr>
|
||||||
<tr><td>A / D 键</td><td>视角向左 / 向右平移</td></tr>
|
<tr><td>W / S 键</td><td>相机沿 Z 轴向前 / 向后移动(靠近/远离场景)</td></tr>
|
||||||
<tr><td>W / S 键</td><td>视角向上 / 向下平移</td></tr>
|
<tr><td>A / D 键</td><td>视角向右 / 向左平移</td></tr>
|
||||||
<tr><td>Q / E 键</td><td>降低 / 提高平移速度</td></tr>
|
<tr><td>E / Q 键</td><td>视角上升 / 下降(屏幕方向)</td></tr>
|
||||||
|
<tr><td>C / X 键</td><td>增大 / 减小步长</td></tr>
|
||||||
|
<tr><td>V 键</td><td>切换透视 / 正交投影</td></tr>
|
||||||
<tr><td>左上角 <strong>reset</strong> 按钮</td><td>复位视角到初始位置</td></tr>
|
<tr><td>左上角 <strong>reset</strong> 按钮</td><td>复位视角到初始位置</td></tr>
|
||||||
<tr><td>左上角 <strong>info</strong> 按钮</td><td>切换信息面板显示/隐藏</td></tr>
|
<tr><td>左上角 <strong>info</strong> 按钮</td><td>切换信息面板显示/隐藏</td></tr>
|
||||||
<tr><td>左上角 <strong>axes</strong> 按钮</td><td>切换坐标轴显示/隐藏</td></tr>
|
<tr><td>左上角 <strong>axes</strong> 按钮</td><td>切换坐标轴显示/隐藏</td></tr>
|
||||||
@@ -397,6 +399,7 @@ step_animation: 1 # 播放动画</pre>
|
|||||||
<tr><td>step_simulate</td><td>跳过模拟(加载已有轨迹)</td><td>运行物理模拟</td></tr>
|
<tr><td>step_simulate</td><td>跳过模拟(加载已有轨迹)</td><td>运行物理模拟</td></tr>
|
||||||
<tr><td>step_sample</td><td>跳过抽帧</td><td>从轨迹抽取显示帧</td></tr>
|
<tr><td>step_sample</td><td>跳过抽帧</td><td>从轨迹抽取显示帧</td></tr>
|
||||||
<tr><td>step_plot</td><td>不生成图表</td><td>生成轨迹/能量图</td></tr>
|
<tr><td>step_plot</td><td>不生成图表</td><td>生成轨迹/能量图</td></tr>
|
||||||
|
<tr><td><strong>step_plot_wave</strong></td><td>不生成波形图</td><td>生成波形能量动画 GIF</td></tr>
|
||||||
<tr><td>step_animation</td><td>不启动动画</td><td>自动打开 VisPy 3D 窗口</td></tr>
|
<tr><td>step_animation</td><td>不启动动画</td><td>自动打开 VisPy 3D 窗口</td></tr>
|
||||||
<tr><td>force_calc</td><td>自动检测缓存</td><td>强制重新计算</td></tr>
|
<tr><td>force_calc</td><td>自动检测缓存</td><td>强制重新计算</td></tr>
|
||||||
</table>
|
</table>
|
||||||
@@ -409,7 +412,7 @@ step_animation: 1 # 播放动画</pre>
|
|||||||
<section id="files">
|
<section id="files">
|
||||||
<h2>六、文件结构</h2>
|
<h2>六、文件结构</h2>
|
||||||
|
|
||||||
<pre>case05/
|
<pre>case06/
|
||||||
├── input/
|
├── input/
|
||||||
│ ├── input.txt # 主配置文件(YAML 格式)
|
│ ├── input.txt # 主配置文件(YAML 格式)
|
||||||
│ ├── coord.txt # 原子坐标(60 个原子)
|
│ ├── coord.txt # 原子坐标(60 个原子)
|
||||||
@@ -420,7 +423,8 @@ step_animation: 1 # 播放动画</pre>
|
|||||||
│ ├── trajectory.txt # 全量轨迹数据(10000 步 × 60 原子)
|
│ ├── trajectory.txt # 全量轨迹数据(10000 步 × 60 原子)
|
||||||
│ ├── display.txt # 抽帧后的动画数据(200 帧 × 60 原子)
|
│ ├── display.txt # 抽帧后的动画数据(200 帧 × 60 原子)
|
||||||
│ ├── dynamics.log # 计算日志
|
│ ├── dynamics.log # 计算日志
|
||||||
│ └── animation.log # 动画启动日志(闪退时排查用)
|
│ ├── animation.log # 动画启动日志(闪退时排查用)
|
||||||
|
│ └── wave_animation.gif # 波形能量动画(step_plot_wave=1 时生成)
|
||||||
├── doc/
|
├── doc/
|
||||||
│ └── index.html # <span class="cm">本文档</span>
|
│ └── index.html # <span class="cm">本文档</span>
|
||||||
├── Readme.md # 案例简介
|
├── Readme.md # 案例简介
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
bond_name k rest_length
|
bond_name k rest_length
|
||||||
k1 100.0 1.0
|
k1 1.0 1.0
|
||||||
|
|||||||
@@ -1,61 +1,61 @@
|
|||||||
n mass radius x y z vx vy vz fix_x fix_y fix_z
|
n mass radius x y z vx vy vz fix_x fix_y fix_z
|
||||||
1 1 0.1 0 0 1 0 0 0 0 1 1
|
1 1 0.1 0 0 0 0 0 0 1 1 0
|
||||||
2 1 0.1 1 0 0 0 0 0 0 1 1
|
2 1 0.1 1 0 0 0 0 0 1 1 0
|
||||||
3 1 0.1 2 0 0 0 0 0 0 1 1
|
3 1 0.1 2 0 0 0 0 0 1 1 0
|
||||||
4 1 0.1 3 0 0 0 0 0 0 1 1
|
4 1 0.1 3 0 0 0 0 0 1 1 0
|
||||||
5 1 0.1 4 0 0 0 0 0 0 1 1
|
5 1 0.1 4 0 0 0 0 0 1 1 0
|
||||||
6 1 0.1 5 0 0 0 0 0 0 1 1
|
6 1 0.1 5 0 0 0 0 0 1 1 0
|
||||||
7 1 0.1 6 0 0 0 0 0 0 1 1
|
7 1 0.1 6 0 0 0 0 0 1 1 0
|
||||||
8 1 0.1 7 0 0 0 0 0 0 1 1
|
8 1 0.1 7 0 0 0 0 0 1 1 0
|
||||||
9 1 0.1 8 0 0 0 0 0 0 1 1
|
9 1 0.1 8 0 0 0 0 0 1 1 0
|
||||||
10 1 0.1 9 0 0 0 0 0 0 1 1
|
10 1 0.1 9 0 0 0 0 0 1 1 0
|
||||||
11 1 0.1 10 0 0 0 0 0 0 1 1
|
11 1 0.1 10 0 0 0 0 0 1 1 0
|
||||||
12 1 0.1 11 0 0 0 0 0 0 1 1
|
12 1 0.1 11 0 0 0 0 0 1 1 0
|
||||||
13 1 0.1 12 0 0 0 0 0 0 1 1
|
13 1 0.1 12 0 0 0 0 0 1 1 0
|
||||||
14 1 0.1 13 0 0 0 0 0 0 1 1
|
14 1 0.1 13 0 0 0 0 0 1 1 0
|
||||||
15 1 0.1 14 0 0 0 0 0 0 1 1
|
15 1 0.1 14 0 0 0 0 0 1 1 0
|
||||||
16 1 0.1 15 0 0 0 0 0 0 1 1
|
16 1 0.1 15 0 0 0 0 0 1 1 0
|
||||||
17 1 0.1 16 0 0 0 0 0 0 1 1
|
17 1 0.1 16 0 0 0 0 0 1 1 0
|
||||||
18 1 0.1 17 0 0 0 0 0 0 1 1
|
18 1 0.1 17 0 0 0 0 0 1 1 0
|
||||||
19 1 0.1 18 0 0 0 0 0 0 1 1
|
19 1 0.1 18 0 0 0 0 0 1 1 0
|
||||||
20 1 0.1 19 0 0 0 0 0 0 1 1
|
20 1 0.1 19 0 0 0 0 0 1 1 0
|
||||||
21 1 0.1 20 0 0 0 0 0 0 1 1
|
21 1 0.1 20 0 0 0 0 0 1 1 0
|
||||||
22 1 0.1 21 0 0 0 0 0 0 1 1
|
22 1 0.1 21 0 0 0 0 0 1 1 0
|
||||||
23 1 0.1 22 0 0 0 0 0 0 1 1
|
23 1 0.1 22 0 0 0 0 0 1 1 0
|
||||||
24 1 0.1 23 0 0 0 0 0 0 1 1
|
24 1 0.1 23 0 0 0 0 0 1 1 0
|
||||||
25 1 0.1 24 0 0 0 0 0 0 1 1
|
25 1 0.1 24 0 0 0 0 0 1 1 0
|
||||||
26 1 0.1 25 0 0 0 0 0 0 1 1
|
26 1 0.1 25 0 0 0 0 0 1 1 0
|
||||||
27 1 0.1 26 0 0 0 0 0 0 1 1
|
27 1 0.1 26 0 0 0 0 0 1 1 0
|
||||||
28 1 0.1 27 0 0 0 0 0 0 1 1
|
28 1 0.1 27 0 0 0 0 0 1 1 0
|
||||||
29 1 0.1 28 0 0 0 0 0 0 1 1
|
29 1 0.1 28 0 0 0 0 0 1 1 0
|
||||||
30 1 0.1 29 0 0 0 0 0 0 1 1
|
30 1 0.1 29 0 0 0 0 0 1 1 0
|
||||||
31 1 0.1 30 0 0 0 0 0 0 1 1
|
31 1 0.1 30 0 0 0 0 0 1 1 0
|
||||||
32 1 0.1 31 0 0 0 0 0 0 1 1
|
32 1 0.1 31 0 0 0 0 0 1 1 0
|
||||||
33 1 0.1 32 0 0 0 0 0 0 1 1
|
33 1 0.1 32 0 0 0 0 0 1 1 0
|
||||||
34 1 0.1 33 0 0 0 0 0 0 1 1
|
34 1 0.1 33 0 0 0 0 0 1 1 0
|
||||||
35 1 0.1 34 0 0 0 0 0 0 1 1
|
35 1 0.1 34 0 0 0 0 0 1 1 0
|
||||||
36 1 0.1 35 0 0 0 0 0 0 1 1
|
36 1 0.1 35 0 0 0 0 0 1 1 0
|
||||||
37 1 0.1 36 0 0 0 0 0 0 1 1
|
37 1 0.1 36 0 0 0 0 0 1 1 0
|
||||||
38 1 0.1 37 0 0 0 0 0 0 1 1
|
38 1 0.1 37 0 0 0 0 0 1 1 0
|
||||||
39 1 0.1 38 0 0 0 0 0 0 1 1
|
39 1 0.1 38 0 0 0 0 0 1 1 0
|
||||||
40 1 0.1 39 0 0 0 0 0 0 1 1
|
40 1 0.1 39 0 0 0 0 0 1 1 0
|
||||||
41 1 0.1 40 0 0 0 0 0 0 1 1
|
41 1 0.1 40 0 0 0 0 0 1 1 0
|
||||||
42 1 0.1 41 0 0 0 0 0 0 1 1
|
42 1 0.1 41 0 0 0 0 0 1 1 0
|
||||||
43 1 0.1 42 0 0 0 0 0 0 1 1
|
43 1 0.1 42 0 0 0 0 0 1 1 0
|
||||||
44 1 0.1 43 0 0 0 0 0 0 1 1
|
44 1 0.1 43 0 0 0 0 0 1 1 0
|
||||||
45 1 0.1 44 0 0 0 0 0 0 1 1
|
45 1 0.1 44 0 0 0 0 0 1 1 0
|
||||||
46 1 0.1 45 0 0 0 0 0 0 1 1
|
46 1 0.1 45 0 0 0 0 0 1 1 0
|
||||||
47 1 0.1 46 0 0 0 0 0 0 1 1
|
47 1 0.1 46 0 0 0 0 0 1 1 0
|
||||||
48 1 0.1 47 0 0 0 0 0 0 1 1
|
48 1 0.1 47 0 0 0 0 0 1 1 0
|
||||||
49 1 0.1 48 0 0 0 0 0 0 1 1
|
49 1 0.1 48 0 0 0 0 0 1 1 0
|
||||||
50 1 0.1 49 0 0 0 0 0 0 1 1
|
50 1 0.1 49 0 0 0 0 0 1 1 0
|
||||||
51 1 0.1 50 0 0 0 0 0 0 1 1
|
51 1 0.1 50 0 0 0 0 0 1 1 0
|
||||||
52 1 0.1 51 0 0 0 0 0 0 1 1
|
52 1 0.1 51 0 0 0 0 0 1 1 0
|
||||||
53 1 0.1 52 0 0 0 0 0 0 1 1
|
53 1 0.1 52 0 0 0 0 0 1 1 0
|
||||||
54 1 0.1 53 0 0 0 0 0 0 1 1
|
54 1 0.1 53 0 0 0 0 0 1 1 0
|
||||||
55 1 0.1 54 0 0 0 0 0 0 1 1
|
55 1 0.1 54 0 0 0 0 0 1 1 0
|
||||||
56 1 0.1 55 0 0 0 0 0 0 1 1
|
56 1 0.1 55 0 0 0 0 0 1 1 0
|
||||||
57 1 0.1 56 0 0 0 0 0 0 1 1
|
57 1 0.1 56 0 0 0 0 0 1 1 0
|
||||||
58 1 0.1 57 0 0 0 0 0 0 1 1
|
58 1 0.1 57 0 0 0 0 0 1 1 0
|
||||||
59 1 0.1 58 0 0 0 0 0 0 1 1
|
59 1 0.1 58 0 0 0 0 0 1 1 0
|
||||||
60 1 0.1 59 0 0 0 0 0 1 1 1
|
60 1 0.1 59 0 0 0 0 0 1 1 0
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
n amp_x amp_y amp_z freq_x freq_y freq_z phi_x phi_y phi_z period
|
n amp_x amp_y amp_z freq_x freq_y freq_z phi_x phi_y phi_z period
|
||||||
1 0.5 0 0 0.1 0 0 0 0 0 all
|
1 0 0 0.5 0 0 0.1 0 0 90 all
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
step_simulate: 1 # 运行物理模拟 → output/trajectory.txt
|
step_simulate: 1 # 运行物理模拟 → output/trajectory.txt
|
||||||
step_sample: 1 # 抽帧 → output/display.txt
|
step_sample: 1 # 抽帧 → output/display.txt
|
||||||
step_plot: 0 # 绘制轨迹/能量图 → output/trajectory_plots.png
|
step_plot: 0 # 绘制轨迹/能量图 → output/trajectory_plots.png
|
||||||
|
step_plot_wave: 0 # 绘制波形能量动画 → output/wave_animation.gif
|
||||||
step_animation: 1 # 自动播放 VisPy 3D 动画窗口(需安装 vispy)
|
step_animation: 1 # 自动播放 VisPy 3D 动画窗口(需安装 vispy)
|
||||||
force_calc: 0 # 强制重新计算:1=跳过缓存强算,0=自动使用已有输出
|
force_calc: 0 # 强制重新计算:1=跳过缓存强算,0=自动使用已有输出
|
||||||
|
|
||||||
@@ -63,7 +64,7 @@ warmup_steps: 0 # 默认 0(立即开始记录)
|
|||||||
T_total: 50.0
|
T_total: 50.0
|
||||||
|
|
||||||
# 抽帧间隔(每 NSTEP 步取一帧用于动画)
|
# 抽帧间隔(每 NSTEP 步取一帧用于动画)
|
||||||
NSTEP: 50
|
NSTEP: 100
|
||||||
|
|
||||||
# ── 时间步长 ──────────────────────────────────
|
# ── 时间步长 ──────────────────────────────────
|
||||||
DT: 0.001 # 时间步长 (s)
|
DT: 0.001 # 时间步长 (s)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Case runner for Dynamics case05 — 1D atomic chain.
|
Case runner for Dynamics case06 — 1D atomic chain (transverse wave).
|
||||||
|
|
||||||
This script keeps program and data separated:
|
This script keeps program and data separated:
|
||||||
- program: ../../dynamics.py
|
- program: ../../dynamics.py
|
||||||
|
|||||||
+26
-7
@@ -234,19 +234,38 @@ def plot_wave(output_dir):
|
|||||||
|
|
||||||
ani = FuncAnimation(fig, update, frames=n_frames, interval=50, blit=True)
|
ani = FuncAnimation(fig, update, frames=n_frames, interval=50, blit=True)
|
||||||
|
|
||||||
# 保存 GIF
|
# ── 先输出 GIF(自动循环)──
|
||||||
gif_path = os.path.join(output_dir, "wave_animation.gif")
|
gif_path = os.path.join(output_dir, "wave_animation.gif")
|
||||||
ani.save(gif_path, writer="pillow", fps=min(20, max(1, n_frames // 5)))
|
ani.save(gif_path, writer="pillow", fps=min(20, max(1, n_frames // 5)))
|
||||||
print(f"[plot_wave] GIF 已保存: {gif_path}")
|
print(f"[plot_wave] GIF 已保存: {gif_path}")
|
||||||
|
|
||||||
# 尝试保存 MP4
|
# ── 再输出 MP4(需要 ffmpeg)──
|
||||||
try:
|
try:
|
||||||
mp4_path = os.path.join(output_dir, "wave_animation.mp4")
|
import matplotlib.animation as manim
|
||||||
ani.save(mp4_path, writer="ffmpeg", fps=min(20, max(1, n_frames // 5)))
|
import matplotlib.pyplot as _plt
|
||||||
print(f"[plot_wave] MP4 已保存: {mp4_path}")
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
# 尝试通过 imageio_ffmpeg 定位 ffmpeg
|
||||||
|
ffmpeg_path = None
|
||||||
|
try:
|
||||||
|
import imageio_ffmpeg
|
||||||
|
ffmpeg_path = imageio_ffmpeg.get_ffmpeg_exe()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
if ffmpeg_path and os.path.exists(ffmpeg_path):
|
||||||
|
_plt.rcParams['animation.ffmpeg_path'] = ffmpeg_path
|
||||||
|
|
||||||
|
ffps = min(20, max(1, n_frames // 5))
|
||||||
|
writer = manim.FFMpegWriter(fps=ffps, codec="libx264",
|
||||||
|
extra_args=["-pix_fmt", "yuv420p"])
|
||||||
|
mp4_path = os.path.join(output_dir, "wave_animation.mp4")
|
||||||
|
ani.save(mp4_path, writer=writer)
|
||||||
|
print(f"[plot_wave] MP4 已保存: {mp4_path}")
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("[plot_wave] 警告: 未找到 ffmpeg,跳过 MP4 输出")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[plot_wave] 警告: MP4 输出失败 ({e}),跳过")
|
||||||
|
|
||||||
|
# ── 最后显示动画窗口 ──
|
||||||
plt.show()
|
plt.show()
|
||||||
return gif_path
|
return gif_path
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user