11 #include "SystemBase.h"
20 InputParameters params = validParams<Kernel>();
21 params.addClassDescription(
"Advective flux of fluid species or heat using "
22 "the Flux Limited TVD scheme invented by Kuzmin and Turek");
23 params.addRequiredParam<UserObjectName>(
24 "PorousFlowDictator",
"The UserObject that holds the list of PorousFlow variable names");
25 params.addRequiredParam<UserObjectName>(
26 "advective_flux_calculator",
27 "PorousFlowAdvectiveFluxCalculator UserObject. This determines whether the advection "
28 "describes a movement of a fluid component in a fluid phase, or movement of heat energy in a "
34 const InputParameters & parameters)
44 mooseError(
"PorousFlowFluxLimitedTVDAdvection::computeQpResidual() called\n");
51 prepareVectorTag(_assembly, _var.number());
52 precalculateResidual();
55 for (
unsigned i = 0; i < _current_elem->n_nodes(); ++i)
57 const dof_id_type node_id_i = _current_elem->node_id(i);
61 accumulateTaggedLocalResidual();
65 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
66 for (
unsigned int i = 0; i < _save_in.size(); i++)
67 _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices());
74 prepareMatrixTag(_assembly, _var.number(), _var.number());
75 precalculateJacobian();
82 for (
unsigned i = 0; i < _current_elem->n_nodes(); ++i)
85 const dof_id_type node_id_i = _current_elem->node_id(i);
87 std::vector<dof_id_type> idof_indices(
88 1, _current_elem->node_ref(i).dof_number(_sys.number(), _var.number(), 0));
100 std::vector<dof_id_type> jdof_indices(derivs.size());
101 DenseMatrix<Number> deriv_matrix(1, derivs.size());
103 for (
const auto & node_j_deriv : derivs)
106 const dof_id_type node_id_j = node_j_deriv.first;
108 jdof_indices[j] = _mesh.getMesh().node_ref(node_id_j).dof_number(_sys.number(), varnum, 0);
111 deriv_matrix(0, j) = node_j_deriv.second[pvar] / valence;
115 _assembly.cacheJacobianBlock(deriv_matrix, idof_indices, jdof_indices, _var.scalingFactor());