https://mooseframework.inl.gov
MFEMTransient.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 "MFEMTransient.h"
13 #include "MFEMProblem.h"
15 #include "TimeStepper.h"
16 
18 
21 {
23  params += TransientBase::validParams();
24  params.addClassDescription("Executioner for transient MFEM problems.");
25  return params;
26 }
27 
29  : TransientBase(params),
30  _mfem_problem(dynamic_cast<MFEMProblem &>(feProblem())),
31  _mfem_problem_data(_mfem_problem.getProblemData()),
32  _mfem_problem_solve(*this, getProblemOperators())
33 {
34  // If no ProblemOperators have been added by the user, add a default
35  if (getProblemOperators().empty())
36  {
37  _mfem_problem_data.eqn_system = std::make_shared<Moose::MFEM::TimeDependentEquationSystem>(
39  auto problem_operator =
40  std::make_shared<Moose::MFEM::TimeDependentEquationSystemProblemOperator>(_mfem_problem);
41  addProblemOperator(std::move(problem_operator));
42  }
43 }
44 
45 void
47 {
49 
50  // Set up initial conditions
54  getParam<MooseEnum>("assembly_level").getEnum<mfem::AssemblyLevel>());
55 
56  for (const auto & problem_operator : getProblemOperators())
57  {
58  problem_operator->SetGridFunctions();
59  problem_operator->Init(_mfem_problem_data.f);
60  }
61 }
62 
63 void
65 {
66  _dt_old = _dt;
67 
68  if (input_dt == -1.0)
70  else
71  _dt = input_dt;
72 
74 
75  // Unfortunately, time needs to be temporarily incremented so we get
76  // meaningful console output in timestepSetup(). We decrement it back
77  // immediately after so step() below behaves as expected.
78  _time += _dt;
80  _time -= _dt;
81 
83 
84  // Advance time step of the MFEM problem. Time is also updated here, and
85  // _problem_operator->SetTime is called inside the ode_solver->Step method to
86  // update the time used by time dependent (function) coefficients.
88 
89  // Continue with usual TransientBase::takeStep() finalisation
91 
92  if (!lastSolveConverged())
93  {
94  _console << "Aborting as solve did not converge" << std::endl;
95  return;
96  }
97 
98  if (lastSolveConverged())
100  else
102 
103  // Set time to time old, since final time is updated in TransientBase::endStep()
104  _time = _time_old;
105 
107 }
108 
109 #endif
void timestepSetup() override
Moose::MFEM::ComplexGridFunctions cmplx_gridfunctions
static InputParameters validParams()
Definition: TransientBase.C:69
bool & _last_solve_converged
Whether or not the last solve converged.
virtual std::vector< std::shared_ptr< ProblemOperatorBase > > & getProblemOperators()
Returns a pointer to the operator&#39;s equation system.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
virtual void preSolve()
Definition: TimeStepper.h:36
Real & _time
Current time.
virtual void takeStep(Real input_dt=-1.0) override
Do whatever is necessary to advance one step.
Definition: MFEMTransient.C:64
virtual bool converged() const
If the time step converged.
Definition: TimeStepper.C:201
TimeStepper * _time_stepper
virtual void init() override
Initialize the executioner.
Definition: MFEMTransient.C:46
virtual Real computeConstrainedDT()
FEProblemBase & _problem
Here for backward compatibility.
mfem::BlockVector f
virtual void acceptStep()
This gets called when time step is accepted.
Definition: TimeStepper.C:176
Real & _time_old
Previous time.
MFEMTransient(const InputParameters &params)
Definition: MFEMTransient.C:28
Real & _dt
Current delta t... or timestep size.
Base class for transient executioners that use a FixedPointSolve solve object for multiapp-main app i...
Definition: TransientBase.h:27
static InputParameters validParams()
std::shared_ptr< Moose::MFEM::EquationSystem > eqn_system
virtual void init() override
Initialize the executioner.
virtual void onTimestepBegin() override
virtual void rejectStep()
This gets called when time step is rejected.
Definition: TimeStepper.C:188
virtual void postSolve()
Definition: TimeStepper.h:37
virtual void step()
Take a time step.
Definition: TimeStepper.C:167
virtual void addProblemOperator(std::shared_ptr< ProblemOperatorBase > problem_operator)
Add an MFEM problem operator. Takes ownership.
MFEMProblem & _mfem_problem
Definition: MFEMTransient.h:49
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...
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
virtual bool lastSolveConverged() const override
Whether or not the last solve converged.
registerMooseObject("MooseApp", MFEMTransient)
static InputParameters validParams()
Definition: MFEMTransient.C:20
Moose::MFEM::GridFunctions gridfunctions
MFEMProblemData & _mfem_problem_data
Definition: MFEMTransient.h:50
Moose::MFEM::TimeDerivativeMap time_derivative_map