⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blockedsymm.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
📖 第 1 页 / 共 2 页
字号:
    ExEnv::errn() << indent << "BlockedSymmSCMatrix::"         << "accumulate_symmetric_product(SCMatrix*a): bad dim\n";    abort();  }  int mxnb = (d->blocks()->nblock() > la->nblocks_)             ? d->blocks()->nblock()             : la->nblocks_;  int &mi = (d->blocks()->nblock()==1) ? zero : i;  for (i=0; i < mxnb; i++)    if (mats_[mi].nonnull() && la->mats_[i].nonnull())      mats_[mi]->accumulate_symmetric_product(la->mats_[i].pointer());}// computes this += a + a.tvoidBlockedSymmSCMatrix::accumulate_symmetric_sum(SCMatrix*a){  // make sure that the argument is of the correct type  BlockedSCMatrix* la    = require_dynamic_cast<BlockedSCMatrix*>(a,"BlockedSymmSCMatrix::"                                          "accumulate_symmetric_sum");  if (!dim()->equiv(la->rowdim()) || !dim()->equiv(la->coldim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::"         << "accumulate_symmetric_sum(SCMatrix*a): bad dim\n";    abort();  }  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->accumulate_symmetric_sum(la->mats_[i].pointer());}voidBlockedSymmSCMatrix::accumulate_symmetric_outer_product(SCVector*a){  // make sure that the argument is of the correct type  BlockedSCVector* la    = require_dynamic_cast<BlockedSCVector*>(a,"BlockedSymmSCMatrix::"                                      "accumulate_symmetric_outer_product");  if (!dim()->equiv(la->dim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::"         << "accumulate_symmetric_outer_product(SCMatrix*a): bad dim\n";    abort();  }  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->accumulate_symmetric_outer_product(la->vecs_[i].pointer());}// this += a * b * transpose(a)voidBlockedSymmSCMatrix::accumulate_transform(SCMatrix*a,SymmSCMatrix*b,                                          SCMatrix::Transform t){  int i, zero=0;    // do the necessary castdowns  BlockedSCMatrix*la    = require_dynamic_cast<BlockedSCMatrix*>(a,"%s::accumulate_transform",                                      class_name());  BlockedSymmSCMatrix*lb = require_dynamic_cast<BlockedSymmSCMatrix*>(      b,"%s::accumulate_transform", class_name());  // check the dimensions  if (t == SCMatrix::NormalTransform) {      if (!dim()->equiv(la->rowdim()) || !lb->dim()->equiv(la->coldim())) {          ExEnv::outn() << indent << "BlockedSymmSCMatrix::accumulate_transform: bad dim (not transposed)\n";          ExEnv::outn() << "target dim:" << endl;          dim()->print();          ExEnv::outn() << "source dim" << endl;          b->dim()->print();          ExEnv::outn() << "transform dims" << endl;          a->rowdim()->print();          a->coldim()->print();          abort();        }    }  else {      if (!dim()->equiv(la->coldim()) || !lb->dim()->equiv(la->rowdim())) {          ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_transform: bad dim\n";          abort();        }    }  int mxnb = (d->blocks()->nblock() > la->nblocks_)             ? d->blocks()->nblock()             : la->nblocks_;  int &mi = (d->blocks()->nblock()==1) ? zero : i;  int &bi = (lb->d->blocks()->nblock()==1) ? zero : i;    for (i=0; i < mxnb; i++) {    if (mats_[mi].null() || la->mats_[i].null() || lb->mats_[bi].null())      continue;                                 mats_[mi]->accumulate_transform(la->mats_[i].pointer(),                                    lb->mats_[bi].pointer(),t);  }}// this += a * b * transpose(a)voidBlockedSymmSCMatrix::accumulate_transform(SCMatrix*a,DiagSCMatrix*b,                                          SCMatrix::Transform t){  int i, zero=0;    // do the necessary castdowns  BlockedSCMatrix*la    = require_dynamic_cast<BlockedSCMatrix*>(a,"%s::accumulate_transform",                                      class_name());  BlockedDiagSCMatrix*lb    = require_dynamic_cast<BlockedDiagSCMatrix*>(b,"%s::accumulate_transform",                                          class_name());  // check the dimensions  if (!dim()->equiv(la->rowdim()) || !lb->dim()->equiv(la->coldim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_transform: bad dim\n";    abort();  }  int mxnb = (d->blocks()->nblock() > la->nblocks_)             ? d->blocks()->nblock()             : la->nblocks_;  int &mi = (d->blocks()->nblock()==1) ? zero : i;  int &bi = (lb->d->blocks()->nblock()==1) ? zero : i;  for (i=0; i < mxnb; i++) {    if (mats_[mi].null() || la->mats_[i].null() || lb->mats_[bi].null())      continue;                                 mats_[mi]->accumulate_transform(la->mats_[i].pointer(),                                    lb->mats_[bi].pointer());  }}voidBlockedSymmSCMatrix::accumulate_transform(SymmSCMatrix*a,SymmSCMatrix*b){  SymmSCMatrix::accumulate_transform(a,b);}voidBlockedSymmSCMatrix::element_op(const Ref<SCElementOp>& op){  BlockedSCElementOp *bop = dynamic_cast<BlockedSCElementOp*>(op.pointer());  int nb = d->blocks()->nblock();    op->defer_collect(1);  for (int i=0; i < nb; i++) {    if (bop)      bop->working_on(i);    if (mats_[i].nonnull())      mats_[i]->element_op(op);  }  op->defer_collect(0);  if (op->has_collect()) op->collect(messagegrp());}voidBlockedSymmSCMatrix::element_op(const Ref<SCElementOp2>& op,                                SymmSCMatrix* m){  BlockedSymmSCMatrix *lm = require_dynamic_cast<BlockedSymmSCMatrix*>(m,                                          "BlockedSymSCMatrix::element_op");  if (!dim()->equiv(lm->dim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix: bad element_op\n";    abort();  }  BlockedSCElementOp2 *bop = dynamic_cast<BlockedSCElementOp2*>(op.pointer());  int nb = d->blocks()->nblock();    op->defer_collect(1);  for (int i=0; i < nb; i++) {    if (bop)      bop->working_on(i);    if (mats_[i].nonnull())      mats_[i]->element_op(op,lm->mats_[i].pointer());  }  op->defer_collect(0);  if (op->has_collect()) op->collect(messagegrp());}voidBlockedSymmSCMatrix::element_op(const Ref<SCElementOp3>& op,                              SymmSCMatrix* m,SymmSCMatrix* n){  BlockedSymmSCMatrix *lm = require_dynamic_cast<BlockedSymmSCMatrix*>(m,                                        "BlockedSymSCMatrix::element_op");  BlockedSymmSCMatrix *ln = require_dynamic_cast<BlockedSymmSCMatrix*>(n,                                        "BlockedSymSCMatrix::element_op");  if (!dim()->equiv(lm->dim()) || !dim()->equiv(ln->dim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix: bad element_op\n";    abort();  }  BlockedSCElementOp3 *bop = dynamic_cast<BlockedSCElementOp3*>(op.pointer());  int nb = d->blocks()->nblock();    op->defer_collect(1);  for (int i=0; i < nb; i++) {    if (bop)      bop->working_on(i);    if (mats_[i].nonnull())      mats_[i]->element_op(op,lm->mats_[i].pointer(),                            ln->mats_[i].pointer());  }  op->defer_collect(0);  if (op->has_collect()) op->collect(messagegrp());}voidBlockedSymmSCMatrix::vprint(const char *title, ostream& os, int prec) const{  int len = (title) ? strlen(title) : 0;  char *newtitle = new char[len + 80];  for (int i=0; i < d->blocks()->nblock(); i++) {    if (mats_[i].null())      continue;        sprintf(newtitle,"%s:  block %d",title,i+1);    mats_[i]->print(newtitle, os, prec);  }  delete[] newtitle;}RefSCDimensionBlockedSymmSCMatrix::dim(int i) const{  return d->blocks()->subdim(i);}intBlockedSymmSCMatrix::nblocks() const{  return d->blocks()->nblock();}RefSymmSCMatrixBlockedSymmSCMatrix::block(int i){  return mats_[i];}Ref<SCMatrixSubblockIter>BlockedSymmSCMatrix::local_blocks(SCMatrixSubblockIter::Access access){  Ref<SCMatrixCompositeSubblockIter> iter      = new SCMatrixCompositeSubblockIter(access,nblocks());  for (int i=0; i<nblocks(); i++) {      if (block(i).null())          iter->set_iter(i, new SCMatrixNullSubblockIter(access));      else          iter->set_iter(i, block(i)->local_blocks(access));    }  Ref<SCMatrixSubblockIter> ret = iter.pointer();  return ret;}Ref<SCMatrixSubblockIter>BlockedSymmSCMatrix::all_blocks(SCMatrixSubblockIter::Access access){  Ref<SCMatrixCompositeSubblockIter> iter      = new SCMatrixCompositeSubblockIter(access,nblocks());  for (int i=0; i<nblocks(); i++) {      if (block(i).null())          iter->set_iter(i, new SCMatrixNullSubblockIter(access));      else          iter->set_iter(i, block(i)->all_blocks(access));    }  Ref<SCMatrixSubblockIter> ret = iter.pointer();  return ret;}voidBlockedSymmSCMatrix::save(StateOut&s){  int ndim = n();  s.put(ndim);  int has_subblocks = 1;  s.put(has_subblocks);  s.put(nblocks());  for (int i=0; i<nblocks(); i++) {      block(i).save(s);    }}voidBlockedSymmSCMatrix::restore(StateIn& s){  int ndimt, ndim = n();  s.get(ndimt);  if (ndimt != ndim) {      ExEnv::errn() << indent           << "BlockedSymmSCMatrix::restore(): bad dimension" << endl;      abort();    }  int has_subblocks;  s.get(has_subblocks);  if (has_subblocks) {      int nblock;      s.get(nblock);      if (nblock != nblocks()) {          ExEnv::errn() << indent               << "BlockedSymmSCMatrix::restore(): nblock differs\n" << endl;          abort();        }      for (int i=0; i<nblocks(); i++) {          block(i).restore(s);        }    }  else {      ExEnv::errn() << indent           << "BlockedSymmSCMatrix::restore(): no subblocks--cannot restore"           << endl;      abort();    }}voidBlockedSymmSCMatrix::convert_accumulate(SymmSCMatrix*a){  // ok, are we converting a non-blocked matrix to a blocked one, or are  // we converting a blocked matrix from one specialization to another?    if (dynamic_cast<BlockedSymmSCMatrix*>(a)) {    BlockedSymmSCMatrix *ba = dynamic_cast<BlockedSymmSCMatrix*>(a);    if (ba->nblocks() == this->nblocks()) {      for (int i=0; i < nblocks(); i++)        mats_[i]->convert_accumulate(ba->mats_[i]);    } else {      ExEnv::errn() << indent           << "BlockedSymmSCMatrix::convert_accumulate: "           << "can't convert from BlockedSymmSCMatrix with different nblock"           << endl;      abort();    }  }  else {    if (nblocks()==1) {      mats_[0]->convert_accumulate(a);    } else {      ExEnv::errn() << indent           << "BlockedSymmSCMatrix::convert_accumulate: "           << "can't convert from SymmSCMatrix when nblocks != 1"           << endl;      abort();    }  }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -