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

📄 block.h

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 H
字号:
//// block.h//// 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.//#ifndef _math_scmat_block_h#define _math_scmat_block_h#ifdef __GNUC__#pragma interface#endif#include <util/state/state.h>namespace sc {class SCElementOp;class SCElementOp2;class SCElementOp3;/** SCMatrixBlock is the base clase for all types of blocks    that comprise matrices and vectors. */class SCMatrixBlock: public SavableState {  public:    int blocki, blockj;  public:    SCMatrixBlock();    SCMatrixBlock(StateIn&s);    virtual ~SCMatrixBlock();    void save_data_state(StateOut&s);    /** Return of copy of this.  A runtime error will be generated        for blocks that cannot do a deepcopy.  These routines are only used        internally in the matrix library. */    virtual SCMatrixBlock *deepcopy() const;    /** Return a pointer to the block's data and the number of elements        in the block.  Some blocks cannot provide this information and        a runtime error will be generated if these members are called.        These routines are only used internally in the matrix library. */    virtual double *dat();    virtual int ndat() const;    // These routines are obsolete.    virtual void process(SCElementOp*) = 0;    virtual void process(SCElementOp2*, SCMatrixBlock*) = 0;    virtual void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*) = 0;};class SCMatrixBlockListLink {  private:    void operator = (const SCMatrixBlockListLink&) {}  // disallowed    SCMatrixBlock* _block;    SCMatrixBlockListLink* _next;  public:    SCMatrixBlockListLink(SCMatrixBlock*, SCMatrixBlockListLink* = 0);    ~SCMatrixBlockListLink();    void block(SCMatrixBlock*);    void next(SCMatrixBlockListLink* link) { _next = link; }    SCMatrixBlock* block() { return _block; }    SCMatrixBlockListLink* next() { return _next; }};class SCMatrixBlockListIter {  private:    SCMatrixBlockListLink* link;  public:    SCMatrixBlockListIter(): link(0) {}    SCMatrixBlockListIter(SCMatrixBlockListLink*l): link(l) {}    int operator !=(const SCMatrixBlockListIter p) const {        return link != p.link;      }    void operator ++() { link = link->next(); }    void operator ++(int) { link = link->next(); }    SCMatrixBlock* block() const { return link->block(); }};class SCMatrixBlockList: public SavableState {  private:    SCMatrixBlockListLink* _begin;  public:    SCMatrixBlockList();    SCMatrixBlockList(StateIn&);    ~SCMatrixBlockList();    void save_data_state(StateOut&);    void insert(SCMatrixBlock*);    void append(SCMatrixBlock*);    SCMatrixBlockListIter begin() { return _begin; }    SCMatrixBlockListIter end() { return 0; }    SCMatrixBlockList *deepcopy();};/** The SCVectorSimpleBlock describes a piece of avector.  The following bit of code illustrates the data layout:fill(double *vector, SCVectorSimpleBlock &b){  int i,offset=0;  for (i=b.istart; i<b.iend; i++,offset++) {      vector[i] = b.data[offset];  }}*/class SCVectorSimpleBlock: public SCMatrixBlock {  public:    SCVectorSimpleBlock(int istart,int iend);    SCVectorSimpleBlock(StateIn&);    virtual ~SCVectorSimpleBlock();    void save_data_state(StateOut&);    int istart;    int iend;    double* data;    SCMatrixBlock *deepcopy() const;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);    double *dat();    int ndat() const;};/** The SCVectorSimpleSubBlock describes a subblock of avector.  The following bit of code illustrates the data layout:fill(double *vector, SCVectorSimpleSubBlock &b){  int i,offset=b.offset;  for (i=b.istart; i<b.iend; i++,offset++) {      vector[i] = b.data[offset];  }}*/class SCVectorSimpleSubBlock: public SCMatrixBlock {  public:    SCVectorSimpleSubBlock(int istart,int iend, int offset, double* data);    SCVectorSimpleSubBlock(StateIn&);    virtual ~SCVectorSimpleSubBlock();    void save_data_state(StateOut&);    int istart;    int iend;    int offset;    double* data;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);};/** The SCMatrixRectBlock describes a rectangular piece of amatrix.  The following bit of code illustrates the data layout:fill(double **matrix, SCMatrixRectBlock &b){  int offset=0;  for (int i=b.istart; i<b.iend; i++) {    for (int j=b.jstart; j<b.jend; j++,offset++) {      matrix[i][j] = b.data[offset];    }  }}*/class SCMatrixRectBlock: public SCMatrixBlock {  public:    SCMatrixRectBlock(int is, int ie, int js, int je);    SCMatrixRectBlock(StateIn&);    virtual ~SCMatrixRectBlock();    void save_data_state(StateOut&);    int istart;    int jstart;    int iend;    int jend;    double* data;    SCMatrixBlock *deepcopy() const;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);    double *dat();    int ndat() const;};/** The SCMatrixRectSubBlock describes a rectangular piece of amatrix.  The following bit of code illustrates the data layout:fill(double **matrix, SCMatrixRectSubBlock &b){  int offset=b.istart * b.istride + b.jstart;  for (int i=b.istart; i<b.iend; i++) {    for (int j=b.jstart; j<b.jend; j++,offset++) {      matrix[i][j] = b.data[offset];    }  offset += b.istride - (b.jend - b.jstart);  }}*/class SCMatrixRectSubBlock: public SCMatrixBlock {  public:    SCMatrixRectSubBlock(int is, int ie, int istride, int js, int je,                         double* data);    SCMatrixRectSubBlock(StateIn&);    // does not delete the data member    virtual ~SCMatrixRectSubBlock();    // does not save the data member    void save_data_state(StateOut&);    int istart;    int jstart;    int iend;    int jend;    int istride;    double* data;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);};/** The SCMatrixLTriBlock describes a triangular piece of amatrix.  The following bit of code illustrates the data layout:fill(double **matrix, SCMatrixLTriBlock &b){  int offset=0;  for (int i=b.start; i<b.end; i++) {    for (int j=b.start; j<=i; j++,offset++) {      matrix[i][j] = b.data[offset];    }  }}*/class SCMatrixLTriBlock: public SCMatrixBlock {  public:    SCMatrixLTriBlock(int s,int e);    SCMatrixLTriBlock(StateIn&);    virtual ~SCMatrixLTriBlock();    void save_data_state(StateOut&);    int start;    int end;    double* data;    SCMatrixBlock *deepcopy() const;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);    double *dat();    int ndat() const;};/** The SCMatrixLTriSubBlock describes a triangular subblock of amatrix.  The following bit of code illustrates the data layout:fill(double **matrix, SCMatrixLTriSubBlock &b){  int offset=(b.istart*(b.istart+1)>>1) + b.jstart;  for (int i=b.start; i<b.end; i++) {    for (int j=b.start; j<=i && j<b.jend; j++,offset++) {      matrix[i][j] = b.data[offset];    }  if (j>i) offset += b.istart;  else offset += i + b.jstart - b.jend;  }}*/class SCMatrixLTriSubBlock: public SCMatrixBlock {  public:    SCMatrixLTriSubBlock(int is,int ie,int js,int je,double*data);    SCMatrixLTriSubBlock(StateIn&);    // does not delete the data member    virtual ~SCMatrixLTriSubBlock();    // does not save the data member    void save_data_state(StateOut&);    int istart;    int iend;    int jstart;    int jend;    double* data;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);};/** The SCMatrixDiagBlock describes a diagonal piece of amatrix.  The following bit of code illustrates the data layout:fill(double **matrix, SCMatrixDiagBlock &b){  int i,j,offset=0;  for (i=b.istart,j=b.jstart; i<b.iend; i++,j++,offset++) {      matrix[i][j] = b.data[offset];  }}*/class SCMatrixDiagBlock: public SCMatrixBlock {  public:    SCMatrixDiagBlock(int istart,int iend,int jstart);    SCMatrixDiagBlock(int istart,int iend);    SCMatrixDiagBlock(StateIn&);    virtual ~SCMatrixDiagBlock();    void save_data_state(StateOut&);    int istart;    int jstart;    int iend;    double* data;    SCMatrixBlock *deepcopy() const;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);    double *dat();    int ndat() const;};/** The SCMatrixDiagSubBlock describes a diagonal subblock of amatrix.  The following bit of code illustrates the data layout:fill(double **matrix, SCMatrixDiagSubBlock &b){  int i,j,offset=b.offset;  for (i=b.istart,j=b.jstart; i<b.iend; i++,j++,offset++) {      matrix[i][j] = b.data[offset];  }}*/class SCMatrixDiagSubBlock: public SCMatrixBlock {  public:    SCMatrixDiagSubBlock(int istart,int iend,int jstart, int offset,                         double*data);    SCMatrixDiagSubBlock(int istart,int iend, int offset, double*data);    SCMatrixDiagSubBlock(StateIn&);    // does not delete the data member    virtual ~SCMatrixDiagSubBlock();    // does not save the data member    void save_data_state(StateOut&);    int istart;    int jstart;    int iend;    int offset;    double* data;    void process(SCElementOp*);    void process(SCElementOp2*, SCMatrixBlock*);    void process(SCElementOp3*, SCMatrixBlock*, SCMatrixBlock*);};// //////////////////////////////////////////////////////////////////// Classes that iterate through the blocks of a matrix./** Objects of class SCMatrixSubblockIter are used to iterate through the    blocks of a matrix.  The object must be deleted before using the matrix    that owns the blocks that SCMatrixSubblockIter is iterating through. */class SCMatrixSubblockIter: public RefCount {  public:    enum Access { Read, Write, Accum, None };  protected:    Access access_;  public:    /** The access variable should be one of Read, Write, Accum, and None,        with the SCMatrixSubblockIter:: scope operator applied. */    SCMatrixSubblockIter(Access access): access_(access) {}    /// Start at the beginning.    virtual void begin() = 0;    /// Returns nonzero if there is another block.    virtual int ready() = 0;    /// Proceed to the next block.    virtual void next() = 0;    /// Return the current block.    virtual SCMatrixBlock *block() = 0;    /// Return the type of Access allowed for these blocks.    Access access() const { return access_; }};class SCMatrixSimpleSubblockIter: public SCMatrixSubblockIter {  protected:    Ref<SCMatrixBlock> block_;    int ready_;  public:    SCMatrixSimpleSubblockIter(Access, const Ref<SCMatrixBlock> &b);    void begin();    int ready();    void next();    SCMatrixBlock *block();};class SCMatrixListSubblockIter: public SCMatrixSubblockIter {  protected:    Ref<SCMatrixBlockList> list_;    SCMatrixBlockListIter iter_;  public:    SCMatrixListSubblockIter(Access, const Ref<SCMatrixBlockList> &list);    void begin();    int ready();    void next();    SCMatrixBlock *block();};class SCMatrixNullSubblockIter: public SCMatrixSubblockIter {  public:    SCMatrixNullSubblockIter();    SCMatrixNullSubblockIter(Access);    void begin();    int ready();    void next();    SCMatrixBlock *block();};class SCMatrixCompositeSubblockIter: public SCMatrixSubblockIter {  protected:    int niters_;    Ref<SCMatrixSubblockIter> *iters_;    int iiter_;  public:    SCMatrixCompositeSubblockIter(Access, int niter);    SCMatrixCompositeSubblockIter(Ref<SCMatrixSubblockIter>&,                                  Ref<SCMatrixSubblockIter>&);    ~SCMatrixCompositeSubblockIter();    void set_iter(int i, const Ref<SCMatrixSubblockIter> &);    void begin();    int ready();    void next();    SCMatrixBlock *block();    int current_block() const { return iiter_; }};class SCMatrixJointSubblockIter: public SCMatrixSubblockIter {  protected:    int niters_;    Ref<SCMatrixSubblockIter> *iters_;  public:    SCMatrixJointSubblockIter(const Ref<SCMatrixSubblockIter>&,                              const Ref<SCMatrixSubblockIter>&,                              const Ref<SCMatrixSubblockIter>& = 0,                              const Ref<SCMatrixSubblockIter>& = 0,                              const Ref<SCMatrixSubblockIter>& = 0);    ~SCMatrixJointSubblockIter();    void begin();    int ready();    void next();    SCMatrixBlock *block();    SCMatrixBlock *block(int i);};}#endif// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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