本文整理汇总了C++中AssemblyContext::get_elem_solution方法的典型用法代码示例。如果您正苦于以下问题:C++ AssemblyContext::get_elem_solution方法的具体用法?C++ AssemblyContext::get_elem_solution怎么用?C++ AssemblyContext::get_elem_solution使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AssemblyContext
的用法示例。
在下文中一共展示了AssemblyContext::get_elem_solution方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: element_qoi_derivative
void ParsedInteriorQoI::element_qoi_derivative( AssemblyContext& context,
const unsigned int qoi_index )
{
libMesh::FEBase* element_fe;
context.get_element_fe<libMesh::Real>(0, element_fe);
const std::vector<libMesh::Real> &JxW = element_fe->get_JxW();
const std::vector<libMesh::Point>& x_qp = element_fe->get_xyz();
// Local DOF count and quadrature point count
const unsigned int n_u_dofs = context.get_dof_indices().size();
unsigned int n_qpoints = context.get_element_qrule().n_points();
// Local solution vector - non-const version for finite
// differenting purposes
libMesh::DenseVector<libMesh::Number>& elem_solution =
const_cast<libMesh::DenseVector<libMesh::Number>&>
(context.get_elem_solution());
/*! \todo Need to generalize this to the multiple QoI case */
libMesh::DenseVector<libMesh::Number> &Qu =
context.get_qoi_derivatives()[qoi_index];
for( unsigned int qp = 0; qp != n_qpoints; qp++ )
{
// Central finite differencing to approximate derivatives.
// FIXME - we should hook the FParserAD stuff into
// ParsedFEMFunction
for( unsigned int i = 0; i != n_u_dofs; ++i )
{
libMesh::Number ¤t_solution = elem_solution(i);
const libMesh::Number original_solution = current_solution;
current_solution = original_solution + libMesh::TOLERANCE;
const libMesh::Number plus_val =
(*qoi_functional)(context, x_qp[qp], context.get_time());
current_solution = original_solution - libMesh::TOLERANCE;
const libMesh::Number minus_val =
(*qoi_functional)(context, x_qp[qp], context.get_time());
Qu(i) += (plus_val - minus_val) *
(0.5 / libMesh::TOLERANCE) * JxW[qp];
// Don't forget to restore the correct solution...
current_solution = original_solution;
}
}
}
示例2: nonlocal_constraint
void ScalarODE::nonlocal_constraint(bool compute_jacobian,
AssemblyContext& context,
CachedValues& /* cache */ )
{
libMesh::DenseSubMatrix<libMesh::Number> &Kss =
context.get_elem_jacobian(_scalar_ode_var, _scalar_ode_var); // R_{s},{s}
libMesh::DenseSubVector<libMesh::Number> &Fs =
context.get_elem_residual(_scalar_ode_var); // R_{s}
const libMesh::Number constraint =
(*constraint_function)(context, libMesh::Point(0),
context.get_time());
Fs(0) += constraint;
if (compute_jacobian)
{
// FIXME: we should replace this hacky FDM with a hook to the
// AD fparser stuff
libMesh::DenseSubVector<libMesh::Number> &Us =
const_cast<libMesh::DenseSubVector<libMesh::Number>&>
(context.get_elem_solution(_scalar_ode_var)); // U_{s}
const libMesh::Number s = Us(0);
Us(0) = s + this->_epsilon;
libMesh::Number constraint_jacobian =
(*constraint_function)(context, libMesh::Point(0),
context.get_time());
Us(0) = s - this->_epsilon;
constraint_jacobian -=
(*constraint_function)(context, libMesh::Point(0),
context.get_time());
Us(0) = s;
constraint_jacobian /= (2*this->_epsilon);
Kss(0,0) += constraint_jacobian *
context.get_elem_solution_derivative();
}
return;
}
示例3: u_gradphi
void ElasticCableRayleighDamping<StressStrainLaw>::damping_residual( bool compute_jacobian,
AssemblyContext& context,
CachedValues& /*cache*/)
{
// First, do the "mass" contribution
this->mass_residual_impl(compute_jacobian,
context,
&libMesh::FEMContext::interior_rate,
&libMesh::DiffContext::get_elem_solution_rate_derivative,
_mu_factor);
// Now do the stiffness contribution
const unsigned int n_u_dofs = context.get_dof_indices(this->_disp_vars.u()).size();
const std::vector<libMesh::Real> &JxW =
this->get_fe(context)->get_JxW();
// Residuals that we're populating
libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(this->_disp_vars.u());
libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(this->_disp_vars.v());
libMesh::DenseSubVector<libMesh::Number> &Fw = context.get_elem_residual(this->_disp_vars.w());
//Grab the Jacobian matrix as submatrices
//libMesh::DenseMatrix<libMesh::Number> &K = context.get_elem_jacobian();
libMesh::DenseSubMatrix<libMesh::Number> &Kuu = context.get_elem_jacobian(this->_disp_vars.u(),this->_disp_vars.u());
libMesh::DenseSubMatrix<libMesh::Number> &Kuv = context.get_elem_jacobian(this->_disp_vars.u(),this->_disp_vars.v());
libMesh::DenseSubMatrix<libMesh::Number> &Kuw = context.get_elem_jacobian(this->_disp_vars.u(),this->_disp_vars.w());
libMesh::DenseSubMatrix<libMesh::Number> &Kvu = context.get_elem_jacobian(this->_disp_vars.v(),this->_disp_vars.u());
libMesh::DenseSubMatrix<libMesh::Number> &Kvv = context.get_elem_jacobian(this->_disp_vars.v(),this->_disp_vars.v());
libMesh::DenseSubMatrix<libMesh::Number> &Kvw = context.get_elem_jacobian(this->_disp_vars.v(),this->_disp_vars.w());
libMesh::DenseSubMatrix<libMesh::Number> &Kwu = context.get_elem_jacobian(this->_disp_vars.w(),this->_disp_vars.u());
libMesh::DenseSubMatrix<libMesh::Number> &Kwv = context.get_elem_jacobian(this->_disp_vars.w(),this->_disp_vars.v());
libMesh::DenseSubMatrix<libMesh::Number> &Kww = context.get_elem_jacobian(this->_disp_vars.w(),this->_disp_vars.w());
unsigned int n_qpoints = context.get_element_qrule().n_points();
// All shape function gradients are w.r.t. master element coordinates
const std::vector<std::vector<libMesh::Real> >& dphi_dxi = this->get_fe(context)->get_dphidxi();
const libMesh::DenseSubVector<libMesh::Number>& u_coeffs = context.get_elem_solution( this->_disp_vars.u() );
const libMesh::DenseSubVector<libMesh::Number>& v_coeffs = context.get_elem_solution( this->_disp_vars.v() );
const libMesh::DenseSubVector<libMesh::Number>& w_coeffs = context.get_elem_solution( this->_disp_vars.w() );
const libMesh::DenseSubVector<libMesh::Number>& dudt_coeffs = context.get_elem_solution_rate( this->_disp_vars.u() );
const libMesh::DenseSubVector<libMesh::Number>& dvdt_coeffs = context.get_elem_solution_rate( this->_disp_vars.v() );
const libMesh::DenseSubVector<libMesh::Number>& dwdt_coeffs = context.get_elem_solution_rate( this->_disp_vars.w() );
// Need these to build up the covariant and contravariant metric tensors
const std::vector<libMesh::RealGradient>& dxdxi = this->get_fe(context)->get_dxyzdxi();
const unsigned int dim = 1; // The cable dimension is always 1 for this physics
for (unsigned int qp=0; qp != n_qpoints; qp++)
{
// Gradients are w.r.t. master element coordinates
libMesh::Gradient grad_u, grad_v, grad_w;
libMesh::Gradient dgradu_dt, dgradv_dt, dgradw_dt;
for( unsigned int d = 0; d < n_u_dofs; d++ )
{
libMesh::RealGradient u_gradphi( dphi_dxi[d][qp] );
grad_u += u_coeffs(d)*u_gradphi;
grad_v += v_coeffs(d)*u_gradphi;
grad_w += w_coeffs(d)*u_gradphi;
dgradu_dt += dudt_coeffs(d)*u_gradphi;
dgradv_dt += dvdt_coeffs(d)*u_gradphi;
dgradw_dt += dwdt_coeffs(d)*u_gradphi;
}
libMesh::RealGradient grad_x( dxdxi[qp](0) );
libMesh::RealGradient grad_y( dxdxi[qp](1) );
libMesh::RealGradient grad_z( dxdxi[qp](2) );
libMesh::TensorValue<libMesh::Real> a_cov, a_contra, A_cov, A_contra;
libMesh::Real lambda_sq = 0;
this->compute_metric_tensors( qp, *(this->get_fe(context)), context,
grad_u, grad_v, grad_w,
a_cov, a_contra, A_cov, A_contra,
lambda_sq );
// Compute stress tensor
libMesh::TensorValue<libMesh::Real> tau;
ElasticityTensor C;
this->_stress_strain_law.compute_stress_and_elasticity(dim,a_contra,a_cov,A_contra,A_cov,tau,C);
libMesh::Real jac = JxW[qp];
for (unsigned int i=0; i != n_u_dofs; i++)
{
libMesh::RealGradient u_gradphi( dphi_dxi[i][qp] );
libMesh::Real u_diag_factor = _lambda_factor*this->_A*jac*tau(0,0)*dgradu_dt(0)*u_gradphi(0);
libMesh::Real v_diag_factor = _lambda_factor*this->_A*jac*tau(0,0)*dgradv_dt(0)*u_gradphi(0);
libMesh::Real w_diag_factor = _lambda_factor*this->_A*jac*tau(0,0)*dgradw_dt(0)*u_gradphi(0);
const libMesh::Real C1 = _lambda_factor*this->_A*jac*C(0,0,0,0)*u_gradphi(0);
const libMesh::Real gamma_u = (grad_x(0)+grad_u(0));
//.........这里部分代码省略.........
示例4: u_gradphi
void ElasticMembranePressure<PressureType>::element_time_derivative
( bool compute_jacobian, AssemblyContext & context )
{
unsigned int u_var = this->_disp_vars.u();
unsigned int v_var = this->_disp_vars.v();
unsigned int w_var = this->_disp_vars.w();
const unsigned int n_u_dofs = context.get_dof_indices(u_var).size();
const std::vector<libMesh::Real> &JxW =
this->get_fe(context)->get_JxW();
const std::vector<std::vector<libMesh::Real> >& u_phi =
this->get_fe(context)->get_phi();
const MultiphysicsSystem & system = context.get_multiphysics_system();
unsigned int u_dot_var = system.get_second_order_dot_var(u_var);
unsigned int v_dot_var = system.get_second_order_dot_var(v_var);
unsigned int w_dot_var = system.get_second_order_dot_var(w_var);
libMesh::DenseSubVector<libMesh::Number> &Fu = context.get_elem_residual(u_dot_var);
libMesh::DenseSubVector<libMesh::Number> &Fv = context.get_elem_residual(v_dot_var);
libMesh::DenseSubVector<libMesh::Number> &Fw = context.get_elem_residual(w_dot_var);
libMesh::DenseSubMatrix<libMesh::Number>& Kuv = context.get_elem_jacobian(u_dot_var,v_var);
libMesh::DenseSubMatrix<libMesh::Number>& Kuw = context.get_elem_jacobian(u_dot_var,w_var);
libMesh::DenseSubMatrix<libMesh::Number>& Kvu = context.get_elem_jacobian(v_dot_var,u_var);
libMesh::DenseSubMatrix<libMesh::Number>& Kvw = context.get_elem_jacobian(v_dot_var,w_var);
libMesh::DenseSubMatrix<libMesh::Number>& Kwu = context.get_elem_jacobian(w_dot_var,u_var);
libMesh::DenseSubMatrix<libMesh::Number>& Kwv = context.get_elem_jacobian(w_dot_var,v_var);
unsigned int n_qpoints = context.get_element_qrule().n_points();
// All shape function gradients are w.r.t. master element coordinates
const std::vector<std::vector<libMesh::Real> >& dphi_dxi =
this->get_fe(context)->get_dphidxi();
const std::vector<std::vector<libMesh::Real> >& dphi_deta =
this->get_fe(context)->get_dphideta();
const libMesh::DenseSubVector<libMesh::Number>& u_coeffs = context.get_elem_solution( u_var );
const libMesh::DenseSubVector<libMesh::Number>& v_coeffs = context.get_elem_solution( v_var );
const libMesh::DenseSubVector<libMesh::Number>& w_coeffs = context.get_elem_solution( w_var );
const std::vector<libMesh::RealGradient>& dxdxi = this->get_fe(context)->get_dxyzdxi();
const std::vector<libMesh::RealGradient>& dxdeta = this->get_fe(context)->get_dxyzdeta();
for (unsigned int qp=0; qp != n_qpoints; qp++)
{
// sqrt(det(a_cov)), a_cov being the covariant metric tensor of undeformed body
libMesh::Real sqrt_a = sqrt( dxdxi[qp]*dxdxi[qp]*dxdeta[qp]*dxdeta[qp]
- dxdxi[qp]*dxdeta[qp]*dxdeta[qp]*dxdxi[qp] );
// Gradients are w.r.t. master element coordinates
libMesh::Gradient grad_u, grad_v, grad_w;
for( unsigned int d = 0; d < n_u_dofs; d++ )
{
libMesh::RealGradient u_gradphi( dphi_dxi[d][qp], dphi_deta[d][qp] );
grad_u += u_coeffs(d)*u_gradphi;
grad_v += v_coeffs(d)*u_gradphi;
grad_w += w_coeffs(d)*u_gradphi;
}
libMesh::RealGradient dudxi( grad_u(0), grad_v(0), grad_w(0) );
libMesh::RealGradient dudeta( grad_u(1), grad_v(1), grad_w(1) );
libMesh::RealGradient A_1 = dxdxi[qp] + dudxi;
libMesh::RealGradient A_2 = dxdeta[qp] + dudeta;
libMesh::RealGradient A_3 = A_1.cross(A_2);
// Compute pressure at this quadrature point
libMesh::Real press = (*_pressure)(context,qp);
// Small optimization
libMesh::Real p_over_sa = press/sqrt_a;
/* The formula here is actually
P*\sqrt{\frac{A}{a}}*A_3, where A_3 is a unit vector
But, |A_3| = \sqrt{A} so the normalizing part kills
the \sqrt{A} in the numerator, so we can leave it out
and *not* normalize A_3.
*/
libMesh::RealGradient traction = p_over_sa*A_3;
for (unsigned int i=0; i != n_u_dofs; i++)
{
// Small optimization
libMesh::Real phi_times_jac = u_phi[i][qp]*JxW[qp];
Fu(i) -= traction(0)*phi_times_jac;
Fv(i) -= traction(1)*phi_times_jac;
Fw(i) -= traction(2)*phi_times_jac;
if( compute_jacobian )
{
for (unsigned int j=0; j != n_u_dofs; j++)
//.........这里部分代码省略.........