20 #include "libmesh/mesh_base.h" 21 #include "libmesh/dof_map.h" 22 #include "libmesh/static_condensation.h" 23 #include "libmesh/quadrature.h" 24 #include "libmesh/boundary_info.h" 25 #include "libmesh/numeric_vector.h" 26 #include "libmesh/sparse_matrix.h" 32 template <
typename SolnType,
typename PhiType>
35 const unsigned int n_qps,
36 const std::vector<std::vector<PhiType>> & phi,
37 const std::vector<Number> & dof_values)
41 for (
auto & val : qp_vec)
45 const auto & qp_phis = phi[i];
47 const auto sol = dof_values[i];
49 qp_vec[qp] += qp_phis[qp] * sol;
56 u_true_soln(nu, cavity),
57 v_true_soln(nu, cavity),
93 left_bnd = bnd_info.get_id_by_name(
"left");
94 top_bnd = bnd_info.get_id_by_name(
"top");
95 right_bnd = bnd_info.get_id_by_name(
"right");
96 bottom_bnd = bnd_info.get_id_by_name(
"bottom");
106 const std::vector<Real> & JxW_local,
107 const std::vector<std::vector<Real>> & phi,
108 const std::vector<Number> & sol,
109 const std::size_t n_dofs,
114 R(i) -= JxW_local[qp] * phi[i][qp] * sol[qp];
119 const std::vector<Real> & JxW_local,
120 const std::vector<std::vector<Real>> & phi,
121 const std::size_t n_dofs,
127 J(i, j) -= JxW_local[qp] * phi[i][qp] * phi[j][qp];
132 const unsigned int vel_component,
133 std::vector<Gradient> & sigma)
135 sigma.resize(
qrule->n_points());
139 qp_p(vel_component) =
p_sol[qp];
140 sigma[qp] =
nu * vel_gradient[qp] - qp_p;
146 const std::vector<Number> & scalar_sol,
153 R(i) += (*JxW)[qp] * ((*vector_phi)[i][qp] * vector_sol[qp]);
156 R(i) += (*JxW)[qp] * ((*div_vector_phi)[i][qp] * scalar_sol[qp]);
168 Jqq(i, j) += (*JxW)[qp] * ((*vector_phi)[i][qp] * (*vector_phi)[j][qp]);
172 Jqs(i, j) += (*JxW)[qp] * ((*div_vector_phi)[i][qp] * (*scalar_phi)[j][qp]);
178 const std::vector<Number> & v_sol_local,
179 const unsigned int qp,
180 const unsigned int vel_component)
const 183 return U * U(vel_component);
188 const std::vector<Number> & v_sol_local,
189 const unsigned int qp,
190 const unsigned int vel_component,
191 const unsigned int vel_j_component,
192 const std::vector<std::vector<Real>> & phi,
193 const unsigned int j)
const 197 vector_phi_local(vel_j_component) = phi[j][qp];
198 auto ret = vector_phi_local * U(vel_component);
199 if (vel_component == vel_j_component)
200 ret += U * phi[j][qp];
206 const unsigned int vel_component,
207 std::vector<Gradient> & sigma,
220 f = mms_info.forcing((*
q_point)[qp]);
225 R(i) += (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * sigma[qp]);
228 R(i) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel_cross_vel);
232 R(i) -= (*JxW)[qp] * (*scalar_phi)[i][qp] * f;
249 Jsq(i, j) += (*JxW)[qp] *
nu * ((*grad_scalar_phi)[i][qp] * (*vector_phi)[j][qp]);
255 p_phi(vel_component) = (*scalar_phi)[j][qp];
256 Jsp(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * p_phi);
264 const auto vel_cross_vel =
266 Jsu(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel_cross_vel);
270 const auto vel_cross_vel =
272 Jsv(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel_cross_vel);
291 Rp(i) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * vel);
295 Rp(i) -= (*JxW)[qp] * (*scalar_phi)[i][qp] * f;
302 Rglm(0) -= (*JxW)[qp] *
p_sol[qp];
320 Jpu(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * phi);
324 Jpv(i, j) -= (*JxW)[qp] * ((*grad_scalar_phi)[i][qp] * phi);
328 Jpglm(i, 0) -= (*JxW)[qp] * (*scalar_phi)[i][qp];
335 Jglmp(0, j) -= (*JxW)[qp] * (*scalar_phi)[j][qp];
346 const auto vdotn = vel * (*normals)[qp];
348 R(i) += (*JxW_face)[qp] * vdotn * (*scalar_phi_face)[i][qp];
361 Jplm_u(i, j) += (*JxW_face)[qp] * phi * (*normals)[qp] * (*scalar_phi_face)[i][qp];
365 Jplm_v(i, j) += (*JxW_face)[qp] * phi * (*normals)[qp] * (*scalar_phi_face)[i][qp];
401 const auto vdotn = dirichlet_velocity * (*normals)[qp];
403 R(i) += (*JxW_face)[qp] * vdotn * (*scalar_phi_face)[i][qp];
416 R(i) -= (*JxW_face)[qp] * ((*vector_phi_face)[i][qp] * (*normals)[qp]) * scalar_value;
426 R(i) -= (*JxW_face)[qp] * ((*vector_phi_face)[i][qp] * (*normals)[qp]) * lm_sol[qp];
437 (*JxW_face)[qp] * ((*vector_phi_face)[i][qp] * (*normals)[qp]) * (*
lm_phi_face)[j][qp];
442 const std::vector<Number> & scalar_sol,
443 const unsigned int vel_component,
449 qp_p(vel_component) =
p_sol[qp];
452 const auto scalar_value = dirichlet_velocity(vel_component);
458 R(i) -= (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] * (vector_sol[qp] * (*normals)[qp]);
461 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (qp_p * (*normals)[qp]);
464 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * scalar_sol[qp] * (*normals)[qp] *
468 R(i) -= (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * scalar_value * (*normals)[qp] *
472 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (dirichlet_velocity * (*normals)[qp]) *
488 Jsq(i, j) -= (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] *
489 ((*vector_phi_face)[j][qp] * (*normals)[qp]);
494 p_phi(vel_component) = (*scalar_phi_face)[j][qp];
496 Jsp(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (p_phi * (*normals)[qp]);
500 Jss(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * (*scalar_phi_face)[j][qp] *
501 (*normals)[qp] * (*normals)[qp];
507 const std::vector<Number> & scalar_sol,
508 const std::vector<Number> & lm_sol,
509 const unsigned int vel_component,
515 qp_p(vel_component) =
p_sol[qp];
524 (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] * (vector_sol[qp] * (*normals)[qp]);
527 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (qp_p * (*normals)[qp]);
530 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * scalar_sol[qp] *
531 (*normals)[qp] * (*normals)[qp];
534 R(i) -= (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * lm_sol[qp] * (*normals)[qp] *
539 "This method should only be called with an outflow boundary. " 540 "Dirichlet boundaries should call a different routine");
543 R(i) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
563 Jsq(i, j) -= (*JxW_face)[qp] *
nu * (*scalar_phi_face)[i][qp] *
564 ((*vector_phi_face)[j][qp] * (*normals)[qp]);
569 p_phi(vel_component) = (*scalar_phi_face)[j][qp];
571 Jsp(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * (p_phi * (*normals)[qp]);
575 Jss(i, j) += (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau *
576 (*scalar_phi_face)[j][qp] * (*normals)[qp] * (*normals)[qp];
580 "This method should only be called with an outflow boundary. " 581 "Dirichlet boundaries should call a different routine");
587 Jslm(i, j) -= (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] *
tau * (*lm_phi_face)[j][qp] *
588 (*normals)[qp] * (*normals)[qp];
596 const auto vel_cross_vel =
599 (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
603 const auto vel_cross_vel =
606 (*JxW_face)[qp] * (*scalar_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
614 const std::vector<Number> & scalar_sol,
615 const std::vector<Number> & lm_sol,
616 const unsigned int vel_component,
622 qp_p(vel_component) =
p_sol[qp];
628 R(i) -= (*JxW_face)[qp] *
nu * (*lm_phi_face)[i][qp] * (vector_sol[qp] * (*normals)[qp]);
631 R(i) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * (qp_p * (*normals)[qp]);
634 R(i) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * scalar_sol[qp] * (*normals)[qp] *
638 R(i) -= (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * lm_sol[qp] * (*normals)[qp] *
645 R(i) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
648 "This method should only be called with an outflow boundary. " 649 "Dirichlet boundaries should call a different routine");
667 Jlmq(i, j) -= (*JxW_face)[qp] *
nu * (*lm_phi_face)[i][qp] *
668 ((*vector_phi_face)[j][qp] * (*normals)[qp]);
673 p_phi(vel_component) = (*scalar_phi_face)[j][qp];
674 Jlmp(i, j) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * (p_phi * (*normals)[qp]);
678 Jlms(i, j) += (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * (*scalar_phi_face)[j][qp] *
679 (*normals)[qp] * (*normals)[qp];
684 Jlmlm(i, j) -= (*JxW_face)[qp] * (*lm_phi_face)[i][qp] *
tau * (*lm_phi_face)[j][qp] *
685 (*normals)[qp] * (*normals)[qp];
690 const auto vel_cross_vel =
693 (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
697 const auto vel_cross_vel =
700 (*JxW_face)[qp] * (*lm_phi_face)[i][qp] * vel_cross_vel * (*normals)[qp];
705 "This method should only be called with an outflow boundary. " 706 "Dirichlet boundaries should call a different routine");
734 static std::vector<dof_id_type> dummy_indices;
735 auto & global_lm_dof_indices =
cavity ?
dof_indices[global_lm_num] : dummy_indices;
737 std::vector<boundary_id_type> boundary_ids;
741 for (
const auto & elem :
mesh->active_local_element_ptr_range())
769 Rglm.
resize(global_lm_dof_indices.size());
811 for (
auto side : elem->side_index_range())
829 if (
neigh ==
nullptr)
831 boundary_info.boundary_ids(elem, side, boundary_ids);
887 const unsigned int ivar_num,
888 const unsigned int jvar_num,
904 for (
const auto i :
make_range(J->row_start(), J->row_stop()))
923 static std::vector<dof_id_type> dummy_indices;
924 auto & global_lm_dof_indices =
cavity ?
dof_indices[global_lm_num] : dummy_indices;
926 std::vector<boundary_id_type> boundary_ids;
929 DenseMatrix<Number> Jqu_qu, Jqv_qv, Jqu_u, Jqv_v, Ju_qu, Jv_qv, Ju_p, Jv_p, Ju_u, Jv_u, Ju_v,
930 Jv_v, Jp_u, Jp_v, Jp_glm, Jglm_p, Jp_lmu, Jp_lmv, Jqu_lmu, Jqv_lmv, Ju_lmu, Jv_lmv, Jv_lmu,
931 Ju_lmv, Jlmu_qu, Jlmv_qv, Jlmu_p, Jlmv_p, Jlmu_u, Jlmv_v, Jlmu_lmu, Jlmv_lmu, Jlmu_lmv,
934 for (
const auto & elem :
mesh->active_local_element_ptr_range())
959 Jqu_qu.
resize(qu_dof_indices.size(), qu_dof_indices.size());
960 Jqv_qv.
resize(qv_dof_indices.size(), qv_dof_indices.size());
961 Jqu_u.
resize(qu_dof_indices.size(), u_dof_indices.size());
962 Jqv_v.
resize(qv_dof_indices.size(), v_dof_indices.size());
963 Ju_qu.
resize(u_dof_indices.size(), qu_dof_indices.size());
964 Jv_qv.
resize(v_dof_indices.size(), qv_dof_indices.size());
965 Ju_p.
resize(u_dof_indices.size(), p_dof_indices.size());
966 Jv_p.
resize(v_dof_indices.size(), p_dof_indices.size());
967 Ju_u.
resize(u_dof_indices.size(), u_dof_indices.size());
968 Jv_u.
resize(v_dof_indices.size(), u_dof_indices.size());
969 Ju_v.
resize(u_dof_indices.size(), v_dof_indices.size());
970 Jv_v.
resize(v_dof_indices.size(), v_dof_indices.size());
971 Jp_u.
resize(p_dof_indices.size(), u_dof_indices.size());
972 Jp_v.
resize(p_dof_indices.size(), v_dof_indices.size());
973 Jp_glm.
resize(p_dof_indices.size(), global_lm_dof_indices.size());
974 Jglm_p.
resize(global_lm_dof_indices.size(), p_dof_indices.size());
975 Jp_lmu.
resize(p_dof_indices.size(), lm_u_dof_indices.size());
976 Jp_lmv.
resize(p_dof_indices.size(), lm_v_dof_indices.size());
977 Jqu_lmu.
resize(qu_dof_indices.size(), lm_u_dof_indices.size());
978 Jqv_lmv.
resize(qv_dof_indices.size(), lm_v_dof_indices.size());
979 Ju_lmu.
resize(u_dof_indices.size(), lm_u_dof_indices.size());
980 Jv_lmv.
resize(v_dof_indices.size(), lm_v_dof_indices.size());
981 Jv_lmu.
resize(v_dof_indices.size(), lm_u_dof_indices.size());
982 Ju_lmv.
resize(u_dof_indices.size(), lm_v_dof_indices.size());
983 Jlmu_qu.
resize(lm_u_dof_indices.size(), qu_dof_indices.size());
984 Jlmv_qv.
resize(lm_v_dof_indices.size(), qv_dof_indices.size());
985 Jlmu_p.
resize(lm_u_dof_indices.size(), p_dof_indices.size());
986 Jlmv_p.
resize(lm_v_dof_indices.size(), p_dof_indices.size());
987 Jlmu_u.
resize(lm_u_dof_indices.size(), u_dof_indices.size());
988 Jlmv_v.
resize(lm_v_dof_indices.size(), v_dof_indices.size());
989 Jlmu_lmu.
resize(lm_u_dof_indices.size(), lm_u_dof_indices.size());
990 Jlmv_lmu.
resize(lm_v_dof_indices.size(), lm_u_dof_indices.size());
991 Jlmu_lmv.
resize(lm_u_dof_indices.size(), lm_v_dof_indices.size());
992 Jlmv_lmv.
resize(lm_v_dof_indices.size(), lm_v_dof_indices.size());
1034 for (
auto side : elem->side_index_range())
1052 if (
neigh ==
nullptr)
1054 boundary_info.boundary_ids(elem, side, boundary_ids);
1080 lm_face_jacobian(0, Jlmu_qu, Jlmu_p, Jlmu_u, Jlmu_lmu, Jlmu_lmu, Jlmu_lmv);
1085 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