LCOV - code coverage report
Current view: top level - src/kernels - ACInterfaceStress.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 91 92 98.9 %
Date: 2025-09-04 07:55:36 Functions: 4 4 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 "ACInterfaceStress.h"
      11             : #include "RankTwoTensor.h"
      12             : #include "RankThreeTensor.h"
      13             : 
      14             : registerMooseObject("PhaseFieldApp", ACInterfaceStress);
      15             : 
      16             : InputParameters
      17          23 : ACInterfaceStress::validParams()
      18             : {
      19          23 :   InputParameters params = Kernel::validParams();
      20          23 :   params.addClassDescription("Interface stress driving force Allen-Cahn Kernel");
      21          46 :   params.addParam<MaterialPropertyName>("mob_name", "L", "The mobility used with the kernel");
      22          46 :   params.addParam<std::string>("base_name", "Material property base name");
      23          46 :   params.addRequiredParam<Real>("stress", "Planar stress");
      24          69 :   params.addRangeCheckedParam<Real>("op_range",
      25          46 :                                     1.0,
      26             :                                     "op_range > 0.0",
      27             :                                     "Range over which order parameters change across an "
      28             :                                     "interface. By default order parameters are assumed to "
      29             :                                     "vary from 0 to 1");
      30          23 :   return params;
      31           0 : }
      32             : 
      33          12 : ACInterfaceStress::ACInterfaceStress(const InputParameters & parameters)
      34             :   : Kernel(parameters),
      35          12 :     _L(getMaterialProperty<Real>("mob_name")),
      36          24 :     _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
      37          24 :     _strain(getMaterialPropertyByName<RankTwoTensor>(_base_name + "elastic_strain")),
      38          48 :     _stress(getParam<Real>("stress") / getParam<Real>("op_range"))
      39             : {
      40          12 : }
      41             : 
      42             : Real
      43    62914560 : ACInterfaceStress::computeQpResidual()
      44             : {
      45             :   // no interface, return zero stress
      46    62914560 :   const Real grad_norm_sq = _grad_u[_qp].norm_sq();
      47    62914560 :   if (grad_norm_sq < libMesh::TOLERANCE)
      48             :     return 0.0;
      49             : 
      50    38491960 :   const Real grad_norm = std::sqrt(grad_norm_sq);
      51             : 
      52             :   const Real nx = _grad_u[_qp](0);
      53             :   const Real ny = _grad_u[_qp](1);
      54             :   const Real nz = _grad_u[_qp](2);
      55             : 
      56    38491960 :   const Real s = _stress / grad_norm;
      57    38491960 :   const Real ds = -_stress / (grad_norm * grad_norm_sq);
      58    38491960 :   const Real dsx = ds * nx;
      59    38491960 :   const Real dsy = ds * ny;
      60    38491960 :   const Real dsz = ds * nz;
      61             : 
      62             :   // d/d(grad eta)_x
      63    38491960 :   _dS(0, 0, 0) = (ny * ny + nz * nz) * dsx;                // (ny * ny + nz * nz) * s;
      64    38491960 :   _dS(0, 1, 0) = _dS(0, 0, 1) = -ny * s - nx * ny * dsx;   // -nx * ny * s;
      65    38491960 :   _dS(0, 1, 1) = 2.0 * nx * s + (nx * nx + nz * nz) * dsx; // (nx * nx + nz * nz) * s;
      66    38491960 :   _dS(0, 2, 0) = _dS(0, 0, 2) = -nz * s - nx * nz * dsx;   // -nx * nz * s;
      67    38491960 :   _dS(0, 2, 1) = _dS(0, 1, 2) = -ny * nz * dsx;            // -ny * nz * s;
      68    38491960 :   _dS(0, 2, 2) = 2.0 * nx * s + (nx * nx + ny * ny) * dsx; // (nx * nx + ny * ny) * s;
      69             : 
      70             :   // d/d(grad eta)_y
      71    38491960 :   _dS(1, 0, 0) = 2.0 * ny * s + (ny * ny + nz * nz) * dsy; // (ny * ny + nz * nz) * s;
      72    38491960 :   _dS(1, 1, 0) = _dS(1, 0, 1) = -nx * s - nx * ny * dsy;   // -nx * ny * s;
      73    38491960 :   _dS(1, 1, 1) = (nx * nx + nz * nz) * dsy;                // (nx * nx + nz * nz) * s;
      74    38491960 :   _dS(1, 2, 0) = _dS(1, 0, 2) = -nx * nz * dsy;            // -nx * nz * s;
      75    38491960 :   _dS(1, 2, 1) = _dS(1, 1, 2) = -nz * s - ny * nz * dsy;   // -ny * nz * s;
      76    38491960 :   _dS(1, 2, 2) = 2.0 * ny * s + (nx * nx + ny * ny) * dsy; // (nx * nx + ny * ny) * s;
      77             : 
      78             :   // d/d(grad eta)_z
      79    38491960 :   _dS(2, 0, 0) = 2.0 * nz * s + (ny * ny + nz * nz) * dsz; // (ny * ny + nz * nz) * s;
      80    38491960 :   _dS(2, 1, 0) = _dS(2, 0, 1) = -nx * ny * dsz;            // -nx * ny * s;
      81    38491960 :   _dS(2, 1, 1) = 2.0 * nz * s + (nx * nx + nz * nz) * dsz; // (nx * nx + nz * nz) * s;
      82    38491960 :   _dS(2, 2, 0) = _dS(2, 0, 2) = -nx * s - nx * nz * dsz;   // -nx * nz * s;
      83    38491960 :   _dS(2, 2, 1) = _dS(2, 1, 2) = -ny * s - ny * nz * dsz;   // -ny * nz * s;
      84    38491960 :   _dS(2, 2, 2) = (nx * nx + ny * ny) * dsz;                // (nx * nx + ny * ny) * s;
      85             : 
      86    38491960 :   return _L[_qp] * 0.5 * _dS.doubleContraction(_strain[_qp]) * _grad_test[_i][_qp];
      87             : }
      88             : 
      89             : Real
      90    63963136 : ACInterfaceStress::computeQpJacobian()
      91             : {
      92             :   // no interface, return zero stress
      93    63963136 :   const Real grad_norm_sq = _grad_u[_qp].norm_sq();
      94    63963136 :   if (grad_norm_sq < libMesh::TOLERANCE)
      95             :     return 0.0;
      96             : 
      97    39116608 :   const Real grad_norm = std::sqrt(grad_norm_sq);
      98             : 
      99             :   const Real nx = _grad_u[_qp](0);
     100             :   const Real ny = _grad_u[_qp](1);
     101             :   const Real nz = _grad_u[_qp](2);
     102             : 
     103    39116608 :   const Real px = _grad_phi[_j][_qp](0);
     104    39116608 :   const Real py = _grad_phi[_j][_qp](1);
     105    39116608 :   const Real pz = _grad_phi[_j][_qp](2);
     106             : 
     107    39116608 :   const Real s = _stress / grad_norm;
     108    39116608 :   const Real ds = -_stress / (grad_norm * grad_norm_sq);
     109    39116608 :   const Real dsx = ds * nx;
     110    39116608 :   const Real dsy = ds * ny;
     111    39116608 :   const Real dsz = ds * nz;
     112             : 
     113    39116608 :   const Real dus = ds * (nx * px + ny * py + pz * nz);
     114             : 
     115    39116608 :   const Real b = -3.0 * nx * px - 3.0 * ny * py - 3.0 * nz * pz;
     116    39116608 :   const Real dudsx = ds * nx / grad_norm_sq * b + ds * px;
     117    39116608 :   const Real dudsy = ds * ny / grad_norm_sq * b + ds * py;
     118    39116608 :   const Real dudsz = ds * nz / grad_norm_sq * b + ds * pz;
     119             : 
     120             :   // d/du d/d(grad eta)_x
     121    39116608 :   _ddS(0, 0, 0) = (2.0 * ny * py + 2.0 * nz * pz) * dsx + (ny * ny + nz * nz) * dudsx;
     122    39116608 :   _ddS(0, 1, 0) = _ddS(0, 0, 1) =
     123    39116608 :       -py * s - ny * dus - px * ny * dsx - nx * py * dsx - nx * ny * dudsx;
     124    39116608 :   _ddS(0, 1, 1) = 2.0 * px * s + 2.0 * nx * dus + (2.0 * nx * px + 2.0 * nz * pz) * dsx +
     125    39116608 :                   (nx * nx + nz * nz) * dudsx;
     126    39116608 :   _ddS(0, 2, 0) = _ddS(0, 0, 2) =
     127    39116608 :       -pz * s - nz * dus - px * nz * dsx - nx * pz * dsx - nx * nz * dudsx;
     128    39116608 :   _ddS(0, 2, 1) = _ddS(0, 1, 2) = -py * nz * dsx - ny * pz * dsx - ny * nz * dudsx;
     129    39116608 :   _ddS(0, 2, 2) = 2.0 * px * s + 2.0 * nx * dus + (2.0 * nx * px + 2.0 * ny * py) * dsx +
     130    39116608 :                   (nx * nx + ny * ny) * dudsx;
     131             : 
     132             :   // d/du d/d(grad eta)_y
     133    39116608 :   _ddS(1, 0, 0) = 2.0 * py * s + 2.0 * ny * dus + (2.0 * ny * py + 2.0 * nz * pz) * dsy +
     134    39116608 :                   (ny * ny + nz * nz) * dudsy;
     135    39116608 :   _ddS(1, 1, 0) = _ddS(1, 0, 1) =
     136    39116608 :       -px * s - nx * dus - px * ny * dsy - nx * py * dsy - nx * ny * dudsy;
     137    39116608 :   _ddS(1, 1, 1) = (2.0 * nx * px + 2.0 * nz * pz) * dsy + (nx * nx + nz * nz) * dudsy;
     138    39116608 :   _ddS(1, 2, 0) = _ddS(1, 0, 2) = -px * nz * dsy - nx * pz * dsy - nx * nz * dudsy;
     139    39116608 :   _ddS(1, 2, 1) = _ddS(1, 1, 2) =
     140    39116608 :       -pz * s - nz * dus - py * nz * dsy - ny * pz * dsy - ny * nz * dudsy;
     141    39116608 :   _ddS(1, 2, 2) = 2.0 * py * s + 2.0 * ny * dus + (2.0 * nx * px + 2.0 * ny * py) * dsy +
     142    39116608 :                   (nx * nx + ny * ny) * dudsy;
     143             : 
     144             :   // d/du d/d(grad eta)_z
     145    39116608 :   _ddS(2, 0, 0) = 2.0 * pz * s + 2.0 * nz * dus + (2.0 * ny * py + 2.0 * nz * pz) * dsz +
     146    39116608 :                   (ny * ny + nz * nz) * dudsz;
     147    39116608 :   _ddS(2, 1, 0) = _ddS(2, 0, 1) = -px * ny * dsz - nx * py * dsz - nx * ny * dudsz;
     148    39116608 :   _ddS(2, 1, 1) = 2.0 * pz * s + 2.0 * nz * dus + (2.0 * nx * px + 2.0 * nz * pz) * dsz +
     149    39116608 :                   (nx * nx + nz * nz) * dudsz;
     150    39116608 :   _ddS(2, 2, 0) = _ddS(2, 0, 2) =
     151    39116608 :       -px * s - nx * dus - px * nz * dsz - nx * pz * dsz - nx * nz * dudsz;
     152    39116608 :   _ddS(2, 2, 1) = _ddS(2, 1, 2) =
     153    39116608 :       -py * s - ny * dus - py * nz * dsz - ny * pz * dsz - ny * nz * dudsz;
     154    39116608 :   _ddS(2, 2, 2) = (2.0 * nx * px + 2.0 * ny * py) * dsz + (nx * nx + ny * ny) * dudsz;
     155             : 
     156    39116608 :   return _L[_qp] * 0.5 * _ddS.doubleContraction(_strain[_qp]) * _grad_test[_i][_qp];
     157             : }

Generated by: LCOV version 1.14