Line data Source code
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 "Executioner.h" 13 : #include "MFEMProblemSolve.h" 14 : #include "MFEMProblem.h" 15 : 16 : InputParameters 17 17882 : MFEMProblemSolve::validParams() 18 : { 19 17882 : InputParameters params = emptyInputParameters(); 20 35764 : params.addClassDescription("Solve object for MFEM problems."); 21 71528 : params.addParam<std::string>("device", "Run app on the chosen device."); 22 71528 : MooseEnum assembly_levels("legacy full element partial none", "legacy", true); 23 53646 : params.addParam<MooseEnum>("assembly_level", assembly_levels, "Matrix assembly level."); 24 35764 : return params; 25 17882 : } 26 : 27 311 : MFEMProblemSolve::MFEMProblemSolve( 28 : Executioner & ex, 29 311 : std::vector<std::shared_ptr<Moose::MFEM::ProblemOperatorBase>> & problem_operators) 30 : : SolveObject(ex), 31 311 : _mfem_problem(dynamic_cast<MFEMProblem &>(_problem)), 32 311 : _problem_operators(problem_operators) 33 : { 34 311 : if (const auto compute_device = _app.getComputeDevice()) 35 253 : _app.setMFEMDevice(*compute_device, Moose::PassKey<MFEMProblemSolve>()); 36 : else 37 232 : _app.setMFEMDevice(isParamValid("device") ? getParam<std::string>("device") 38 53 : : _app.isUltimateMaster() ? "cpu" 39 : : "", 40 369 : Moose::PassKey<MFEMProblemSolve>()); 41 311 : } 42 : 43 : bool 44 818 : MFEMProblemSolve::solve() 45 : { 46 : // FixedPointSolve::solve() is libMesh specific, so we need 47 : // to include all steps therein relevant to the MFEM backend here. 48 : 49 818 : bool converged = true; 50 : 51 : // need to back up multi-apps even when not doing fixed point iteration for recovering from failed 52 : // multiapp solve 53 818 : _mfem_problem.backupMultiApps(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 54 818 : _mfem_problem.backupMultiApps(EXEC_TIMESTEP_BEGIN); 55 818 : _mfem_problem.backupMultiApps(EXEC_TIMESTEP_END); 56 818 : _mfem_problem.backupMultiApps(EXEC_MULTIAPP_FIXED_POINT_END); 57 : 58 : // Solve step begins 59 818 : _executioner.preSolve(); 60 818 : _mfem_problem.execTransfers(EXEC_TIMESTEP_BEGIN); 61 : 62 818 : _mfem_problem.execute(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 63 818 : _mfem_problem.execTransfers(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 64 818 : _mfem_problem.execMultiApps(EXEC_MULTIAPP_FIXED_POINT_BEGIN, true); 65 818 : _mfem_problem.outputStep(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 66 : 67 818 : _mfem_problem.execMultiApps(EXEC_TIMESTEP_BEGIN, true); 68 818 : _mfem_problem.execute(EXEC_TIMESTEP_BEGIN); 69 818 : _mfem_problem.outputStep(EXEC_TIMESTEP_BEGIN); 70 : 71 : // Update warehouse active objects 72 818 : _mfem_problem.updateActiveObjects(); 73 : 74 818 : if (_mfem_problem.shouldSolve()) 75 1540 : for (const auto & problem_operator : _problem_operators) 76 770 : problem_operator->Solve(); 77 818 : _mfem_problem.displaceMesh(); 78 : 79 : // Execute user objects, transfers, and multiapps at timestep end 80 818 : _mfem_problem.onTimestepEnd(); 81 818 : _mfem_problem.execute(EXEC_TIMESTEP_END); 82 818 : _mfem_problem.execTransfers(EXEC_TIMESTEP_END); 83 818 : _mfem_problem.execMultiApps(EXEC_TIMESTEP_END, true); 84 818 : _executioner.postSolve(); 85 : // Solve step ends 86 : 87 818 : if (converged) 88 : { 89 : // Fixed point iteration loop ends right above 90 818 : _mfem_problem.execute(EXEC_MULTIAPP_FIXED_POINT_END); 91 818 : _mfem_problem.execTransfers(EXEC_MULTIAPP_FIXED_POINT_END); 92 818 : _mfem_problem.execMultiApps(EXEC_MULTIAPP_FIXED_POINT_END, true); 93 818 : _mfem_problem.outputStep(EXEC_MULTIAPP_FIXED_POINT_END); 94 : } 95 : 96 818 : return converged; 97 : } 98 : #endif