Conjugate gradient solve
64-bitThe displacement of every node under the loads.
repeat until ‖r‖ ÷ ‖b‖ < 1e-8
Every vector is a 64-bit array. The answer is as accurate as the stopping rule: the residual is under one hundred-millionth of the load.
for (; it < cap; it++) {
let rn = 0; for (let i = 0; i < n; i++) rn += r[i] * r[i];
res = Math.sqrt(rn) / bn;
if (res < tol) break;
if (onProgress && Date.now() - t0 > 200) { t0 = Date.now(); onProgress(Math.min(0.99, Math.log(res) / Math.log(tol)), `${label}: iteration ${it}, residual ${res.toExponential(1)}`); } // i18n-ignore: progress label, never shown (the workers pass on only the fraction)
if (cancelled && (it & 15) === 0 && cancelled()) throw new Error('Cancelled');
applyK(model, p, q, scale); proj(q);
let pq = 0; for (let i = 0; i < n; i++) pq += p[i] * q[i];
if (!(pq > 0)) break;
const a = rz / pq;
for (let i = 0; i < n; i++) { u[i] += a * p[i]; r[i] -= a * q[i]; }
prec(r, z);
let rz2 = 0; for (let i = 0; i < n; i++) rz2 += r[i] * z[i];
const beta = rz2 / rz; rz = rz2;
for (let i = 0; i < n; i++) p[i] = z[i] + beta * p[i];
}
return { u, iterations: it, residual: res, converged: res < tol };