当前位置: 首页>>代码示例>>C++>>正文


C++ VectorType::AddScale方法代码示例

本文整理汇总了C++中VectorType::AddScale方法的典型用法代码示例。如果您正苦于以下问题:C++ VectorType::AddScale方法的具体用法?C++ VectorType::AddScale怎么用?C++ VectorType::AddScale使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在VectorType的用法示例。


在下文中一共展示了VectorType::AddScale方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: assert

void CR<OperatorType, VectorType, ValueType>::SolvePrecond_(const VectorType &rhs,
                                                            VectorType *x) {

  LOG_DEBUG(this, "CR::SolvePrecond_()",
            " #*# begin");

  assert(x != NULL);
  assert(x != &rhs);
  assert(this->op_  != NULL);
  assert(this->precond_ != NULL);
  assert(this->build_ == true);

  const OperatorType *op = this->op_;

  VectorType *r = &this->r_;
  VectorType *z = &this->z_;
  VectorType *p = &this->p_;
  VectorType *q = &this->q_;
  VectorType *v = &this->v_;
  VectorType *t = &this->t_;

  ValueType alpha, beta;
  ValueType rho, rho_old;

  // initial residual = b - Ax
  op->Apply(*x, z);
  z->ScaleAdd(ValueType(-1.0), rhs);

  // Solve Mr=z
  this->precond_->SolveZeroSol(*z, r);

  // p = r
  p->CopyFrom(*r);

  // t = z
  t->CopyFrom(*z);

  // use for |b-Ax0|
  ValueType res_norm = this->Norm(*t);

  if (this->iter_ctrl_.InitResidual(paralution_abs(res_norm)) == false) {

    LOG_DEBUG(this, "CR::SolvePrecond_()",
              " #*# end");

    return;
  }


  // use for |b|
  //  this->iter_ctrl_.InitResidual(rhs.Norm());

  // v=Ar
  op->Apply(*r, v);

  // rho = (r,v)
  rho = r->DotNonConj(*v);

  // q=Ap
  op->Apply(*p, q);

  // Mz=q
  this->precond_->SolveZeroSol(*q, z);

  // alpha = rho / (q,z)
  alpha = rho / q->DotNonConj(*z);

  // x = x + alpha * p
  x->AddScale(*p, alpha);

  // r = r - alpha * z
  r->AddScale(*z, ValueType(-1.0)*alpha);

  // t = t - alpha * q
  t->AddScale(*q, ValueType(-1.0)*alpha);

  res_norm = this->Norm(*t);

  while (!this->iter_ctrl_.CheckResidual(paralution_abs(res_norm), this->index_)) {

    rho_old = rho;

    // v=Ar
    op->Apply(*r, v);

    // rho = (r,v)
    rho = r->DotNonConj(*v);

    beta = rho / rho_old;

    // p = beta*p + r
    p->ScaleAdd(beta, *r);

    // q = beta*q + v
    q->ScaleAdd(beta, *v);

    // Mz=q
    this->precond_->SolveZeroSol(*q, z);

    // alpha = rho / (q,z)
//.........这里部分代码省略.........
开发者ID:georgeliao,项目名称:paralution_VBCSR,代码行数:101,代码来源:cr.cpp


注:本文中的VectorType::AddScale方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。