40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
import torch
|
|
|
|
from pina.problem import TimeDependentProblem, SpatialProblem
|
|
from pina.operators import grad
|
|
from pina import Condition
|
|
from pina.span import Span
|
|
|
|
|
|
class Burgers1D(TimeDependentProblem, SpatialProblem):
|
|
|
|
spatial_variables = ['x']
|
|
temporal_variable = ['t']
|
|
output_variables = ['u']
|
|
domain = Span({'x': [-1, 1], 't': [0, 1]})
|
|
|
|
def burger_equation(input_, output_):
|
|
grad_u = grad(output_.extract(['u']), input_)
|
|
grad_x = grad_u.extract(['x'])
|
|
grad_t = grad_u.extract(['t'])
|
|
gradgrad_u_x = grad(grad_u.extract(['x']), input_)
|
|
return (
|
|
grad_u.extract(['t']) + output_.extract(['u'])*grad_u.extract(['x']) -
|
|
(0.01/torch.pi)*gradgrad_u_x.extract(['x'])
|
|
)
|
|
|
|
def nil_dirichlet(input_, output_):
|
|
u_expected = 0.0
|
|
return output_.extract(['u']) - u_expected
|
|
|
|
def initial_condition(input_, output_):
|
|
u_expected = -torch.sin(torch.pi*input_.extract(['x']))
|
|
return output_.extract(['u']) - u_expected
|
|
|
|
conditions = {
|
|
'gamma1': Condition(Span({'x': -1, 't': [0, 1]}), nil_dirichlet),
|
|
'gamma2': Condition(Span({'x': 1, 't': [0, 1]}), nil_dirichlet),
|
|
't0': Condition(Span({'x': [-1, 1], 't': 0}), initial_condition),
|
|
'D': Condition(Span({'x': [-1, 1], 't': [0, 1]}), burger_equation),
|
|
}
|