本文整理汇总了C++中MsqHessian::accumulate_entries方法的典型用法代码示例。如果您正苦于以下问题:C++ MsqHessian::accumulate_entries方法的具体用法?C++ MsqHessian::accumulate_entries怎么用?C++ MsqHessian::accumulate_entries使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MsqHessian
的用法示例。
在下文中一共展示了MsqHessian::accumulate_entries方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: function
//.........这里部分代码省略.........
// Loops over all elements in the patch.
for (e=0; e<num_elems; ++e) {
short nve = elements[e].vertex_count();
// Gets a list of free vertices in the element.
vtx_indices = elements[e].get_vertex_index_array();
nfve=0;
for (i=0; i<nve; ++i) {
if ( vertices[vtx_indices[i]].is_free_vertex() ) {
ele_free_vtces[nfve] = vertices + vtx_indices[i];
++nfve;
}
}
// Computes \nabla^2 Q(e). Only the free vertices will have non-zero entries.
qm_bool = currentQM->compute_element_hessian(pd,
elements+e, ele_free_vtces,
grad_vec, elem_hessian,
nfve, QM_val, err);
if (MSQ_CHKERR(err) || !qm_bool) return false;
// **** Computes Hessian ****
double QM_pow=1.;
if (pVal == 1) {
n=0;
for (i=0; i<nve; ++i) {
for (j=i; j<nve; ++j) {
//negate if necessary
elem_hessian[n] *= (scaling_value * get_negate_flag());
++n;
}
}
hessian.accumulate_entries(pd, e, elem_hessian, err);
fac1 = 1;
}
else if (pVal >= 2) {
// Computes the coefficients:
QM_val = fabs(QM_val);
QM_pow = 1;
for (i=0; i<pVal-2; ++i)
QM_pow *= QM_val;
// 1 - computes p(p-1)Q(e)^{p-2}
fac2 = pVal* (pVal-1) * QM_pow;
// 2 - computes pQ(e)^{p-1}
QM_pow *= QM_val;
fac1 = pVal * QM_pow;
//fac1 *= get_negate_flag();
//fac2 *= get_negate_flag();
n=0;
for (i=0; i<nve; ++i) {
for (j=i; j<nve; ++j) {
if ( vertices[vtx_indices[i]].is_free_vertex() &&
vertices[vtx_indices[j]].is_free_vertex() ) {
// Computes \nabla Q(e) [\nabla Q(e)]^T
elem_outer_product.outer_product(grad_vec[i], grad_vec[j]);
elem_outer_product *= fac2;
elem_hessian[n] *= fac1;
elem_hessian[n] += elem_outer_product;
} else {
// elem_outer_product is nul
elem_hessian[n] *= fac1;
}