void getInverseMatrix(const CellIter& c, FullMatrix<Scalar,SP,FortranOrdering>& Binv) const { // Binv = (N*lambda*K*N' + t*diag(A)*(I - Q*Q')*diag(A))/vol // ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ // precomputed: n_ precomputed: second_term_ // t = 6/dim * trace(lambda*K) int ci = c->index(); int nf = Binv.numRows(); ImmutableFortranMatrix n(nf, dim, &n_[ci][0]); ImmutableFortranMatrix t2(nf, nf, &second_term_[ci][0]); Binv = t2; ImmutableFortranMatrix lambdaK(dim, dim, lambdaK_.data()); SharedFortranMatrix T2(nf, dim, &t2_[0]); // T2 <- N*lambda*K matMulAdd_NN(Scalar(1.0), n, lambdaK, Scalar(0.0), T2); // Binv <- (T2*N' + t*Binv) / vol(c) // == (N*lambda*K*N' + t*(diag(A) * (I - Q*Q') * diag(A))) / vol(c) // // where t = 6/d * TRACE(lambda*K) (== 2*TRACE(lambda*K) for 3D). // Scalar t = Scalar(6.0) * trace(lambdaK) / dim; matMulAdd_NT(Scalar(1.0) / c->volume(), T2, n, t / c->volume(), Binv ); }