awslabs / palace

3D finite element solver for computational electromagnetics
https://awslabs.github.io/palace/dev
Apache License 2.0
237 stars 49 forks source link

AMS without Multigrid fails #216

Closed hughcars closed 6 months ago

hughcars commented 6 months ago

Setting "MGMaxLevels": 1 in the cavity_pec.json example causes an error to throw in rap.cpp:

Verification failed: (cA) is false:
 --> ParOperator::ParallelAssemble requires A as an hypre::HypreCSRMatrix or ceed::Operator!
 ... in function: mfem::HypreParMatrix &palace::ParOperator::ParallelAssemble(bool) const
 ... in file: /Users/hughcars/AWS/palace/palace/linalg/rap.cpp:92

Backtrace:
0) [0x107eb22df]: mfem::mfem_error(char const*)
1) [0x102d93147]: palace::ParOperator::ParallelAssemble(bool) const
2) [0x102d466fb]: palace::ParOperator::StealParallelAssemble(bool) const
3) [0x102d45c07]: palace::HypreAmsSolver::ConstructAuxiliaryMatrices(palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&)
4) [0x102d45247]: palace::HypreAmsSolver::HypreAmsSolver(palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int, int, bool, bool, bool, int)
5) [0x102d462b7]: palace::HypreAmsSolver::HypreAmsSolver(palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int, int, bool, bool, bool, int)
6) [0x102d77503]: palace::HypreAmsSolver::HypreAmsSolver(palace::IoData const&, bool, palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int)
7) [0x102d77123]: std::__1::__unique_if<palace::HypreAmsSolver>::__unique_single std::__1::make_unique[abi:ue170006]<palace::HypreAmsSolver, palace::IoData const&, bool, palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int const&>(palace::IoData const&, bool&&, palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int const&)
8) [0x102d7952b]: auto palace::(anonymous namespace)::MakeWrapperSolver<palace::ComplexOperator, palace::HypreAmsSolver, palace::IoData const&, bool, palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int const&>(palace::IoData const&, bool&&, palace::FiniteElementSpace&, palace::AuxiliaryFiniteElementSpace&, int const&)
9) [0x102d74ca7]: std::__1::unique_ptr<palace::Solver<palace::ComplexOperator>, std::__1::default_delete<palace::Solver<palace::ComplexOperator>>> palace::(anonymous namespace)::ConfigurePreconditionerSolver<palace::ComplexOperator>(ompi_communicator_t*, palace::IoData const&, palace::FiniteElementSpaceHierarchy&, palace::AuxiliaryFiniteElementSpaceHierarchy*)
10) [0x102d755c7]: palace::BaseKspSolver<palace::ComplexOperator>::BaseKspSolver(palace::IoData const&, palace::FiniteElementSpaceHierarchy&, palace::AuxiliaryFiniteElementSpaceHierarchy*)
11) [0x102c67d7b]: std::__1::__unique_if<palace::BaseKspSolver<palace::ComplexOperator>>::__unique_single std::__1::make_unique[abi:ue170006]<palace::BaseKspSolver<palace::ComplexOperator>, palace::IoData const&, palace::FiniteElementSpaceHierarchy&, palace::AuxiliaryFiniteElementSpaceHierarchy*>(palace::IoData const&, palace::FiniteElementSpaceHierarchy&, palace::AuxiliaryFiniteElementSpaceHierarchy*&&)
12) [0x102c667bb]: palace::EigenSolver::Solve(std::__1::vector<std::__1::unique_ptr<palace::Mesh, std::__1::default_delete<palace::Mesh>>, std::__1::allocator<std::__1::unique_ptr<palace::Mesh, std::__1::default_delete<palace::Mesh>>>> const&) const
13) [0x102bf9e47]: palace::BaseSolver::SolveEstimateMarkRefine(std::__1::vector<std::__1::unique_ptr<palace::Mesh, std::__1::default_delete<palace::Mesh>>, std::__1::allocator<std::__1::unique_ptr<palace::Mesh, std::__1::default_delete<palace::Mesh>>>>&) const
14) [0x102bd8a67]: main
sebastiangrimberg commented 6 months ago

https://github.com/awslabs/palace/issues/111 would resolve this, but in the mean time we need to have a hypre::HypreCSRMatrix constructor from an mfem::SparseMatrix. Shouldn't be hard to add. The original source of this problem is https://github.com/awslabs/palace/pull/193, and it only happens for order > 1.

sebastiangrimberg commented 6 months ago

Resolved by #217