Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【hydra No.5】shock_wave #627

Merged
merged 16 commits into from
Nov 15, 2023
102 changes: 45 additions & 57 deletions docs/zh/examples/shock_wave.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

<a href="https://aistudio.baidu.com/projectdetail/6755993?contributionType=1&sUid=438690&shared=1&ts=1694949960479" class="md-button md-button--primary" style>AI Studio快速体验</a>



## 1. 背景简介

激波是自然界以及工程应用中经常发现的现象。它们不仅广泛地存在于航空航天领域的可压缩流动中,而且也表现在理论与应用物理以及工程应用等其它领域。在超声速与高超声速流动中,激波的出现对流体流动的整体特征会产生重要影响。激波捕捉问题已在CFD领域发展了数十年,以弱解的数学理论为基础的激波捕捉方法以其简单易实现的特点发展迅速,并在复杂超声速、高超声速流动数值模拟中得到了广泛应用。
Expand Down Expand Up @@ -67,9 +69,9 @@ $$

上式中 $g$ 即为 MLP 模型本身,用 PaddleScience 代码表示如下

``` py linenums="255"
``` py linenums="256"
--8<--
examples/shock_wave/shock_wave.py:255:256
examples/shock_wave/shock_wave.py:256:257
--8<--
```

Expand All @@ -81,25 +83,25 @@ examples/shock_wave/shock_wave.py:255:256

本案例涉及二维欧拉方程和边界上的方程,如下所示

``` py linenums="32"
``` py linenums="35"
--8<--
examples/shock_wave/shock_wave.py:32:211
examples/shock_wave/shock_wave.py:35:214
--8<--
```

``` py linenums="258"
``` py linenums="259"
--8<--
examples/shock_wave/shock_wave.py:258:259
examples/shock_wave/shock_wave.py:259:260
--8<--
```

### 3.3 计算域构建

本案例的计算域为 0 ~ 0.4 单位时间,长为 1.5,宽为 2.0 的长方形区域,其内含有一个圆心坐标为 [1, 1],半径为 0.25 的圆,代码如下所示

``` py linenums="261"
``` py linenums="31"
--8<--
examples/shock_wave/shock_wave.py:261:273
examples/shock_wave/conf/shock_wave.yaml:31:43
--8<--
```

Expand All @@ -109,145 +111,131 @@ examples/shock_wave/shock_wave.py:261:273

我们将欧拉方程施加在计算域的内部点上,并且使用拉丁超立方(Latin HyperCube Sampling, LHS)方法采样共 `N_INTERIOR` 个训练点,代码如下所示:

``` py linenums="268"
``` py linenums="38"
--8<--
examples/shock_wave/shock_wave.py:268:268
examples/shock_wave/conf/shock_wave.yaml:38:38
--8<--
```

``` py linenums="275"
``` py linenums="263"
--8<--
examples/shock_wave/shock_wave.py:275:289
examples/shock_wave/shock_wave.py:263:277
--8<--
```

``` py linenums="349"
``` py linenums="337"
--8<--
examples/shock_wave/shock_wave.py:349:363
examples/shock_wave/shock_wave.py:337:350
--8<--
```

#### 3.4.2 边界约束

我们将边界条件施加在计算域的边界点上,同样使用拉丁超立方(Latin HyperCube Sampling, LHS)方法在边界上采样共 `N_BOUNDARY` 个训练点,代码如下所示:

``` py linenums="269"
``` py linenums="39"
--8<--
examples/shock_wave/shock_wave.py:269:269
examples/shock_wave/conf/shock_wave.yaml:39:39
--8<--
```

``` py linenums="291"
``` py linenums="279"
--8<--
examples/shock_wave/shock_wave.py:291:324
examples/shock_wave/shock_wave.py:279:312
--8<--
```

``` py linenums="376"
``` py linenums="363"
--8<--
examples/shock_wave/shock_wave.py:376:400
examples/shock_wave/shock_wave.py:363:387
--8<--
```

#### 3.4.3 初值约束

我们将边界条件施加在计算域的初始时刻的点上,同样使用拉丁超立方(Latin HyperCube Sampling, LHS)方法在初始时刻的计算域内采样共 `N_BOUNDARY` 个训练点,代码如下所示:

``` py linenums="326"
``` py linenums="314"
--8<--
examples/shock_wave/shock_wave.py:326:347
examples/shock_wave/shock_wave.py:314:335
--8<--
```

``` py linenums="364"
``` py linenums="351"
--8<--
examples/shock_wave/shock_wave.py:364:375
examples/shock_wave/shock_wave.py:351:362
--8<--
```

在以上三个约束构建完毕之后,需要将他们包装成一个字典,方便后续作为参数传递

``` py linenums="401"
``` py linenums="388"
--8<--
examples/shock_wave/shock_wave.py:401:406
examples/shock_wave/shock_wave.py:388:393
--8<--
```

### 3.5 超参数设定

接下来我们需要指定训练轮数和学习率,此处我们按实验经验,使用 100 轮训练轮数。

``` py linenums="412"
``` py linenums="400"
--8<--
examples/shock_wave/shock_wave.py:412:412
examples/shock_wave/shock_wave.py:400:400
--8<--
```

### 3.6 优化器构建

训练过程会调用优化器来更新模型参数,此处选择 `L-BFGS` 优化器并设定 `max_iter` 为 100。

``` py linenums="408"
``` py linenums="395"
--8<--
examples/shock_wave/shock_wave.py:408:409
examples/shock_wave/shock_wave.py:395:397
--8<--
```

### 3.7 模型训练与可视化

完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`。

``` py linenums="412"
``` py linenums="401"
--8<--
examples/shock_wave/shock_wave.py:412:426
examples/shock_wave/shock_wave.py:401:414
--8<--
```

本案例需要根据每一轮训练的 epoch 值,计算PDE、BC方程内的权重系数 `relu`。因此在 solver 实例化完毕之后,需额外将其传递给方程本身,代码如下:

``` py linenums="427"
``` py linenums="415"
--8<--
examples/shock_wave/shock_wave.py:427:430
examples/shock_wave/shock_wave.py:415:418
--8<--
```

最后启动训练即可:

``` py linenums="432"
``` py linenums="420"
--8<--
examples/shock_wave/shock_wave.py:432:433
examples/shock_wave/shock_wave.py:420:421
--8<--
```

训练完毕后,我们可视化最后一个时刻的计算域内辨率为 600x600 的激波,共 360000 个点,代码如下:

``` py linenums="435"
``` py linenums="423"
--8<--
examples/shock_wave/shock_wave.py:435:506
examples/shock_wave/shock_wave.py:423:492
--8<--
```

## 4. 完整代码

=== "Ma=2.0"

``` py linenums="1" title="shock_wave.py"
--8<--
examples/shock_wave/shock_wave.py
--8<--
```

=== "Ma=0.728"

``` py linenums="1" title="shock_wave.py"
--8<--
examples/shock_wave/shock_wave.py::245
--8<--
MA=0.728
--8<--
examples/shock_wave/shock_wave.py:248:
--8<--
```
``` py linenums="1" title="shock_wave.py"
--8<--
examples/shock_wave/shock_wave.py
--8<--
```

## 5. 结果展示

Expand Down
72 changes: 72 additions & 0 deletions examples/shock_wave/conf/shock_wave_Ma0.728.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
hydra:
run:
# dynamic output directory according to running time and override name
dir: outputs_shock_wave/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
job:
name: ${mode} # name of logfile
chdir: false # keep current working direcotry unchaned
config:
override_dirname:
exclude_keys:
- TRAIN.checkpoint_path
- TRAIN.pretrained_model_path
- EVAL.pretrained_model_path
- mode
- output_dir
- log_freq
sweep:
# output directory for multirun
dir: ${hydra.run.dir}
subdir: ./

# general settings
mode: train # running mode: train/eval
seed: 2023
DrRyanHuang marked this conversation as resolved.
Show resolved Hide resolved
output_dir: ${hydra:run.dir}
log_freq: 20

# set working condition
MA: 0.728

# set hyper-parameters
Lt: 0.4
Lx: 1.5
Ly: 2.0
rx: 1.0
ry: 1.0
rd: 0.25
N_INTERIOR: 100000
N_BOUNDARY: 10000
RHO1: 2.112
P1: 3.001
GAMMA: 1.4
V1: 0.0

# visualize prediction
Nd: 600
T: 0.4

# model settings
MODEL:
input_keys: ["t", "x", "y"]
output_keys: ["u", "v", "p", "rho"]
num_layers: 9
hidden_size: 90
activation: "tanh"

# training settings
TRAIN:
epochs: 100
iters_per_epoch: 1
save_freq: 50
eval_during_train: false
eval_freq: 20
learning_rate: 1e-1
max_iter: 100
pretrained_model_path: null
checkpoint_path: null

# evaluation settings
EVAL:
pretrained_model_path: null
eval_with_no_grad: true
72 changes: 72 additions & 0 deletions examples/shock_wave/conf/shock_wave_Ma2.0.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
hydra:
run:
# dynamic output directory according to running time and override name
dir: outputs_shock_wave/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
job:
name: ${mode} # name of logfile
chdir: false # keep current working direcotry unchaned
config:
override_dirname:
exclude_keys:
- TRAIN.checkpoint_path
- TRAIN.pretrained_model_path
- EVAL.pretrained_model_path
- mode
- output_dir
- log_freq
sweep:
# output directory for multirun
dir: ${hydra.run.dir}
subdir: ./

# general settings
mode: train # running mode: train/eval
seed: 2023
output_dir: ${hydra:run.dir}
log_freq: 20

# set working condition
MA: 2.0

# set hyper-parameters
Lt: 0.4
Lx: 1.5
Ly: 2.0
rx: 1.0
ry: 1.0
rd: 0.25
N_INTERIOR: 100000
N_BOUNDARY: 10000
RHO1: 2.112
P1: 3.001
GAMMA: 1.4
V1: 0.0

# visualize prediction
Nd: 600
T: 0.4

# model settings
MODEL:
input_keys: ["t", "x", "y"]
output_keys: ["u", "v", "p", "rho"]
num_layers: 9
hidden_size: 90
activation: "tanh"

# training settings
TRAIN:
epochs: 100
iters_per_epoch: 1
save_freq: 50
eval_during_train: false
eval_freq: 20
learning_rate: 1e-1
max_iter: 100
pretrained_model_path: null
checkpoint_path: null

# evaluation settings
EVAL:
pretrained_model_path: null
eval_with_no_grad: true
Loading