55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
// Copyright (c) 2010-2020, Lawrence Livermore National Security, LLC. Produced
|
|
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
|
|
// LICENSE and NOTICE for details. LLNL-CODE-806117.
|
|
//
|
|
// This file is part of the MFEM library. For more information and source code
|
|
// availability visit https://mfem.org.
|
|
//
|
|
// MFEM is free software; you can redistribute it and/or modify it under the
|
|
// terms of the BSD-3 license. We welcome feedback and contributions, see file
|
|
// CONTRIBUTING.md for details.
|
|
|
|
#include "mfem.hpp"
|
|
#include "catch.hpp"
|
|
|
|
#ifdef MFEM_USE_EXCEPTIONS
|
|
|
|
using namespace mfem;
|
|
|
|
TEST_CASE("Operator", "[Operator]")
|
|
{
|
|
// Define diagonal sparse matrix
|
|
Vector diag(5);
|
|
diag = 12.34;
|
|
|
|
SparseMatrix A(diag);
|
|
|
|
CGSolver cg;
|
|
cg.SetOperator(A);
|
|
|
|
SECTION("ProductNotIterative")
|
|
{
|
|
// When cg is in a product (on the right), we require cg->iterative_mode to be false.
|
|
|
|
ProductOperator *product = NULL;
|
|
RAPOperator *rap = NULL;
|
|
TripleProductOperator *triple = NULL;
|
|
|
|
// First, test that the failing version throws an exception.
|
|
cg.iterative_mode = true;
|
|
REQUIRE_THROWS(product = new ProductOperator(&A, &cg, false, false));
|
|
REQUIRE_THROWS(triple = new TripleProductOperator(&A, &cg, &cg, false, false,
|
|
false));
|
|
REQUIRE_THROWS(rap = new RAPOperator(A, cg, cg));
|
|
|
|
// Second, test that the correct version does not throw.
|
|
cg.iterative_mode = false;
|
|
REQUIRE_NOTHROW(product = new ProductOperator(&A, &cg, false, false));
|
|
REQUIRE_NOTHROW(triple = new TripleProductOperator(&A, &cg, &cg, false, false,
|
|
false));
|
|
REQUIRE_NOTHROW(rap = new RAPOperator(A, cg, cg));
|
|
}
|
|
}
|
|
|
|
#endif // MFEM_USE_EXCEPTIONS
|