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 : #include "LevelSetReinitializationMultiApp.h" 11 : #include "LevelSetReinitializationProblem.h" 12 : 13 : #include "Executioner.h" 14 : 15 : // libMesh 16 : #include "libmesh/mesh_tools.h" 17 : 18 : registerMooseObject("LevelSetApp", LevelSetReinitializationMultiApp); 19 : 20 : InputParameters 21 74 : LevelSetReinitializationMultiApp::validParams() 22 : { 23 74 : InputParameters params = MultiApp::validParams(); 24 74 : params.addClassDescription( 25 : "MultiApp capable of performing repeated complete solves for level set reinitialization."); 26 148 : params.addParam<unsigned int>( 27 148 : "interval", 1, "Time step interval when to perform reinitialization."); 28 : 29 74 : params.suppressParameter<std::vector<Point>>("positions"); 30 74 : params.suppressParameter<std::vector<FileName>>("positions_file"); 31 74 : params.suppressParameter<bool>("output_in_position"); 32 74 : params.suppressParameter<std::vector<Real>>("reset_time"); 33 74 : params.suppressParameter<std::vector<unsigned int>>("reset_apps"); 34 74 : params.suppressParameter<Real>("move_time"); 35 74 : params.suppressParameter<std::vector<unsigned int>>("move_apps"); 36 74 : params.suppressParameter<std::vector<Point>>("move_positions"); 37 : 38 74 : return params; 39 0 : } 40 : 41 37 : LevelSetReinitializationMultiApp::LevelSetReinitializationMultiApp( 42 37 : const InputParameters & parameters) 43 74 : : MultiApp(parameters), _level_set_problem(NULL), _interval(getParam<unsigned int>("interval")) 44 : { 45 37 : } 46 : 47 : void 48 35 : LevelSetReinitializationMultiApp::initialSetup() 49 : { 50 35 : MultiApp::initialSetup(); 51 : 52 35 : if (_has_an_app) 53 : { 54 35 : Executioner * ex = _apps[0]->getExecutioner(); 55 : 56 35 : if (!ex) 57 0 : mooseError("Executioner does not exist!"); 58 : 59 35 : ex->init(); 60 : 61 35 : _executioner = ex; 62 : 63 35 : _level_set_problem = dynamic_cast<LevelSetReinitializationProblem *>(&appProblemBase(0)); 64 35 : if (!_level_set_problem) 65 0 : mooseError("The Problem type must be LevelSetReinitializationProblem."); 66 : } 67 35 : } 68 : 69 : bool 70 68 : LevelSetReinitializationMultiApp::solveStep(Real /*dt*/, 71 : Real /*target_time*/, 72 : bool /*auto_advance*/) 73 : { 74 : // Do nothing if not on interval 75 68 : if ((_fe_problem.timeStep() % _interval) != 0) 76 : return true; 77 : 78 68 : if (!_has_an_app) 79 : return true; 80 : 81 68 : _console << "Solving Reinitialization problem." << std::endl; 82 : 83 : int rank; 84 : int ierr; 85 68 : ierr = MPI_Comm_rank(_orig_comm, &rank); 86 68 : mooseCheckMPIErr(ierr); 87 : 88 : bool last_solve_converged = true; 89 : 90 68 : _level_set_problem->resetTime(); 91 68 : _executioner->execute(); 92 68 : if (!_executioner->lastSolveConverged()) 93 : last_solve_converged = false; 94 : 95 : return last_solve_converged; 96 : }