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

📄 petite.h

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 H
字号:
//// petite.h --- definition of the PetiteList class//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Edward Seidl <seidl@janed.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_petite_h#define _chemistry_qc_basis_petite_h#ifdef __GNUC__#pragma interface#endif#include <scconfig.h>#include <iostream>#include <scconfig.h>#include <util/misc/scint.h>#include <util/ref/ref.h>#include <math/scmat/blocked.h>#include <math/scmat/offset.h>#include <chemistry/molecule/molecule.h>#include <chemistry/qc/basis/gaussbas.h>#include <chemistry/qc/basis/integral.h>// //////////////////////////////////////////////////////////////////////////namespace sc {inline sc_int_least64_tij_offset64(sc_int_least64_t i, sc_int_least64_t j){  return (i>j) ? (((i*(i+1)) >> 1) + j) : (((j*(j+1)) >> 1) + i);}inline sc_int_least64_ti_offset64(sc_int_least64_t i){  return ((i*(i+1)) >> 1);}// //////////////////////////////////////////////////////////////////////////// These are helper functions for PetiteList and GPetite4int **compute_atom_map(const Ref<GaussianBasisSet> &);void delete_atom_map(int **atom_map, const Ref<GaussianBasisSet> &);int **compute_shell_map(int **atom_map, const Ref<GaussianBasisSet> &);void delete_shell_map(int **shell_map, const Ref<GaussianBasisSet> &);// //////////////////////////////////////////////////////////////////////////struct contribution {    int bfn;    double coef;    contribution();    contribution(int b, double c);    ~contribution();};struct SO {    int len;    int length;    contribution *cont;    SO();    SO(int);    ~SO();    SO& operator=(const SO&);        void set_length(int);    void reset_length(int);        // is this equal to so to within a sign    int equiv(const SO& so);};struct SO_block {    int len;    SO *so;    SO_block();    SO_block(int);    ~SO_block();    void set_length(int);    void reset_length(int);    int add(SO& s, int i);    void print(const char *title);};// //////////////////////////////////////////////////////////////////////////// this should only be used from within a SymmGaussianBasisSetclass PetiteList : public RefCount {  private:    int natom_;    int nshell_;    int ng_;    int nirrep_;    int nblocks_;    int c1_;    Ref<GaussianBasisSet> gbs_;    Ref<Integral> ints_;        char *p1_;        // p1[n] is 1 if shell n is in the group P1    int **atom_map_;  // atom_map[n][g] is the atom that symop g maps atom n                      // into    int **shell_map_; // shell_map[n][g] is the shell that symop g maps shell n                      // into    char *lamij_;     // see Dupuis & King, IJQC 11,613,(1977)    int *nbf_in_ir_;    void init();  public:    PetiteList(const Ref<GaussianBasisSet>&, const Ref<Integral>&);    ~PetiteList();    Ref<GaussianBasisSet> basis() { return gbs_; }    Ref<Integral> integral() { return ints_; }    Ref<PetiteList> clone() { return new PetiteList(gbs_, ints_); }    int nirrep() const { return nirrep_; }    int order() const { return ng_; }    int atom_map(int n, int g) const { return (c1_) ? n : atom_map_[n][g]; }    int shell_map(int n, int g) const { return (c1_) ? n : shell_map_[n][g]; }    int lambda(int ij) const { return (c1_) ? 1 : (int) lamij_[ij]; }    int lambda(int i, int j) const                          { return (c1_) ? 1 : (int) lamij_[ij_offset(i,j)]; }    int in_p1(int n) const { return (c1_) ? 1 : (int) p1_[n]; }    int in_p2(int ij) const { return (c1_) ? 1 : (int) lamij_[ij]; }    /// Same as previous, except for it takes i and j separately    int in_p2(int i, int j) const { return (c1_) ? 1 : (int) lamij_[ij_offset(i,j)]; }    int in_p4(int ij, int kl, int i, int j, int k, int l) const;    /// Same as previous, except for doesn't assume ij > kl and recomputes them    int in_p4(int i, int j, int k, int l) const;        int nfunction(int i) const                            { return (c1_) ? gbs_->nbasis() : nbf_in_ir_[i]; }    int nblocks() const { return nblocks_; }    void print(std::ostream& =ExEnv::out0(), int verbose=1);    // these return blocked dimensions    RefSCDimension AO_basisdim();    RefSCDimension SO_basisdim();    // return the basis function rotation matrix R(g)    RefSCMatrix r(int g);    // return information about the transformation from AOs to SOs    SO_block * aotoso_info();    RefSCMatrix aotoso();    RefSCMatrix sotoao();    // given a skeleton matrix, form the symmetrized matrix in the SO basis    void symmetrize(const RefSymmSCMatrix& skel, const RefSymmSCMatrix& sym);    // transform a matrix from AO->SO or SO->AO.    // this can take either a blocked or non-blocked AO basis matrix.    RefSymmSCMatrix to_SO_basis(const RefSymmSCMatrix&);    // this returns a non-blocked AO basis matrix.    RefSymmSCMatrix to_AO_basis(const RefSymmSCMatrix&);    // these two are just for eigenvectors    // returns non-blocked AO basis eigenvectors    RefSCMatrix evecs_to_AO_basis(const RefSCMatrix&);    // returns blocked SO basis eigenvectors    RefSCMatrix evecs_to_SO_basis(const RefSCMatrix&);};inline intPetiteList::in_p4(int ij, int kl, int i, int j, int k, int l) const{  if (c1_)    return 1;    sc_int_least64_t ijkl = i_offset64(ij)+kl;  int nijkl=1;  for (int g=1; g < ng_; g++) {    int gij = ij_offset(shell_map_[i][g],shell_map_[j][g]);    int gkl = ij_offset(shell_map_[k][g],shell_map_[l][g]);    sc_int_least64_t gijkl = ij_offset64(gij,gkl);    if (gijkl > ijkl)      return 0;    else if (gijkl == ijkl)      nijkl++;  }  return ng_/nijkl;}inline intPetiteList::in_p4(int i, int j, int k, int l) const{  if (c1_)    return 1;    int ij = ij_offset(i,j);  int kl = ij_offset(k,l);  sc_int_least64_t ijkl = ij_offset64(ij,kl);  int nijkl=1;  for (int g=1; g < ng_; g++) {    int gij = ij_offset(shell_map_[i][g],shell_map_[j][g]);    int gkl = ij_offset(shell_map_[k][g],shell_map_[l][g]);    sc_int_least64_t gijkl = ij_offset64(gij,gkl);    if (gijkl > ijkl)      return 0;    else if (gijkl == ijkl)      nijkl++;  }  return ng_/nijkl;}}#endif// Local Variables:// mode: c++// c-file-style: "ETS"// End:

⌨️ 快捷键说明

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