The documentation for PeriodicBoundaryCondition (https://reference.wolfram.com/language/ref/PeriodicBoundaryCondition.html) has: Where it says $u ( x_{target} ) = a + b\ u ( f ( x_{target} ) )$, I think it should instead say $u( f ( x_{target} ) ) = a + b\ u ( x_{target} )$. I could be wrong but I believe this is demonstrated by this example: https://wolfram.com/xid/0bswu24h9fy656tmxe-jnf5k3. I have copied the code here, only modifying it from $a=-1/20$ to $a=0$ because this will demonstrate what I am talking about:
Ω = Rectangle[{0, 0}, {2, 1}];
pde = -\!\(
\*SubsuperscriptBox[\(∇\), \({x, y}\), \(2\)]\(u[x, y]\)\) ==
If[1.25 <= x <= 1.75 && 0.25 <= y <= 0.5, 1., 0.];
Subscript[Γ, D] =
DirichletCondition[u[x, y] == 0, (y == 0 || y == 1) && 0 < x <= 2];
a = 0; b = 2;
pbc = PeriodicBoundaryCondition[a + b*u[x, y], x == 0 && 0 <= y <= 1,
TranslationTransform[{2, 0}]];
ufun = NDSolveValue[{pde, pbc, Subscript[Γ, D]},
u, {x, y} ∈ Ω];
ContourPlot[ufun[x, y], {x, y} ∈ Ω,
ColorFunction -> "TemperatureMap", AspectRatio -> Automatic]
The left-hand edge, from $(0,0)$ to $(0,1)$, is the target (i.e. where the predicate in PeriodicBoundaryCondition is true) and the right-hand edge, from $(2,0)$ to $(2,1)$, is the source because $x_{source} = f (x_{target})$. Now as $b=2$ (and $a=0$) by the current definition we would expect $u(x_{target}) = 2 u(x_{source})$, meaning the values at the left-hand edge should be twice as large as those on the right-hand edge. But they're not. Instead, they are half as large. This implies that the definition should instead be $u( f ( x_{target} ) ) = a + b u ( x_{target} )$. I have explored this for many hours with many examples and keep arriving at the same conclusion.
PeriodicBoundaryCondition
. A triangle mesh and a symmetrized PBC, may be required. You can look at my answer 223465 as well as the other answers. $\endgroup$ – Tim Laska Aug 10 '20 at 15:59