Ejemplo n.º 1
0
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];
    }
}
Ejemplo n.º 2
0
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];
        }
    }

}