system_matrix.add (-std::pow(time_step*theta,2), tmp_matrix);
// Then, we compute the right-hand side vector $-F_h(U^{n,l})$.
+ //
+ // We have to first build up the matrix
+ // $M+k^2\theta^2 A$, which we put into <code>tmp_matrix</code>
+ // use it to compute a contribution to the right hand side vector, and
+ // then build the matrix $M-k^2\theta(1-\theta) A$. We could
+ // build it in the same way as before, i.e., using code like
+ // @code
+ // tmp_matrix.copy_from (mass_matrix);
+ // tmp_matrix.add (-std::pow(time_step,2)*theta*(1-theta), laplace_matrix);
+ // @endcode
+ // but we can save the expense of the <code>copy_from</code> operation
+ // by starting from what is already in the <code>tmp_matrix</code>
+ // variable (i.e., $M+k^2\theta^2 A$) and subtracting from this
+ // $k^2\theta^2 A+k^2\theta(1-\theta) A=k^2\theta A$ when computing the
+ // second matrix:
system_rhs = 0;
tmp_matrix.copy_from (mass_matrix);
tmp_matrix.vmult (tmp_vector, solution);
system_rhs += tmp_vector;
- tmp_matrix.copy_from (mass_matrix);
- tmp_matrix.add (-std::pow(time_step,2)*theta*(1-theta), laplace_matrix);
+
+ tmp_matrix.add(-std::pow(time_step, 2) * theta, laplace_matrix);
tmp_matrix.vmult (tmp_vector, old_solution);
system_rhs -= tmp_vector;