📄 blockedsymm.cc
字号:
//// 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 + -