function uu(a, b, D, f, u0) {
let N = 30;
let pi = Math.PI;
let exp = Math.exp;
let sin = Math.sin;
let cos = Math.cos;
let u;
if (!insulate_left && !insulate_right) {
let f_coeffs = d3
.range(1, N + 1)
.map(k => int(x => f(x) * sin(k * pi * x), 0, 1, 1e-10, 10, 5));
let u0_coeffs = d3
.range(1, N + 1)
.map(k => int(x => u0(x) * sin(k * pi * x), 0, 1, 1e-10, 10, 5));
u = (x, t) => {
return (
a +
(b - a) * x +
2 *
d3.sum(
d3.range(1, N + 1).map(function(k) {
let dkp2 = D * k ** 2 * pi ** 2;
let e = exp(-dkp2 * t);
return (
((f_coeffs[k - 1] * (1 - e)) / dkp2 +
e * (((-1) ** k * b - a) / (k * pi) + u0_coeffs[k - 1])) *
sin(k * pi * x)
);
})
)
);
};
} else if (!insulate_left && insulate_right) {
let f_coeffs = d3
.range(1, N + 1)
.map(k => int(x => f(x) * sin((k - 1 / 2) * pi * x), 0, 1, 1e-10, 10, 5));
let u0_coeffs = d3
.range(1, N + 1)
.map(k =>
int(x => (u0(x) - a) * sin((k - 1 / 2) * pi * x), 0, 1, 1e-10, 10, 5)
);
u = (x, t) => {
return (
a +
2 *
d3.sum(
d3.range(1, N + 1).map(function(k) {
let d2km1p2 = (D * (2 * k - 1) ** 2 * pi ** 2) / 4;
let e = exp(-d2km1p2 * t);
return (
((f_coeffs[k - 1] * 4 * (1 - e)) /
(D * (pi - 2 * k * pi) ** 2) +
e * u0_coeffs[k - 1]) *
sin((k - 1 / 2) * pi * x)
);
})
)
);
};
} else if (insulate_left && !insulate_right) {
let f_coeffs = d3
.range(1, N + 1)
.map(k => int(x => f(x) * cos((k - 1 / 2) * pi * x), 0, 1, 1e-10, 10, 5));
let u0_coeffs = d3
.range(1, N + 1)
.map(k =>
int(x => (u0(x) - b) * cos((k - 1 / 2) * pi * x), 0, 1, 1e-10, 10, 5)
);
u = (x, t) => {
return (
b +
2 *
d3.sum(
d3.range(1, N + 1).map(function(k) {
let d2km1p2 = (D * (2 * k - 1) ** 2 * pi ** 2) / 4;
let e = exp(-d2km1p2 * t);
return (
((f_coeffs[k - 1] * 4 * (1 - e)) /
(D * (pi - 2 * k * pi) ** 2) +
e * u0_coeffs[k - 1]) *
cos((k - 1 / 2) * pi * x)
);
})
)
);
};
} else if (insulate_left && insulate_right) {
let f_coeffs = d3
.range(1, N + 1)
.map(k => int(x => f(x) * cos(k * pi * x), 0, 1, 1e-10, 10, 5));
let u0_coeffs = d3
.range(1, N + 1)
.map(k => int(x => u0(x) * cos(k * pi * x), 0, 1, 1e-10, 10, 5));
let f_int = int(f, 0, 1, 1e-10, 10, 5);
let u0_int = int(u0, 0, 1, 1e-10, 10, 5);
u = (x, t) => {
return (
u0_int +
t * f_int +
2 *
d3.sum(
d3.range(1, N + 1).map(function(k) {
let dkp2 = D * k ** 2 * pi ** 2;
let e = exp(-dkp2 * t);
return (
((f_coeffs[k - 1] * (1 - e)) / dkp2 + e * u0_coeffs[k - 1]) *
cos(k * pi * x)
);
})
)
);
};
}
return u;
}