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 "PorousFlowFullySaturatedDarcyBase.h" 11 : 12 : #include "MooseVariable.h" 13 : 14 : registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedDarcyBase); 15 : 16 : InputParameters 17 2718 : PorousFlowFullySaturatedDarcyBase::validParams() 18 : { 19 2718 : InputParameters params = Kernel::validParams(); 20 5436 : params.addRequiredParam<RealVectorValue>("gravity", 21 : "Gravitational acceleration vector downwards (m/s^2)"); 22 5436 : params.addParam<bool>("multiply_by_density", 23 5436 : true, 24 : "If true, then this Kernel is the fluid mass " 25 : "flux. If false, then this Kernel is the " 26 : "fluid volume flux (which is common in " 27 : "poro-mechanics)"); 28 5436 : params.addRequiredParam<UserObjectName>( 29 : "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names"); 30 2718 : params.addClassDescription("Darcy flux suitable for models involving a fully-saturated, single " 31 : "phase, single component fluid. No upwinding is used"); 32 2718 : return params; 33 0 : } 34 : 35 1498 : PorousFlowFullySaturatedDarcyBase::PorousFlowFullySaturatedDarcyBase( 36 1498 : const InputParameters & parameters) 37 : : Kernel(parameters), 38 1498 : _multiply_by_density(getParam<bool>("multiply_by_density")), 39 2996 : _permeability(getMaterialProperty<RealTensorValue>("PorousFlow_permeability_qp")), 40 1498 : _dpermeability_dvar( 41 1498 : getMaterialProperty<std::vector<RealTensorValue>>("dPorousFlow_permeability_qp_dvar")), 42 2996 : _dpermeability_dgradvar(getMaterialProperty<std::vector<std::vector<RealTensorValue>>>( 43 : "dPorousFlow_permeability_qp_dgradvar")), 44 2996 : _density(getMaterialProperty<std::vector<Real>>("PorousFlow_fluid_phase_density_qp")), 45 2996 : _ddensity_dvar(getMaterialProperty<std::vector<std::vector<Real>>>( 46 : "dPorousFlow_fluid_phase_density_qp_dvar")), 47 2996 : _viscosity(getMaterialProperty<std::vector<Real>>("PorousFlow_viscosity_qp")), 48 1498 : _dviscosity_dvar( 49 1498 : getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_viscosity_qp_dvar")), 50 2996 : _pp(getMaterialProperty<std::vector<Real>>("PorousFlow_porepressure_qp")), 51 2996 : _grad_p(getMaterialProperty<std::vector<RealGradient>>("PorousFlow_grad_porepressure_qp")), 52 2996 : _dgrad_p_dgrad_var(getMaterialProperty<std::vector<std::vector<Real>>>( 53 : "dPorousFlow_grad_porepressure_qp_dgradvar")), 54 2996 : _dgrad_p_dvar(getMaterialProperty<std::vector<std::vector<RealGradient>>>( 55 : "dPorousFlow_grad_porepressure_qp_dvar")), 56 1498 : _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")), 57 2996 : _gravity(getParam<RealVectorValue>("gravity")), 58 2996 : _perm_derivs(_dictator.usePermDerivs()) 59 : { 60 1498 : if (_dictator.numPhases() != 1) 61 0 : mooseError("PorousFlowFullySaturatedDarcyBase should not be used for multi-phase scenarios as " 62 : "it does no upwinding and does not include relative-permeability effects"); 63 1498 : } 64 : 65 : Real 66 29066472 : PorousFlowFullySaturatedDarcyBase::computeQpResidual() 67 : { 68 : const unsigned ph = 0; 69 29066472 : const Real mob = mobility(); 70 : const RealVectorValue flow = 71 29066472 : _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity); 72 29066472 : return _grad_test[_i][_qp] * mob * flow; 73 : } 74 : 75 : Real 76 131872352 : PorousFlowFullySaturatedDarcyBase::computeQpJacobian() 77 : { 78 131872352 : return computeQpOffDiagJacobian(_var.number()); 79 : } 80 : 81 : Real 82 388103936 : PorousFlowFullySaturatedDarcyBase::computeQpOffDiagJacobian(unsigned int jvar) 83 : { 84 388103936 : if (_dictator.notPorousFlowVariable(jvar)) 85 : return 0.0; 86 : 87 : const unsigned ph = 0; 88 388103936 : const unsigned pvar = _dictator.porousFlowVariableNum(jvar); 89 : 90 388103936 : const Real mob = mobility(); 91 388103936 : const Real dmob = dmobility(pvar) * _phi[_j][_qp]; 92 : 93 : const RealVectorValue flow = 94 388103936 : _permeability[_qp] * (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity); 95 : 96 : RealVectorValue dflow = 97 388103936 : _permeability[_qp] * (_grad_phi[_j][_qp] * _dgrad_p_dgrad_var[_qp][ph][pvar] - 98 388103936 : _phi[_j][_qp] * _ddensity_dvar[_qp][ph][pvar] * _gravity); 99 388103936 : dflow += _permeability[_qp] * (_dgrad_p_dvar[_qp][ph][pvar] * _phi[_j][_qp]); 100 : 101 388103936 : if (_perm_derivs) 102 : { 103 0 : dflow += _dpermeability_dvar[_qp][pvar] * _phi[_j][_qp] * 104 0 : (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity); 105 0 : for (const auto i : make_range(Moose::dim)) 106 0 : dflow += _dpermeability_dgradvar[_qp][i][pvar] * _grad_phi[_j][_qp](i) * 107 0 : (_grad_p[_qp][ph] - _density[_qp][ph] * _gravity); 108 : } 109 : 110 388103936 : return _grad_test[_i][_qp] * (dmob * flow + mob * dflow); 111 : } 112 : 113 : Real 114 552827592 : PorousFlowFullySaturatedDarcyBase::mobility() const 115 : { 116 : const unsigned ph = 0; 117 552827592 : Real mob = 1.0 / _viscosity[_qp][ph]; 118 552827592 : if (_multiply_by_density) 119 332266456 : mob *= _density[_qp][ph]; 120 552827592 : return mob; 121 : } 122 : 123 : Real 124 388103936 : PorousFlowFullySaturatedDarcyBase::dmobility(unsigned pvar) const 125 : { 126 : const unsigned ph = 0; 127 388103936 : Real dmob = -_dviscosity_dvar[_qp][ph][pvar] / std::pow(_viscosity[_qp][ph], 2); 128 388103936 : if (_multiply_by_density) 129 182104448 : dmob = _density[_qp][ph] * dmob + _ddensity_dvar[_qp][ph][pvar] / _viscosity[_qp][ph]; 130 388103936 : return dmob; 131 : }