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

📄 mstate.h

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 H
字号:
//// mstate.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.//#ifdef __GNUC__#pragma interface#endif#ifndef _util_group_mstate_h#define _util_group_mstate_h#include <util/state/state.h>#include <util/state/statein.h>#include <util/state/stateout.h>#include <util/group/message.h>namespace sc {/** The MsgStateSend is an abstract base class that sends objects    to nodes in a MessageGrp.*/class MsgStateSend: public StateOut {  private:    // do not allow copy constructor or assignment    MsgStateSend(const MsgStateSend&);    void operator=(const MsgStateSend&);  protected:    Ref<MessageGrp> grp;    int nbuf; // the number of bytes used in the buffer    int bufsize; // the allocated size of the data buffer    char* buffer; // the data buffer    char* send_buffer; // the buffer used to send data (includes nbuf)    int nheader; // nbuf + nheader = the number of bytes in send_buffer to send    int* nbuf_buffer; // the pointer to the nbuf stored in the buffer    int put_array_void(const void*, int);  public:    MsgStateSend(const Ref<MessageGrp>&);    virtual ~MsgStateSend();    /// Specializations must implement flush().    virtual void flush() = 0;    /** The buffer size of statein and stateout objects that communicate        with each other must match. */    void set_buffer_size(int);    /** I only need to override put(const ClassDesc*) but C++ will        hide all of the other put's so I must override everything. */    int put(const ClassDesc*);    int put(char r);    int put(unsigned int r);    int put(int r);    int put(float r);    int put(double r);    int put(const char*,int);    int put(const int*,int);    int put(const unsigned int*,int);    int put(const float*,int);    int put(const double*,int);};/** The MsgStateBufRecv is an abstract base class that    buffers objects sent through a MessageGrp.*/class MsgStateBufRecv: public StateIn {  private:    // do not allow copy constructor or assignment    MsgStateBufRecv(const MsgStateBufRecv&);    void operator=(const MsgStateBufRecv&);  protected:    Ref<MessageGrp> grp;    int nbuf; // the number of bytes used in the buffer    int ibuf; // the current pointer withing the buffer    int bufsize; // the allocated size of the buffer    char* buffer; // the data buffer    char* send_buffer; // the buffer used to send data (includes nbuf)    int nheader; // nbuf + nheader = the number of bytes in send_buffer to send    int* nbuf_buffer; // the pointer to the nbuf stored in the buffer    int get_array_void(void*,int);    /// Specializations must implement next_buffer().    virtual void next_buffer() = 0;  public:    /// MsgStateBufRecv can be initialized with a MessageGrp.    MsgStateBufRecv(const Ref<MessageGrp>&);    /// Use the default MessageGrp.    MsgStateBufRecv();    virtual ~MsgStateBufRecv();    /** The buffer size of statein and stateout objects that communicate        with each other must match. */    void set_buffer_size(int);};/** The MsgStateRecv is an abstract base class that receives    objects from nodes in a MessageGrp. */class MsgStateRecv: public MsgStateBufRecv {  private:    // do not allow copy constructor or assignment    MsgStateRecv(const MsgStateRecv&);    void operator=(const MsgStateRecv&);  public:    /// MsgStateRecv must be initialized with a MessageGrp.    MsgStateRecv(const Ref<MessageGrp>&);    virtual ~MsgStateRecv();    /** Returns the version of the ClassDesc.  This assumes that        the version of the remote class is the same as that of        the local class. */    int version(const ClassDesc*);    /** I only need to override get(ClassDesc**) but C++ will hide        all of the other get's so I must override everything. */    int get(const ClassDesc**);    int get(char&r, const char *key = 0);    int get(unsigned int&r, const char *key = 0);    int get(int&r, const char *key = 0);    int get(float&r, const char *key = 0);    int get(double&r, const char *key = 0);    int get(char*&);    int get(unsigned int*&);    int get(int*&);    int get(float*&);    int get(double*&);};/** StateSend is a concrete specialization of    MsgStateSend that does the send part of point to    point communication in a MessageGrp. */class StateSend: public MsgStateSend {  private:    // do not allow copy constructor or assignment    StateSend(const StateSend&);    void operator=(const StateSend&);  private:    int target_;  public:    /// Create a StateSend given a MessageGrp.    StateSend(const Ref<MessageGrp>&);    ~StateSend();    /// Specify the target node.    void target(int);    /// Flush the buffer.    void flush();};/** StateRecv is a concrete specialization of    MsgStateRecv that does the receive part of point to    point communication in a MessageGrp. */class StateRecv: public MsgStateRecv {  private:    // do not allow copy constructor or assignment    StateRecv(const StateRecv&);    void operator=(const StateRecv&);  private:    int source_;  protected:    void next_buffer();  public:    /// Create a StateRecv given a MessageGrp.    StateRecv(const Ref<MessageGrp>&);    /// Specify the source node.    void source(int);};/** BcastStateSend does the send part of a broadcast of an object    to all nodes.  Only one node uses a BcastStateSend and the rest    must use a BcastStateRecv. */class BcastStateSend: public MsgStateSend {  private:    // do not allow copy constructor or assignment    BcastStateSend(const BcastStateSend&);    void operator=(const BcastStateSend&);  public:    /// Create the BcastStateSend.    BcastStateSend(const Ref<MessageGrp>&);    ~BcastStateSend();    /// Flush the data remaining in the buffer.    void flush();};/** BcastStateRecv does the receive part of a broadcast of an    object to all nodes.  Only one node uses a BcastStateSend and    the rest must use a BcastStateRecv. */class BcastStateRecv: public MsgStateRecv {  private:    // do not allow copy constructor or assignment    BcastStateRecv(const BcastStateRecv&);    void operator=(const BcastStateRecv&);  protected:    int source_;    void next_buffer();  public:    /// Create the BcastStateRecv.    BcastStateRecv(const Ref<MessageGrp>&, int source = 0);    /// Set the source node.    void source(int s);};/** This creates and forwards/retrieves data from either a BcastStateRecv    or a BcastStateSend depending on the value of the argument to    constructor. */class BcastState {  private:    BcastStateRecv *recv_;    BcastStateSend *send_;  public:    /// Create a BcastState object.  The default source is node 0.    BcastState(const Ref<MessageGrp> &, int source = 0);    ~BcastState();    /** Broadcast data to all nodes.  After these are called        for a group of data the flush member must be called        to force the source node to actually write the data. */    void bcast(int &);    void bcast(double &);    void bcast(int *&, int);    void bcast(double *&, int);    template <class T> void bcast(Ref<T>&a)        {          if (recv_) {              a << SavableState::restore_state(*recv_);            }          else if (send_) {              SavableState::save_state(a.pointer(),*send_);            }        }    /** Force data to be written.  Data is not otherwise written        until the buffer is full. */    void flush();    /** Call the StateOut or StateIn        forget_references member. */    void forget_references();    /// Controls the amount of data that is buffered before it is sent.    void set_buffer_size(int);};/** BcastStateBin reads a file in written by    StateInBin on node 0 and broadcasts it to all nodes    so state can be simultaneously restored on all nodes. */class BcastStateInBin: public MsgStateBufRecv {  private:    // do not allow copy constructor or assignment    BcastStateInBin(const BcastStateRecv&);    void operator=(const BcastStateRecv&);  protected:    int opened_;    int file_position_;    std::streambuf *buf_;    void next_buffer();    int get_array_void(void*, int);  public:    /// Create the BcastStateRecv using the default MessageGrp.    BcastStateInBin(const Ref<KeyVal> &);    /// Create the BcastStateRecv.    BcastStateInBin(const Ref<MessageGrp>&, const char *filename);    ~BcastStateInBin();    virtual int open(const char *name);    virtual void close();    void seek(int loc);    int seekable();    int tell();    int use_directory();};}#endif// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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