www.mooseframework.org
CHPFCRFFSplitVariablesAction.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
11 #include "Factory.h"
12 #include "FEProblem.h"
13 #include "Conversion.h"
14 #include "AddVariableAction.h"
15 
16 #include "libmesh/string_to_enum.h"
17 
18 registerMooseAction("PhaseFieldApp", CHPFCRFFSplitVariablesAction, "add_variable");
19 
20 template <>
21 InputParameters
23 {
24  InputParameters params = validParams<Action>();
25  MooseEnum familyEnum = AddVariableAction::getNonlinearVariableFamilies();
26  params.addParam<MooseEnum>(
27  "family",
28  familyEnum,
29  "Specifies the family of FE shape functions to use for the L variables");
30  MooseEnum orderEnum = AddVariableAction::getNonlinearVariableOrders();
31  params.addParam<MooseEnum>(
32  "order",
33  orderEnum,
34  "Specifies the order of the FE shape function to use for the L variables");
35  params.addParam<Real>("scaling", 1.0, "Specifies a scaling factor to apply to the L variables");
36  params.addRequiredParam<unsigned int>(
37  "num_L", "specifies the number of complex L variables will be solved for");
38  params.addRequiredParam<std::string>("L_name_base", "Base name for the complex L variables");
39  params.addRequiredParam<std::vector<FileName>>("sub_filenames",
40  "This is the filename of the sub.i file");
41  params.addRequiredParam<AuxVariableName>("n_name", "Name of atomic density variable");
42 
43  return params;
44 }
45 
47  : Action(params),
48  _num_L(getParam<unsigned int>("num_L")),
49  _L_name_base(getParam<std::string>("L_name_base")),
50  _sub_filenames(getParam<std::vector<FileName>>("sub_filenames")),
51  _n_name(getParam<AuxVariableName>("n_name"))
52 {
53 }
54 
55 void
57 {
58  ExecFlagEnum execute_options = MooseUtils::getDefaultExecFlagEnum();
59  execute_options = EXEC_TIMESTEP_BEGIN;
60 
61  // Setup MultiApp
62  InputParameters poly_params = _factory.getValidParams("TransientMultiApp");
63  poly_params.set<MooseEnum>("app_type") = "PhaseFieldApp";
64  poly_params.set<ExecFlagEnum>("execute_on") = execute_options;
65  poly_params.set<std::vector<FileName>>("input_files") = _sub_filenames;
66  poly_params.set<unsigned int>("max_procs_per_app") = 1;
67  poly_params.set<std::vector<Point>>("positions") = {Point()};
68  _problem->addMultiApp("TransientMultiApp", "HHEquationSolver", poly_params);
69 
70  poly_params = _factory.getValidParams("MultiAppNearestNodeTransfer");
71  poly_params.set<MultiMooseEnum>("direction") = "to_multiapp";
72  poly_params.set<ExecFlagEnum>("execute_on") = execute_options;
73  poly_params.set<std::vector<AuxVariableName>>("variable") = {_n_name};
74  poly_params.set<std::vector<VariableName>>("source_variable") = {_n_name};
75  poly_params.set<MultiAppName>("multi_app") = "HHEquationSolver";
76  _problem->addTransfer("MultiAppNearestNodeTransfer", _n_name + "_trans", poly_params);
77 
78  // Loop through the number of L variables
79  for (unsigned int l = 0; l < _num_L; ++l)
80  {
81  // Create L base name
82  std::string L_name = _L_name_base + Moose::stringify(l);
83 
84  // Create real L variable
85  std::string real_name = L_name + "_real";
86 
87  _problem->addAuxVariable(
88  real_name,
89  FEType(Utility::string_to_enum<Order>(getParam<MooseEnum>("order")),
90  Utility::string_to_enum<FEFamily>(getParam<MooseEnum>("family"))));
91 
92  poly_params = _factory.getValidParams("MultiAppNearestNodeTransfer");
93  poly_params.set<MultiMooseEnum>("direction") = "from_multiapp";
94  poly_params.set<std::vector<AuxVariableName>>("variable") = {real_name};
95  poly_params.set<std::vector<VariableName>>("source_variable") = {real_name};
96  poly_params.set<MultiAppName>("multi_app") = "HHEquationSolver";
97  _problem->addTransfer("MultiAppNearestNodeTransfer", real_name + "_trans", poly_params);
98 
99  if (l > 0)
100  {
101  // Create imaginary L variable IF l > 0
102  std::string imag_name = L_name + "_imag";
103 
104  _problem->addAuxVariable(
105  imag_name,
106  FEType(Utility::string_to_enum<Order>(getParam<MooseEnum>("order")),
107  Utility::string_to_enum<FEFamily>(getParam<MooseEnum>("family"))));
108 
109  poly_params = _factory.getValidParams("MultiAppNearestNodeTransfer");
110  poly_params.set<MultiMooseEnum>("direction") = "from_multiapp";
111  poly_params.set<std::vector<AuxVariableName>>("variable") = {imag_name};
112  poly_params.set<std::vector<VariableName>>("source_variable") = {imag_name};
113  poly_params.set<MultiAppName>("multi_app") = "HHEquationSolver";
114  _problem->addTransfer("MultiAppNearestNodeTransfer", imag_name + "_trans", poly_params);
115  }
116  }
117 }
CHPFCRFFSplitVariablesAction::_L_name_base
const std::string _L_name_base
Definition: CHPFCRFFSplitVariablesAction.h:33
registerMooseAction
registerMooseAction("PhaseFieldApp", CHPFCRFFSplitVariablesAction, "add_variable")
CHPFCRFFSplitVariablesAction
Automatically generates all the L variables for the RFF phase field crystal model.
Definition: CHPFCRFFSplitVariablesAction.h:24
CHPFCRFFSplitVariablesAction::_sub_filenames
const std::vector< FileName > _sub_filenames
Definition: CHPFCRFFSplitVariablesAction.h:34
CHPFCRFFSplitVariablesAction.h
CHPFCRFFSplitVariablesAction::_n_name
const AuxVariableName _n_name
Definition: CHPFCRFFSplitVariablesAction.h:35
CHPFCRFFSplitVariablesAction::_num_L
const unsigned int _num_L
Definition: CHPFCRFFSplitVariablesAction.h:32
CHPFCRFFSplitVariablesAction::act
virtual void act()
Definition: CHPFCRFFSplitVariablesAction.C:56
CHPFCRFFSplitVariablesAction::CHPFCRFFSplitVariablesAction
CHPFCRFFSplitVariablesAction(const InputParameters &params)
Definition: CHPFCRFFSplitVariablesAction.C:46
validParams< CHPFCRFFSplitVariablesAction >
InputParameters validParams< CHPFCRFFSplitVariablesAction >()
Definition: CHPFCRFFSplitVariablesAction.C:22