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

📄 obint.h

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 H
字号:
//// obint.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 _chemistry_qc_basis_obint_h#define _chemistry_qc_basis_obint_h#ifdef __GNUC__#pragma interface#endif#include <util/ref/ref.h>#include <util/state/state.h>#include <math/scmat/matrix.h>#include <math/scmat/elemop.h>#include <chemistry/qc/basis/gaussbas.h>#include <chemistry/qc/basis/dercent.h>namespace sc {class Integral;// //////////////////////////////////////////////////////////////////////////class EfieldDotVectorData: public RefCount{  public:    double position[3];    double vector[3];    void set_position(double*);    void set_vector(double*);};class DipoleData: public RefCount{  public:    double origin[3];    DipoleData(double *d) {origin[0]=d[0]; origin[1]=d[1]; origin[2]=d[2];}    DipoleData() {origin[0]=origin[1]=origin[2]=0.0;}    void set_origin(double*);};class PointChargeData: public RefCount{  private:    int ncharges_;    const double *charges_;    const double *const*positions_;    double *alloced_charges_;    double **alloced_positions_;  public:    // If copy_data is 0, the passed positions and charges will    // be stored (but not freed).    PointChargeData(int ncharge,                    const double *const*positions, const double *charges,                    int copy_data = 0);    ~PointChargeData();    int ncharges() const { return ncharges_; }    const double *charges() const { return charges_; }    const double *const*positions() const { return positions_; }};/** OneBodyInt is an abstract base class for objects that    compute integrals between two basis functions. */class OneBodyInt : public RefCount {  protected:    // this is who created me    Integral *integral_;    Ref<GaussianBasisSet> bs1_;    Ref<GaussianBasisSet> bs2_;    double *buffer_;    OneBodyInt(Integral *integral,               const Ref<GaussianBasisSet>&b1,               const Ref<GaussianBasisSet>&b2 = 0);  public:    virtual ~OneBodyInt();      /// Returns the number of basis functions on center one.    int nbasis() const;    /// Returns the number of basis functions on the given center.    //@{    int nbasis1() const;    int nbasis2() const;    //@}    /// Return the number of shells on center one.    int nshell() const;    /// Return the number of shells on the given center.    //@{    int nshell1() const;    int nshell2() const;    //@}    /// Return the basis set on center one.    Ref<GaussianBasisSet> basis();    /// Return the basis set on the given center.    //@{    Ref<GaussianBasisSet> basis1();    Ref<GaussianBasisSet> basis2();    //@}    /// Returns the buffer where the integrals are placed.    const double * buffer() const;        /** Computes the integrals between basis functions in the        given shell pair. */    virtual void compute_shell(int,int) = 0;    /** This is called for one body integrals that take data to let        them know that the data they reference has changed. */    virtual void reinitialize();    /** Return true if the clone member can be called.  The default     * implementation returns false. */    virtual bool cloneable();    /** Returns a clone of this.  The default implementation throws an     * exception. */    virtual Ref<OneBodyInt> clone();    Integral *integral() const { return integral_; }};// //////////////////////////////////////////////////////////////////////////class ShellPairIter {  private:    const double * buf;    double scale_;    int e12;    int index;        int ioffset;    int joffset;    int iend;    int jend;    int icur;    int jcur;      public:    ShellPairIter();    ~ShellPairIter();    void init(const double * buffer, int ishell, int jshell,              int ioff, int joff, int nfunci, int nfuncj, int redund=0,              double scale=1.0);    void start() { icur=jcur=index=0; }    int ready() const { return (icur < iend); }    void next() {      if (jcur < ((e12)?(icur):((jend)-1))) {        index++;        jcur++;        return;      }      jcur=0;      icur++;      index = icur*jend;    }    int current_i() const { return icur; }    int current_j() const { return jcur; }    int i() const { return icur+ioffset; }    int j() const { return jcur+joffset; }    int nint() const { return iend*jend; }        double val() const { return buf[index]*scale_; }};// //////////////////////////////////////////////////////////////////////////class OneBodyIntIter : public RefCount {  protected:    Ref<OneBodyInt> obi; // help me obi wan    ShellPairIter spi;        int redund;        int istart;    int jstart;        int iend;    int jend;    int icur;    int jcur;    int ij;      public:    OneBodyIntIter();    OneBodyIntIter(const Ref<OneBodyInt>&);    virtual ~OneBodyIntIter();        virtual void start(int ist=0, int jst=0, int ien=0, int jen=0);    virtual void next();    int ready() const { return (icur < iend); }    int ishell() const { return icur; }    int jshell() const { return jcur; }    int ijshell() const { return ij; }    int redundant() const { return redund; }    void set_redundant(int i) { redund=i; }        virtual double scale() const;    Ref<OneBodyInt> one_body_int() { return obi; }    ShellPairIter& current_pair();    virtual bool cloneable();    virtual Ref<OneBodyIntIter> clone();};// //////////////////////////////////////////////////////////////////////////class OneBodyIntOp: public SCElementOp {  protected:    Ref<OneBodyIntIter> iter;  public:    OneBodyIntOp(const Ref<OneBodyInt>&);    OneBodyIntOp(const Ref<OneBodyIntIter>&);    virtual ~OneBodyIntOp();      void process(SCMatrixBlockIter&);    void process_spec_rect(SCMatrixRectBlock*);    void process_spec_ltri(SCMatrixLTriBlock*);    void process_spec_rectsub(SCMatrixRectSubBlock*);    void process_spec_ltrisub(SCMatrixLTriSubBlock*);    bool cloneable();    Ref<SCElementOp> clone();    int has_side_effects();};class OneBody3IntOp: public SCElementOp3 {  private:    Ref<OneBodyIntIter> iter;  public:    OneBody3IntOp(const Ref<OneBodyInt>&b);    OneBody3IntOp(const Ref<OneBodyIntIter>&);    virtual ~OneBody3IntOp();      void process(SCMatrixBlockIter&,                 SCMatrixBlockIter&,                 SCMatrixBlockIter&);    void process_spec_rect(SCMatrixRectBlock*,                           SCMatrixRectBlock*,                           SCMatrixRectBlock*);    void process_spec_ltri(SCMatrixLTriBlock*,                           SCMatrixLTriBlock*,                           SCMatrixLTriBlock*);    int has_side_effects();    int has_side_effects_in_arg1();    int has_side_effects_in_arg2();};// ///////////////////////////////////////////////////////////////////////////** OneBodyInt is an abstract base class for objects that    compute one body derivative integrals. */class OneBodyDerivInt : public RefCount {  protected:    // this is who created me    Integral *integral_;    Ref<GaussianBasisSet> bs1;    Ref<GaussianBasisSet> bs2;    double *buffer_;  public:    OneBodyDerivInt(Integral *, const Ref<GaussianBasisSet>&b);    OneBodyDerivInt(Integral *,                    const Ref<GaussianBasisSet>&b1,                    const Ref<GaussianBasisSet>&b2);    virtual ~OneBodyDerivInt();      /// Return the number of basis functions on center one.    int nbasis() const;    /// Return the number of basis functions on the given center.    //@{    int nbasis1() const;    int nbasis2() const;    //@}    /// Return the number of shells on center one.    int nshell() const;    /// Return the number of shells on the given center.    //@{    int nshell1() const;    int nshell2() const;    //@}    /// Return the basis set on center one.    Ref<GaussianBasisSet> basis();    /// Return the basis set on the given center.    //@{    Ref<GaussianBasisSet> basis1();    Ref<GaussianBasisSet> basis2();    //@}    /** The computed shell integrals will be put in the buffer returned by        this member.  */    const double * buffer() const;        /** Given for shell indices, these will cause the integral buffer        to be filled in. */    //@{    virtual void compute_shell(int ish, int jsh, DerivCenters&) = 0;    virtual void compute_shell(int ish, int jsh, int center) = 0;    //@}};}#endif// Local Variables:// mode: c++// c-file-style: "ETS"// End:

⌨️ 快捷键说明

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