void LaplaceSystem::init_context(DiffContext &context) { FEMContext &c = libmesh_cast_ref<FEMContext&>(context); // Get finite element object FEGenericBase<RealGradient>* fe; c.get_element_fe<RealGradient>( u_var, fe ); // We should prerequest all the data // we will need to build the linear system. fe->get_JxW(); fe->get_phi(); fe->get_dphi(); fe->get_xyz(); FEGenericBase<RealGradient>* side_fe; c.get_side_fe<RealGradient>( u_var, side_fe ); side_fe->get_JxW(); side_fe->get_phi(); }
bool LaplaceSystem::element_time_derivative (bool request_jacobian, DiffContext &context) { FEMContext &c = libmesh_cast_ref<FEMContext&>(context); // Get finite element object FEGenericBase<RealGradient>* fe = NULL; c.get_element_fe<RealGradient>( u_var, fe ); // First we get some references to cell-specific data that // will be used to assemble the linear system. // Element Jacobian * quadrature weights for interior integration const std::vector<Real> &JxW = fe->get_JxW(); // The velocity shape functions at interior quadrature points. const std::vector<std::vector<RealGradient> >& phi = fe->get_phi(); // The velocity shape function gradients at interior // quadrature points. const std::vector<std::vector<RealTensor> >& grad_phi = fe->get_dphi(); const std::vector<Point>& qpoint = fe->get_xyz(); // The number of local degrees of freedom in each variable const unsigned int n_u_dofs = c.dof_indices_var[u_var].size(); DenseSubMatrix<Number> &Kuu = *c.elem_subjacobians[u_var][u_var]; DenseSubVector<Number> &Fu = *c.elem_subresiduals[u_var]; // Now we will build the element Jacobian and residual. // Constructing the residual requires the solution and its // gradient from the previous timestep. This must be // calculated at each quadrature point by summing the // solution degree-of-freedom values by the appropriate // weight functions. const unsigned int n_qpoints = (c.get_element_qrule())->n_points(); for (unsigned int qp=0; qp != n_qpoints; qp++) { Tensor grad_u; c.interior_gradient( u_var, qp, grad_u ); // Value of the forcing function at this quadrature point RealGradient f = this->forcing(qpoint[qp]); // First, an i-loop over the velocity degrees of freedom. // We know that n_u_dofs == n_v_dofs so we can compute contributions // for both at the same time. for (unsigned int i=0; i != n_u_dofs; i++) { Fu(i) += ( grad_u.contract(grad_phi[i][qp]) - f*phi[i][qp] )*JxW[qp]; if (request_jacobian) { // Matrix contributions for the uu and vv couplings. for (unsigned int j=0; j != n_u_dofs; j++) { Kuu(i,j) += grad_phi[j][qp].contract(grad_phi[i][qp])*JxW[qp]; } } } } // end of the quadrature point qp-loop return request_jacobian; }
bool CurlCurlSystem::element_time_derivative (bool request_jacobian, DiffContext &context) { FEMContext &c = cast_ref<FEMContext&>(context); // Get finite element object FEGenericBase<RealGradient>* fe = NULL; c.get_element_fe<RealGradient>( u_var, fe ); // First we get some references to cell-specific data that // will be used to assemble the linear system. // Element Jacobian * quadrature weights for interior integration const std::vector<Real> &JxW = fe->get_JxW(); // The velocity shape functions at interior quadrature points. const std::vector<std::vector<RealGradient> >& phi = fe->get_phi(); // The velocity shape function gradients at interior // quadrature points. const std::vector<std::vector<RealGradient> >& curl_phi = fe->get_curl_phi(); const std::vector<Point>& qpoint = fe->get_xyz(); // The number of local degrees of freedom in each variable const unsigned int n_u_dofs = c.get_dof_indices(u_var).size(); DenseSubMatrix<Number> &Kuu = c.get_elem_jacobian(u_var,u_var); DenseSubVector<Number> &Fu = c.get_elem_residual(u_var); // Now we will build the element Jacobian and residual. // Constructing the residual requires the solution and its // gradient from the previous timestep. This must be // calculated at each quadrature point by summing the // solution degree-of-freedom values by the appropriate // weight functions. const unsigned int n_qpoints = c.get_element_qrule().n_points(); // Loop over quadrature points for (unsigned int qp=0; qp != n_qpoints; qp++) { Gradient u; Gradient curl_u; c.interior_value( u_var, qp, u ); c.interior_curl( u_var, qp, curl_u ); // Value of the forcing function at this quadrature point RealGradient f = this->forcing(qpoint[qp]); // First, an i-loop over the degrees of freedom. for (unsigned int i=0; i != n_u_dofs; i++) { Fu(i) += ( curl_u*curl_phi[i][qp] + u*phi[i][qp] - f*phi[i][qp] )*JxW[qp]; if (request_jacobian) { // Matrix contributions for the uu and vv couplings. for (unsigned int j=0; j != n_u_dofs; j++) { Kuu(i,j) += ( curl_phi[j][qp]*curl_phi[i][qp] + phi[j][qp]*phi[i][qp] )*JxW[qp]; } } } } // end of the quadrature point qp-loop return request_jacobian; }