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 "PorousFlowHeatVolumetricExpansion.h" 11 : 12 : #include "MooseVariable.h" 13 : 14 : registerMooseObject("PorousFlowApp", PorousFlowHeatVolumetricExpansion); 15 : 16 : InputParameters 17 212 : PorousFlowHeatVolumetricExpansion::validParams() 18 : { 19 212 : InputParameters params = TimeKernel::validParams(); 20 424 : params.addParam<bool>("strain_at_nearest_qp", 21 424 : false, 22 : "When calculating nodal porosity that depends on strain, use the strain at " 23 : "the nearest quadpoint. This adds a small extra computational burden, and " 24 : "is not necessary for simulations involving only linear lagrange elements. " 25 : " If you set this to true, you will also want to set the same parameter to " 26 : "true for related Kernels and Materials"); 27 424 : params.addRequiredParam<UserObjectName>( 28 : "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names."); 29 212 : params.set<bool>("use_displaced_mesh") = false; 30 212 : params.suppressParameter<bool>("use_displaced_mesh"); 31 212 : params.addClassDescription("Energy-density*rate_of_solid_volumetric_expansion. The " 32 : "energy-density is lumped to the nodes"); 33 212 : return params; 34 0 : } 35 : 36 112 : PorousFlowHeatVolumetricExpansion::PorousFlowHeatVolumetricExpansion( 37 112 : const InputParameters & parameters) 38 : : TimeKernel(parameters), 39 112 : _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")), 40 112 : _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())), 41 112 : _num_phases(_dictator.numPhases()), 42 112 : _fluid_present(_num_phases > 0), 43 224 : _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp")), 44 224 : _porosity(getMaterialProperty<Real>("PorousFlow_porosity_nodal")), 45 224 : _dporosity_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_nodal_dvar")), 46 112 : _dporosity_dgradvar( 47 112 : getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_nodal_dgradvar")), 48 224 : _nearest_qp(_strain_at_nearest_qp 49 119 : ? &getMaterialProperty<unsigned int>("PorousFlow_nearestqp_nodal") 50 : : nullptr), 51 224 : _rock_energy_nodal(getMaterialProperty<Real>("PorousFlow_matrix_internal_energy_nodal")), 52 112 : _drock_energy_nodal_dvar( 53 112 : getMaterialProperty<std::vector<Real>>("dPorousFlow_matrix_internal_energy_nodal_dvar")), 54 224 : _fluid_density(_fluid_present ? &getMaterialProperty<std::vector<Real>>( 55 : "PorousFlow_fluid_phase_density_nodal") 56 : : nullptr), 57 224 : _dfluid_density_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>( 58 : "dPorousFlow_fluid_phase_density_nodal_dvar") 59 : : nullptr), 60 112 : _fluid_saturation_nodal( 61 224 : _fluid_present ? &getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal") 62 : : nullptr), 63 224 : _dfluid_saturation_nodal_dvar(_fluid_present 64 224 : ? &getMaterialProperty<std::vector<std::vector<Real>>>( 65 : "dPorousFlow_saturation_nodal_dvar") 66 : : nullptr), 67 224 : _energy_nodal(_fluid_present ? &getMaterialProperty<std::vector<Real>>( 68 : "PorousFlow_fluid_phase_internal_energy_nodal") 69 : : nullptr), 70 224 : _denergy_nodal_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>( 71 : "dPorousFlow_fluid_phase_internal_energy_nodal_dvar") 72 : : nullptr), 73 224 : _strain_rate_qp(getMaterialProperty<Real>("PorousFlow_volumetric_strain_rate_qp")), 74 224 : _dstrain_rate_qp_dvar(getMaterialProperty<std::vector<RealGradient>>( 75 112 : "dPorousFlow_volumetric_strain_rate_qp_dvar")) 76 : { 77 112 : } 78 : 79 : Real 80 192784 : PorousFlowHeatVolumetricExpansion::computeQpResidual() 81 : { 82 192784 : Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i]; 83 400448 : for (unsigned ph = 0; ph < _num_phases; ++ph) 84 207664 : energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] * 85 207664 : (*_energy_nodal)[_i][ph] * _porosity[_i]; 86 : 87 192784 : return _test[_i][_qp] * energy * _strain_rate_qp[_qp]; 88 : } 89 : 90 : Real 91 677824 : PorousFlowHeatVolumetricExpansion::computeQpJacobian() 92 : { 93 677824 : return computedEnergyQpJac(_var.number()) + computedVolQpJac(_var.number()); 94 : } 95 : 96 : Real 97 2335040 : PorousFlowHeatVolumetricExpansion::computeQpOffDiagJacobian(unsigned int jvar) 98 : { 99 2335040 : return computedEnergyQpJac(jvar) + computedVolQpJac(jvar); 100 : } 101 : 102 : Real 103 3012864 : PorousFlowHeatVolumetricExpansion::computedVolQpJac(unsigned int jvar) 104 : { 105 3012864 : if (_dictator.notPorousFlowVariable(jvar)) 106 : return 0.0; 107 : 108 3012864 : Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i]; 109 6217728 : for (unsigned ph = 0; ph < _num_phases; ++ph) 110 3204864 : energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] * 111 3204864 : (*_energy_nodal)[_i][ph] * _porosity[_i]; 112 : 113 3012864 : const unsigned int pvar = _dictator.porousFlowVariableNum(jvar); 114 3012864 : Real dvol = _dstrain_rate_qp_dvar[_qp][pvar] * _grad_phi[_j][_qp]; 115 : 116 3012864 : return _test[_i][_qp] * energy * dvol; 117 : } 118 : Real 119 3012864 : PorousFlowHeatVolumetricExpansion::computedEnergyQpJac(unsigned int jvar) 120 : { 121 3012864 : if (_dictator.notPorousFlowVariable(jvar)) 122 : return 0.0; 123 : 124 3012864 : const unsigned int pvar = _dictator.porousFlowVariableNum(jvar); 125 3012864 : const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i); 126 : 127 3012864 : Real denergy = -_dporosity_dgradvar[_i][pvar] * _grad_phi[_j][_i] * _rock_energy_nodal[_i]; 128 6217728 : for (unsigned ph = 0; ph < _num_phases; ++ph) 129 3204864 : denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] * 130 3204864 : (*_energy_nodal)[_i][ph] * _dporosity_dgradvar[_i][pvar] * _grad_phi[_j][nearest_qp]; 131 : 132 3012864 : if (_i != _j) 133 2450176 : return _test[_i][_qp] * denergy * _strain_rate_qp[_qp]; 134 : 135 562688 : denergy += _drock_energy_nodal_dvar[_i][pvar] * (1.0 - _porosity[_i]); 136 562688 : denergy -= _rock_energy_nodal[_i] * _dporosity_dvar[_i][pvar]; 137 1173376 : for (unsigned ph = 0; ph < _num_phases; ++ph) 138 : { 139 610688 : denergy += (*_dfluid_density_dvar)[_i][ph][pvar] * (*_fluid_saturation_nodal)[_i][ph] * 140 610688 : (*_energy_nodal)[_i][ph] * _porosity[_i]; 141 610688 : denergy += (*_fluid_density)[_i][ph] * (*_dfluid_saturation_nodal_dvar)[_i][ph][pvar] * 142 610688 : (*_energy_nodal)[_i][ph] * _porosity[_i]; 143 610688 : denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] * 144 610688 : (*_denergy_nodal_dvar)[_i][ph][pvar] * _porosity[_i]; 145 610688 : denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] * 146 610688 : (*_energy_nodal)[_i][ph] * _dporosity_dvar[_i][pvar]; 147 : } 148 : 149 562688 : return _test[_i][_qp] * denergy * _strain_rate_qp[_qp]; 150 : }