""" Definition of the diffusion-reaction problem.""" import torch from pina import Condition from pina.problem import SpatialProblem, TimeDependentProblem from pina.equation.equation import Equation from pina.domain import CartesianDomain from pina.operators import grad def diffusion_reaction(input_, output_): """ Implementation of the diffusion-reaction equation. """ x = input_.extract('x') t = input_.extract('t') u_t = grad(output_, input_, d='t') u_x = grad(output_, input_, d='x') u_xx = grad(u_x, input_, d='x') r = torch.exp(-t) * (1.5 * torch.sin(2*x) + (8/3) * torch.sin(3*x) + (15/4) * torch.sin(4*x) + (63/8) * torch.sin(8*x)) return u_t - u_xx - r class DiffusionReactionProblem(TimeDependentProblem, SpatialProblem): """ Implementation of the diffusion-reaction problem on the spatial interval [-pi, pi] and temporal interval [0,1]. """ output_variables = ['u'] spatial_domain = CartesianDomain({'x': [-torch.pi, torch.pi]}) temporal_domain = CartesianDomain({'t': [0, 1]}) conditions = { 'D': Condition( domain=CartesianDomain({'x': [-torch.pi, torch.pi], 't': [0, 1]}), equation=Equation(diffusion_reaction)) } def _solution(self, pts): t = pts.extract('t') x = pts.extract('x') return torch.exp(-t) * ( torch.sin(x) + (1/2)*torch.sin(2*x) + (1/3)*torch.sin(3*x) + (1/4)*torch.sin(4*x) + (1/8)*torch.sin(8*x) )