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 19170 : MFEMProblemSolve::validParams() 18 : { 19 19170 : InputParameters params = emptyInputParameters(); 20 38340 : params.addClassDescription("Solve object for MFEM problems."); 21 76680 : params.addParam<std::string>("device", "Run app on the chosen device."); 22 76680 : MooseEnum assembly_levels("legacy full element partial none", "legacy", true); 23 57510 : params.addParam<MooseEnum>("assembly_level", assembly_levels, "Matrix assembly level."); 24 38340 : return params; 25 19170 : } 26 : 27 353 : MFEMProblemSolve::MFEMProblemSolve( 28 : Executioner & ex, 29 353 : std::vector<std::shared_ptr<Moose::MFEM::ProblemOperatorBase>> & problem_operators) 30 : : SolveObject(ex), 31 353 : _mfem_problem(dynamic_cast<MFEMProblem &>(_problem)), 32 353 : _problem_operators(problem_operators) 33 : { 34 353 : if (const auto compute_device = _app.getComputeDevice()) 35 280 : _app.setMFEMDevice(*compute_device, Moose::PassKey<MFEMProblemSolve>()); 36 : else 37 292 : _app.setMFEMDevice(isParamValid("device") ? getParam<std::string>("device") 38 68 : : _app.isUltimateMaster() ? "cpu" 39 : : "", 40 426 : Moose::PassKey<MFEMProblemSolve>()); 41 353 : } 42 : 43 : bool 44 889 : 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 889 : 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 889 : _mfem_problem.backupMultiApps(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 54 889 : _mfem_problem.backupMultiApps(EXEC_TIMESTEP_BEGIN); 55 889 : _mfem_problem.backupMultiApps(EXEC_TIMESTEP_END); 56 889 : _mfem_problem.backupMultiApps(EXEC_MULTIAPP_FIXED_POINT_END); 57 : 58 : // Solve step begins 59 889 : _executioner.preSolve(); 60 889 : _mfem_problem.execTransfers(EXEC_TIMESTEP_BEGIN); 61 : 62 889 : _mfem_problem.execute(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 63 889 : _mfem_problem.execTransfers(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 64 889 : _mfem_problem.execMultiApps(EXEC_MULTIAPP_FIXED_POINT_BEGIN, true); 65 889 : _mfem_problem.outputStep(EXEC_MULTIAPP_FIXED_POINT_BEGIN); 66 : 67 889 : _mfem_problem.execMultiApps(EXEC_TIMESTEP_BEGIN, true); 68 889 : _mfem_problem.execute(EXEC_TIMESTEP_BEGIN); 69 889 : _mfem_problem.outputStep(EXEC_TIMESTEP_BEGIN); 70 : 71 : // Update warehouse active objects 72 889 : _mfem_problem.updateActiveObjects(); 73 : 74 889 : if (_mfem_problem.shouldSolve()) 75 1682 : for (const auto & problem_operator : _problem_operators) 76 841 : problem_operator->Solve(); 77 889 : _mfem_problem.displaceMesh(); 78 : 79 : // Execute user objects, transfers, and multiapps at timestep end 80 889 : _mfem_problem.onTimestepEnd(); 81 889 : _mfem_problem.execute(EXEC_TIMESTEP_END); 82 889 : _mfem_problem.execTransfers(EXEC_TIMESTEP_END); 83 889 : _mfem_problem.execMultiApps(EXEC_TIMESTEP_END, true); 84 889 : _executioner.postSolve(); 85 : // Solve step ends 86 : 87 889 : if (converged) 88 : { 89 : // Fixed point iteration loop ends right above 90 889 : _mfem_problem.execute(EXEC_MULTIAPP_FIXED_POINT_END); 91 889 : _mfem_problem.execTransfers(EXEC_MULTIAPP_FIXED_POINT_END); 92 889 : _mfem_problem.execMultiApps(EXEC_MULTIAPP_FIXED_POINT_END, true); 93 889 : _mfem_problem.outputStep(EXEC_MULTIAPP_FIXED_POINT_END); 94 : } 95 : 96 889 : return converged; 97 : } 98 : #endif