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 "PolynomialFreeEnergy.h" 11 : 12 : registerMooseObject("PhaseFieldApp", PolynomialFreeEnergy); 13 : 14 : InputParameters 15 310 : PolynomialFreeEnergy::validParams() 16 : { 17 310 : InputParameters params = DerivativeParsedMaterialHelper::validParams(); 18 310 : params.addClassDescription("Polynomial free energy for single component systems"); 19 620 : MooseEnum poly_order("4 6 8"); 20 620 : params.addRequiredParam<MooseEnum>( 21 : "polynomial_order", poly_order, "Order of polynomial free energy"); 22 620 : params.addParam<MaterialPropertyName>( 23 : "c_eq_name", "c_eq", "Name of material property storing the equilibrium concentration"); 24 620 : params.addParam<MaterialPropertyName>( 25 : "W_name", "barr_height", "Name of the material property storing the barrier height"); 26 620 : params.addRequiredCoupledVar("c", "Concentration"); 27 310 : return params; 28 310 : } 29 : 30 240 : PolynomialFreeEnergy::PolynomialFreeEnergy(const InputParameters & parameters) 31 : : DerivativeParsedMaterialHelper(parameters), 32 240 : _c("c"), 33 240 : _a("c_eq_name"), 34 240 : _W("W_name"), 35 960 : _order(getParam<MooseEnum>("polynomial_order")) 36 : { 37 240 : EBFunction free_energy; 38 : 39 : // Free energy 40 240 : switch (_order) 41 : { 42 48 : case 0: // 4th order 43 48 : free_energy(_c, _W, _a) = pow(2.0, 4.0) * _W * pow(_c - _a, 2) * pow(1 - _c - _a, 2); 44 48 : break; 45 48 : case 1: // 6th order 46 96 : free_energy(_c, _W, _a) = pow(2.0, 6.0) * _W * 47 96 : (2.0 * pow(_c, 6) - 6.0 * pow(_c, 5) + 48 240 : (3.0 * _a + 27.0 / 4.0 - 3.0 * _a * _a) * pow(_c, 4) + 49 240 : (-6.0 * _a - 7.0 / 2.0 + 6.0 * _a * _a) * pow(_c, 3) + 50 240 : (9.0 / 2.0 * _a - 9.0 / 2.0 * _a * _a + 3.0 / 4.0) * pow(_c, 2) + 51 144 : (3.0 / 2.0 * _a * _a - 3.0 / 2.0 * _a) * _c); 52 48 : break; 53 144 : case 2: // 8th order 54 144 : free_energy(_c, _W, _a) = 55 288 : pow(2.0, 8.0) * _W * 56 432 : (3.0 * pow(_c, 8) - 12.0 * pow(_c, 7) + (-4.0 * _a * _a + 4.0 * _a + 20.0) * pow(_c, 6) + 57 720 : (12.0 * _a * _a - 12.0 * _a - 18.0) * pow(_c, 5) + 58 720 : (15.0 * _a + 75.0 / 8.0 - 15.0 * _a * _a) * pow(_c, 4) + 59 720 : (-10.0 * _a - 11.0 / 4.0 + 10.0 * _a * _a) * pow(_c, 3) + 60 720 : (15.0 / 4.0 * _a - 15.0 / 4.0 * _a * _a + 3.0 / 8.0) * pow(_c, 2) + 61 432 : (3.0 / 4.0 * _a * _a - 3.0 / 4.0 * _a) * _c); 62 144 : break; 63 0 : default: 64 0 : mooseError("Error in PolynomialFreeEnergy: incorrect polynomial order"); 65 : } 66 : 67 : // Parse function 68 480 : functionParse(free_energy, {}, {}, {"W_name", "c_eq_name"}, {}, {}); 69 240 : }