<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>petite.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.5 on Mon Oct 14 14:16:38 2002 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>petite.h</h1><div class="fragment"><pre>00001 <font class="comment">//</font> 00002 <font class="comment">// petite.h --- definition of the PetiteList class</font> 00003 <font class="comment">//</font> 00004 <font class="comment">// Copyright (C) 1996 Limit Point Systems, Inc.</font> 00005 <font class="comment">//</font> 00006 <font class="comment">// Author: Edward Seidl <seidl@janed.com></font> 00007 <font class="comment">// Maintainer: LPS</font> 00008 <font class="comment">//</font> 00009 <font class="comment">// This file is part of the SC Toolkit.</font> 00010 <font class="comment">//</font> 00011 <font class="comment">// The SC Toolkit is free software; you can redistribute it and/or modify</font> 00012 <font class="comment">// it under the terms of the GNU Library General Public License as published by</font> 00013 <font class="comment">// the Free Software Foundation; either version 2, or (at your option)</font> 00014 <font class="comment">// any later version.</font> 00015 <font class="comment">//</font> 00016 <font class="comment">// The SC Toolkit is distributed in the hope that it will be useful,</font> 00017 <font class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00018 <font class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00019 <font class="comment">// GNU Library General Public License for more details.</font> 00020 <font class="comment">//</font> 00021 <font class="comment">// You should have received a copy of the GNU Library General Public License</font> 00022 <font class="comment">// along with the SC Toolkit; see the file COPYING.LIB. If not, write to</font> 00023 <font class="comment">// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.</font> 00024 <font class="comment">//</font> 00025 <font class="comment">// The U.S. Government is granted a limited license as per AL 91-7.</font> 00026 <font class="comment">//</font> 00027 00028 <font class="preprocessor">#ifndef _chemistry_qc_basis_petite_h</font> 00029 <font class="preprocessor"></font><font class="preprocessor">#define _chemistry_qc_basis_petite_h</font> 00030 <font class="preprocessor"></font> 00031 <font class="preprocessor">#ifdef __GNUC__</font> 00032 <font class="preprocessor"></font><font class="preprocessor">#pragma interface</font> 00033 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00034 <font class="preprocessor"></font> 00035 <font class="preprocessor">#include <iostream></font> 00036 00037 <font class="preprocessor">#include <util/misc/scint.h></font> 00038 <font class="preprocessor">#include <util/ref/ref.h></font> 00039 <font class="preprocessor">#include <util/container/array.h></font> 00040 <font class="preprocessor">#include <math/scmat/blocked.h></font> 00041 <font class="preprocessor">#include <math/scmat/offset.h></font> 00042 <font class="preprocessor">#include <chemistry/molecule/molecule.h></font> 00043 <font class="preprocessor">#include <chemistry/qc/basis/gaussbas.h></font> 00044 <font class="preprocessor">#include <chemistry/qc/basis/integral.h></font> 00045 00046 <font class="comment">// //////////////////////////////////////////////////////////////////////////</font> 00047 00048 <font class="keyword">namespace </font>sc { 00049 00050 <font class="keyword">inline</font> sc_int_least64_t 00051 ij_offset64(sc_int_least64_t i, sc_int_least64_t j)<font class="keyword"></font> 00052 <font class="keyword"></font>{ 00053 <font class="keywordflow">return</font> (i>j) ? (((i*(i+1)) >> 1) + j) : (((j*(j+1)) >> 1) + i); 00054 } 00055 00056 <font class="keyword">inline</font> sc_int_least64_t 00057 i_offset64(sc_int_least64_t i)<font class="keyword"></font> 00058 <font class="keyword"></font>{ 00059 <font class="keywordflow">return</font> ((i*(i+1)) >> 1); 00060 } 00061 00062 <font class="comment">// //////////////////////////////////////////////////////////////////////////</font> 00063 00064 <font class="keyword">struct </font>contribution { 00065 <font class="keywordtype">int</font> bfn; 00066 <font class="keywordtype">double</font> coef; 00067 00068 contribution(); 00069 contribution(<font class="keywordtype">int</font> b, <font class="keywordtype">double</font> c); 00070 ~contribution(); 00071 }; 00072 00073 <font class="keyword">struct </font>SO { 00074 <font class="keywordtype">int</font> len; 00075 <font class="keywordtype">int</font> length; 00076 contribution *cont; 00077 00078 SO(); 00079 SO(<font class="keywordtype">int</font>); 00080 ~SO(); 00081 00082 SO& operator=(<font class="keyword">const</font> SO&); 00083 00084 <font class="keywordtype">void</font> set_length(<font class="keywordtype">int</font>); 00085 <font class="keywordtype">void</font> reset_length(<font class="keywordtype">int</font>); 00086 00087 <font class="comment">// is this equal to so to within a sign</font> 00088 <font class="keywordtype">int</font> equiv(<font class="keyword">const</font> SO& so); 00089 }; 00090 00091 <font class="keyword">struct </font>SO_block { 00092 <font class="keywordtype">int</font> len; 00093 SO *so; 00094 00095 SO_block(); 00096 SO_block(<font class="keywordtype">int</font>); 00097 ~SO_block(); 00098 00099 <font class="keywordtype">void</font> set_length(<font class="keywordtype">int</font>); 00100 <font class="keywordtype">void</font> reset_length(<font class="keywordtype">int</font>); 00101 00102 <font class="keywordtype">int</font> add(SO& s, <font class="keywordtype">int</font> i); 00103 <font class="keywordtype">void</font> print(<font class="keyword">const</font> <font class="keywordtype">char</font> *title); 00104 }; 00105 00106 <font class="comment">// //////////////////////////////////////////////////////////////////////////</font> 00107 <font class="comment">// this should only be used from within a SymmGaussianBasisSet</font> 00108 00109 <font class="keyword">class </font>PetiteList : <font class="keyword">public</font> RefCount { 00110 <font class="keyword">private</font>: 00111 <font class="keywordtype">int</font> natom_; 00112 <font class="keywordtype">int</font> nshell_; 00113 <font class="keywordtype">int</font> ng_; 00114 <font class="keywordtype">int</font> nirrep_; 00115 <font class="keywordtype">int</font> nblocks_; 00116 <font class="keywordtype">int</font> c1_; 00117 00118 Ref<GaussianBasisSet> gbs_; 00119 Ref<Integral> ints_; 00120 00121 <font class="keywordtype">char</font> *p1_; <font class="comment">// p1[n] is 1 if shell n is in the group P1</font> 00122 <font class="keywordtype">int</font> **atom_map_; <font class="comment">// atom_map[n][g] is the atom that symop g maps atom n</font> 00123 <font class="comment">// into</font> 00124 <font class="keywordtype">int</font> **shell_map_; <font class="comment">// shell_map[n][g] is the shell that symop g maps shell n</font> 00125 <font class="comment">// into</font> 00126 <font class="keywordtype">char</font> *lamij_; <font class="comment">// see Dupuis & King, IJQC 11,613,(1977)</font> 00127 00128 <font class="keywordtype">int</font> *nbf_in_ir_; 00129 00130 <font class="keywordtype">void</font> init(); 00131 00132 <font class="keyword">public</font>: 00133 PetiteList(<font class="keyword">const</font> Ref<GaussianBasisSet>&, <font class="keyword">const</font> Ref<Integral>&); 00134 ~PetiteList(); 00135 00136 <font class="keywordtype">int</font> nirrep()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> nirrep_; } 00137 <font class="keywordtype">int</font> order()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> ng_; } 00138 <font class="keywordtype">int</font> atom_map(<font class="keywordtype">int</font> n, <font class="keywordtype">int</font> g)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> (c1_) ? n : atom_map_[n][g]; } 00139 <font class="keywordtype">int</font> shell_map(<font class="keywordtype">int</font> n, <font class="keywordtype">int</font> g)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> (c1_) ? n : shell_map_[n][g]; } 00140 <font class="keywordtype">int</font> lambda(<font class="keywordtype">int</font> ij)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> (c1_) ? 1 : (<font class="keywordtype">int</font>) lamij_[ij]; } 00141 <font class="keywordtype">int</font> lambda(<font class="keywordtype">int</font> i, <font class="keywordtype">int</font> j)<font class="keyword"> const</font> 00142 <font class="keyword"> </font>{ <font class="keywordflow">return</font> (c1_) ? 1 : (<font class="keywordtype">int</font>) lamij_[ij_offset(i,j)]; } 00143 00144 <font class="keywordtype">int</font> in_p1(<font class="keywordtype">int</font> n)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> (c1_) ? 1 : (<font class="keywordtype">int</font>) p1_[n]; } 00145 <font class="keywordtype">int</font> in_p2(<font class="keywordtype">int</font> ij)<font class="keyword"> const </font>{ <font class="keywordflow">return</font> (c1_) ? 1 : (<font class="keywordtype">int</font>) lamij_[ij]; } 00146 <font class="keywordtype">int</font> in_p4(<font class="keywordtype">int</font> ij, <font class="keywordtype">int</font> kl, <font class="keywordtype">int</font> i, <font class="keywordtype">int</font> j, <font class="keywordtype">int</font> k, <font class="keywordtype">int</font> l) <font class="keyword">const</font>; 00147 00148 <font class="keywordtype">int</font> nfunction(<font class="keywordtype">int</font> i)<font class="keyword"> const</font> 00149 <font class="keyword"> </font>{ <font class="keywordflow">return</font> (c1_) ? gbs_->nbasis() : nbf_in_ir_[i]; } 00150 00151 <font class="keywordtype">int</font> nblocks()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> nblocks_; } 00152 00153 <font class="keywordtype">void</font> print(std::ostream& =ExEnv::out0(), <font class="keywordtype">int</font> verbose=1); 00154 00155 <font class="comment">// these return blocked dimensions</font> 00156 RefSCDimension AO_basisdim(); 00157 RefSCDimension SO_basisdim(); 00158 00159 <font class="comment">// return the basis function rotation matrix R(g)</font> 00160 RefSCMatrix r(<font class="keywordtype">int</font> g); 00161 00162 <font class="comment">// return information about the transformation from AOs to SOs</font> 00163 SO_block * aotoso_info(); 00164 RefSCMatrix aotoso(); 00165 RefSCMatrix sotoao(); 00166 00167 <font class="comment">// given a skeleton matrix, form the symmetrized matrix in the SO basis</font> 00168 <font class="keywordtype">void</font> symmetrize(<font class="keyword">const</font> RefSymmSCMatrix& skel, <font class="keyword">const</font> RefSymmSCMatrix& sym); 00169 00170 <font class="comment">// transform a matrix from AO->SO or SO->AO.</font> 00171 <font class="comment">// this can take either a blocked or non-blocked AO basis matrix.</font> 00172 RefSymmSCMatrix to_SO_basis(<font class="keyword">const</font> RefSymmSCMatrix&); 00173 00174 <font class="comment">// this returns a non-blocked AO basis matrix.</font> 00175 RefSymmSCMatrix to_AO_basis(<font class="keyword">const</font> RefSymmSCMatrix&); 00176 00177 <font class="comment">// these two are just for eigenvectors</font> 00178 <font class="comment">// returns non-blocked AO basis eigenvectors</font> 00179 RefSCMatrix evecs_to_AO_basis(<font class="keyword">const</font> RefSCMatrix&); 00180 <font class="comment">// returns blocked SO basis eigenvectors</font> 00181 RefSCMatrix evecs_to_SO_basis(<font class="keyword">const</font> RefSCMatrix&); 00182 }; 00183 00184 <font class="keyword">inline</font> <font class="keywordtype">int</font> 00185 PetiteList::in_p4(<font class="keywordtype">int</font> ij, <font class="keywordtype">int</font> kl, <font class="keywordtype">int</font> i, <font class="keywordtype">int</font> j, <font class="keywordtype">int</font> k, <font class="keywordtype">int</font> l)<font class="keyword"> const</font> 00186 <font class="keyword"></font>{ 00187 <font class="keywordflow">if</font> (c1_) 00188 <font class="keywordflow">return</font> 1; 00189 00190 sc_int_least64_t ijkl = i_offset64(ij)+kl; 00191 <font class="keywordtype">int</font> nijkl=0; 00192 00193 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> g=0; g < ng_; g++) { 00194 <font class="keywordtype">int</font> gij = ij_offset(shell_map_[i][g],shell_map_[j][g]); 00195 <font class="keywordtype">int</font> gkl = ij_offset(shell_map_[k][g],shell_map_[l][g]); 00196 sc_int_least64_t gijkl = ij_offset64(gij,gkl); 00197 00198 <font class="keywordflow">if</font> (gijkl > ijkl) 00199 <font class="keywordflow">return</font> 0; 00200 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (gijkl == ijkl) 00201 nijkl++; 00202 } 00203 00204 <font class="keywordflow">return</font> ng_/nijkl; 00205 } 00206 00207 } 00208 00209 <font class="preprocessor">#endif</font> 00210 <font class="preprocessor"></font> 00211 <font class="comment">// Local Variables:</font> 00212 <font class="comment">// mode: c++</font> 00213 <font class="comment">// c-file-style: "ETS"</font> 00214 <font class="comment">// End:</font> </div></pre><hr> <address> <small> Generated at Mon Oct 14 14:16:38 2002 for <a href="http://aros.ca.sandia.gov/~cljanss/mpqc">MPQC</a> 2.1.2 using the documentation package <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a> 1.2.5. </small> </address> </body> </html>