20 #if defined(LIBMESH_HAVE_EIGEN_DENSE) && defined(LIBMESH_HAVE_PETSC) 22 #include "libmesh/mesh_base.h" 23 #include "libmesh/dof_map.h" 24 #include "libmesh/static_condensation.h" 25 #include "libmesh/quadrature.h" 26 #include "libmesh/boundary_info.h" 27 #include "libmesh/numeric_vector.h" 28 #include "libmesh/sparse_matrix.h" 34 template <
typename SolnType,
typename PhiType>
37 const unsigned int n_qps,
38 const std::vector<std::vector<PhiType>> & phi,
39 const std::vector<Number> & dof_values)
43 for (
auto & val : qp_vec)
47 const auto & qp_phis = phi[i];
49 const auto sol = dof_values[i];
51 qp_vec[qp] += qp_phis[qp] * sol;
58 u_true_soln(nu, cavity),
59 v_true_soln(nu, cavity),
95 left_bnd = bnd_info.get_id_by_name(
"left");
96 top_bnd = bnd_info.get_id_by_name(
"top");
97 right_bnd = bnd_info.get_id_by_name(
"right");
98 bottom_bnd = bnd_info.get_id_by_name(
"bottom");
108 const std::vector<Real> & JxW_local,
109 const std::vector<std::vector<Real>> & phi,
110 const std::vector<Number> & sol,
111 const std::size_t n_dofs,
116 R(i) -= JxW_local[qp] * phi[i][qp] * sol[qp];
121 const std::vector<Real> & JxW_local,
122 const std::vector<std::vector<Real>> & phi,
123 const std::size_t n_dofs,
129 J(i, j) -= JxW_local[qp] * phi[i][qp] * phi[j][qp];
134 const unsigned int vel_component,
135 std::vector<Gradient> & sigma)
137 sigma.resize(
qrule->n_points());
141 qp_p(vel_component) =
p_sol[qp];
142 sigma[qp] =
nu * vel_gradient[qp] - qp_p;
148 const std::vector<Number> & scalar_sol,
155 R(i) += (*JxW)[qp] * ((*vector_phi)[i][qp] * vector_sol[qp]);
158 R(i) += (*JxW)[qp] * ((*div_vector_phi)[i][qp] * scalar_sol[qp]);
170 Jqq(i, j) += (*JxW)[qp] * ((*vector_phi)[i][qp] * (*vector_phi)[j][qp]);
174 Jqs(i, j) += (*JxW)[qp] * ((*div_vector_phi)[i][qp] * (*scalar_phi)[j][qp]);
180 const std::vector<Number> & v_sol_local,
181 const unsigned int qp,
182 const unsigned int vel_component)
const 185 return U * U(vel_component);
190 const std::vector<Number> & v_sol_local,
191 const unsigned int qp,
192 const unsigned int vel_component,
193 const unsigned int vel_j_component,
194 const std::vector<std::vector<Real>> & phi,
195 const unsigned int j)
const 199 vector_phi_local(vel_j_component) = phi[j][qp];
200 auto ret = vector_phi_local * U(vel_component);
201 if (vel_component == vel_j_component)
202 ret += U * phi[j][qp];
208 const unsigned int vel_component,
209 std::vector<Gradient> & sigma,
222 f = mms_info.forcing((*
q_point)[qp]);
227 R(i) += (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * sigma[qp]);
230 R(i) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel_cross_vel);
234 R(i) -= (*JxW)[qp] * (*scalar_phi)[i][qp] * f;
251 Jsq(i, j) += (*JxW)[qp] *
nu * ((*grad_scalar_phi)[i][qp] * (*vector_phi)[j][qp]);
257 p_phi(vel_component) = (*scalar_phi)[j][qp];
258 Jsp(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * p_phi);
266 const auto vel_cross_vel =
268 Jsu(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel_cross_vel);
272 const auto vel_cross_vel =
274 Jsv(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel_cross_vel);
293 Rp(i) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel);
297 Rp(i) -= (*JxW)[qp] * (*scalar_phi)[i][qp] * f;
304 Rglm(0) -= (*JxW)[qp] *
p_sol[qp];
322 Jpu(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * phi);
326 Jpv(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * phi);
330 Jpglm(i, 0) -= (*JxW)[qp] * (*scalar_phi)[i][qp];
337 Jglmp(0, j) -= (*JxW)[qp] * (*scalar_phi)[j][qp];
348 const auto vdotn = vel * (*normals)[qp];
350 R(i) += (*JxW_face)[qp] * vdotn * (*scalar_phi_face)[i][qp];
363 Jplm_u(i, j) += (*JxW_face)[qp] * phi * (*normals)[qp] * (*scalar_phi_face)[i][qp];
367 Jplm_v(i, j) += (*JxW_face)[qp] * phi * (*normals)[qp] * (*scalar_phi_face)[i][qp];
403 const auto vdotn = dirichlet_velocity * (*normals)[qp];
405 R(i) += (*JxW_face)[qp] * vdotn * (*scalar_phi_face)[i][qp];
418 R(i) -= (*JxW_face)[qp] * ((*vector_phi_face)[i][qp] * (*normals)[qp]) * scalar_value;
428 R(i) -= (*JxW_face)[qp] * ((*vector_phi_face)[i][qp] * (*normals)[qp]) * lm_sol[qp];
439 (*JxW_face)[qp] * ((*vector_phi_face)[i][qp] * (*normals)[qp]) * (*
lm_phi_face)[j][qp];
444 const std::vector<Number> & scalar_sol,
445 const unsigned int vel_component,
451 qp_p(vel_component) =
p_sol[qp];
454 const auto scalar_value = dirichlet_velocity(vel_component);
460 R(i) -= (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] * (vector_sol[qp] * (*normals)[qp]);
463 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (qp_p * (*normals)[qp]);
466 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * scalar_sol[qp] * (*normals)[qp] *
470 R(i) -= (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * scalar_value * (*normals)[qp] *
474 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (dirichlet_velocity * (*normals)[qp]) *
490 Jsq(i, j) -= (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] *
491 ((*vector_phi_face)[j][qp] * (*normals)[qp]);
496 p_phi(vel_component) = (*scalar_phi_face)[j][qp];
498 Jsp(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (p_phi * (*normals)[qp]);
502 Jss(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * (*scalar_phi_face)[j][qp] *
503 (*normals)[qp] * (*normals)[qp];
509 const std::vector<Number> & scalar_sol,
510 const std::vector<Number> & lm_sol,
511 const unsigned int vel_component,
517 qp_p(vel_component) =
p_sol[qp];
526 (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] * (vector_sol[qp] * (*normals)[qp]);
529 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (qp_p * (*normals)[qp]);
532 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * scalar_sol[qp] *
533 (*normals)[qp] * (*normals)[qp];
536 R(i) -= (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * lm_sol[qp] * (*normals)[qp] *
541 "This method should only be called with an outflow boundary. " 542 "Dirichlet boundaries should call a different routine");
545 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
565 Jsq(i, j) -= (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] *
566 ((*vector_phi_face)[j][qp] * (*normals)[qp]);
571 p_phi(vel_component) = (*scalar_phi_face)[j][qp];
573 Jsp(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (p_phi * (*normals)[qp]);
577 Jss(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau *
578 (*scalar_phi_face)[j][qp] * (*normals)[qp] * (*normals)[qp];
582 "This method should only be called with an outflow boundary. " 583 "Dirichlet boundaries should call a different routine");
589 Jslm(i, j) -= (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * (*lm_phi_face)[j][qp] *
590 (*normals)[qp] * (*normals)[qp];
598 const auto vel_cross_vel =
601 (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
605 const auto vel_cross_vel =
608 (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
616 const std::vector<Number> & scalar_sol,
617 const std::vector<Number> & lm_sol,
618 const unsigned int vel_component,
624 qp_p(vel_component) =
p_sol[qp];
630 R(i) -= (*JxW_face)[qp] *
nu * (*lm_phi_face)[i][qp] * (vector_sol[qp] * (*normals)[qp]);
633 R(i) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * (qp_p * (*normals)[qp]);
636 R(i) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * scalar_sol[qp] * (*normals)[qp] *
640 R(i) -= (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * lm_sol[qp] * (*normals)[qp] *
647 R(i) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
650 "This method should only be called with an outflow boundary. " 651 "Dirichlet boundaries should call a different routine");
669 Jlmq(i, j) -= (*JxW_face)[qp] *
nu * (*lm_phi_face)[i][qp] *
670 ((*vector_phi_face)[j][qp] * (*normals)[qp]);
675 p_phi(vel_component) = (*scalar_phi_face)[j][qp];
676 Jlmp(i, j) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * (p_phi * (*normals)[qp]);
680 Jlms(i, j) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * (*scalar_phi_face)[j][qp] *
681 (*normals)[qp] * (*normals)[qp];
686 Jlmlm(i, j) -= (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * (*lm_phi_face)[j][qp] *
687 (*normals)[qp] * (*normals)[qp];
692 const auto vel_cross_vel =
695 (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
699 const auto vel_cross_vel =
702 (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
707 "This method should only be called with an outflow boundary. " 708 "Dirichlet boundaries should call a different routine");
736 static std::vector<dof_id_type> dummy_indices;
737 auto & global_lm_dof_indices =
cavity ?
dof_indices[global_lm_num] : dummy_indices;
739 std::vector<boundary_id_type> boundary_ids;
743 for (
const auto & elem :
mesh->active_local_element_ptr_range())
771 Rglm.
resize(global_lm_dof_indices.size());
813 for (
auto side : elem->side_index_range())
831 if (
neigh ==
nullptr)
833 boundary_info.boundary_ids(elem, side, boundary_ids);
889 const unsigned int ivar_num,
890 const unsigned int jvar_num,
906 for (
const auto i :
make_range(J->row_start(), J->row_stop()))
925 static std::vector<dof_id_type> dummy_indices;
926 auto & global_lm_dof_indices =
cavity ?
dof_indices[global_lm_num] : dummy_indices;
928 std::vector<boundary_id_type> boundary_ids;
931 DenseMatrix<Number> Jqu_qu, Jqv_qv, Jqu_u, Jqv_v, Ju_qu, Jv_qv, Ju_p, Jv_p, Ju_u, Jv_u, Ju_v,
932 Jv_v, Jp_u, Jp_v, Jp_glm, Jglm_p, Jp_lmu, Jp_lmv, Jqu_lmu, Jqv_lmv, Ju_lmu, Jv_lmv, Jv_lmu,
933 Ju_lmv, Jlmu_qu, Jlmv_qv, Jlmu_p, Jlmv_p, Jlmu_u, Jlmv_v, Jlmu_lmu, Jlmv_lmu, Jlmu_lmv,
936 for (
const auto & elem :
mesh->active_local_element_ptr_range())
961 Jqu_qu.
resize(qu_dof_indices.size(), qu_dof_indices.size());
962 Jqv_qv.
resize(qv_dof_indices.size(), qv_dof_indices.size());
963 Jqu_u.
resize(qu_dof_indices.size(), u_dof_indices.size());
964 Jqv_v.
resize(qv_dof_indices.size(), v_dof_indices.size());
965 Ju_qu.
resize(u_dof_indices.size(), qu_dof_indices.size());
966 Jv_qv.
resize(v_dof_indices.size(), qv_dof_indices.size());
967 Ju_p.
resize(u_dof_indices.size(), p_dof_indices.size());
968 Jv_p.
resize(v_dof_indices.size(), p_dof_indices.size());
969 Ju_u.
resize(u_dof_indices.size(), u_dof_indices.size());
970 Jv_u.
resize(v_dof_indices.size(), u_dof_indices.size());
971 Ju_v.
resize(u_dof_indices.size(), v_dof_indices.size());
972 Jv_v.
resize(v_dof_indices.size(), v_dof_indices.size());
973 Jp_u.
resize(p_dof_indices.size(), u_dof_indices.size());
974 Jp_v.
resize(p_dof_indices.size(), v_dof_indices.size());
975 Jp_glm.
resize(p_dof_indices.size(), global_lm_dof_indices.size());
976 Jglm_p.
resize(global_lm_dof_indices.size(), p_dof_indices.size());
977 Jp_lmu.
resize(p_dof_indices.size(), lm_u_dof_indices.size());
978 Jp_lmv.
resize(p_dof_indices.size(), lm_v_dof_indices.size());
979 Jqu_lmu.
resize(qu_dof_indices.size(), lm_u_dof_indices.size());
980 Jqv_lmv.
resize(qv_dof_indices.size(), lm_v_dof_indices.size());
981 Ju_lmu.
resize(u_dof_indices.size(), lm_u_dof_indices.size());
982 Jv_lmv.
resize(v_dof_indices.size(), lm_v_dof_indices.size());
983 Jv_lmu.
resize(v_dof_indices.size(), lm_u_dof_indices.size());
984 Ju_lmv.
resize(u_dof_indices.size(), lm_v_dof_indices.size());
985 Jlmu_qu.
resize(lm_u_dof_indices.size(), qu_dof_indices.size());
986 Jlmv_qv.
resize(lm_v_dof_indices.size(), qv_dof_indices.size());
987 Jlmu_p.
resize(lm_u_dof_indices.size(), p_dof_indices.size());
988 Jlmv_p.
resize(lm_v_dof_indices.size(), p_dof_indices.size());
989 Jlmu_u.
resize(lm_u_dof_indices.size(), u_dof_indices.size());
990 Jlmv_v.
resize(lm_v_dof_indices.size(), v_dof_indices.size());
991 Jlmu_lmu.
resize(lm_u_dof_indices.size(), lm_u_dof_indices.size());
992 Jlmv_lmu.
resize(lm_v_dof_indices.size(), lm_u_dof_indices.size());
993 Jlmu_lmv.
resize(lm_u_dof_indices.size(), lm_v_dof_indices.size());
994 Jlmv_lmv.
resize(lm_v_dof_indices.size(), lm_v_dof_indices.size());
1036 for (
auto side : elem->side_index_range())
1054 if (
neigh ==
nullptr)
1056 boundary_info.boundary_ids(elem, side, boundary_ids);
1082 lm_face_jacobian(0, Jlmu_qu, Jlmu_p, Jlmu_u, Jlmu_lmu, Jlmu_lmu, Jlmu_lmv);
1087 lm_face_jacobian(1, Jlmv_qv, Jlmv_p, Jlmv_v, Jlmv_lmv, Jlmv_lmu, Jlmv_lmv);
const std::vector< std::vector< Real > > * scalar_phi_face
void scalar_face_jacobian(const unsigned int vel_component, DenseMatrix< Number > &Jsq, DenseMatrix< Number > &Jsp, DenseMatrix< Number > &Jss, DenseMatrix< Number > &Jslm, DenseMatrix< Number > &Js_lmu, DenseMatrix< Number > &Js_lmv)
NumberVectorValue vel_cross_vel_residual(const std::vector< Number > &u_sol_local, const std::vector< Number > &v_sol_local, const unsigned int qp, const unsigned int vel_component) const
boundary_id_type bottom_bnd
std::unique_ptr< QBase > qface
HDGProblem(const Real nu_in, const bool cavity_in)
void create_identity_jacobian(const QBase &quadrature, const std::vector< Real > &JxW_local, const std::vector< std::vector< Real >> &phi, const std::size_t n_dofs, DenseMatrix< Number > &J)
const std::vector< std::vector< Real > > * scalar_phi
void vector_face_residual(const std::vector< Number > &lm_sol, DenseVector< Number > &R)
const std::vector< std::vector< RealVectorValue > > * vector_phi_face
void lm_face_jacobian(const unsigned int vel_component, DenseMatrix< Number > &Jlmq, DenseMatrix< Number > &Jlmp, DenseMatrix< Number > &Jlms, DenseMatrix< Number > &Jlmlm, DenseMatrix< Number > &Jlm_lmu, DenseMatrix< Number > &Jlm_lmv)
void pressure_face_residual(DenseVector< Number > &R)
std::vector< Gradient > sigma_u
const std::vector< std::vector< RealVectorValue > > * vector_phi
void scalar_face_residual(const std::vector< Gradient > &vector_sol, const std::vector< Number > &scalar_sol, const std::vector< Number > &lm_sol, const unsigned int vel_component, DenseVector< Number > &R)
void set_current_elem(const Elem &elem)
Set the current element.
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
std::unique_ptr< FEVectorBase > vector_fe
void vector_volume_residual(const std::vector< Gradient > &vector_sol, const std::vector< Number > &scalar_sol, DenseVector< Number > &R)
boundary_id_type current_bnd
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
VectorValue< Real > RealVectorValue
Useful typedefs to allow transparent switching between Real and Complex data types.
std::unique_ptr< FEBase > lm_fe_face
std::vector< Number > v_sol
void resize(const unsigned int n)
Resize the vector.
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i]...
std::vector< Number > p_sol
void compute_stress(const std::vector< Gradient > &vel_gradient, const unsigned int vel_component, std::vector< Gradient > &sigma)
std::unique_ptr< FEBase > scalar_fe
void scalar_volume_residual(const std::vector< Gradient > &vel_gradient, const unsigned int vel_component, std::vector< Gradient > &sigma, DenseVector< Number > &R)
std::vector< Number > v_dof_values
void scalar_volume_jacobian(const unsigned int vel_component, DenseMatrix< Number > &Jsq, DenseMatrix< Number > &Jsp, DenseMatrix< Number > &Jsu, DenseMatrix< Number > &Jsv)
void pressure_volume_residual(DenseVector< Number > &Rp, DenseVector< Number > &Rglm)
This class defines a vector in LIBMESH_DIM dimensional Real or Complex space.
The libMesh namespace provides an interface to certain functionality in the library.
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
const std::vector< Real > * JxW_face
virtual void zero()=0
Set all entries to zero.
const std::vector< Real > * JxW
unsigned int variable_number(std::string_view var) const
const std::vector< std::vector< Real > > * div_vector_phi
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
const std::vector< Point > * q_point
void create_identity_residual(const QBase &quadrature, const std::vector< Real > &JxW_local, const std::vector< std::vector< Real >> &phi, const std::vector< Number > &sol, const std::size_t n_dofs, DenseVector< Number > &R)
virtual void residual(const NumericVector< Number > &X, NumericVector< Number > &R, NonlinearImplicitSystem &S) override
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
static const boundary_id_type invalid_id
Number used for internal use.
std::vector< Number > lm_u_sol
std::unordered_map< unsigned int, std::vector< dof_id_type > > dof_indices
std::vector< Number > qv_dof_values
std::size_t global_lm_n_dofs
std::vector< Number > p_dof_values
static constexpr Real tau
std::unique_ptr< QBase > qrule
std::vector< Number > lm_v_sol
const std::vector< std::vector< Real > > * lm_phi_face
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and non-linear solv...
void lm_face_residual(const std::vector< Gradient > &vector_sol, const std::vector< Number > &scalar_sol, const std::vector< Number > &lm_sol, const unsigned int vel_component, DenseVector< Number > &R)
std::vector< Number > u_sol
std::unique_ptr< FEBase > scalar_fe_face
void add_matrix(NonlinearImplicitSystem &sys, const unsigned int ivar_num, const unsigned int jvar_num, const DenseMatrix< Number > &elem_mat)
unsigned int n_points() const
std::vector< Number > u_dof_values
virtual void jacobian(const NumericVector< Number > &X, SparseMatrix< Number > &, NonlinearImplicitSystem &S) override
void pressure_dirichlet_residual(DenseVector< Number > &R)
RealVectorValue get_dirichlet_velocity(const unsigned int qp) const
void scalar_dirichlet_jacobian(const unsigned int vel_component, DenseMatrix< Number > &Jsq, DenseMatrix< Number > &Jsp, DenseMatrix< Number > &Jss)
std::vector< Gradient > qu_sol
const std::vector< Point > * normals
const Elem * neighbor_ptr(unsigned int i) const
std::vector< Gradient > qv_sol
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< Number > qu_dof_values
Real forcing(const Point &p) const override
void vector_volume_jacobian(DenseMatrix< Number > &Jqq, DenseMatrix< Number > &Jqs)
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
void pressure_face_jacobian(DenseMatrix< Number > &Jplm_u, DenseMatrix< Number > &Jplm_v)
boundary_id_type left_bnd
std::vector< Number > lm_u_dof_values
const std::vector< Point > * qface_point
Number global_lm_dof_value
void pressure_volume_jacobian(DenseMatrix< Number > &Jpu, DenseMatrix< Number > &Jpv, DenseMatrix< Number > &Jpglm, DenseMatrix< Number > &Jglmp)
void compute_qp_soln(std::vector< SolnType > &qp_vec, const unsigned int n_qps, const std::vector< std::vector< PhiType >> &phi, const std::vector< Number > &dof_values)
void vector_face_jacobian(DenseMatrix< Number > &Jqlm)
std::vector< Number > lm_v_dof_values
const std::vector< std::vector< RealVectorValue > > * grad_scalar_phi
std::size_t scalar_n_dofs
std::size_t vector_n_dofs
void vector_dirichlet_residual(const unsigned int vel_component, DenseVector< Number > &R)
std::vector< Gradient > sigma_v
boundary_id_type right_bnd
const SparseMatrix< Number > & get_system_matrix() const
The QBase class provides the basic functionality from which various quadrature rules can be derived...
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
std::unique_ptr< FEVectorBase > vector_fe_face
void scalar_dirichlet_residual(const std::vector< Gradient > &vector_sol, const std::vector< Number > &scalar_sol, const unsigned int vel_component, DenseVector< Number > &R)
NumberVectorValue vel_cross_vel_jacobian(const std::vector< Number > &u_sol_local, const std::vector< Number > &v_sol_local, const unsigned int qp, const unsigned int vel_component, const unsigned int vel_j_component, const std::vector< std::vector< Real >> &phi, const unsigned int j) const