Line data Source code
1 : /**********************************************************************/ 2 : /* DO NOT MODIFY THIS HEADER */ 3 : /* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */ 4 : /* */ 5 : /* Copyright 2017 Battelle Energy Alliance, LLC */ 6 : /* ALL RIGHTS RESERVED */ 7 : /**********************************************************************/ 8 : 9 : #include "PolarPhaseFieldAction.h" 10 : #include "FEProblemBase.h" 11 : #include "Factory.h" 12 : 13 : registerMooseAction("MagpieApp", PolarPhaseFieldAction, "add_kernel"); 14 : registerMooseAction("MagpieApp", PolarPhaseFieldAction, "add_material"); 15 : 16 : InputParameters 17 4 : PolarPhaseFieldAction::validParams() 18 : { 19 4 : InputParameters params = Action::validParams(); 20 8 : params.addParam<VariableName>("theta", "theta", "Theta order parameter"); 21 8 : params.addParam<VariableName>("upsilon", "Upsilon", "Upsilon order parameter"); 22 : 23 8 : params.addParam<Real>("L_theta", 1.0, "Mobility for the theta order parameter"); 24 8 : params.addParam<Real>("L_upsilon", 1.0, "Mobility for the upsilon order parameter"); 25 : 26 8 : params.addRequiredParam<Real>("a0", "Interpolation coefficient a0"); 27 8 : params.addRequiredParam<Real>("a_A", "Interpolation coefficient a_A"); 28 : 29 8 : params.addRequiredParam<Real>("a_beta", "Interpolation coefficient a_beta"); 30 8 : params.addRequiredParam<Real>("a_theta", "Interpolation coefficient a_theta"); 31 8 : params.addRequiredParam<Real>("a_phi", "Interpolation coefficient a_phi"); 32 : 33 8 : params.addRequiredParam<Real>("beta10", "Gradient energy coefficient between solid 1 and melt"); 34 8 : params.addRequiredParam<Real>("beta20", "Gradient energy coefficient between solid 2 and melt"); 35 8 : params.addRequiredParam<Real>("beta21", 36 : "Gradient energy coefficient between solid 2 and solid 1"); 37 : 38 8 : params.addRequiredParam<Real>("A10", "Barrier coefficient solid 1 and melt"); 39 8 : params.addRequiredParam<Real>("A20", "Barrier coefficient solid 2 and melt"); 40 8 : params.addRequiredParam<Real>("A21", "Barrier coefficient solid 2 and solid 1"); 41 : 42 8 : params.addRequiredParam<Real>("G0", "Thermal energy of the melt"); 43 8 : params.addRequiredParam<Real>("DeltaG10", 44 : "Difference in thermal energy between solid 1 and melt"); 45 8 : params.addRequiredParam<Real>("DeltaG20", 46 : "Difference in thermal energy between solid 2 and melt"); 47 : 48 4 : return params; 49 0 : } 50 : 51 4 : PolarPhaseFieldAction::PolarPhaseFieldAction(const InputParameters & parameters) 52 4 : : Action(parameters) 53 : { 54 4 : } 55 : 56 : void 57 8 : PolarPhaseFieldAction::act() 58 : { 59 : // material property names 60 8 : const std::string psiL = _name + "_psiL"; 61 8 : const std::string betaS0 = _name + "_betaS0"; 62 8 : const std::string beta21phi = _name + "_beta21phi"; 63 : 64 : // variables 65 8 : auto theta = getParam<VariableName>("theta"); 66 8 : auto upsilon = getParam<VariableName>("upsilon"); 67 : 68 8 : if (_current_task == "add_material") 69 : { 70 4 : const std::string prefix = _name + "_"; 71 : { 72 4 : std::string name = "PolarPFMBetaS0"; 73 4 : auto params = _factory.getValidParams(name); 74 8 : params.set<std::string>("f_name") = betaS0; 75 12 : params.set<std::vector<VariableName>>("theta") = {theta}; 76 4 : params.applyParameters(parameters()); 77 4 : _problem->addMaterial(name, _name + "_" + name, params); 78 4 : } 79 : { 80 4 : std::string name = "PolarPFMPhi"; 81 4 : auto params = _factory.getValidParams(name); 82 8 : params.set<std::string>("f_name") = beta21phi; 83 12 : params.set<std::vector<VariableName>>("upsilon") = {upsilon}; 84 4 : params.applyParameters(parameters()); 85 4 : _problem->addMaterial(name, _name + "_" + name, params); 86 4 : } 87 : { 88 4 : std::string name = "PolarPFMPsiL"; 89 4 : auto params = _factory.getValidParams(name); 90 8 : params.set<std::string>("f_name") = psiL; 91 12 : params.set<std::vector<VariableName>>("theta") = {theta}; 92 12 : params.set<std::vector<VariableName>>("upsilon") = {upsilon}; 93 4 : params.applyParameters(parameters()); 94 4 : _problem->addMaterial(name, _name + "_" + name, params); 95 4 : } 96 : } 97 : 98 8 : if (_current_task == "add_kernel") 99 : { 100 : // upsilon 101 : { 102 4 : const std::string prefix = _name + "_upsilon_"; 103 : { 104 4 : std::string name = "CoefTimeDerivative"; 105 4 : auto params = _factory.getValidParams(name); 106 8 : params.set<NonlinearVariableName>("variable") = upsilon; 107 8 : params.set<Real>("Coefficient") = 1.0 / getParam<Real>("L_upsilon"); 108 4 : _problem->addKernel(name, prefix + name, params); 109 4 : } 110 : { 111 4 : std::string name = "PolarPFMDerivative"; 112 4 : auto params = _factory.getValidParams(name); 113 8 : params.set<NonlinearVariableName>("variable") = upsilon; 114 8 : params.set<MaterialPropertyName>("F") = psiL; 115 4 : _problem->addKernel(name, prefix + name, params); 116 4 : } 117 : { 118 4 : std::string name = "PolarPFMGradient"; 119 4 : auto params = _factory.getValidParams(name); 120 8 : params.set<NonlinearVariableName>("variable") = upsilon; 121 12 : params.set<std::vector<VariableName>>("v") = {theta}; 122 8 : params.set<MaterialPropertyName>("F") = beta21phi; 123 4 : _problem->addKernel(name, prefix + name, params); 124 4 : } 125 : { 126 4 : std::string name = "MatDiffusion"; 127 4 : auto params = _factory.getValidParams(name); 128 8 : params.set<NonlinearVariableName>("variable") = upsilon; 129 8 : params.set<MaterialPropertyName>("diffusivity") = betaS0; 130 12 : params.set<std::vector<VariableName>>("args") = {theta}; 131 4 : _problem->addKernel(name, prefix + name, params); 132 4 : } 133 : } 134 : 135 : // theta 136 : { 137 4 : const std::string prefix = _name + "_theta_"; 138 : { 139 4 : std::string name = "CoefTimeDerivative"; 140 4 : auto params = _factory.getValidParams(name); 141 8 : params.set<NonlinearVariableName>("variable") = theta; 142 8 : params.set<Real>("Coefficient") = 1.0 / getParam<Real>("L_theta"); 143 4 : _problem->addKernel(name, prefix + name, params); 144 4 : } 145 : { 146 4 : std::string name = "PolarPFMDerivative"; 147 4 : auto params = _factory.getValidParams(name); 148 8 : params.set<NonlinearVariableName>("variable") = theta; 149 8 : params.set<MaterialPropertyName>("F") = psiL; 150 4 : _problem->addKernel(name, prefix + name, params); 151 4 : } 152 : { 153 4 : std::string name = "PolarPFMGradient"; 154 4 : auto params = _factory.getValidParams(name); 155 8 : params.set<NonlinearVariableName>("variable") = theta; 156 12 : params.set<std::vector<VariableName>>("v") = {theta}; 157 8 : params.set<MaterialPropertyName>("F") = betaS0; 158 4 : _problem->addKernel(name, prefix + name, params); 159 4 : } 160 : { 161 4 : std::string name = "MatDiffusion"; 162 4 : auto params = _factory.getValidParams(name); 163 8 : params.set<NonlinearVariableName>("variable") = theta; 164 8 : params.set<MaterialPropertyName>("diffusivity") = beta21phi; 165 12 : params.set<std::vector<VariableName>>("args") = {upsilon}; 166 4 : _problem->addKernel(name, prefix + name, params); 167 4 : } 168 : } 169 : } 170 8 : }