1% Allen-Cahn on a closed surface: interfaces form, then coarsen.
2%
3% du/dt = eps2*lap_g(u) + u - u^3
4%
5% Same scheme as models/schnakenberg.m.
7function [U, u] = init(noise)
8 U = analys(noise);
9 u = synth(U);
10end
12function [Un, u] = step(U, lam, filt, gx, gy, gz, p1, p2, q2, r, jhat, eps2, dt, niter)
13 u = synth(U);
15 Bu = U + dt * analys(u - u.^3);
17 % Mean-J preconditioning -- see models/schnakenberg.m.
18 lamJ = lam ./ jhat;
19 Un = Bu ./ (1 + (dt * eps2) * lamJ);
21 for k = 1:niter
22 % dlap = lap_g - lap_s, evaluated at the current iterate in flux form
23 % (see models/schnakenberg.m, docs/richardson-iteration.md and
24 % docs/reduced-transforms.md for the derivation; the grouped calls run
25 % the gradient syntheses and the flux analyses as batched dispatches).
26 Fu = Un .* filt;
27 vtu = dthetac(Fu);
28 vpu = dphic(Fu);
29 [Ftu, Fpu] = synth(vtu, vpu);
30 Pu = p1 .* Ftu + p2 .* Fpu;
31 Qu = p2 .* Ftu + q2 .* Fpu;
32 PAu = analys(Pu);
33 Pcu = PAu .* filt;
34 scu = dthetac(Pcu);
35 Lu = synth(scu);
36 dQu = dphig(Qu);
37 lapu = r .* (Lu + dQu);
38 dLu = (analys(lapu) + lamJ .* Un) .* filt;
40 Un = (Bu + (dt * eps2) * dLu) ./ (1 + (dt * eps2) * lamJ);
41 end
42end