Skip to content

Commit b41530d

Browse files
add burgers problem
1 parent 44d5ec5 commit b41530d

6 files changed

Lines changed: 115 additions & 1 deletion

File tree

docs/source/_rst/_code.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ Problem Zoo
256256
AcousticWaveProblem <problem/zoo/acoustic_wave_problem.rst>
257257
AdvectionProblem <problem/zoo/advection_problem.rst>
258258
AllenCahnProblem <problem/zoo/allen_cahn_problem.rst>
259+
BurgersProblem <problem/zoo/burgers_problem.rst>
259260
DiffusionReactionProblem <problem/zoo/diffusion_reaction_problem.rst>
260261
HelmholtzProblem <problem/zoo/helmholtz_problem.rst>
261262
InversePoisson2DSquareProblem <problem/zoo/inverse_poisson_problem.rst>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Burgers Problem
2+
=====================
3+
.. currentmodule:: pina.problem.zoo.burgers_problem
4+
5+
.. automodule:: pina._src.problem.zoo.burgers_problem
6+
7+
.. autoclass:: pina._src.problem.zoo.burgers_problem.BurgersProblem
8+
:members:
9+
:show-inheritance:

pina/_src/equation/zoo/burgers_equation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def __init__(self, nu):
3030
check_consistency(nu, (float, int))
3131
if nu < 0:
3232
raise ValueError(
33-
"The viscosity ``nu`` must be a positive float or int."
33+
"The viscosity ``nu`` must be a non-negative float or int."
3434
)
3535

3636
# Store viscosity coefficient
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
"""Formulation of the burgers problem."""
2+
3+
import torch
4+
from pina._src.problem.time_dependent_problem import TimeDependentProblem
5+
from pina._src.domain.cartesian_domain import CartesianDomain
6+
from pina._src.problem.spatial_problem import SpatialProblem
7+
from pina._src.condition.condition import Condition
8+
from pina._src.core.utils import check_consistency
9+
from pina._src.equation.equation import Equation
10+
from pina._src.equation.zoo.fixed_value import FixedValue
11+
from pina._src.equation.zoo.burgers_equation import BurgersEquation
12+
13+
14+
def initial_condition(input_, output_):
15+
"""
16+
Definition of the initial condition of the burgers problem.
17+
18+
:param LabelTensor input_: The input data of the problem.
19+
:param LabelTensor output_: The output data of the problem.
20+
:return: The residual of the initial condition.
21+
:rtype: LabelTensor
22+
"""
23+
return output_ + torch.sin(torch.pi * input_["x"])
24+
25+
26+
class BurgersProblem(TimeDependentProblem, SpatialProblem):
27+
r"""
28+
Implementation of the burgers problem in the spatial interval
29+
:math:`[-1, 1]` and temporal interval :math:`[0, 1]`.
30+
31+
.. seealso::
32+
33+
**Original reference**: Raissi M., Perdikaris P., Karniadakis G. E.
34+
(2017).
35+
*Physics Informed Deep Learning (Part I): Data-driven Solutions of
36+
Nonlinear Partial Differential Equations*.
37+
DOI: `10.48550 <https://doi.org/10.48550/arXiv.1711.10561>`_.
38+
39+
:Example:
40+
41+
>>> problem = BurgersProblem()
42+
"""
43+
44+
output_variables = ["u"]
45+
spatial_domain = CartesianDomain({"x": [-1, 1]})
46+
temporal_domain = CartesianDomain({"t": [0, 1]})
47+
48+
domains = {
49+
"D": spatial_domain.update(temporal_domain),
50+
"t0": spatial_domain.update(CartesianDomain({"t": 0})),
51+
"boundary": spatial_domain.partial().update(temporal_domain),
52+
}
53+
54+
conditions = {
55+
"boundary": Condition(domain="boundary", equation=FixedValue(0.0)),
56+
"t0": Condition(domain="t0", equation=Equation(initial_condition)),
57+
}
58+
59+
def __init__(self, nu=0):
60+
"""
61+
Initialization of the :class:`BurgersProblem` class.
62+
63+
:param nu: The viscosity coefficient.
64+
:type nu: float | int
65+
:raises ValueError: If ``nu`` is not a float or an int.
66+
:raises ValueError: If ``nu`` is negative.
67+
"""
68+
super().__init__()
69+
70+
# Check consistency
71+
check_consistency(nu, (float, int))
72+
if nu < 0:
73+
raise ValueError(
74+
"The viscosity ``nu`` must be a non-negative float or int."
75+
)
76+
77+
self.conditions["D"] = Condition(
78+
domain="D", equation=BurgersEquation(nu)
79+
)

pina/problem/zoo.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"DiffusionReactionProblem",
1010
"InversePoisson2DSquareProblem",
1111
"AcousticWaveProblem",
12+
"BurgersProblem",
1213
]
1314

1415
from pina._src.problem.zoo.acoustic_wave_problem import AcousticWaveProblem
@@ -17,6 +18,7 @@
1718
from pina._src.problem.zoo.advection_problem import AdvectionProblem
1819
from pina._src.problem.zoo.helmholtz_problem import HelmholtzProblem
1920
from pina._src.problem.zoo.poisson_problem import Poisson2DSquareProblem
21+
from pina._src.problem.zoo.burgers_problem import BurgersProblem
2022
from pina._src.problem.zoo.diffusion_reaction_problem import (
2123
DiffusionReactionProblem,
2224
)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import pytest
2+
from pina.problem.zoo import BurgersProblem
3+
from pina.problem import SpatialProblem, TimeDependentProblem
4+
5+
6+
@pytest.mark.parametrize("nu", [0.1, 1])
7+
def test_constructor(nu):
8+
9+
problem = BurgersProblem(nu=nu)
10+
problem.discretise_domain(n=10, mode="random", domains=None)
11+
assert problem.are_all_domains_discretised
12+
assert isinstance(problem, SpatialProblem)
13+
assert isinstance(problem, TimeDependentProblem)
14+
assert hasattr(problem, "conditions")
15+
assert isinstance(problem.conditions, dict)
16+
17+
# Should fail if nu is not a float or int
18+
with pytest.raises(ValueError):
19+
BurgersProblem(nu="invalid")
20+
21+
# Should fail if nu is negative
22+
with pytest.raises(ValueError):
23+
BurgersProblem(nu=-0.1)

0 commit comments

Comments
 (0)