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

📄 cartiter.h

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 H
字号:
//// cartiter.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_cartiter_h#define _chemistry_qc_basis_cartiter_h#ifdef __GNUC__#pragma interface#endifnamespace sc {/** CartesianIter gives the ordering of the Cartesian functions    within a shell for the particular integrals specialization. */class CartesianIter {  protected:    int a_;    int b_;    int c_;    int l_;    int bfn_;  public:    /// Initialize an iterator for the given angular momentum.    CartesianIter(int l);    virtual ~CartesianIter();    /// Start the iteration.    virtual void start() =0;    /// Move to the next Cartesian function.    virtual void next() =0;    /// Returns nonzero if the iterator currently hold valid data.    virtual operator int() =0;    /// Returns the number of Cartesian functions.    int n() { return ((l_>=0)?((((l_)+2)*((l_)+1))>>1):0); }    /// Returns the exponent of x.    int a() { return a_; }    /// Returns the exponent of y.    int b() { return b_; }    /// Returns the exponent of z.    int c() { return c_; }    /// Returns the angular momentum.    int l() { return l_; }    /// Returns a() if i==0, b() if i==1, and c() if i==2.    int l(int i) { return i ? (i==1 ? b_ : c_) : a_; }    /** Returns the number of the current basis function within the shell.        This starts at 0 and sequentially increases as next() is called. */    int bfn() { return bfn_; }};/** RedundantCartesianIter objects loop through all possible combinations    of a given number of axes.  This is used to compute the transformation    matrices that maps a set of Cartesian functions into to another set of    Cartesian functions in a rotated coordinate system. */class RedundantCartesianIter {  private:    int done_;    int l_;    int *axis_;  public:    /// Create a object for the given angular momentum.    RedundantCartesianIter(int l);    virtual ~RedundantCartesianIter();    /// Return the current Cartesian basis function number.    virtual int bfn() =0;    /// Initialize the iterator.    void start();    /// Move to the next combination of axes.    void next();    /// Returns nonzero if the iterator currently hold valid data.    operator int() { return !done_; }    /// The current exponent of x.    int a();    /// The current exponent of y.    int b();    /// The current exponent of z.    int c();    /// The angular momentum.    int l() { return l_; }    /// Returns a() if i==0, b() if i==1, and c() if i==2.    int l(int i);    /// Return the i'th axis.    int axis(int i) { return axis_[i]; }};inline voidRedundantCartesianIter::start(){  if (l_==0)    done_ = 1;  else    done_ = 0;  for (int i=0; i<l_; i++)    axis_[i] = 0;}inline voidRedundantCartesianIter::next(){  for (int i=0; i<l_; i++) {    if (axis_[i] == 2)      axis_[i] = 0;    else {      axis_[i]++;      return;    }  }  done_ = 1;}inline intRedundantCartesianIter::l(int axis){  int i;  int r = 0;  for (i=0; i<l_; i++) if (axis_[i]==axis) r++;  return r;}inline intRedundantCartesianIter::a(){  return l(0);}inline intRedundantCartesianIter::b(){  return l(1);}inline intRedundantCartesianIter::c(){  return l(2);}/** Like RedundantCartesianIter, except a, b, and c are fixed to a given    value. */class RedundantCartesianSubIter {  private:    int done_;    int l_;    int e_[3];    int *axis_;    // the locations of the z's in the axis array    int *zloc_;    // the locations of the y's in the subarray after the z's are removed    int *yloc_;    int valid();  public:    /// Create a object for the given angular momentum.    RedundantCartesianSubIter(int l);    virtual ~RedundantCartesianSubIter();    /// Return the current Cartesian basis function number.    virtual int bfn() =0;    /** Initialize the iterator.  The constraints on a, b, and c are        given as arguments. */    void start(int a, int b, int c);    /// Move to the next combination of axes.    void next();    /// Returns nonzero if the iterator currently hold valid data.    operator int() const { return !done_; }    /// The current exponent of x.    int a() const { return e_[0]; }    /// The current exponent of y.    int b() const { return e_[1]; }    /// The current exponent of z.    int c() const { return e_[2]; }    /// The angular momentum.    int l() const { return l_; }    /// Returns a() if i==0, b() if i==1, and c() if i==2.    int l(int i) { return e_[i]; }    /// Return the i'th axis.    int axis(int i) { return axis_[i]; }};}  #endif// Local Variables:// mode: c++// c-file-style: "ETS"// End:

⌨️ 快捷键说明

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