Skip to content

Commit 5e64483

Browse files
Merge pull request #321 from HydrogenSulfate/fix_cylinder2d_data
Fix cylinder2d and other details
2 parents 730faad + ff2fcc1 commit 5e64483

File tree

17 files changed

+126
-114
lines changed

17 files changed

+126
-114
lines changed

docs/zh/examples/cylinder2d_unsteady.md

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ $$
104104

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

107-
``` py linenums="32"
107+
``` py linenums="33"
108108
--8<--
109-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:32:35
109+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:33:36
110110
--8<--
111111
```
112112

@@ -118,9 +118,9 @@ examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:32:35
118118

119119
由于 2D-Cylinder 使用的是 Navier-Stokes 方程的2维瞬态形式,因此可以直接使用 PaddleScience 内置的 `NavierStokes`
120120

121-
``` py linenums="36"
121+
``` py linenums="37"
122122
--8<--
123-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:36:37
123+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:37:38
124124
--8<--
125125
```
126126

@@ -130,7 +130,7 @@ examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:36:37
130130

131131
本文中 2D-Cylinder 的计算域由 CSV 文件储存的点云构成,因此可以直接使用 PaddleScience 内置的点云几何 `PointCloud` 和时间域 `TimeDomain`,组合成时间-空间的 `TimeXGeometry` 计算域。
132132

133-
``` py linenums="39"
133+
``` py linenums="40"
134134
# set timestamps
135135
TIME_START, TIME_END = 1, 50
136136
NUM_TIMESTAMPS = 50
@@ -159,15 +159,20 @@ geom = {
159159
timestamps=np.concatenate((t0, train_timestamps), axis=0),
160160
),
161161
ppsci.geometry.PointCloud(
162-
"./datasets/domain_train.csv",
163-
("Points:0", "Points:1"),
164-
alias_dict={"Points:0": "x", "Points:1": "y"},
162+
reader.load_csv_file(
163+
"./datasets/domain_train.csv",
164+
("x", "y"),
165+
alias_dict={"x": "Points:0", "y": "Points:1"},
166+
),
167+
("x", "y"),
165168
),
166169
),
167-
"time_rect_eval": ppsci.geometry.PointCloud( # (1)
168-
"./datasets/domain_eval.csv",
170+
"time_rect_eval": ppsci.geometry.PointCloud(
171+
reader.load_csv_file(
172+
"./datasets/domain_eval.csv",
173+
("t", "x", "y"),
174+
),
169175
("t", "x", "y"),
170-
alias_dict={},
171176
),
172177
}
173178
```
@@ -232,19 +237,19 @@ geom = {
232237

233238
在定义约束之前,需要给每一种约束指定采样点个数,表示每一种约束在其对应计算域内采样数据的数量,以及通用的采样配置。
234239

235-
``` py linenums="79"
240+
``` py linenums="85"
236241
--8<--
237-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:79:86
242+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:85:92
238243
--8<--
239244
```
240245

241246
#### 3.4.1 内部点约束
242247

243248
以作用在流体域内部点上的 `InteriorConstraint` 为例,代码如下:
244249

245-
``` py linenums="88"
250+
``` py linenums="94"
246251
--8<--
247-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:88:100
252+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:94:106
248253
--8<--
249254
```
250255

@@ -262,87 +267,91 @@ examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:88:100
262267

263268
#### 3.4.2 边界约束
264269

265-
同理,我们还需要构建流体域的流入边界、流出边界、圆周边界共三个边界的 Dirichlet 边界约束。以 `bc_inlet_cylinder` 边界约束为例,由于作用区域是边界且边界上的数据由 CSV 文件记录,因此我们使用 `SupervisedConstraint` 类,并指定第一个参数为 CSV 文件的路径 `./datasets/domain_inlet_cylinder.csv`
270+
同理,我们还需要构建流体域的流入边界、流出边界、圆周边界共三个边界的 Dirichlet 边界约束。以 `bc_inlet_cylinder` 边界约束为例,由于作用区域是边界且边界上的数据由 CSV 文件记录,因此我们使用 `SupervisedConstraint` 类,并按照如下规则指定第一个参数 `dataloader_cfg` 配置字典:
271+
272+
- 该配置字典的第一个参数为包含 CSV 文件的路径 `./datasets/domain_inlet_cylinder.csv` 在内的配置字典;
273+
274+
- 该配置字典的第一个参数指定数据加载方式,此处我们使用 `IterableCSVDataset` 作为全量数据加载器;
266275

267-
第二个参数指定数据输入 $x$ 和 $y$ 在 CSV 文件中的字段名,分别为 `"Points:0"``"Points:1"`
276+
- 该配置字典的第二个参数指定数据的加载路径,此处填写 `./datasets/domain_inlet_cylinder.csv`
268277

269-
第三个参数指定约束目标值 $u$ 和 $v$ 在 CSV 文件中的字段名,分别为 `"U:0"``"U:1"`
278+
- 该配置字典的第三个参数指定要从文件中读取的输入列,对应转换后关键字,此处填写为 `("x", "y")`
270279

271-
考虑到同一个变量在不同 CSV 文件中可能具有不同的字段名,而且有的字段名过长在编写代码时容易写错,因此第四个参数用于指定字段别名,此处为 `{"Points:0": "x", "Points:1": "y", "U:0": "u", "U:1": "v"}`,表示读取数据后,将 `"Points:0"` 关键字重新命名为 `"x"`,将 `"Points:1"` 关键字重新命名为 `"y"`,将 `"U:0"` 关键字重新命名为 `"u"`,将 `"U:1"` 关键字重新命名为 `"v"`
280+
- 该配置字典的第四个参数指定要从文件中读取的标签列,对应转换后关键字,此处填写为 `("u", "v")`
272281

273-
第五个参数是在计算域上的采样配置,此处我们使用全量数据点训练,因此 `dataset` 字段设置为 "IterableNamedArrayDataset" 且 `iters_per_epoch` 也设置为 1,采样点数 `batch_size` 设为 161 * 30(表示一个时刻产生 161 个数据点,共有 30 个时刻)
282+
- 考虑到同一个变量在不同 CSV 文件中可能具有不同的字段名,而且有的字段名过长在编写代码时容易写错,因此该配置字典的第五个参数用于指定字段列的别名,此处填写为 `{"x": "Points:0", "y": "Points:1", "u": "U:0", "v": "U:1"}`
274283

275-
第六个参数是损失函数,此处我们选用常用的MSE函数,且 `reduction` 设置为 `"mean"`,即我们会将参与计算的所有数据点产生的损失项求和取平均
284+
- 该配置字典的第六个参数指定每个标签在计算损失时的权重,此处我们放大 "u" 和 "v" 的权重至 10,填写 `{"u": 10, "v": 10}`
276285

277-
第七个参数是权重系数,该配置可以精确调整每一个变量参与损失计算时的权重
286+
- 该配置字典的第七个参数指定数据读取是否涉及时间信息,此处我们设定为训练时间戳,即填写 `train_timestamps`
278287

279-
第八个参数是指定 CSV 文件的时刻信息,此处我们传入表示训练 30 个时刻的 `train_timestamps`
288+
第二个参数是损失函数,此处我们选用常用的MSE函数,且 `reduction` 设置为 `"mean"`,即我们会将参与计算的所有数据点产生的损失项求和取平均
280289

281-
第九个参数是约束条件的名字,我们需要给每一个约束条件命名,方便后续对其索引。此处我们命名为 "BC_inlet_cylinder" 即可。
290+
第三个参数是约束条件的名字,我们需要给每一个约束条件命名,方便后续对其索引。此处我们命名为 "BC_inlet_cylinder" 即可。
282291

283292
剩下的 `bc_outlet` 按照相同原理构建,代码如下所示:
284293

285-
``` py linenums="101"
294+
``` py linenums="107"
286295
--8<--
287-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:101:129
296+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:107:135
288297
--8<--
289298
```
290299

291300
#### 3.4.3 初值约束
292301

293302
对于 $t=t_0$ 时刻的流体域内的点,我们还需要对 $u$, $v$, $p$ 施加初值约束,代码如下:
294303

295-
``` py linenums="130"
304+
``` py linenums="136"
296305
--8<--
297-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:130:144
306+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:136:150
298307
--8<--
299308
```
300309

301310
#### 3.4.4 监督约束
302311

303312
本案例在流体域内部加入了一定数量的监督点来保证模型最终的收敛情况,因此最后还需要加入一个监督约束,数据同样来自 CSV 文件,代码如下:
304313

305-
``` py linenums="145"
314+
``` py linenums="151"
306315
--8<--
307-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:145:159
316+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:151:165
308317
--8<--
309318
```
310319

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

313-
``` py linenums="160"
322+
``` py linenums="166"
314323
--8<--
315-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:160:167
324+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:166:173
316325
--8<--
317326
```
318327

319328
### 3.5 超参数设定
320329

321330
接下来我们需要指定训练轮数和学习率,此处我们按实验经验,使用两万轮训练轮数,评估间隔为四百轮,学习率设为 0.001。
322331

323-
``` py linenums="169"
332+
``` py linenums="175"
324333
--8<--
325-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:169:171
334+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:175:177
326335
--8<--
327336
```
328337

329338
### 3.6 优化器构建
330339

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

333-
``` py linenums="173"
342+
``` py linenums="179"
334343
--8<--
335-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:173:174
344+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:179:180
336345
--8<--
337346
```
338347

339348
### 3.7 评估器构建
340349

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

343-
``` py linenums="176"
352+
``` py linenums="182"
344353
--8<--
345-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:176:192
354+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:182:198
346355
--8<--
347356
```
348357

@@ -364,19 +373,19 @@ examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:176:192
364373

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

367-
``` py linenums="194"
376+
``` py linenums="200"
368377
--8<--
369-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:194:205
378+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:200:212
370379
--8<--
371380
```
372381

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

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

377-
``` py linenums="207"
386+
``` py linenums="214"
378387
--8<--
379-
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:207:
388+
examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py:214:
380389
--8<--
381390
```
382391

examples/cylinder/2d_unsteady/cylinder2d_unsteady_Re100.py

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import ppsci
1818
from ppsci.utils import config
1919
from ppsci.utils import logger
20+
from ppsci.utils import reader
2021

2122
if __name__ == "__main__":
2223
args = config.parse_args()
@@ -64,23 +65,28 @@
6465
timestamps=np.concatenate((t0, train_timestamps), axis=0),
6566
),
6667
ppsci.geometry.PointCloud(
67-
"./datasets/domain_train.csv",
68-
["Points:0", "Points:1"],
69-
alias_dict={"Points:0": "x", "Points:1": "y"},
68+
reader.load_csv_file(
69+
"./datasets/domain_train.csv",
70+
("x", "y"),
71+
alias_dict={"x": "Points:0", "y": "Points:1"},
72+
),
73+
("x", "y"),
7074
),
7175
),
7276
"time_rect_eval": ppsci.geometry.PointCloud(
73-
"./datasets/cylinder2d_eval_points.csv",
74-
["t", "x", "y"],
75-
alias_dict={},
77+
reader.load_csv_file(
78+
"./datasets/domain_eval.csv",
79+
("t", "x", "y"),
80+
),
81+
("t", "x", "y"),
7682
),
7783
}
7884

7985
# set dataloader config
8086
ITERS_PER_EPOCH = 1
8187

8288
# pde/bc/sup constraint use t1~tn, initial constraint use t0
83-
NPOINT_PDE, ntime_pde = 9420, len(train_timestamps)
89+
NPOINT_PDE, NTIME_PDE = 9420, len(train_timestamps)
8490
NPOINT_INLET_CYLINDER = 161
8591
NPOINT_OUTLET = 81
8692
ALIAS_DICT = {"x": "Points:0", "y": "Points:1", "u": "U:0", "v": "U:1"}
@@ -92,7 +98,7 @@
9298
geom["time_rect"],
9399
{
94100
"dataset": "IterableNamedArrayDataset",
95-
"batch_size": NPOINT_PDE * ntime_pde,
101+
"batch_size": NPOINT_PDE * NTIME_PDE,
96102
"iters_per_epoch": ITERS_PER_EPOCH,
97103
},
98104
ppsci.loss.MSELoss("mean"),
@@ -103,8 +109,8 @@
103109
"dataset": {
104110
"name": "IterableCSVDataset",
105111
"file_path": "./datasets/domain_inlet_cylinder.csv",
106-
"input_keys": ["x", "y"],
107-
"label_keys": ["u", "v"],
112+
"input_keys": ("x", "y"),
113+
"label_keys": ("u", "v"),
108114
"alias_dict": ALIAS_DICT,
109115
"weight_dict": {"u": 10, "v": 10},
110116
"timestamps": train_timestamps,
@@ -118,8 +124,8 @@
118124
"dataset": {
119125
"name": "IterableCSVDataset",
120126
"file_path": "./datasets/domain_outlet.csv",
121-
"input_keys": ["x", "y"],
122-
"label_keys": ["p"],
127+
"input_keys": ("x", "y"),
128+
"label_keys": ("p",),
123129
"alias_dict": ALIAS_DICT,
124130
"timestamps": train_timestamps,
125131
},
@@ -132,8 +138,8 @@
132138
"dataset": {
133139
"name": "IterableCSVDataset",
134140
"file_path": "./datasets/initial/ic0.1.csv",
135-
"input_keys": ["x", "y"],
136-
"label_keys": ["u", "v", "p"],
141+
"input_keys": ("x", "y"),
142+
"label_keys": ("u", "v", "p"),
137143
"alias_dict": ALIAS_DICT,
138144
"weight_dict": {"u": 10, "v": 10, "p": 10},
139145
"timestamps": t0,
@@ -147,8 +153,8 @@
147153
"dataset": {
148154
"name": "IterableCSVDataset",
149155
"file_path": "./datasets/probe/probe1_50.csv",
150-
"input_keys": ["t", "x", "y"],
151-
"label_keys": ["u", "v"],
156+
"input_keys": ("t", "x", "y"),
157+
"label_keys": ("u", "v"),
152158
"alias_dict": ALIAS_DICT,
153159
"weight_dict": {"u": 10, "v": 10},
154160
"timestamps": train_timestamps,
@@ -193,14 +199,15 @@
193199

194200
# set visualizer(optional)
195201
vis_points = geom["time_rect_eval"].sample_interior(
196-
(NPOINT_PDE + NPOINT_INLET_CYLINDER + NPOINT_OUTLET) * NUM_TIMESTAMPS
202+
(NPOINT_PDE + NPOINT_INLET_CYLINDER + NPOINT_OUTLET) * NUM_TIMESTAMPS,
203+
evenly=True,
197204
)
198205
visualizer = {
199-
"visulzie_u": ppsci.visualize.VisualizerVtu(
206+
"visulzie_u_v_p": ppsci.visualize.VisualizerVtu(
200207
vis_points,
201208
{"u": lambda d: d["u"], "v": lambda d: d["v"], "p": lambda d: d["p"]},
202209
num_timestamps=NUM_TIMESTAMPS,
203-
prefix="result_u",
210+
prefix="result_u_v_p",
204211
)
205212
}
206213

examples/cylinder/2d_unsteady/download_dataset.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,15 @@
1313
# limitations under the License.
1414
"""This *.py file is an example of downloading data of the 2d-unsteady-cylinder–flow case"""
1515
import os
16-
import zipfile
16+
import tarfile
1717

1818
import wget
1919

20-
DATASETS = (
21-
"https://dataset.bj.bcebos.com/PaddleScience/cylinder2D_continuous/datasets.zip"
22-
)
20+
DATASETS = "https://paddle-org.bj.bcebos.com/paddlescience/datasets/cylinder2d_unsteady_Re100/cylinder2d_unsteady_Re100_dataset.tar"
2321

2422
dirname = os.path.dirname(os.path.abspath(__file__)) + "/"
2523
print("* Running [download_dataset.py]")
2624
wget.download(DATASETS, out=dirname)
2725

28-
with zipfile.ZipFile(dirname + "datasets.zip", "r") as zip_ref:
29-
zip_ref.extractall(dirname)
30-
print("\n" + "* Successfully Downloaded!")
31-
print("* Data is prepared here :" + dirname + "datasets/\n")
26+
with tarfile.open("cylinder2d_unsteady_Re100_dataset.tar") as tar:
27+
tar.extractall()

examples/darcy/darcy2d.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,14 @@ def poisson_ref_compute_func(_in):
131131
optimizer = ppsci.optimizer.Adam(1e-3)((model,))
132132

133133
# set validator
134-
NPOINTS_EVAL = NPOINT_PDE
134+
NPOINT_EVAL = NPOINT_PDE
135135
residual_validator = ppsci.validate.GeometryValidator(
136136
equation["Poisson"].equations,
137137
{"poisson": poisson_ref_compute_func},
138138
geom["rect"],
139139
{
140140
"dataset": "NamedArrayDataset",
141-
"total_size": NPOINTS_EVAL,
141+
"total_size": NPOINT_EVAL,
142142
"batch_size": 8192,
143143
"sampler": {"name": "BatchSampler"},
144144
},

examples/ldc/ldc2d_steady_Re10.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@
122122
optimizer = ppsci.optimizer.Adam(lr_scheduler)((model,))
123123

124124
# set validator
125-
NPOINTS_EVAL = NPOINT_PDE
125+
NPOINT_EVAL = NPOINT_PDE
126126
residual_validator = ppsci.validate.GeometryValidator(
127127
equation["NavierStokes"].equations,
128128
{"momentum_x": 0, "continuity": 0, "momentum_y": 0},
129129
geom["rect"],
130130
{
131131
"dataset": "NamedArrayDataset",
132-
"total_size": NPOINTS_EVAL,
132+
"total_size": NPOINT_EVAL,
133133
"batch_size": 8192,
134134
"sampler": {"name": "BatchSampler"},
135135
},

0 commit comments

Comments
 (0)