Skip to content

anypinn.cli.scaffold.poisson_2d.ode

Poisson 2D — PDE problem definition.

GRID_SIZE = 30 module-attribute

create_data_module_csv(hp: PINNHyperparameters) -> Poisson2DDataModule

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def create_data_module_csv(hp: PINNHyperparameters) -> Poisson2DDataModule:
    return Poisson2DDataModule(
        hp=hp,
        grid_size=GRID_SIZE,
        validation=_validation,
    )

create_data_module_synthetic(hp: PINNHyperparameters) -> Poisson2DDataModule

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def create_data_module_synthetic(hp: PINNHyperparameters) -> Poisson2DDataModule:
    return Poisson2DDataModule(
        hp=hp,
        grid_size=GRID_SIZE,
        validation=_validation,
    )

create_problem_forward(hp: PINNHyperparameters) -> Problem

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def create_problem_forward(hp: PINNHyperparameters) -> Problem:
    encode = FourierEncoding(num_frequencies=6)
    field_u = Field(
        config=MLPConfig(
            in_dim=encode.out_dim(2),
            out_dim=1,
            hidden_layers=hp.fields_config.hidden_layers,
            activation=hp.fields_config.activation,
            output_activation=hp.fields_config.output_activation,
            encode=encode,
        )
    )
    fields = FieldsRegistry({U_KEY: field_u})
    params = ParamsRegistry({})

    bcs = [
        DirichletBCConstraint(
            BoundaryCondition(sampler=_left_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_left",
            weight=10.0,
        ),
        DirichletBCConstraint(
            BoundaryCondition(sampler=_right_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_right",
            weight=10.0,
        ),
        DirichletBCConstraint(
            BoundaryCondition(sampler=_bottom_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_bottom",
            weight=10.0,
        ),
        DirichletBCConstraint(
            BoundaryCondition(sampler=_top_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_top",
            weight=10.0,
        ),
    ]

    pde = PDEResidualConstraint(
        fields=fields,
        params=params,
        residual_fn=poisson_residual_forward,
        log_key="loss/pde_residual",
        weight=1.0,
    )

    return Problem(
        constraints=[pde, *bcs],
        criterion=build_criterion(hp.criterion),
        fields=fields,
        params=params,
    )

create_problem_inverse(hp: PINNHyperparameters) -> Problem

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def create_problem_inverse(hp: PINNHyperparameters) -> Problem:
    encode = FourierEncoding(num_frequencies=6)
    field_u = Field(
        config=MLPConfig(
            in_dim=encode.out_dim(2),
            out_dim=1,
            hidden_layers=hp.fields_config.hidden_layers,
            activation=hp.fields_config.activation,
            output_activation=hp.fields_config.output_activation,
            encode=encode,
        )
    )
    param_k = Parameter(
        config=ScalarConfig(init_value=hp.params_config.init_value),
    )

    fields = FieldsRegistry({U_KEY: field_u})
    params = ParamsRegistry({K_KEY: param_k})

    bcs = [
        DirichletBCConstraint(
            BoundaryCondition(sampler=_left_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_left",
            weight=10.0,
        ),
        DirichletBCConstraint(
            BoundaryCondition(sampler=_right_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_right",
            weight=10.0,
        ),
        DirichletBCConstraint(
            BoundaryCondition(sampler=_bottom_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_bottom",
            weight=10.0,
        ),
        DirichletBCConstraint(
            BoundaryCondition(sampler=_top_edge, value=_zero, n_pts=100),
            field_u,
            log_key="loss/bc_top",
            weight=10.0,
        ),
    ]

    pde = PDEResidualConstraint(
        fields=fields,
        params=params,
        residual_fn=poisson_residual_inverse,
        log_key="loss/pde_residual",
        weight=1.0,
    )

    data = DataConstraint(
        fields=fields,
        params=params,
        predict_data=predict_data,
        weight=5.0,
    )

    return Problem(
        constraints=[pde, *bcs, data],
        criterion=build_criterion(hp.criterion),
        fields=fields,
        params=params,
    )

poisson_residual_forward(x: Tensor, fields: FieldsRegistry, _params: ParamsRegistry) -> Tensor

PDE residual: -nabla^2(u) - f = 0 (k=1 known).

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def poisson_residual_forward(x: Tensor, fields: FieldsRegistry, _params: ParamsRegistry) -> Tensor:
    """PDE residual: -nabla^2(u) - f = 0 (k=1 known)."""
    u = fields[U_KEY](x)
    return -laplacian(u, x) - source_fn(x)

poisson_residual_inverse(x: Tensor, fields: FieldsRegistry, params: ParamsRegistry) -> Tensor

PDE residual: -k * nabla^2(u) - f = 0 (k learned).

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def poisson_residual_inverse(x: Tensor, fields: FieldsRegistry, params: ParamsRegistry) -> Tensor:
    """PDE residual: -k * nabla^2(u) - f = 0 (k learned)."""
    u = fields[U_KEY](x)
    k = params[K_KEY](x)
    return -k * laplacian(u, x) - source_fn(x)

predict_data(x_data: Tensor, fields: FieldsRegistry, _params: ParamsRegistry) -> Tensor

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def predict_data(x_data: Tensor, fields: FieldsRegistry, _params: ParamsRegistry) -> Tensor:
    return fields[U_KEY](x_data).unsqueeze(1)

source_fn(x: Tensor) -> Tensor

Source term f(x,y) = -2 pi^2 sin(pix) sin(piy).

Source code in src/anypinn/cli/scaffold/poisson_2d/ode.py
def source_fn(x: Tensor) -> Tensor:
    """Source term f(x,y) = -2 pi^2 sin(pi*x) sin(pi*y)."""
    return -2 * math.pi**2 * torch.sin(math.pi * x[:, 0:1]) * torch.sin(math.pi * x[:, 1:2])