Skip to content

Commit

Permalink
【hydra No.7】Adapt ldc2d_unsteady_Re10 to hydra (PaddlePaddle#580)
Browse files Browse the repository at this point in the history
* add ldc2d_unsteady_Re10.yaml, modify ldc2d_unsteady_Re10.py ldc2d_unsteady.md to hydra style

* fix ldc2d_unsteady.md、ldc2d_unsteady_Re10.yaml、ldc2d_unsteady_Re10.py

* fix ldc2d_unsteady_Re10.py

* fix ldc2d_unsteady_Re10.yaml、ldc2d_unsteady_Re10.py

* fix 2 files

* fix 2 files
  • Loading branch information
lknt committed Oct 24, 2023
1 parent 79abd76 commit 58f79ad
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 66 deletions.
51 changes: 26 additions & 25 deletions docs/zh/examples/ldc2d_unsteady.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

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

=== "模型训练命令"
``` sh
python ldc2d_unsteady_Re10.py
```

## 1. 背景简介

顶盖方腔驱动流LDC问题在许多领域中都有应用。例如,这个问题可以用于计算流体力学(CFD)领域中验证计算方法的有效性。虽然这个问题的边界条件相对简单,但是其流动特性却非常复杂。在顶盖驱动流LDC中,顶壁朝x方向以U=1的速度移动,而其他三个壁则被定义为无滑移边界条件,即速度为零。
Expand Down Expand Up @@ -201,28 +206,24 @@ examples/ldc/ldc2d_unsteady_Re10.py:36:44

``` py linenums="46"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:46:60
examples/ldc/ldc2d_unsteady_Re10.py:46:58
--8<--
```

#### 3.4.1 内部点约束

以作用在矩形内部点上的 `InteriorConstraint` 为例,代码如下:

``` py linenums="62"
``` py linenums="60"
# set constraint
pde_constraint = ppsci.constraint.InteriorConstraint(
pde = ppsci.constraint.InteriorConstraint(
equation["NavierStokes"].equations,
{"continuity": 0, "momentum_x": 0, "momentum_y": 0},
geom["time_rect"],
{**train_dataloader_cfg, "batch_size": NPOINT_PDE * NTIME_PDE},
ppsci.loss.MSELoss("sum"),
evenly=True,
weight_dict={
"continuity": 0.0001, # (1)
"momentum_x": 0.0001,
"momentum_y": 0.0001,
},
weight_dict=cfg.TRAIN.weight.pde, # (1)
name="EQ",
)
```
Expand Down Expand Up @@ -257,57 +258,57 @@ pde_constraint = ppsci.constraint.InteriorConstraint(

由于 `BoundaryConstraint` 默认会在所有边界上进行采样,而我们需要对四个边界分别施加约束,因此需通过设置 `criteria` 参数,进一步细化出四个边界,如上边界就是符合 $y = 0.05$ 的边界点集

``` py linenums="77"
``` py linenums="71"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:77:112
examples/ldc/ldc2d_unsteady_Re10.py:71:106
--8<--
```

#### 3.4.3 初值约束

最后我们还需要对 $t=t_0$ 时刻的矩形内部点施加 N-S 方程约束,代码如下:

``` py linenums="113"
``` py linenums="107"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:113:121
examples/ldc/ldc2d_unsteady_Re10.py:107:115
--8<--
```

在微分方程约束、边界约束、初值约束构建完毕之后,以我们刚才的命名为关键字,封装到一个字典中,方便后续访问。

``` py linenums="122"
``` py linenums="116"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:122:130
examples/ldc/ldc2d_unsteady_Re10.py:116:124
--8<--
```

### 3.5 超参数设定

接下来我们需要指定训练轮数和学习率,此处我们按实验经验,使用两万轮训练轮数和带有 warmup 的 Cosine 余弦衰减学习率。
接下来需要在配置文件中指定训练轮数,此处我们按实验经验,使用两万轮训练轮数和带有 warmup 的 Cosine 余弦衰减学习率。

``` py linenums="132"
``` py linenums="40"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:132:139
examples/ldc/conf/ldc2d_unsteady_Re10.yaml:40:43
--8<--
```

### 3.6 优化器构建

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器。

``` py linenums="141"
``` py linenums="132"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:141:142
examples/ldc/ldc2d_unsteady_Re10.py:132:133
--8<--
```

### 3.7 评估器构建

在训练过程中通常会按一定轮数间隔,用验证集(测试集)评估当前模型的训练情况,因此使用 `ppsci.validate.GeometryValidator` 构建评估器。

``` py linenums="144"
``` py linenums="135"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:144:162
examples/ldc/ldc2d_unsteady_Re10.py:135:153
--8<--
```

Expand All @@ -329,19 +330,19 @@ examples/ldc/ldc2d_unsteady_Re10.py:144:162

本文中的输出数据是一个区域内的二维点集,每个时刻 $t$ 的坐标是 $(x^t_i,y^t_i)$,对应值是 $(u^t_i, v^t_i, p^t_i)$,因此我们只需要将评估的输出数据按时刻保存成 16 个 **vtu格式** 文件,最后用可视化软件打开查看即可。代码如下:

``` py linenums="164"
``` py linenums="155"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:164:195
examples/ldc/ldc2d_unsteady_Re10.py:155:186
--8<--
```

### 3.9 模型训练、评估与可视化

完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练、评估、可视化。

``` py linenums="197"
``` py linenums="188"
--8<--
examples/ldc/ldc2d_unsteady_Re10.py:197:
examples/ldc/ldc2d_unsteady_Re10.py:188:209
--8<--
```

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

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

# set working condition
NU: 0.01
RHO: 1.0
NTIME_ALL: 16

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

# training settings
TRAIN:
epochs: 20000
iters_per_epoch: 1
eval_during_train: true
eval_freq: 200
lr_scheduler:
epochs: ${TRAIN.epochs}
iters_per_epoch: ${TRAIN.iters_per_epoch}
learning_rate: 0.001
weight:
pde: {"continuity": 0.0001,"momentum_x": 0.0001,"momentum_y": 0.0001}
pretrained_model_path: null
checkpoint_path: null

# evaluation settings
EVAL:
pretrained_model_path: null
batch_size:
residual_validator: 8192
Loading

0 comments on commit 58f79ad

Please sign in to comment.