Foam::Vandermonde::Vandermonde ( const scalarSquareMatrix& A, const bool checkVandermonde ) : scalarDiagonalMatrix(A.m()), m_(A.m()) { if (checkVandermonde) { for (label i = 0; i < m_; i++) { for (label j = 0; i < m_; j++) { if (A[i][j] != pow(A[1][j], i)) { FatalErrorInFunction << "Source matrix not of Vandermonde type." << nl << abort(FatalError); } } } } for (label i = 0; i < m_; i++) { (*this)[i] = A[1][i]; } }
void multiply ( scalarSquareMatrix& ans, // value changed in return const scalarDiagonalMatrix& A, const scalarSquareMatrix& B, const scalarDiagonalMatrix& C ) { if (A.size() != B.n()) { FatalErrorIn ( "multiply(" "scalarRectangularMatrix& answer)," "const DiagonalMatrix<scalar>& A, " "const scalarRectangularMatrix& B, " "const DiagonalMatrix<scalar>& C" ) << "A and B must have identical inner dimensions but A.m = " << A.size() << " and B.n = " << B.n() << abort(FatalError); } if (B.m() != C.size()) { FatalErrorIn ( "multiply(" "scalarRectangularMatrix& answer)," "const DiagonalMatrix<scalar>& A, " "const scalarRectangularMatrix& B, " "const DiagonalMatrix<scalar>& C" ) << "B and C must have identical inner dimensions but B.m = " << B.m() << " and C.n = " << C.size() << abort(FatalError); } ans = scalarSquareMatrix(B.n(), B.n(), scalar(0)); for (register label i = 0; i < A.size(); i++) { for (register label j = 0; j < C.size(); j++) { ans[i][j] = A[i] * B[i][j] * C[j]; } } }