LCOV - code coverage report
Current view: top level - src/materials - PFParamsPolyFreeEnergy.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 61 63 96.8 %
Date: 2025-09-04 07:55:36 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          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 "PFParamsPolyFreeEnergy.h"
      11             : 
      12             : registerMooseObject("PhaseFieldApp", PFParamsPolyFreeEnergy);
      13             : 
      14             : InputParameters
      15         470 : PFParamsPolyFreeEnergy::validParams()
      16             : {
      17         470 :   InputParameters params = Material::validParams();
      18         470 :   params.addClassDescription(
      19             :       "Phase field parameters for polynomial free energy for single component systems");
      20         940 :   params.addCoupledVar("T", "Temperature variable in Kelvin");
      21         940 :   params.addRequiredCoupledVar("c", "Concentration");
      22         940 :   params.addRequiredParam<Real>(
      23             :       "int_width", "The interfacial width of void surface in the length scale of the problem");
      24         940 :   params.addParam<Real>(
      25         940 :       "length_scale", 1.0e-9, "defines the base length scale of the problem in m");
      26         940 :   params.addParam<Real>("time_scale", 1.0e-9, "defines the base time scale of the problem");
      27         940 :   MooseEnum poly_order("4 6 8");
      28         940 :   params.addRequiredParam<MooseEnum>(
      29             :       "polynomial_order", poly_order, "Order of polynomial free energy");
      30         940 :   params.addRequiredParam<Real>("D0", "Diffusivity prefactor for vacancies in m^2/s");
      31         940 :   params.addRequiredParam<Real>("Em", "Migration energy in eV");
      32         940 :   params.addRequiredParam<Real>("Ef", "Formation energy in eV");
      33         940 :   params.addRequiredParam<Real>("surface_energy", "Surface energy in J/m2");
      34         470 :   return params;
      35         470 : }
      36             : 
      37         360 : PFParamsPolyFreeEnergy::PFParamsPolyFreeEnergy(const InputParameters & parameters)
      38             :   : Material(parameters),
      39         360 :     _c(coupledValue("c")),
      40         360 :     _T(coupledValue("T")),
      41         360 :     _M(declareProperty<Real>("M")),
      42         360 :     _grad_M(declareProperty<RealGradient>("grad_M")),
      43         360 :     _kappa(declareProperty<Real>("kappa")),
      44         360 :     _c_eq(declareProperty<Real>("c_eq")),
      45         360 :     _W(declareProperty<Real>("barr_height")),
      46         360 :     _Qstar(declareProperty<Real>("Qstar")),
      47         360 :     _D(declareProperty<Real>("D")),
      48         720 :     _int_width(getParam<Real>("int_width")),
      49         720 :     _length_scale(getParam<Real>("length_scale")),
      50         720 :     _time_scale(getParam<Real>("time_scale")),
      51         720 :     _order(getParam<MooseEnum>("polynomial_order")),
      52         720 :     _D0(getParam<Real>("D0")),
      53         720 :     _Em(getParam<Real>("Em")),
      54         720 :     _Ef(getParam<Real>("Ef")),
      55         720 :     _surface_energy(getParam<Real>("surface_energy")),
      56         360 :     _JtoeV(6.24150974e18), // joule to eV conversion
      57         360 :     _kb(8.617343e-5)       // Boltzmann constant in eV/K
      58             : {
      59         360 : }
      60             : 
      61             : void
      62     4295480 : PFParamsPolyFreeEnergy::computeQpProperties()
      63             : {
      64             :   // Convert mobility from m^2/s to the length and time scale
      65     4295480 :   Real D0_c = _D0 * _time_scale / (_length_scale * _length_scale);
      66             : 
      67     4295480 :   Real kbT = _kb * _T[_qp];
      68             : 
      69             :   // Compute equilibrium concentration and diffusivity
      70     4295480 :   _c_eq[_qp] = std::exp(-_Ef / kbT);
      71     4295480 :   _D[_qp] = D0_c * std::exp(-_Em / kbT);
      72             : 
      73             :   // Compute free energy integral constant, such that int^1_0 f_loc = KN*sqrt(W)
      74             :   Real KN = 0.0;
      75             : 
      76             :   switch (_order)
      77             :   {
      78             :     case 0: // Fourth oder
      79             :       KN = 2.0 / 3.0;
      80             :       break;
      81             :     case 1: // Sixth order
      82             :       KN = 3.0 / 16.0 * std::sqrt(3.0) + 9.0 / 64.0 * std::sqrt(2.0) *
      83             :                                              (std::log(-std::sqrt(2.0) + std::sqrt(3.0)) +
      84             :                                               std::log(std::sqrt(2.0) + std::sqrt(3.0)));
      85             :       break;
      86             :     case 2: // Eigth order
      87             :       KN = 0.835510425;
      88             :       break;
      89           0 :     default:
      90           0 :       paramError("polynomial_order", "Incorrect polynomial order");
      91             :   }
      92             : 
      93             :   // Convert surface energy from J/m2 to eV/length_scale
      94     4295480 :   Real surf_energy = _surface_energy * _JtoeV * _length_scale * _length_scale;
      95             : 
      96             :   // Set interfacial parameter and energy barrier
      97     4295480 :   _kappa[_qp] = surf_energy * _int_width / KN;
      98     4295480 :   _W[_qp] = surf_energy / (2.0 * _int_width * KN);
      99             : 
     100             :   Real Co = 0.0;
     101     4295480 :   Real a = _c_eq[_qp];
     102             : 
     103     4295480 :   switch (_order)
     104             :   {
     105      373090 :     case 0: // 4th order polynomial
     106      373090 :       Co = std::pow(2.0, 5.0) * (1.0 + 2.0 * a - 2.0 * a * a);
     107      373090 :       break;
     108      433620 :     case 1: // 6th order polynomial
     109      433620 :       Co = std::pow(2.0, 7.0) * (9.0 / 2.0 * a - 9.0 / 2.0 * a * a + 3.0 / 4.0);
     110      433620 :       break;
     111     3488770 :     case 2: // 8th order polynomial
     112     3488770 :       Co = std::pow(2.0, 9.0) * (15.0 / 4.0 * a - 15.0 / 4.0 * a * a + 3.0 / 8.0);
     113     3488770 :       break;
     114             :     default:
     115             :       mooseError("Error in PFParamsPolyFreeEnergy: incorrect polynomial order");
     116             :   }
     117             : 
     118     4295480 :   _M[_qp] = KN / Co * (_D[_qp] * _int_width / surf_energy);
     119     4295480 :   _grad_M[_qp] = 0.0;
     120             : 
     121     4295480 :   _Qstar[_qp] = -4.0; // eV
     122     4295480 : }

Generated by: LCOV version 1.14