Skip to content

feat(boundaries): Robin BC (a·u + b·∂u/∂n = c) #62

Description

@kylebeggs

What's missing

AbstractBC is exactly Periodic, Dirichlet, Neumann, Interface. _require_face_bc (src/boundaries.jl:82) errors loudly for anything else, so a Robin condition is a genuine extension rather than a config option — it needs _bc_sign, _offset_ghost! and a _require_face_bc method, plus the matching fold_bc! row and the operator_diagonal correction.

Why (downstream)

Robin is the native boundary condition for trans-wall exchange in the microvascular model, in two places:

  1. Perivascular wall coupling. Flux across the capillary wall is g·(C_blood − C_tissue) — a conductance times a concentration difference. That is a Robin condition on the tissue side, currently hand-assembled as a separate coupling operator with its own implicit/explicit split.
  2. Proton leak regularization. The transported proton field H is no-flux on every boundary, which makes its Laplacian pure-Neumann and therefore singular. A small Robin leak gH is what regularizes it. Right now that regularization is a bespoke term rather than a boundary condition, so it is invisible to operator_diagonal and to multigrid.

Both are the same mathematical object, and both would be one BC type if MFO had it.

Sketch

Robin(a, b, c)      # a·u + b·∂u/∂n = c ; Dirichlet is b=0, Neumann is a=0

Worth deciding up front whether a, b, c may be per-face Fields or must be scalars. The downstream conductance g is genuinely per-face (it varies with local vessel geometry), so scalar-only would leave the main use case unserved — but per-face coefficients interact with the affine boundary_rhs lift, so it's a real design call, not a detail.

Payoff beyond the downstream package

operator_diagonal gaining a Robin case is what lets MultigridPreconditioner precondition wall-coupled systems. That matters: the downstream steady solve currently reaches for ILU(0) on an assembled sparse W precisely because unpreconditioned matrix-free GMRES spent ~750 iterations per linear solve. The system is diffusion-dominated — ideal MG territory — so a Robin-aware diagonal is the step that makes MFO's native preconditioner applicable and lets the sparse-matrix detour go away.


🤖 Beep — Claude wrote this one; Kyle is not yet talking to himself in his own issue tracker.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions