LCOV - code coverage report
Current view: top level - src/materials - ElectrochemicalDefectMaterial.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 105 116 90.5 %
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 "ElectrochemicalDefectMaterial.h"
      11             : #include "libmesh/quadrature.h"
      12             : #include "libmesh/utility.h"
      13             : 
      14             : registerMooseObject("PhaseFieldApp", ElectrochemicalDefectMaterial);
      15             : 
      16             : InputParameters
      17          94 : ElectrochemicalDefectMaterial::validParams()
      18             : {
      19          94 :   InputParameters params = Material::validParams();
      20          94 :   params.addClassDescription(
      21             :       "Calculates density, susceptibility, and derivatives for a defect species in the grand "
      22             :       "potential sintering model coupled with electrochemistry");
      23         188 :   params.addRequiredCoupledVarWithAutoBuild(
      24             :       "etas", "var_name_base", "op_num", "Array of order parameters that describe solid phase");
      25         188 :   params.addRequiredCoupledVar("chemical_potential", "The name of the chemical potential variable");
      26         188 :   params.addRequiredCoupledVar("void_op", "The name of the void phase order parameter");
      27         188 :   params.addRequiredCoupledVar("Temperature", "Name of the temperature variable with units of K");
      28         188 :   params.addRequiredCoupledVar("electric_potential",
      29             :                                "Name of the electric potential variable with units of V");
      30         188 :   params.addParam<MaterialPropertyName>(
      31             :       "void_density_name",
      32             :       "nv",
      33             :       "Name of material property to be created for defect number density in the void phase.");
      34         188 :   params.addParam<MaterialPropertyName>(
      35             :       "solid_density_name",
      36             :       "ns",
      37             :       "Name of material property to be created for defect number density in the solid phase.");
      38         188 :   params.addParam<MaterialPropertyName>(
      39             :       "chi_name", "chi", "Name of material property to be created defect susceptibility.");
      40         188 :   params.addParam<MaterialPropertyName>("solid_energy_coefficient",
      41         188 :                                         1.0,
      42             :                                         "Parabolic solid energy coefficient (energy*volume) for "
      43             :                                         "defect species. Only used for parabolic energy.");
      44         188 :   params.addRequiredParam<MaterialPropertyName>(
      45             :       "void_energy_coefficient",
      46             :       "Parabolic void energy coefficient (energy*volume) for defect species.");
      47         188 :   params.addRequiredParam<MaterialPropertyName>(
      48             :       "min_vacancy_concentration_solid",
      49             :       "Name of material that determines the minimum in energy wrt defect concentration in the "
      50             :       "solid phase");
      51         188 :   params.addRequiredParam<Real>("min_vacancy_concentration_void",
      52             :                                 "Minimum in energy wrt defect concentration in the void phase");
      53         188 :   MooseEnum solid_energy_model("PARABOLIC DILUTE IDEAL", "PARABOLIC");
      54         188 :   params.addParam<MooseEnum>("solid_energy_model",
      55             :                              solid_energy_model,
      56             :                              "Type of energy function to use for the solid phase.");
      57         188 :   params.addRequiredParam<int>("defect_charge", "Effective charge of defect species");
      58         188 :   params.addRequiredParam<Real>("solid_relative_permittivity",
      59             :                                 "Solid phase relative permittivity (dimensionless)");
      60         188 :   params.addParam<Real>("voltage_scale", 1, "Voltage scale (default is for voltage in V)");
      61          94 :   return params;
      62          94 : }
      63             : 
      64          72 : ElectrochemicalDefectMaterial::ElectrochemicalDefectMaterial(const InputParameters & parameters)
      65             :   : DerivativeMaterialInterface<Material>(parameters),
      66          72 :     _neta(coupledComponents("etas")),
      67          72 :     _eta(_neta),
      68          72 :     _eta_name(_neta),
      69          72 :     _w(coupledValue("chemical_potential")),
      70          72 :     _w_name(coupledName("chemical_potential", 0)),
      71          72 :     _phi(coupledValue("void_op")),
      72          72 :     _phi_name(coupledName("void_op", 0)),
      73          72 :     _ns_min_name(getParam<MaterialPropertyName>("min_vacancy_concentration_solid")),
      74          72 :     _ns_min(getMaterialProperty<Real>(_ns_min_name)),
      75          72 :     _dns_min(_neta),
      76          72 :     _d2ns_min(_neta),
      77          72 :     _temp(coupledValue("Temperature")),
      78          72 :     _v(coupledValue("electric_potential")),
      79          72 :     _grad_V(coupledGradient("electric_potential")),
      80         144 :     _kv(getMaterialProperty<Real>("void_energy_coefficient")),
      81         144 :     _ks(getMaterialProperty<Real>("solid_energy_coefficient")),
      82         144 :     _hv(getMaterialPropertyByName<Real>("hv")),
      83         144 :     _dhv(getMaterialPropertyDerivativeByName<Real>("hv", _phi_name)),
      84         144 :     _d2hv(getMaterialPropertyDerivativeByName<Real>("hv", _phi_name, _phi_name)),
      85         144 :     _hs(getMaterialPropertyByName<Real>("hs")),
      86         144 :     _dhs(getMaterialPropertyDerivativeByName<Real>("hs", _phi_name)),
      87         144 :     _d2hs(getMaterialPropertyDerivativeByName<Real>("hs", _phi_name, _phi_name)),
      88          72 :     _chi_name(getParam<MaterialPropertyName>("chi_name")),
      89          72 :     _chi(declareProperty<Real>(_chi_name)),
      90          72 :     _dchidphi(declarePropertyDerivative<Real>(_chi_name, _phi_name)),
      91          72 :     _dchidw(declarePropertyDerivative<Real>(_chi_name, _w_name)),
      92          72 :     _d2chidphi2(declarePropertyDerivative<Real>(_chi_name, _phi_name, _phi_name)),
      93          72 :     _d2chidw2(declarePropertyDerivative<Real>(_chi_name, _w_name, _w_name)),
      94          72 :     _d2chidphidw(declarePropertyDerivative<Real>(_chi_name, _phi_name, _w_name)),
      95          72 :     _nv_name(getParam<MaterialPropertyName>("void_density_name")),
      96          72 :     _nv(declareProperty<Real>(_nv_name)),
      97          72 :     _dnvdw(declarePropertyDerivative<Real>(_nv_name, _w_name)),
      98          72 :     _ns_name(getParam<MaterialPropertyName>("solid_density_name")),
      99          72 :     _ns(declareProperty<Real>(_ns_name)),
     100          72 :     _dnsdw(declarePropertyDerivative<Real>(_ns_name, _w_name)),
     101          72 :     _d2nsdw2(declarePropertyDerivative<Real>(_ns_name, _w_name, _w_name)),
     102          72 :     _dns(_neta),
     103          72 :     _d2nsdwdeta(_neta),
     104          72 :     _d2ns(_neta),
     105         144 :     _solid_energy(getParam<MooseEnum>("solid_energy_model")),
     106          72 :     _kB(8.617343e-5), // eV/K
     107          72 :     _e(1.0),          // to put energy units in eV
     108         144 :     _z(getParam<int>("defect_charge")),
     109         144 :     _v_scale(getParam<Real>("voltage_scale")),
     110         144 :     _eps_r(getParam<Real>("solid_relative_permittivity")),
     111         216 :     _nv_min(getParam<Real>("min_vacancy_concentration_void"))
     112             : {
     113             : 
     114         216 :   for (unsigned int i = 0; i < _neta; ++i)
     115             :   {
     116         144 :     _eta[i] = &coupledValue("etas", i);
     117         144 :     _eta_name[i] = coupledName("etas", i);
     118         144 :     _dns_min[i] = &getMaterialPropertyDerivativeByName<Real>(_ns_min_name, _eta_name[i]);
     119         144 :     _d2ns_min[i].resize(_neta);
     120         144 :     _dns[i] = &declarePropertyDerivative<Real>(_ns_name, _eta_name[i]);
     121         144 :     _d2ns[i].resize(_neta);
     122         144 :     _d2nsdwdeta[i] = &declarePropertyDerivative<Real>(_ns_name, _w_name, _eta_name[i]);
     123             : 
     124         360 :     for (unsigned int j = 0; j <= i; ++j)
     125             :     {
     126         216 :       _d2ns_min[j][i] =
     127         216 :           &getMaterialPropertyDerivativeByName<Real>(_ns_min_name, _eta_name[j], _eta_name[i]);
     128         216 :       _d2ns[j][i] = &declarePropertyDerivative<Real>(_ns_name, _eta_name[j], _eta_name[i]);
     129             :     }
     130             :   }
     131          72 : }
     132             : 
     133             : void
     134      883200 : ElectrochemicalDefectMaterial::computeQpProperties()
     135             : {
     136             :   // Calculate the void phase density and derivatives
     137      883200 :   _nv[_qp] = (_w[_qp] - _z * _e * _v[_qp] * _v_scale) / _kv[_qp] + _nv_min;
     138      883200 :   _dnvdw[_qp] = 1.0 / _kv[_qp]; // susceptibility
     139             : 
     140             :   // Calculate solid phase density and derivatives
     141             :   Real d3nsdw3 = 0.0;
     142      883200 :   switch (_solid_energy)
     143             :   {
     144           0 :     case 0: // PARABOLIC
     145             :     {
     146           0 :       _ns[_qp] = (_w[_qp] - _z * _e * _v[_qp] * _v_scale) / _ks[_qp] + _ns_min[_qp];
     147           0 :       _dnsdw[_qp] = 1.0 / _ks[_qp];
     148           0 :       _d2nsdw2[_qp] = 0.0;
     149             :       d3nsdw3 = 0.0;
     150             : 
     151           0 :       for (unsigned int i = 0; i < _neta; ++i)
     152             :       {
     153           0 :         (*_dns[i])[_qp] = (*_dns_min[i])[_qp];
     154           0 :         (*_d2nsdwdeta[i])[_qp] = 0.0;
     155           0 :         for (unsigned int j = i; j < _neta; ++j)
     156             :         {
     157           0 :           (*_d2ns[i][j])[_qp] = (*_d2ns_min[i][j])[_qp];
     158             :         }
     159             :       }
     160             :       break;
     161             :     }       // case 0; // PARABOLIC
     162      883200 :     case 1: // DILUTE
     163             :     {
     164      883200 :       Real n_exp = std::exp((_w[_qp] - _z * _e * _v[_qp] * _v_scale) / _kB / _temp[_qp]);
     165      883200 :       _ns[_qp] = _ns_min[_qp] * n_exp;
     166      883200 :       _dnsdw[_qp] = _ns[_qp] / _kB / _temp[_qp];
     167      883200 :       _d2nsdw2[_qp] = _dnsdw[_qp] / _kB / _temp[_qp];
     168      883200 :       d3nsdw3 = _d2nsdw2[_qp] / _kB / _temp[_qp];
     169             : 
     170     2649600 :       for (unsigned int i = 0; i < _neta; ++i)
     171             :       {
     172     1766400 :         (*_dns[i])[_qp] = (*_dns_min[i])[_qp] * n_exp;
     173     1766400 :         (*_d2nsdwdeta[i])[_qp] = (*_dns_min[i])[_qp] * n_exp / _kB / _temp[_qp];
     174     4416000 :         for (unsigned int j = i; j < _neta; ++j)
     175             :         {
     176     2649600 :           (*_d2ns[i][j])[_qp] = (*_d2ns_min[i][j])[_qp] * n_exp;
     177             :         }
     178             :       }
     179             :       break;
     180             :     }       // case 1: // DILUTE
     181           0 :     case 2: // IDEAL
     182             :     {
     183           0 :       mooseError("Ideal solution in solid is not yet supported in ElectrochemicalDefectMaterial");
     184             :       break;
     185             :     } // case 2: // IDEAL
     186             :   }   // switch (_solid_energy)
     187             : 
     188             :   // Calculate the susceptibilities
     189      883200 :   _chi[_qp] = _hs[_qp] * _dnsdw[_qp] + _hv[_qp] * _dnvdw[_qp];
     190      883200 :   _dchidphi[_qp] = _dhs[_qp] * _dnsdw[_qp] + _dhv[_qp] * _dnvdw[_qp];
     191      883200 :   _dchidw[_qp] = _hs[_qp] * _d2nsdw2[_qp];
     192      883200 :   _d2chidphi2[_qp] = _d2hs[_qp] * _dnsdw[_qp] + _d2hv[_qp] * _dnvdw[_qp];
     193      883200 :   _d2chidw2[_qp] = _hs[_qp] * d3nsdw3;
     194      883200 :   _d2chidphidw[_qp] = _dhs[_qp] * _d2nsdw2[_qp];
     195      883200 : } // void ElectrochemicalDefectMaterial::computeQpProperties()

Generated by: LCOV version 1.14