In [1]:
import torch
from pina.problem import SpatialProblem, TimeDependentProblem
from pina.equation import Equation, FixedValue, FixedGradient, FixedFlux
from pina.geometry import CartesianDomain
from pina.model import FeedForward
from pina.operators import grad, laplacian
from pina import Condition, Trainer
from pina.solvers import PINN
from pytorch_lightning.callbacks import Callback, Timer 
from pytorch_lightning import seed_everything
from pina.plotter import Plotter 
$$ \begin{cases} \frac{\partial u}{\partial t} - \alpha \frac{\partial ^2 u}{\partial x^2} = f \\ u(a,t) = u(b,t) = 0, \partial \Omega\\ u(.,t) = u_0(x) = \exp(-x^2), \Omega\\ \end{cases} $$
In [2]:
class Heat1DEquation(SpatialProblem, TimeDependentProblem):
    output_variables = ['u']
    spatial_domain = CartesianDomain({'x': [0, 1]})
    temporal_domain = CartesianDomain({'t': [0, 1]})
    
    def pde (input_, output_):
        alpha =0.08
        u_t = grad(output_, input_, components=['u'], d=['t'])
        u_x = grad(output_, input_, components=['u'], d=['x'])
        u_xx = grad(u_x, input_, components=['dudx'], d=['x'])
        return u_t - alpha*u_xx
    
    def initial_condition(input_, output_):
        u_0 = torch.exp(-input_.extract(['x'])**2)
        return output_.extract(['u']) - u_0
    
    conditions = {
        'Dirichlet1': Condition(location=CartesianDomain({'x': 0., 't':[0,1]}), equation=FixedValue(0.)),
        'Dirichlet2': Condition(location=CartesianDomain({'x': 1., 't':[0,1]}), equation=FixedValue(0.)),
        't0': Condition(location=CartesianDomain({'x': [0, 1], 't':0.}), equation=Equation(initial_condition)),
        'Domain': Condition(location=CartesianDomain({'x': [0, 1], 't':[0,1]}), equation=Equation(pde))
    }
In [8]:
heat = Heat1DEquation()
heat.discretise_domain(10000, "random", locations=['Dirichlet1', 'Dirichlet2', "t0", "Domain"])
In [9]:
model = FeedForward(
    layers=[50 for _ in range(20)],
    func=torch.nn.Tanh,
    output_dimensions=len(heat.output_variables),
    input_dimensions=len(heat.input_variables)
)
In [10]:
pinn = PINN(heat, model)
In [11]:
trainer = Trainer(
    solver=pinn,
    accelerator='cpu',
    enable_model_summary=False,
    max_epochs = 1000
)

trainer.train()
GPU available: False, used: False
TPU available: False, using: 0 TPU cores
HPU available: False, using: 0 HPUs
Training: |          | 0/? [00:00<?, ?it/s]
`Trainer.fit` stopped: `max_epochs=1000` reached.
In [12]:
plotter = Plotter()
plotter.plot(solver=pinn)
No description has been provided for this image
In [ ]: