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 "PorousFlowFullySaturatedAdvectiveFlux.h" 11 : 12 : registerMooseObject("PorousFlowApp", PorousFlowFullySaturatedAdvectiveFlux); 13 : registerMooseObject("PorousFlowApp", ADPorousFlowFullySaturatedAdvectiveFlux); 14 : 15 : template <bool is_ad> 16 : InputParameters 17 676 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::validParams() 18 : { 19 676 : InputParameters params = PorousFlowDarcyBaseTempl<is_ad>::validParams(); 20 1352 : params.addParam<unsigned int>( 21 1352 : "fluid_component", 0, "The index corresponding to the fluid component for this kernel"); 22 1352 : params.addParam<bool>("multiply_by_density", 23 1352 : 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 676 : params.addClassDescription("Fully-upwinded advective flux of the fluid component given by " 29 : "fluid_component, in a single-phase fluid"); 30 676 : return params; 31 0 : } 32 : 33 : template <bool is_ad> 34 390 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::PorousFlowFullySaturatedAdvectiveFluxTempl( 35 : const InputParameters & parameters) 36 : : PorousFlowDarcyBaseTempl<is_ad>(parameters), 37 390 : _mass_fractions( 38 780 : this->template getGenericMaterialProperty<std::vector<std::vector<Real>>, is_ad>( 39 : "PorousFlow_mass_frac_nodal")), 40 390 : _dmass_fractions_dvar( 41 : is_ad ? nullptr 42 348 : : &this->template getMaterialProperty<std::vector<std::vector<std::vector<Real>>>>( 43 : "dPorousFlow_mass_frac_nodal_dvar")), 44 780 : _fluid_component(this->template getParam<unsigned int>("fluid_component")), 45 1170 : _multiply_by_density(this->template getParam<bool>("multiply_by_density")) 46 : { 47 390 : if (_dictator.numPhases() != 1) 48 0 : mooseError( 49 : "PorousFlowFullySaturatedAdvectiveFlux should not be used for multi-phase scenarios as " 50 : "it does not include relative-permeability effects"); 51 390 : } 52 : 53 : template <bool is_ad> 54 : GenericReal<is_ad> 55 4916025 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::mobility(unsigned nodenum, unsigned phase) const 56 : { 57 4916025 : if (_multiply_by_density == false) 58 62868 : return _mass_fractions[nodenum][phase][_fluid_component] / _fluid_viscosity[nodenum][phase]; 59 4853157 : return _mass_fractions[nodenum][phase][_fluid_component] * _fluid_density_node[nodenum][phase] / 60 4853289 : _fluid_viscosity[nodenum][phase]; 61 : } 62 : 63 : template <bool is_ad> 64 : Real 65 2752149 : PorousFlowFullySaturatedAdvectiveFluxTempl<is_ad>::dmobility(unsigned nodenum, 66 : unsigned phase, 67 : unsigned pvar) const 68 : { 69 : if constexpr (!is_ad) 70 : { 71 2752149 : if (_multiply_by_density == false) 72 34620 : return (*_dmass_fractions_dvar)[nodenum][phase][_fluid_component][pvar] / 73 34620 : _fluid_viscosity[nodenum][phase] - 74 34620 : _mass_fractions[nodenum][phase][_fluid_component] * 75 34620 : (*_dfluid_viscosity_dvar)[nodenum][phase][pvar] / 76 34620 : Utility::pow<2>(_fluid_viscosity[nodenum][phase]); 77 2717529 : Real dm = (*_dmass_fractions_dvar)[nodenum][phase][_fluid_component][pvar] * 78 2717529 : _fluid_density_node[nodenum][phase] / _fluid_viscosity[nodenum][phase]; 79 2717529 : dm += _mass_fractions[nodenum][phase][_fluid_component] * 80 2717529 : (*_dfluid_density_node_dvar)[nodenum][phase][pvar] / _fluid_viscosity[nodenum][phase]; 81 2717529 : dm -= _mass_fractions[nodenum][phase][_fluid_component] * _fluid_density_node[nodenum][phase] * 82 2717529 : (*_dfluid_viscosity_dvar)[nodenum][phase][pvar] / 83 : Utility::pow<2>(_fluid_viscosity[nodenum][phase]); 84 2717529 : return dm; 85 : } 86 : else 87 : libmesh_ignore(nodenum, phase, pvar); 88 0 : return 0.0; 89 : } 90 : 91 : template class PorousFlowFullySaturatedAdvectiveFluxTempl<false>; 92 : template class PorousFlowFullySaturatedAdvectiveFluxTempl<true>;