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 "FVPorousFlowMassTimeDerivative.h" 11 : #include "PorousFlowDictator.h" 12 : 13 : registerADMooseObject("PorousFlowApp", FVPorousFlowMassTimeDerivative); 14 : 15 : InputParameters 16 782 : FVPorousFlowMassTimeDerivative::validParams() 17 : { 18 782 : InputParameters params = FVTimeKernel::validParams(); 19 1564 : params.addRequiredParam<UserObjectName>("PorousFlowDictator", 20 : "The PorousFlowDictator UserObject"); 21 1564 : params.addParam<unsigned int>("fluid_component", 0, "The fluid component for this kernel"); 22 782 : params.addClassDescription("Derivative of fluid-component mass with respect to time"); 23 782 : return params; 24 0 : } 25 : 26 419 : FVPorousFlowMassTimeDerivative::FVPorousFlowMassTimeDerivative(const InputParameters & parameters) 27 : : FVTimeKernel(parameters), 28 419 : _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")), 29 419 : _num_phases(_dictator.numPhases()), 30 838 : _fluid_component(getParam<unsigned int>("fluid_component")), 31 838 : _porosity(getADMaterialProperty<Real>("PorousFlow_porosity_qp")), 32 838 : _porosity_old(getMaterialPropertyOld<Real>("PorousFlow_porosity_qp")), 33 838 : _density(getADMaterialProperty<std::vector<Real>>("PorousFlow_fluid_phase_density_qp")), 34 838 : _density_old(getMaterialPropertyOld<std::vector<Real>>("PorousFlow_fluid_phase_density_qp")), 35 838 : _saturation(getADMaterialProperty<std::vector<Real>>("PorousFlow_saturation_qp")), 36 838 : _saturation_old(getMaterialPropertyOld<std::vector<Real>>("PorousFlow_saturation_qp")), 37 419 : _mass_fractions( 38 419 : getADMaterialProperty<std::vector<std::vector<Real>>>("PorousFlow_mass_frac_qp")), 39 419 : _mass_fractions_old( 40 838 : getMaterialPropertyOld<std::vector<std::vector<Real>>>("PorousFlow_mass_frac_qp")) 41 : { 42 419 : if (_fluid_component >= _dictator.numComponents()) 43 0 : paramError( 44 : "fluid_component", 45 : "The Dictator proclaims that the maximum fluid component index in this simulation is ", 46 0 : _dictator.numComponents() - 1, 47 : " whereas you have used ", 48 0 : _fluid_component, 49 : ". Remember that indexing starts at 0. The Dictator does not take such mistakes lightly."); 50 419 : } 51 : 52 : ADReal 53 236623 : FVPorousFlowMassTimeDerivative::computeQpResidual() 54 : { 55 236623 : ADReal mass = 0.0; 56 : Real mass_old = 0.0; 57 : 58 580146 : for (const auto p : make_range(_num_phases)) 59 : { 60 687046 : mass += _density[_qp][p] * _saturation[_qp][p] * _mass_fractions[_qp][p][_fluid_component]; 61 343523 : mass_old += _density_old[_qp][p] * _saturation_old[_qp][p] * 62 343523 : _mass_fractions_old[_qp][p][_fluid_component]; 63 : } 64 : 65 473246 : return (_porosity[_qp] * mass - _porosity_old[_qp] * mass_old) / _dt; 66 : }