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 "AutoCheckpointAction.h" 11 : #include "FEProblem.h" 12 : #include "Checkpoint.h" 13 : registerMooseAction("MooseApp", AutoCheckpointAction, "auto_checkpoint_action"); 14 : 15 : InputParameters 16 62220 : AutoCheckpointAction::validParams() 17 : { 18 62220 : InputParameters params = Action::validParams(); 19 : 20 62220 : params.addClassDescription( 21 : "Action to create shortcut syntax-specified checkpoints and automatic checkpoints."); 22 : 23 62220 : params.addParam<bool>("checkpoint", false, "Create checkpoint files using the default options."); 24 186660 : params.addParam<bool>("wall_time_checkpoint", 25 124440 : true, 26 : "Enables the output of checkpoints based on elapsed wall time."); 27 : 28 62220 : return params; 29 0 : } 30 : 31 62016 : AutoCheckpointAction::AutoCheckpointAction(const InputParameters & params) : Action(params) {} 32 : 33 : void 34 56729 : AutoCheckpointAction::act() 35 : { 36 : // if there's already a checkpoint object, we don't need to worry about creating a new one 37 56729 : const auto checkpoints = _app.getOutputWarehouse().getOutputs<Checkpoint>(); 38 56729 : const auto num_checkpoints = checkpoints.size(); 39 : 40 56729 : const bool shortcut_syntax = getParam<bool>("checkpoint"); 41 : 42 56729 : if (num_checkpoints > 1) 43 4 : checkpoints[0]->mooseError("Multiple Checkpoint objects are not allowed and there is more than " 44 : "one Checkpoint defined in the 'Outputs' block."); 45 56725 : if (num_checkpoints == 1 && shortcut_syntax) 46 4 : paramError("checkpoint", 47 : "Shortcut checkpoint syntax cannot be used with another Checkpoint object in the " 48 : "'Outputs' block"); 49 : 50 56721 : if (num_checkpoints == 0) 51 : { 52 : // If there isn't an existing checkpoint, init a new one 53 56460 : auto cp_params = _factory.getValidParams("Checkpoint"); 54 : 55 56460 : cp_params.set<bool>("_built_by_moose") = true; 56 56460 : cp_params.set<bool>("wall_time_checkpoint") = getParam<bool>("wall_time_checkpoint"); 57 : 58 : // We need to keep track of what type of checkpoint we are creating. system created means the 59 : // default value of 1 for time_step_interval is ignored. 60 56460 : if (!shortcut_syntax) 61 56093 : cp_params.set<CheckpointType>("checkpoint_type") = CheckpointType::SYSTEM_CREATED; 62 : 63 : // We only want checkpoints in subapps if the user requests them 64 56460 : if (shortcut_syntax || _app.isUltimateMaster()) 65 45153 : _problem->addOutput("Checkpoint", "checkpoint", cp_params); 66 56460 : } 67 : 68 : // Check for special half transient test harness case 69 56721 : if (_app.testCheckpointHalfTransient() && _app.isUltimateMaster()) 70 : { 71 : // For half transient, we want to simulate a user-created checkpoint so 72 : // time_step_interval works correctly. 73 2829 : const auto checkpoint = _app.getOutputWarehouse().getOutputs<Checkpoint>()[0]; 74 2829 : checkpoint->setAutosaveFlag(CheckpointType::USER_CREATED); 75 2829 : checkpoint->_time_step_interval = 1; 76 : } 77 56721 : }