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

📄 blockedsymm.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
📖 第 1 页 / 共 2 页
字号:
//// blockedsymm.cc//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Curtis Janssen <cljanss@limitpt.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#include <math.h>#include <util/misc/formio.h>#include <util/keyval/keyval.h>#include <util/state/stateio.h>#include <math/scmat/blocked.h>#include <math/scmat/cmatrix.h>#include <math/scmat/elemop.h>using namespace std;using namespace sc;/////////////////////////////////////////////////////////////////////////////// BlockedSymmSCMatrix member functionsstatic ClassDesc BlockedSymmSCMatrix_cd(  typeid(BlockedSymmSCMatrix),"BlockedSymmSCMatrix",1,"public SymmSCMatrix",  0, 0, 0);voidBlockedSymmSCMatrix::resize(SCDimension *a){  if (mats_) {    delete[] mats_;    mats_=0;  }    d = a;    mats_ = new RefSymmSCMatrix[d->blocks()->nblock()];  for (int i=0; i < d->blocks()->nblock(); i++)    if (d->blocks()->size(i))      mats_[i] = subkit->symmmatrix(d->blocks()->subdim(i));}BlockedSymmSCMatrix::BlockedSymmSCMatrix(const RefSCDimension&a,                                         BlockedSCMatrixKit*k):  SymmSCMatrix(a,k),  subkit(k->subkit()),  mats_(0){  resize(a);}BlockedSymmSCMatrix::~BlockedSymmSCMatrix(){  if (mats_) {    delete[] mats_;    mats_=0;  }}doubleBlockedSymmSCMatrix::get_element(int i,int j) const{  int block_i, block_j;  int elem_i, elem_j;  d->blocks()->elem_to_block(i,block_i,elem_i);  d->blocks()->elem_to_block(j,block_j,elem_j);  if (block_i != block_j)    return 0;    return mats_[block_i]->get_element(elem_i,elem_j);}voidBlockedSymmSCMatrix::set_element(int i,int j,double a){  int block_i, block_j;  int elem_i, elem_j;  d->blocks()->elem_to_block(i,block_i,elem_i);  d->blocks()->elem_to_block(j,block_j,elem_j);  if (block_i != block_j)    return;    mats_[block_i]->set_element(elem_i,elem_j,a);}voidBlockedSymmSCMatrix::accumulate_element(int i,int j,double a){  int block_i, block_j;  int elem_i, elem_j;  d->blocks()->elem_to_block(i,block_i,elem_i);  d->blocks()->elem_to_block(j,block_j,elem_j);  if (block_i != block_j)    return;    mats_[block_i]->accumulate_element(elem_i,elem_j,a);}SCMatrix *BlockedSymmSCMatrix::get_subblock(int br, int er, int bc, int ec){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::get_subblock: cannot get subblock\n";  abort();  return 0;}SymmSCMatrix *BlockedSymmSCMatrix::get_subblock(int br, int er){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::get_subblock: cannot get subblock\n";  abort();  return 0;}voidBlockedSymmSCMatrix::assign_subblock(SCMatrix*sb,                                     int br, int er, int bc, int ec){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::assign_subblock:"       << " cannot assign subblock\n";  abort();}voidBlockedSymmSCMatrix::assign_subblock(SymmSCMatrix*sb, int br, int er){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::assign_subblock:"                 << " cannot assign subblock\n";  abort();}voidBlockedSymmSCMatrix::accumulate_subblock(SCMatrix*sb,                                         int br, int er, int bc, int ec){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_subblock:"                 << " cannot accumulate subblock\n";  abort();}voidBlockedSymmSCMatrix::accumulate_subblock(SymmSCMatrix*sb, int br, int er){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_subblock:"                 << " cannot accumulate subblock\n";  abort();}SCVector *BlockedSymmSCMatrix::get_row(int i){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::get_row: cannot get row\n";  abort();  return 0;}voidBlockedSymmSCMatrix::assign_row(SCVector *v, int i){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::assign_row: cannot assign row\n";  abort();}voidBlockedSymmSCMatrix::accumulate_row(SCVector *v, int i){  ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_row:"                 << " cannot accumulate row\n";  abort();}doubleBlockedSymmSCMatrix::invert_this(){  double res=1;    for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      res *= mats_[i]->invert_this();  return res;}doubleBlockedSymmSCMatrix::determ_this(){  double res=1;    for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      res *= mats_[i]->determ_this();  return res;}doubleBlockedSymmSCMatrix::trace(){  double res=0;    for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      res += mats_[i]->trace();  return res;}doubleBlockedSymmSCMatrix::solve_this(SCVector*v){  double res=1;    BlockedSCVector* lv =    require_dynamic_cast<BlockedSCVector*>(v,"BlockedSymmSCMatrix::solve_this");    // make sure that the dimensions match  if (!dim()->equiv(lv->dim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::solve_this(SCVector*v): "         << "dimensions don't match\n";    abort();  }  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      res *= mats_[i]->solve_this(lv->vecs_[i].pointer());  return res;}voidBlockedSymmSCMatrix::assign_val(double s){  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->assign(s);}voidBlockedSymmSCMatrix::assign_s(SymmSCMatrix*a){  // make sure that the arguments is of the correct type  BlockedSymmSCMatrix* la = require_dynamic_cast<BlockedSymmSCMatrix*>(a,                                   "BlockedSymmSCMatrix::assign");  // make sure that the dimensions match  if (!dim()->equiv(la->dim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::assign_s(SymmSCMatrix*a): "         << "dimensions don't match\n";    abort();  }  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->assign(la->mats_[i].pointer());}voidBlockedSymmSCMatrix::scale(double s){  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->scale(s);}voidBlockedSymmSCMatrix::gen_invert_this(){  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->gen_invert_this();}doubleBlockedSymmSCMatrix::scalar_product(SCVector*a){  // make sure that the argument is of the correct type  BlockedSCVector* la    = require_dynamic_cast<BlockedSCVector*>(a,"BlockedSCVector::scalar_product");  // make sure that the dimensions match  if (!dim()->equiv(la->dim())) {    ExEnv::errn() << indent << "BlockedSCVector::scale_product(SCVector*a): "         << "dimensions don't match\n";    abort();  }  double result = 0.0;  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      result += mats_[i]->scalar_product(la->vecs_[i].pointer());  return result;}voidBlockedSymmSCMatrix::diagonalize(DiagSCMatrix*a,SCMatrix*b){  const char* name = "BlockedSymmSCMatrix::diagonalize";  // make sure that the arguments is of the correct type  BlockedDiagSCMatrix* la = require_dynamic_cast<BlockedDiagSCMatrix*>(a,name);  BlockedSCMatrix* lb = require_dynamic_cast<BlockedSCMatrix*>(b,name);  if (!dim()->equiv(la->dim()) ||      !dim()->equiv(lb->coldim()) || !dim()->equiv(lb->rowdim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::"         << "diagonalize(DiagSCMatrix*a,SCMatrix*b): bad dims\n";    abort();  }  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->diagonalize(la->mats_[i].pointer(),lb->mats_[i].pointer());}voidBlockedSymmSCMatrix::accumulate(const SymmSCMatrix*a){  // make sure that the arguments is of the correct type  const BlockedSymmSCMatrix* la = require_dynamic_cast<const BlockedSymmSCMatrix*>(a,                                   "BlockedSymmSCMatrix::accumulate");  // make sure that the dimensions match  if (!dim()->equiv(la->dim())) {    ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate(SymmSCMatrix*a): "         << "dimensions don't match\n";    abort();  }  for (int i=0; i < d->blocks()->nblock(); i++)    if (mats_[i].nonnull())      mats_[i]->accumulate(la->mats_[i].pointer());}// computes this += a * a.tvoidBlockedSymmSCMatrix::accumulate_symmetric_product(SCMatrix*a){  int i, zero=0;    // make sure that the argument is of the correct type  BlockedSCMatrix* la    = require_dynamic_cast<BlockedSCMatrix*>(a,"BlockedSymmSCMatrix::"                                          "accumulate_symmetric_product");  if (!dim()->equiv(la->rowdim())) {

⌨️ 快捷键说明

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