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 "KKSMultiFreeEnergy.h" 11 : 12 : registerMooseObject("PhaseFieldApp", KKSMultiFreeEnergy); 13 : 14 : InputParameters 15 178 : KKSMultiFreeEnergy::validParams() 16 : { 17 178 : InputParameters params = TotalFreeEnergyBase::validParams(); 18 178 : params.addClassDescription("Total free energy in multi-phase KKS system, including chemical, " 19 : "barrier and gradient terms"); 20 356 : params.addRequiredParam<std::vector<MaterialPropertyName>>( 21 : "Fj_names", 22 : "List of free energies for each phase. Place in same order as hj_names and gj_names!"); 23 356 : params.addRequiredParam<std::vector<MaterialPropertyName>>( 24 : "hj_names", 25 : "Switching Function Materials that provide h. Place in same order as Fj_names and gj_names!"); 26 356 : params.addRequiredParam<std::vector<MaterialPropertyName>>( 27 : "gj_names", 28 : "Barrier Function Materials that provide g. Place in same order as Fj_names and hj_names!"); 29 356 : params.addRequiredParam<Real>("w", "Double well height parameter"); 30 178 : params.addParam<std::vector<MaterialPropertyName>>("kappa_names", 31 178 : std::vector<MaterialPropertyName>(), 32 : "Vector of kappa names corresponding to " 33 : "each variable name in interfacial_vars " 34 : "in the same order."); 35 178 : return params; 36 0 : } 37 : 38 93 : KKSMultiFreeEnergy::KKSMultiFreeEnergy(const InputParameters & parameters) 39 : : TotalFreeEnergyBase(parameters), 40 186 : _Fj_names(getParam<std::vector<MaterialPropertyName>>("Fj_names")), 41 93 : _num_j(_Fj_names.size()), 42 93 : _prop_Fj(_num_j), 43 186 : _hj_names(getParam<std::vector<MaterialPropertyName>>("hj_names")), 44 93 : _prop_hj(_num_j), 45 186 : _gj_names(getParam<std::vector<MaterialPropertyName>>("gj_names")), 46 93 : _prop_gj(_num_j), 47 186 : _w(getParam<Real>("w")), 48 186 : _kappas(_nkappas) 49 : { 50 : // Check that same number of Fj, hj, and gj are passed in 51 93 : if (_hj_names.size() != _num_j) 52 0 : mooseError("Size of hj_names is not equal to size of Fj_names in KKSMultiFreeEnergy AuxKernel ", 53 : name()); 54 93 : if (_gj_names.size() != _num_j) 55 0 : mooseError("Size of gj_names is not equal to size of Fj_names in KKSMultiFreeEnergy AuxKernel ", 56 : name()); 57 : 58 : // get bulk properties 59 315 : for (unsigned int i = 0; i < _num_j; ++i) 60 : { 61 222 : _prop_Fj[i] = &getMaterialPropertyByName<Real>(_Fj_names[i]); 62 222 : _prop_hj[i] = &getMaterialPropertyByName<Real>(_hj_names[i]); 63 222 : _prop_gj[i] = &getMaterialPropertyByName<Real>(_gj_names[i]); 64 : } 65 : 66 : // Check to ensure size of interfacial_vars is the same as kappa_names 67 93 : if (_nvars != _nkappas) 68 0 : mooseError("Size of interfacial_vars is not equal to the size of kappa_names in " 69 : "KKSMultiFreeEnergy AuxKernel ", 70 : name()); 71 : 72 : // Assign kappa values 73 315 : for (unsigned int i = 0; i < _nkappas; ++i) 74 222 : _kappas[i] = &getMaterialPropertyByName<Real>(_kappa_names[i]); 75 93 : } 76 : 77 : Real 78 2051920 : KKSMultiFreeEnergy::computeValue() 79 : { 80 : // Start with any additional energy contribution, which is 0 if not supplied 81 2051920 : Real total_energy = _additional_free_energy[_qp]; 82 : // Add bulk energy contributions 83 7784560 : for (unsigned int i = 0; i < _num_j; ++i) 84 5732640 : total_energy += (*_prop_hj[i])[_qp] * (*_prop_Fj[i])[_qp] + _w * (*_prop_gj[i])[_qp]; 85 : 86 : // Add interfacial energy of each variable 87 7784560 : for (unsigned int i = 0; i < _nvars; ++i) 88 5732640 : total_energy += (*_kappas[i])[_qp] / 2.0 * (*_grad_vars[i])[_qp].norm_sq(); 89 : 90 2051920 : return total_energy; 91 : }