-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpinn_soft.py
102 lines (79 loc) · 2.83 KB
/
pinn_soft.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import sys
import os
os.environ["DDE_BACKEND"] = "pytorch" # Export Enviromental variable to use PyTorch
import deepxde as dde
import numpy as np
import pandas as pd
from deepxde.backend import torch
job_id = int(sys.argv[1])
dde.config.set_random_seed(job_id)
def pde(x, y):
"""
PDE residual definition
x[:, 0:1] - x-variable
x[:, 1:2] - eta
x[:, 2:3] - t-variable
"""
dy_t = dde.grad.jacobian(y, x, i=0, j=2)
dy_xx = dde.grad.hessian(y, x, i=0, j=0)
dy_xxxx = dde.grad.hessian(dy_xx, x)
return (
dy_t
+ x[:, 1:2]*dy_xxxx
)
def dy(x, y):
dy_x = dde.grad.jacobian(y, x, j=0)
return dy_x
def ddy(x, y):
return dde.grad.hessian(y, x, i=0, j=0)
def dddy(x, y):
dy_xx = dde.grad.jacobian(y, x, j=0)
dy_xxx = dde.grad.hessian(dy_xx, x, j=0)
return dy_xxx
def boundary_l(x, on_boundary):
return on_boundary and dde.utils.isclose(x[0], 0)
def boundary_r(x, on_boundary):
return on_boundary and dde.utils.isclose(x[0], 1)
if __name__ == "__main__":
print('Initialisation... SOFT \n')
results_folder = f'run_soft_{job_id}'
if not os.path.exists(results_folder):
os.makedirs(results_folder)
# One set is 1000 iterations
sets_adam = 40
sets_lbfgs = 5
geom = dde.geometry.Rectangle([0, 0.0001], [1, 10]) # X x [\eta]
timedomain = dde.geometry.TimeDomain(0, 10) # T
geomtime = dde.geometry.GeometryXTime(geom, timedomain) # X x [\eta] x T
bc1 = dde.icbc.DirichletBC(geomtime, lambda x: 0, boundary_l)
bc2 = dde.icbc.OperatorBC(geomtime, lambda x, y, _: dy(x, y) - torch.cos(x[:, 2:3]), boundary_l)
bc3 = dde.icbc.OperatorBC(geomtime, lambda x, y, _: ddy(x, y), boundary_r)
bc4 = dde.icbc.OperatorBC(geomtime, lambda x, y, _: dddy(x, y), boundary_r)
ic = dde.icbc.IC(
geomtime,
lambda x: 0,
lambda _, on_initial: on_initial,
)
data = dde.data.TimePDE(
geomtime,
pde,
[bc1, bc2, bc3, bc4, ic],
num_domain=6000,
num_boundary=2000,
num_initial=2000,
num_test=10000,
)
net = dde.nn.FNN([3] + [20] * 4 + [1], "tanh", "Glorot uniform")
model = dde.Model(data, net)
total_sets = sets_adam + sets_lbfgs
print('Training Adam optimiser... \n')
model.compile("adam", lr=0.001)
for s in range(sets_adam):
losshistory, train_state = model.train(iterations=1000, model_save_path=f'./{results_folder}/model')
print('Training L-BFGS optimiser... \n')
for s in range(sets_lbfgs):
dde.optimizers.set_LBFGS_options(maxiter=1000)
model.compile("L-BFGS")
losshistory, train_state = model.train(iterations=1000, model_save_path=f'./{results_folder}/model')
print('Saving data... \n')
dde.saveplot(losshistory, train_state, issave=True, isplot=True, output_dir=f'./{results_folder}')