|
1 | 1 | import warnings |
2 | 2 | import torch |
3 | | -import scipy.io as io |
4 | | -import numpy as np |
5 | | -from scipy.io import loadmat |
6 | 3 |
|
7 | 4 | warnings.filterwarnings('ignore') |
8 | 5 |
|
9 | 6 | from pina.problem import SpatialProblem, TimeDependentProblem |
10 | 7 | from pina.operator import grad, laplacian |
11 | | -from pina import Condition, LabelTensor |
| 8 | +from pina import Condition |
12 | 9 | from pina.domain import CartesianDomain |
13 | | -from pina.equation import Equation, FixedValue, FixedGradient |
| 10 | +from pina.equation import Equation, FixedValue |
14 | 11 | import matplotlib.pyplot as plt |
15 | 12 |
|
16 | 13 | from pina import Trainer |
17 | | -from pina.solver import PINN, RBAPINN, SelfAdaptivePINN as SAPINN |
| 14 | +from pina.solver import PINN |
18 | 15 | from pina.model import FeedForward |
19 | | -from pina.callback import MetricTracker, PINAProgressBar, SwitchOptimizer |
20 | | -from pina.loss import LpLoss |
| 16 | +from pina.callback import MetricTracker |
21 | 17 |
|
22 | | -from tsproblem import TimeSpaceProblem |
23 | 18 | from pytorch_lightning import seed_everything |
24 | 19 | from pina.optim import TorchOptimizer |
25 | 20 |
|
| 21 | +class TimeSpaceProblem(TimeDependentProblem, SpatialProblem): |
| 22 | + output_variables = ["u"] |
| 23 | + spatial_domain = CartesianDomain({"x": [0, 1]}) |
| 24 | + temporal_domain = CartesianDomain({"t": [0, 1]}) |
| 25 | + |
| 26 | + # defining the ode equation |
| 27 | + def equation_4p5(input_, output_): |
| 28 | + # computing the derivative |
| 29 | + u_t = grad(output_, input_, components=["u"], d=["t"]) |
| 30 | + nabla_u = laplacian(output_, input_, components=["u"], d=["x"]) |
| 31 | + u = output_.extract(["u"]) |
| 32 | + gamma = 2 |
| 33 | + |
| 34 | + res = u_t - gamma * nabla_u + u**3 - u |
| 35 | + return res |
| 36 | + |
| 37 | + # conditions to hold |
| 38 | + # specify the fixed gradient direction (ex x,y...) |
| 39 | + conditions = { |
| 40 | + "step1": Condition( |
| 41 | + domain=CartesianDomain({"x": [0,0.249], "t": 0}), |
| 42 | + equation=FixedValue(0)), |
| 43 | + "step2": Condition( |
| 44 | + domain=CartesianDomain({"x": [0.25,0.75], "t": 0}), |
| 45 | + equation=FixedValue(1)), |
| 46 | + "step3": Condition( |
| 47 | + domain=CartesianDomain({"x": [0.751,1], "t": 0}), |
| 48 | + equation=FixedValue(0)), |
| 49 | + "L_u": Condition( |
| 50 | + domain=CartesianDomain({"x":[0,1],"t":[0,1]}), |
| 51 | + equation=Equation(equation_4p5)), |
| 52 | + "u0":Condition( |
| 53 | + domain=CartesianDomain({"x":0,"t":[0,1]}), |
| 54 | + equation= FixedValue(0)), |
| 55 | + "u1":Condition( |
| 56 | + domain=CartesianDomain({"x":1,"t":[0,1]}), |
| 57 | + equation= FixedValue(0)) |
| 58 | + } |
| 59 | + |
| 60 | + |
26 | 61 | problem = TimeSpaceProblem() |
27 | 62 |
|
28 | 63 | problem.discretise_domain(4000, "random", domains=["L_u"]) |
29 | 64 | problem.discretise_domain(250, "grid", domains=["step1", "step3"]) |
30 | | -problem.discretise_domain(251, "grid", domains=["step2"]) |
| 65 | +problem.discretise_domain(501, "grid", domains=["step2"]) |
31 | 66 | problem.discretise_domain(1001, "grid", domains=["u0","u1"]) |
32 | 67 |
|
33 | | -#print("Input points:", problem.input_pts) |
34 | | - |
35 | | -# from pina import Plotter |
36 | | - |
37 | | -# pl = Plotter() |
38 | | -# pl.plot_samples(problem=problem)#,variables='spatial') |
39 | | - |
40 | | - |
41 | 68 | # setting the seed for reproducibility |
42 | 69 | seed_everything(42, workers=True) |
43 | 70 |
|
|
51 | 78 | pinn = PINN( |
52 | 79 | problem, |
53 | 80 | model, |
54 | | - optimizer=TorchOptimizer(torch.optim.Adam, lr=1e-4, weight_decay=0), |
| 81 | + #optimizer=TorchOptimizer(torch.optim.Adam, lr=1e-4, weight_decay=0), |
55 | 82 | loss=torch.nn.MSELoss() |
56 | 83 | ) |
57 | 84 |
|
58 | 85 | from lightning.pytorch.loggers import TensorBoardLogger |
59 | 86 | trainer = Trainer( |
60 | 87 | solver=pinn, |
61 | | - max_epochs=10000,#logger=TensorBoardLogger('tutorial_logs'), |
| 88 | + max_epochs=10000, |
62 | 89 | accelerator="cpu", |
63 | 90 | logger=TensorBoardLogger(save_dir="training_logs"), |
64 | 91 | enable_model_summary=False, |
|
73 | 100 | trainer.train() |
74 | 101 | trainer.test() |
75 | 102 |
|
76 | | -input_test = CartesianDomain({"x": [0, 1], "t": [0,1]}).sample(1001, mode='grid') |
77 | | -#input_test = CartesianDomain({"x": [0.1, 20], "t": [1, 70]}).sample(100, mode='grid') |
| 103 | +input_test = CartesianDomain({"x": [0, 1], "t": [0, 1]}).sample(501, mode='grid') |
78 | 104 | output_test = pinn(input_test) |
79 | 105 | u = output_test.extract(["u"]) |
80 | 106 |
|
81 | 107 | plt.figure(figsize=(6, 5)) |
82 | | -plt.scatter(input_test.extract(["x"]), input_test.extract(["t"]), c=u.detach().numpy(), cmap='coolwarm') |
| 108 | +plt.scatter(input_test.extract(["x"]), input_test.extract(["t"]), c=u.detach().numpy()) |
83 | 109 | plt.colorbar() |
84 | 110 | plt.title('u') |
85 | 111 | plt.grid() |
|
0 commit comments