function compute_fields() {
const {R_val, U_val, R_grad, U_grad} = fields;
const {c_rep, mu_k, sigma_k, w_k} = params;
R_val.fill(repulsion_f(0.0, c_rep)[0]);
U_val.fill(peak_f(0.0, mu_k, sigma_k, w_k)[0]);
R_grad.fill(0); U_grad.fill(0);
for (let i=0; i<point_n-1; ++i)
for (let j=i+1; j<point_n; ++j) {
let rx = points[i*2] - points[j*2];
let ry = points[i*2+1] - points[j*2+1];
const r = Math.sqrt(rx*rx + ry*ry) + 1e-20;
rx /= r; ry /= r;
if (r < 1.0) {
const [R, dR] = repulsion_f(r, c_rep);
add_xy(R_grad, i, rx, ry, dR);
add_xy(R_grad, j, rx, ry, -dR);
R_val[i] += R; R_val[j] += R;
}
const [K, dK] = peak_f(r, mu_k, sigma_k, w_k);
add_xy(U_grad, i, rx, ry, dK);
add_xy(U_grad, j, rx, ry, -dK);
U_val[i] += K; U_val[j] += K;
}
}