37 _mass_frac(_nodal_material ? declareGenericProperty<
std::vector<
std::vector<Real>>, is_ad>(
38 "PorousFlow_mass_frac_nodal")
39 : declareGenericProperty<
std::vector<
std::vector<Real>>, is_ad>(
40 "PorousFlow_mass_frac_qp")),
41 _grad_mass_frac(_nodal_material
43 : &declareGenericProperty<
std::vector<
std::vector<RealGradient>>, is_ad>(
44 "PorousFlow_grad_mass_frac_qp")),
45 _dmass_frac_dvar(is_ad ? nullptr
47 ? &declareProperty<
std::vector<
std::vector<
std::vector<Real>>>>(
48 "dPorousFlow_mass_frac_nodal_dvar")
49 : &declareProperty<
std::vector<
std::vector<
std::vector<Real>>>>(
50 "dPorousFlow_mass_frac_qp_dvar")),
51 _num_passed_mf_vars(isParamValid(
"mass_fraction_vars") ? coupledComponents(
"mass_fraction_vars")
55 mooseError(
"PorousFlowMassFraction: The Dictator proclaims that the number of phases is ",
57 " and the number of components is ",
59 ", and stipulates that you should not use PorousFlowMassFraction in this case");
62 paramError(
"mass_fraction_vars",
63 "This value must be equal to the Dictator's num_phases (",
65 ") multiplied by num_components-1 (",
77 isCoupled(
"mass_fraction_vars") ? getFieldVar(
"mass_fraction_vars", i)->isNodal() :
false;
81 (_nodal_material && is_nodal ? &coupledGenericDofValue<is_ad>(
"mass_fraction_vars", i)
82 : &coupledGenericValue<is_ad>(
"mass_fraction_vars", i));
83 _grad_mf_vars[i] = &coupledGenericGradient<is_ad>(
"mass_fraction_vars", i);
101 _mass_frac[_qp].resize(_num_phases);
104 (*_dmass_frac_dvar)[_qp].resize(_num_phases);
106 if (!_nodal_material)
107 (*_grad_mass_frac)[_qp].resize(_num_phases);
109 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
111 _mass_frac[_qp][ph].resize(_num_components);
115 (*_dmass_frac_dvar)[_qp][ph].resize(_num_components);
116 for (
unsigned int comp = 0; comp < _num_components; ++comp)
117 (*_dmass_frac_dvar)[_qp][ph][comp].assign(_num_var, 0.0);
120 if (!_nodal_material)
121 (*_grad_mass_frac)[_qp][ph].resize(_num_components);
126 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
130 if (!_nodal_material)
131 (*_grad_mass_frac)[_qp][ph][_num_components - 1] = 0.0;
133 for (
unsigned int comp = 0; comp < _num_components - 1; ++comp)
135 _mass_frac[_qp][ph][comp] = (*_mf_vars[i])[_qp];
136 total_mass_frac += _mass_frac[_qp][ph][comp];
138 if (!_nodal_material)
140 (*_grad_mass_frac)[_qp][ph][comp] = (*_grad_mf_vars[i])[_qp];
141 (*_grad_mass_frac)[_qp][ph][_num_components - 1] -= (*_grad_mf_vars[i])[_qp];
144 if (!is_ad && _dictator.isPorousFlowVariable(_mf_vars_num[i]))
147 const unsigned int pf_var_num = _dictator.porousFlowVariableNum(_mf_vars_num[i]);
148 (*_dmass_frac_dvar)[_qp][ph][comp][pf_var_num] = 1.0;
149 (*_dmass_frac_dvar)[_qp][ph][_num_components - 1][pf_var_num] = -1.0;
154 _mass_frac[_qp][ph][_num_components - 1] = 1.0 - total_mass_frac;