bool Foam::SolverPerformance<Type>::operator!=
(
    const SolverPerformance<Type>& sp
) const
{
    return
    (
        solverName()      != sp.solverName()
     || fieldName()       != sp.fieldName()
     || initialResidual() != sp.initialResidual()
     || finalResidual()   != sp.finalResidual()
     || nIterations()     != sp.nIterations()
     || converged()       != sp.converged()
     || singular()        != sp.singular()
    );
}
autoPtr<coupledLduSolver> coupledLduSolver::New
(
    const word& fieldName,
    const coupledLduMatrix& matrix,
    const PtrList<FieldField<Field, scalar> >& bouCoeffs,
    const PtrList<FieldField<Field, scalar> >& intCoeffs,
    const lduInterfaceFieldPtrsListList& interfaces,
    const dictionary& dict
)
{
    word solverName(dict.lookup("solver"));

    if (matrix.diagonal())
    {
        return autoPtr<coupledLduSolver>
        (
            new coupledDiagonalSolver
            (
                fieldName,
                matrix,
                bouCoeffs,
                intCoeffs,
                interfaces
            )
        );
    }
    else if (matrix.symmetric())
    {
        symMatrixConstructorTable::iterator constructorIter =
            symMatrixConstructorTablePtr_->find(solverName);

        if (constructorIter == symMatrixConstructorTablePtr_->end())
        {
            FatalIOErrorIn
            (
                "autoPtr<coupledLduSolver> coupledLduSolver::New\n"
                "(\n"
                "    const word& fieldName,\n"
                "    const coupledLduMatrix& matrix,\n"
                "    const PtrList<FieldField<Field, scalar> >& bouCoeffs,\n"
                "    const PtrList<FieldField<Field, scalar> >& intCoeffs,\n"
                "    const lduInterfaceFieldPtrsListList& interfaces,\n"
                "    const dictionary& dict\n"
                ")",
                dict
            )   << "Unknown symmetric matrix solver " << solverName
                << endl << endl
                << "Valid symmetric matrix solvers are :" << endl
                << symMatrixConstructorTablePtr_->sortedToc()
                << exit(FatalIOError);
        }

        return autoPtr<coupledLduSolver>
        (
            constructorIter()
            (
                fieldName,
                matrix,
                bouCoeffs,
                intCoeffs,
                interfaces,
                dict
            )
        );
    }
    else if (matrix.asymmetric())
    {
        asymMatrixConstructorTable::iterator constructorIter =
            asymMatrixConstructorTablePtr_->find(solverName);

        if (constructorIter == asymMatrixConstructorTablePtr_->end())
        {
            FatalIOErrorIn
            (
                "autoPtr<coupledLduSolver> coupledLduSolver::New\n"
                "(\n"
                "    const word& fieldName,\n"
                "    const coupledLduMatrix& matrix,\n"
                "    const PtrList<FieldField<Field, scalar> >& bouCoeffs,\n"
                "    const PtrList<FieldField<Field, scalar> >& intCoeffs,\n"
                "    const lduInterfaceFieldPtrsListList& interfaces,\n"
                "    const dictionary& dict\n"
                ")",
                dict
            )   << "Unknown asymmetric matrix solver " << solverName
                << endl << endl
                << "Valid asymmetric matrix solvers are :" << endl
                << asymMatrixConstructorTablePtr_->sortedToc()
                << exit(FatalIOError);
        }

        return autoPtr<coupledLduSolver>
        (
            constructorIter()
            (
                fieldName,
                matrix,
                bouCoeffs,
                intCoeffs,
                interfaces,
                dict
            )
        );
    }
    else
    {
        FatalErrorIn
        (
            "autoPtr<coupledLduSolver> coupledLduSolver::New\n"
            "(\n"
            "    const word& fieldName,\n"
            "    const coupledLduMatrix& matrix,\n"
            "    const direction cmpt,\n"
            "    const PtrList<FieldField<Field, scalar> >& bouCoeffs,\n"
            "    const PtrList<FieldField<Field, scalar> >& intCoeffs,\n"
            "    const lduInterfaceFieldPtrsListList& interfaces,\n"
            "    const dictionary& dict\n"
            ")"
        )   << "cannot solve incomplete matrix, "
               "no diagonal or off-diagonal coefficient"
            << exit(FatalError);

        return autoPtr<coupledLduSolver>(NULL);
    }
}
Exemple #3
0
Foam::autoPtr<Foam::lduMatrix::solver> Foam::lduMatrix::solver::New
(
    const word& fieldName,
    const lduMatrix& matrix,
    const FieldField<Field, scalar>& coupleBouCoeffs,
    const FieldField<Field, scalar>& coupleIntCoeffs,
    const lduInterfaceFieldPtrsList& interfaces,
    const dictionary& dict
)
{
    word solverName(dict.lookup("solver"));

    if (matrix.diagonal())
    {
        return autoPtr<lduSolver>
        (
            new diagonalSolver
            (
                fieldName,
                matrix,
                coupleBouCoeffs,
                coupleIntCoeffs,
                interfaces,
                dict
            )
        );
    }
    else if (matrix.symmetric())
    {
        symMatrixConstructorTable::iterator constructorIter =
            symMatrixConstructorTablePtr_->find(solverName);

        if (constructorIter == symMatrixConstructorTablePtr_->end())
        {
            FatalIOErrorIn
            (
                "lduSolver::New", dict
            )   << "Unknown symmetric matrix solver " << solverName << nl << nl
                << "Valid symmetric matrix solvers are :" << endl
                << symMatrixConstructorTablePtr_->toc()
                << exit(FatalIOError);
        }

        return autoPtr<lduSolver>
        (
            constructorIter()
            (
                fieldName,
                matrix,
                coupleBouCoeffs,
                coupleIntCoeffs,
                interfaces,
                dict
            )
        );
    }
    else if (matrix.asymmetric())
    {
        asymMatrixConstructorTable::iterator constructorIter =
            asymMatrixConstructorTablePtr_->find(solverName);

        if (constructorIter == asymMatrixConstructorTablePtr_->end())
        {
            FatalIOErrorIn
            (
                "lduSolver::New", dict
            )   << "Unknown asymmetric matrix solver " << solverName << nl << nl
                << "Valid asymmetric matrix solvers are :" << endl
                << asymMatrixConstructorTablePtr_->toc()
                << exit(FatalIOError);
        }

        return autoPtr<lduSolver>
        (
            constructorIter()
            (
                fieldName,
                matrix,
                coupleBouCoeffs,
                coupleIntCoeffs,
                interfaces,
                dict
            )
        );
    }
    else
    {
        FatalIOErrorIn
        (
            "lduSolver::New", dict
        )   << "cannot solve incomplete matrix, "
               "no diagonal or off-diagonal coefficient"
            << exit(FatalIOError);

        return autoPtr<lduSolver>(NULL);
    }
}