Enhancing Equations
- add init file - add docs - fixing bug System of equation, replace torch.stack with torch.hstack - add tests
This commit is contained in:
committed by
Nicola Demo
parent
09f04008b5
commit
b9ddea827b
43
tests/test_equations/test_equation.py
Normal file
43
tests/test_equations/test_equation.py
Normal file
@@ -0,0 +1,43 @@
|
||||
from pina.equation import Equation
|
||||
from pina.operators import grad, nabla
|
||||
from pina import LabelTensor
|
||||
import torch
|
||||
import pytest
|
||||
|
||||
def eq1(input_, output_):
|
||||
u_grad = grad(output_, input_)
|
||||
u1_xx = grad(u_grad, input_, components=['du1dx'], d=['x'])
|
||||
u2_xy = grad(u_grad, input_, components=['du2dx'], d=['y'])
|
||||
return torch.hstack([u1_xx , u2_xy])
|
||||
|
||||
def eq2(input_, output_):
|
||||
force_term = (torch.sin(input_.extract(['x'])*torch.pi) *
|
||||
torch.sin(input_.extract(['y'])*torch.pi))
|
||||
nabla_u = nabla(output_.extract(['u1']), input_)
|
||||
return nabla_u - force_term
|
||||
|
||||
def foo():
|
||||
pass
|
||||
|
||||
def test_constructor():
|
||||
Equation(eq1)
|
||||
Equation(eq2)
|
||||
with pytest.raises(ValueError):
|
||||
Equation([1, 2, 4])
|
||||
with pytest.raises(ValueError):
|
||||
Equation(foo())
|
||||
|
||||
def test_residual():
|
||||
eq_1 = Equation(eq1)
|
||||
eq_2 = Equation(eq2)
|
||||
|
||||
pts = LabelTensor(torch.rand(10, 2), labels=['x', 'y'])
|
||||
pts.requires_grad = True
|
||||
u = torch.pow(pts, 2)
|
||||
u.labels = ['u1', 'u2']
|
||||
|
||||
eq_1_res = eq_1.residual(pts, u)
|
||||
eq_2_res = eq_2.residual(pts, u)
|
||||
|
||||
assert eq_1_res.shape == torch.Size([10, 2])
|
||||
assert eq_2_res.shape == torch.Size([10, 1])
|
||||
47
tests/test_equations/test_systemequation.py
Normal file
47
tests/test_equations/test_systemequation.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from pina.equation import SystemEquation
|
||||
from pina.operators import grad, nabla
|
||||
from pina import LabelTensor
|
||||
import torch
|
||||
import pytest
|
||||
|
||||
def eq1(input_, output_):
|
||||
u_grad = grad(output_, input_)
|
||||
u1_xx = grad(u_grad, input_, components=['du1dx'], d=['x'])
|
||||
u2_xy = grad(u_grad, input_, components=['du2dx'], d=['y'])
|
||||
return torch.hstack([u1_xx , u2_xy])
|
||||
|
||||
def eq2(input_, output_):
|
||||
force_term = (torch.sin(input_.extract(['x'])*torch.pi) *
|
||||
torch.sin(input_.extract(['y'])*torch.pi))
|
||||
nabla_u = nabla(output_.extract(['u1']), input_)
|
||||
return nabla_u - force_term
|
||||
|
||||
def foo():
|
||||
pass
|
||||
|
||||
def test_constructor():
|
||||
SystemEquation([eq1, eq2])
|
||||
SystemEquation([eq1, eq2], reduction='sum')
|
||||
with pytest.raises(NotImplementedError):
|
||||
SystemEquation([eq1, eq2], reduction='foo')
|
||||
with pytest.raises(ValueError):
|
||||
SystemEquation(foo)
|
||||
|
||||
def test_residual():
|
||||
|
||||
pts = LabelTensor(torch.rand(10, 2), labels=['x', 'y'])
|
||||
pts.requires_grad = True
|
||||
u = torch.pow(pts, 2)
|
||||
u.labels = ['u1', 'u2']
|
||||
|
||||
eq_1 = SystemEquation([eq1, eq2])
|
||||
res = eq_1.residual(pts, u)
|
||||
assert res.shape == torch.Size([10])
|
||||
|
||||
eq_1 = SystemEquation([eq1, eq2], reduction='sum')
|
||||
res = eq_1.residual(pts, u)
|
||||
assert res.shape == torch.Size([10])
|
||||
|
||||
eq_1 = SystemEquation([eq1, eq2], reduction='none')
|
||||
res = eq_1.residual(pts, u)
|
||||
assert res.shape == torch.Size([10, 3])
|
||||
Reference in New Issue
Block a user