Skip to content

Commit 0b67435

Browse files
【PPSCI Export&Infer No.20】shock_wave (#890)
* add shock_wave export&infer * Update examples/shock_wave/shock_wave.py * Update examples/shock_wave/shock_wave.py --------- Co-authored-by: HydrogenSulfate <[email protected]>
1 parent baba485 commit 0b67435

File tree

4 files changed

+177
-1
lines changed

4 files changed

+177
-1
lines changed

docs/zh/examples/shock_wave.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,32 @@
2828
python shock_wave.py -cn=shock_wave_Ma0.728 mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/shockwave/shock_wave_Ma0728_pretrained.pdparams
2929
```
3030

31+
=== "模型导出命令"
32+
33+
=== "Ma=2.0"
34+
35+
``` sh
36+
python shock_wave.py mode=export
37+
```
38+
=== "Ma=0.728"
39+
40+
``` sh
41+
python shock_wave.py -cn=shock_wave_Ma0.728 mode=export
42+
```
43+
44+
=== "模型推理命令"
45+
46+
=== "Ma=2.0"
47+
48+
``` sh
49+
python shock_wave.py mode=infer
50+
```
51+
=== "Ma=0.728"
52+
53+
``` sh
54+
python shock_wave.py -cn=shock_wave_Ma0.728 mode=infer
55+
```
56+
3157
## 1. 背景简介
3258

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

examples/shock_wave/conf/shock_wave_Ma0.728.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ hydra:
1111
- TRAIN.checkpoint_path
1212
- TRAIN.pretrained_model_path
1313
- EVAL.pretrained_model_path
14+
- INFER.pretrained_model_path
15+
- INFER.export_path
1416
- mode
1517
- output_dir
1618
- log_freq
@@ -70,3 +72,20 @@ TRAIN:
7072
EVAL:
7173
pretrained_model_path: null
7274
eval_with_no_grad: true
75+
76+
INFER:
77+
pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/shockwave/shock_wave_Ma0728_pretrained.pdparams
78+
export_path: ./inference/shock_wave_Ma0.728
79+
pdmodel_path: ${INFER.export_path}.pdmodel
80+
pdiparams_path: ${INFER.export_path}.pdiparams
81+
device: gpu
82+
engine: native
83+
precision: fp32
84+
onnx_path: ${INFER.export_path}.onnx
85+
ir_optim: true
86+
min_subgraph_size: 10
87+
gpu_mem: 4000
88+
gpu_id: 0
89+
max_batch_size: 256
90+
num_cpu_threads: 4
91+
batch_size: 256

examples/shock_wave/conf/shock_wave_Ma2.0.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ hydra:
1111
- TRAIN.checkpoint_path
1212
- TRAIN.pretrained_model_path
1313
- EVAL.pretrained_model_path
14+
- INFER.pretrained_model_path
15+
- INFER.export_path
1416
- mode
1517
- output_dir
1618
- log_freq
@@ -70,3 +72,20 @@ TRAIN:
7072
EVAL:
7173
pretrained_model_path: null
7274
eval_with_no_grad: true
75+
76+
INFER:
77+
pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/shockwave/shock_wave_Ma2_pretrained.pdparams
78+
export_path: ./inference/shock_wave_Ma2.0
79+
pdmodel_path: ${INFER.export_path}.pdmodel
80+
pdiparams_path: ${INFER.export_path}.pdiparams
81+
device: gpu
82+
engine: native
83+
precision: fp32
84+
onnx_path: ${INFER.export_path}.onnx
85+
ir_optim: true
86+
min_subgraph_size: 10
87+
gpu_mem: 4000
88+
gpu_id: 0
89+
max_batch_size: 256
90+
num_cpu_threads: 4
91+
batch_size: 256

examples/shock_wave/shock_wave.py

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,112 @@ def evaluate(cfg: DictConfig):
518518
plt.savefig(osp.join(cfg.output_dir, f"shock_wave(Ma_{cfg.MA:.3f}).png"))
519519

520520

521+
def export(cfg: DictConfig):
522+
from paddle.static import InputSpec
523+
524+
# set models
525+
model = ppsci.arch.MLP(**cfg.MODEL)
526+
solver = ppsci.solver.Solver(
527+
model,
528+
pretrained_model_path=cfg.INFER.pretrained_model_path,
529+
)
530+
531+
# export models
532+
input_spec = [
533+
{key: InputSpec([None, 1], "float32", name=key) for key in model.input_keys},
534+
]
535+
solver.export(input_spec, cfg.INFER.export_path)
536+
537+
538+
def inference(cfg: DictConfig):
539+
from deploy.python_infer import pinn_predictor
540+
541+
# set model predictor
542+
predictor = pinn_predictor.PINNPredictor(cfg)
543+
544+
# visualize prediction
545+
t = np.linspace(cfg.T, cfg.T, 1, dtype=np.float32)
546+
x = np.linspace(0.0, cfg.Lx, cfg.Nd, dtype=np.float32)
547+
y = np.linspace(0.0, cfg.Ly, cfg.Nd, dtype=np.float32)
548+
_, x_grid, y_grid = np.meshgrid(t, x, y)
549+
550+
x_test = misc.cartesian_product(t, x, y)
551+
x_test_dict = misc.convert_to_dict(
552+
x_test,
553+
cfg.MODEL.input_keys,
554+
)
555+
output_dict = predictor.predict(
556+
x_test_dict,
557+
cfg.INFER.batch_size,
558+
)
559+
560+
# mapping data to cfg.MODEL.output_keys
561+
output_dict = {
562+
store_key: output_dict[infer_key]
563+
for store_key, infer_key in zip(cfg.MODEL.output_keys, output_dict.keys())
564+
}
565+
566+
u, v, p, rho = (
567+
output_dict["u"],
568+
output_dict["v"],
569+
output_dict["p"],
570+
output_dict["rho"],
571+
)
572+
573+
zero_mask = (
574+
(x_test[:, 1] - cfg.rx) ** 2 + (x_test[:, 2] - cfg.ry) ** 2
575+
) < cfg.rd**2
576+
u[zero_mask] = 0
577+
v[zero_mask] = 0
578+
p[zero_mask] = 0
579+
rho[zero_mask] = 0
580+
581+
u = u.reshape(cfg.Nd, cfg.Nd)
582+
v = v.reshape(cfg.Nd, cfg.Nd)
583+
p = p.reshape(cfg.Nd, cfg.Nd)
584+
rho = rho.reshape(cfg.Nd, cfg.Nd)
585+
586+
fig, ax = plt.subplots(2, 2, sharex=True, sharey=True, figsize=(15, 15))
587+
588+
plt.subplot(2, 2, 1)
589+
plt.contourf(x_grid[:, 0, :], y_grid[:, 0, :], u * 241.315, 60)
590+
plt.title("U m/s")
591+
plt.xlabel("x")
592+
plt.ylabel("y")
593+
axe = plt.gca()
594+
axe.set_aspect(1)
595+
plt.colorbar()
596+
597+
plt.subplot(2, 2, 2)
598+
plt.contourf(x_grid[:, 0, :], y_grid[:, 0, :], v * 241.315, 60)
599+
plt.title("V m/s")
600+
plt.xlabel("x")
601+
plt.ylabel("y")
602+
axe = plt.gca()
603+
axe.set_aspect(1)
604+
plt.colorbar()
605+
606+
plt.subplot(2, 2, 3)
607+
plt.contourf(x_grid[:, 0, :], y_grid[:, 0, :], p * 33775, 60)
608+
plt.title("P Pa")
609+
plt.xlabel("x")
610+
plt.ylabel("y")
611+
axe = plt.gca()
612+
axe.set_aspect(1)
613+
plt.colorbar()
614+
615+
plt.subplot(2, 2, 4)
616+
plt.contourf(x_grid[:, 0, :], y_grid[:, 0, :], rho * 0.58, 60)
617+
plt.title("Rho kg/m^3")
618+
plt.xlabel("x")
619+
plt.ylabel("y")
620+
axe = plt.gca()
621+
axe.set_aspect(1)
622+
plt.colorbar()
623+
624+
plt.savefig(osp.join(cfg.output_dir, f"shock_wave(Ma_{cfg.MA:.3f}).png"))
625+
626+
521627
@hydra.main(
522628
version_base=None, config_path="./conf", config_name="shock_wave_Ma2.0.yaml"
523629
)
@@ -526,8 +632,14 @@ def main(cfg: DictConfig):
526632
train(cfg)
527633
elif cfg.mode == "eval":
528634
evaluate(cfg)
635+
elif cfg.mode == "export":
636+
export(cfg)
637+
elif cfg.mode == "infer":
638+
inference(cfg)
529639
else:
530-
raise ValueError(f"cfg.mode should in ['train', 'eval'], but got '{cfg.mode}'")
640+
raise ValueError(
641+
f"cfg.mode should in ['train', 'eval', 'export', 'infer'], but got '{cfg.mode}'"
642+
)
531643

532644

533645
if __name__ == "__main__":

0 commit comments

Comments
 (0)