https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MFEMMatrixFreeAMS.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#ifdef MOOSE_MFEM_ENABLED
11
12#include "MFEMMatrixFreeAMS.h"
13#include "MFEMProblem.h"
14
16
17namespace Moose::MFEM
18{
19MatrixFreeAMS::MatrixFreeAMS(mfem::Coefficient & alpha_coef,
20 mfem::Coefficient & beta_coef,
21 int inner_pi_its,
22 int inner_g_its)
23 : _alpha_coef(alpha_coef),
24 _beta_coef(beta_coef),
25 _inner_pi_its(inner_pi_its),
26 _inner_g_its(inner_g_its)
27{
28}
29
30void
31MatrixFreeAMS::SetOperator(const mfem::Operator & op)
32{
33 height = op.Height();
34 width = op.Width();
35 // The constructor of mfem::MatrixFreeAMS requires the target operator to be known, so this
36 // constructs the solver
37 auto matrix_free_ams = std::make_unique<mfem::MatrixFreeAMS>(*_aform,
38 const_cast<mfem::Operator &>(op),
39 *_aform->ParFESpace(),
42 nullptr,
46 _matrix_free_ams = std::move(matrix_free_ams);
47}
48} // namespace Moose::MFEM
49
52{
54 params.addClassDescription("MFEM matrix-free auxiliary-space Maxwell preconditioner for the "
55 "iterative solution of MFEM equation systems.");
56 params.addParam<MFEMScalarCoefficientName>(
57 "alpha_coefficient",
58 "1.",
59 "Name of scalar coefficient used in curl-curl component of target equation system.");
60 params.addParam<MFEMScalarCoefficientName>(
61 "beta_coefficient",
62 "1.",
63 "Name of scalar coefficient used in mass component of target equation system.");
64 params.addParam<unsigned int>(
65 "inner_pi_iterations", 2, "Number of CG iterations on auxiliary Pi space.");
66 params.addParam<unsigned int>(
67 "inner_g_iterations", 2, "Number of CG iterations on auxiliary G space.");
68 // mfem::MatrixFreeAMS is always an LOR solver
69 params.setParameters("low_order_refined", true);
70 params.suppressParameter<bool>("low_order_refined");
71 return params;
72}
73
75 : Moose::MFEM::LORLinearSolverBase<mfem::MatrixFreeAMS>(parameters),
76 _alpha_coef(getScalarCoefficient("alpha_coefficient")),
77 _beta_coef(getScalarCoefficient("beta_coefficient")),
78 _inner_pi_its(getParam<unsigned int>("inner_pi_iterations")),
79 _inner_g_its(getParam<unsigned int>("inner_g_iterations"))
80{
82}
83
84void
86{
87 auto solver = std::make_unique<Moose::MFEM::MatrixFreeAMS>(
89 _solver = std::move(solver);
90}
91
92template <>
93void
95{
96 LinearSolverBase::UpdateEquationSystemContext();
97 SetupLOR(_equation_system);
98 // update the pointer to the bilinear form representing the curl-curl problem being
99 // preconditioned
100 auto & matrix_free_ams = cast_ref<Moose::MFEM::MatrixFreeAMS &>(*_solver);
101 matrix_free_ams.SetBilinearForm(*_a);
102 matrix_free_ams.SetBoundaryMarkers(_ess_bdr_markers);
103}
104
105#endif
registerMooseObject("MooseApp", MFEMMatrixFreeAMS)
void ErrorVector unsigned int
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void suppressParameter(const std::string &name)
This method suppresses an inherited parameter so that it isn't required or valid in the derived class...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
void setParameters(const std::string &name, const T &value, Ts... extra_input_parameters)
Given a series of parameters names and values, sets each name to the corresponding value.
Wrapper for mfem::MatrixFreeAMS solver.
mfem::Coefficient & _beta_coef
MFEMMatrixFreeAMS(const InputParameters &)
void ConstructSolver() override
Override in derived classes to construct and set the solver options.
static InputParameters validParams()
mfem::Coefficient & _alpha_coef
virtual void UpdateEquationSystemContext() override
Update the solver following any changes to the EquationSystem it is responsible for solving.
std::unique_ptr< mfem::MatrixFreeAMS > _matrix_free_ams
mfem::Coefficient & _beta_coef
MatrixFreeAMS(mfem::Coefficient &alpha_coef, mfem::Coefficient &beta_coef, int inner_pi_its=0, int inner_g_its=1)
void SetOperator(const mfem::Operator &op) override
mfem::Array< int > _ess_bdr_markers
mfem::Coefficient & _alpha_coef
mfem::ParBilinearForm * _aform
std::unique_ptr< mfem::Solver > _solver
Solver to be used for the problem.
Utilities for converting between vector(s) of libMesh Points and MFEM Vector(s).
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...