14 const std::vector<double>& ,
15 const std::vector<double>& Tcurr,
16 std::vector<double>& Tnext)
const
18 const std::size_t N = g.
Nx;
19 const double dx = g.
dx;
22 const double r = D * dt / (dx * dx);
23 const double alpha = r / 2.0;
30 if (Tnext.size() != N)
35 const std::size_t M = N - 2;
40 std::vector<double> a(M, -alpha);
41 std::vector<double> b(M, 1.0 + r);
42 std::vector<double> c(M, -alpha);
43 std::vector<double> d(M, 0.0);
48 for (std::size_t j = 0; j < M; ++j)
50 std::size_t i = j + 1;
51 d[j] = alpha * Tcurr[i - 1] + (1.0 - r) * Tcurr[i] + alpha * Tcurr[i + 1];
57 d[0] += alpha * Tcurr[0];
58 d[M - 1] += alpha * Tcurr[N - 1];
63 for (std::size_t i = 1; i < M; ++i)
65 double m = a[i] / b[i - 1];
71 std::vector<double> x(M);
72 x[M - 1] = d[M - 1] / b[M - 1];
74 for (std::size_t i = M - 1; i-- > 0;)
76 x[i] = (d[i] - c[i] * x[i + 1]) / b[i];
81 for (std::size_t j = 0; j < M; ++j)
void step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const override
Advance one time step using Crank-Nicolson scheme.