fockbuild.h

00001 //
00002 // fockbuild.h --- a generic Fock matrix builder
00003 //
00004 // Based on code gbuild.h:
00005 // Copyright (C) 1996 Limit Point Systems, Inc.
00006 //
00007 // Author: Curtis Janssen <cljanss@ca.sandia.gov>
00008 // Maintainer: SNL
00009 //
00010 // This file is part of the SC Toolkit.
00011 //
00012 // The SC Toolkit is free software; you can redistribute it and/or modify
00013 // it under the terms of the GNU Library General Public License as published by
00014 // the Free Software Foundation; either version 2, or (at your option)
00015 // any later version.
00016 //
00017 // The SC Toolkit is distributed in the hope that it will be useful,
00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020 // GNU Library General Public License for more details.
00021 //
00022 // You should have received a copy of the GNU Library General Public License
00023 // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
00024 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
00025 //
00026 // The U.S. Government is granted a limited license as per AL 91-7.
00027 //
00028 
00029 #ifndef _chemistry_qc_scf_fockbuild_h
00030 #define _chemistry_qc_scf_fockbuild_h
00031 
00032 #ifdef __GNUC__
00033 #pragma interface
00034 #endif
00035 
00036 #include <scconfig.h>
00037 #include <util/group/thread.h>
00038 #include <util/group/message.h>
00039 #include <chemistry/qc/basis/integral.h>
00040 
00041 namespace sc {
00042 
00043 class FockBuildMatrix {
00044     bool owns_data_; 
00047     double **blockpointers_; 
00049     Ref<SCMatrix> rectmat_;
00050     Ref<SymmSCMatrix> symmmat_;
00051     int nI_, nJ_;
00052     int ndata_;
00053     Ref<GaussianBasisSet> bs1_;
00054     Ref<GaussianBasisSet> bs2_;
00055 
00056     inline int offset(int I, int J) const {
00057       if (!symmetric()) {
00058           return I * nJ_ + J;
00059         }
00060       else {
00061           return (I*(I+1))/2 + J;
00062         }
00063     }
00064     inline int nblock() const {
00065       if (!symmetric()) {
00066           return nI_ * nJ_;
00067         }
00068       else {
00069           return (nI_*(nI_+1))/2;
00070         }
00071     }
00072     void data_to_symmat() const;
00073     void data_to_rectmat() const;
00074   public:
00075     FockBuildMatrix();
00076     FockBuildMatrix(const FockBuildMatrix &f) { make_reference(f); }
00077     void operator = (const FockBuildMatrix &f) { make_reference(f); }
00078     ~FockBuildMatrix();
00079     bool symmetric() const { return symmmat_.nonnull(); }
00080     // This will average the off diagonal elements in each
00081     // diagonal block, iff the matrix is symmetrix.
00082     void fix_diagonal_blocks() const;
00083     void clear();
00084     // These allocate data to hold the SCMatrix.  The data is only
00085     // copied if copy is true, otherwise it is zeroed.
00086     void scmat_to_data(const Ref<SymmSCMatrix> &m,
00087                        const Ref<GaussianBasisSet> &b, bool copy);
00088     void scmat_to_data(const Ref<SCMatrix> &m,
00089                        const Ref<GaussianBasisSet> &b1,
00090                        const Ref<GaussianBasisSet> &b2, bool copy);
00091     void make_reference(const FockBuildMatrix &);
00092     // This copies the held data back into the SCMatrix.
00093     void data_to_scmat() const;
00094     inline double *block(int I, int J) const {
00095       return blockpointers_[offset(I,J)];
00096     }
00098     void copy_data();
00100     void zero_data();
00102     void accum(const FockBuildMatrix &fbm);
00104     void accum_remote(const Ref<MessageGrp> &);
00105 };
00106 
00107 class FockContribution: public RefCount {
00108     double nint_;
00109   public:
00110     FockContribution();
00111     virtual ~FockContribution();
00117     virtual void contrib_e_J(double factor,
00118                              int I, int J, int K, int L,
00119                              int nI, int nJ, int nK, int nL,
00120                              const double * restrictxx buf) = 0;
00125     virtual void contrib_e_K(double factor,
00126                              int I, int J, int K, int L,
00127                              int nI, int nJ, int nK, int nL,
00128                              const double * restrictxx buf) = 0;
00129     virtual void contrib_p12_p13p24_J(double factor,
00130                                       int I, int J, int K, int L,
00131                                       int nI, int nJ, int nK, int nL,
00132                                       const double * restrictxx buf) = 0;
00133     virtual void contrib_p12_p13p24_K(double factor,
00134                                       int I, int J, int K, int L,
00135                                       int nI, int nJ, int nK, int nL,
00136                                       const double * restrictxx buf) = 0;
00137     virtual void contrib_p34_p13p24_J(double factor,
00138                                       int I, int J, int K, int L,
00139                                       int nI, int nJ, int nK, int nL,
00140                                       const double * restrictxx buf) = 0;
00141     virtual void contrib_p34_p13p24_K(double factor,
00142                                       int I, int J, int K, int L,
00143                                       int nI, int nJ, int nK, int nL,
00144                                       const double * restrictxx buf) = 0;
00145     virtual void contrib_p12_p34_J(double factor,
00146                                    int I, int J, int K, int L,
00147                                    int nI, int nJ, int nK, int nL,
00148                                    const double * restrictxx buf) = 0;
00149     virtual void contrib_p12_p34_K(double factor,
00150                                    int I, int J, int K, int L,
00151                                    int nI, int nJ, int nK, int nL,
00152                                    const double * restrictxx buf) = 0;
00153     virtual void contrib_p34_J(double factor,
00154                                int I, int J, int K, int L,
00155                                int nI, int nJ, int nK, int nL,
00156                                const double * restrictxx buf) = 0;
00157     virtual void contrib_p34_K(double factor,
00158                                int I, int J, int K, int L,
00159                                int nI, int nJ, int nK, int nL,
00160                                const double * restrictxx buf) = 0;
00161     virtual void contrib_p13p24_J(double factor,
00162                                   int I, int J, int K, int L,
00163                                   int nI, int nJ, int nK, int nL,
00164                                   const double * restrictxx buf) = 0;
00165     virtual void contrib_p13p24_K(double factor,
00166                                   int I, int J, int K, int L,
00167                                   int nI, int nJ, int nK, int nL,
00168                                   const double * restrictxx buf) = 0;
00169     virtual void contrib_all_J(double factor,
00170                                int I, int J, int K, int L,
00171                                int nI, int nJ, int nK, int nL,
00172                                const double * restrictxx buf) = 0;
00173     virtual void contrib_all_K(double factor,
00174                                int I, int J, int K, int L,
00175                                int nI, int nJ, int nK, int nL,
00176                                const double * restrictxx buf) = 0;
00177     virtual Ref<FockContribution> clone() = 0;
00178 
00179     virtual void set_fmat(int i, const Ref<SCMatrix> &) = 0;
00180     virtual void set_fmat(int i, const Ref<SymmSCMatrix> &) = 0;
00181 
00182     virtual void set_jmat(int i, const Ref<SCMatrix> &) = 0;
00183     virtual void set_jmat(int i, const Ref<SymmSCMatrix> &) = 0;
00184 
00185     virtual void set_kmat(int i, const Ref<SCMatrix> &) = 0;
00186     virtual void set_kmat(int i, const Ref<SymmSCMatrix> &) = 0;
00187 
00188     virtual void set_pmat(int i, const Ref<SymmSCMatrix> &) = 0;
00189 
00192     virtual signed char *compute_pmax() const = 0;
00193 
00195     virtual void copy() = 0;
00200     virtual void accum(const Ref<FockContribution> &) = 0;
00204     virtual void accum_remote(const Ref<MessageGrp> &) = 0;
00206     virtual void update() = 0;
00207 
00208     double nint() const { return nint_; }
00209     double &nint() { return nint_; }
00210 };
00211 
00232 class GenericFockContribution: public FockContribution {
00233   protected:
00234     int nfmat_;     
00235     std::vector<FockBuildMatrix> jmats_;
00236     std::vector<FockBuildMatrix> kmats_;
00237     std::vector<bool> k_is_j_;
00238     int npmat_;     
00239     std::vector<FockBuildMatrix> pmats_;
00240     Ref<GaussianBasisSet> f_b1_, f_b2_, p_b_;
00241     bool f_b1_equiv_f_b2;
00242     double nint_;
00243 
00244     GenericFockContribution(int nfmat, int npmat,
00245                             Ref<GaussianBasisSet> &f_b1,
00246                             Ref<GaussianBasisSet> &f_b2,
00247                             Ref<GaussianBasisSet> &p_b);
00248 
00249     void pmax_contrib(const FockBuildMatrix &mat,
00250                       signed char *pmax) const;
00251 
00252   public:
00253     double *jmat_block(int i, int I, int J) {
00254       return jmats_[i].block(I,J);
00255     }
00256     bool jmat_symmetric(int i) const { return jmats_[i].symmetric(); }
00257     double *kmat_block(int i, int I, int J) {
00258       return kmats_[i].block(I,J);
00259     }
00260     bool kmat_symmetric(int i) const { return kmats_[i].symmetric(); }
00261     const double *pmat_block(int i, int I, int J) {
00262       return pmats_[i].block(I,J);
00263     }
00264 
00265     void set_fmat(int i, const Ref<SCMatrix> &);
00266     void set_fmat(int i, const Ref<SymmSCMatrix> &);
00267 
00268     void set_jmat(int i, const Ref<SCMatrix> &);
00269     void set_jmat(int i, const Ref<SymmSCMatrix> &);
00270 
00271     void set_kmat(int i, const Ref<SCMatrix> &);
00272     void set_kmat(int i, const Ref<SymmSCMatrix> &);
00273 
00274     void set_pmat(int i, const Ref<SymmSCMatrix> &);
00275 
00276     void copy();
00277     void accum(const Ref<FockContribution> &);
00278     void accum_remote(const Ref<MessageGrp> &);
00279     void update();
00280 
00281     signed char* compute_pmax() const;
00282 
00283     ~GenericFockContribution();
00284 };
00285 
00289 class FockBuildThread : public Thread {
00290   protected:
00291     Ref<FockContribution> contrib_;
00292     Ref<ThreadLock> lock_;
00293     Ref<Integral> integral_;
00294     double accuracy_;
00295     Ref<MessageGrp> msg_;
00296     int nthread_;
00297     int threadnum_;
00298     const signed char *pmax_;
00299 
00300     int can_sym_offset(int i, int j) { return (i*(i+1))/2 + j; }
00301     int gen_sym_offset(int i, int j) {
00302       if (i>=j) { return can_sym_offset(i,j); }
00303       else      { return can_sym_offset(j,i); }
00304     }
00305   public:
00307     FockBuildThread(const Ref<MessageGrp> &msg,
00308                     int nthread,
00309                     int threadnum,
00310                     const Ref<ThreadLock> &lock,
00311                     const Ref<Integral> &integral);
00312     void set_contrib(const Ref<FockContribution>&c) { contrib_ = c; }
00313     void set_accuracy(double acc) { accuracy_ = acc; }
00314     void set_pmax(const signed char *pmax) { pmax_ = pmax; }
00315 };
00316 
00320 class FockBuildThread_F11_P11 : public FockBuildThread {
00321     Ref<GaussianBasisSet> basis_;
00322     Ref<PetiteList> pl_;
00323     Ref<TwoBodyInt> eri_;
00324   public:
00326     FockBuildThread_F11_P11(const Ref<MessageGrp> &msg,
00327                             int nthread,
00328                             int threadnum,
00329                             const Ref<ThreadLock> &lock,
00330                             const Ref<Integral> &integral,
00331                             const Ref<PetiteList> &pl,
00332                             const Ref<GaussianBasisSet> &basis1,
00333                             const Ref<GaussianBasisSet> &basis2/*not used*/,
00334                             const Ref<GaussianBasisSet> &basis3/*not used*/);
00335     void run();
00336 };
00337 
00341 class FockBuildThread_F12_P33 : public FockBuildThread {
00342     Ref<GaussianBasisSet> basis1_;
00343     Ref<GaussianBasisSet> basis2_;
00344     Ref<GaussianBasisSet> basis3_;
00345     Ref<PetiteList> pl_;
00346 
00347     void run_J();
00348     void run_K();
00349 
00350     Ref<TwoBodyInt> eri_J_;
00351     Ref<TwoBodyInt> eri_K_;
00352 
00353   public:
00355     FockBuildThread_F12_P33(const Ref<MessageGrp> &msg,
00356                             int nthread,
00357                             int threadnum,
00358                             const Ref<ThreadLock> &lock,
00359                             const Ref<Integral> &integral,
00360                             const Ref<PetiteList> &pl,
00361                             const Ref<GaussianBasisSet> &basis1,
00362                             const Ref<GaussianBasisSet> &basis2,
00363                             const Ref<GaussianBasisSet> &basis3);
00364     void run();
00365 };
00366 
00373 class FockBuild: public RefCount {
00374     Ref<FockContribution> contrib_;
00375     Ref<GaussianBasisSet> b_f1_;
00376     Ref<GaussianBasisSet> b_f2_;
00377     Ref<GaussianBasisSet> b_p_;
00378     Ref<MessageGrp> msg_;
00379     Ref<ThreadGrp> thr_;
00380     Ref<Integral> integral_;
00381     double accuracy_;
00382     Ref<PetiteList> pl_;
00383 
00384     typedef FockBuildThread* (*FBT_CTOR)(const Ref<MessageGrp> &msg,
00385                                          int nthread,
00386                                          int threadnum,
00387                                          const Ref<ThreadLock> &lock,
00388                                          const Ref<Integral> &integral,
00389                                          const Ref<PetiteList> &pl,
00390                                          const Ref<GaussianBasisSet> &basis1,
00391                                          const Ref<GaussianBasisSet> &basis2,
00392                                          const Ref<GaussianBasisSet> &basis3);
00393 
00394 
00395     // Build for the any case.  The thread constructing function is passed in.
00396     FockBuildThread **thread_;
00397     void init_threads(FBT_CTOR);
00398     void init_threads();
00399     void done_threads();
00400 
00401   public:
00410     FockBuild(const Ref<FockContribution> &contrib,
00411               const Ref<GaussianBasisSet> &b_f1,
00412               const Ref<GaussianBasisSet> &b_f2 = 0,
00413               const Ref<GaussianBasisSet> &b_p = 0,
00414               const Ref<MessageGrp> &msg=MessageGrp::get_default_messagegrp(),
00415               const Ref<ThreadGrp> &thr=ThreadGrp::get_default_threadgrp(),
00416               const Ref<Integral> &integral=Integral::get_default_integral());
00417     virtual ~FockBuild();
00418 
00420     void build();
00421 
00422     const Ref<FockContribution> &contrib() const { return contrib_; }
00423     void set_accuracy(double acc) { accuracy_ = acc; }
00424 };
00425 
00426 }
00427 
00428 #endif
00429 
00430 // Local Variables:
00431 // mode: c++
00432 // c-file-style: "CLJ"
00433 // End:

Generated at Wed Sep 5 14:02:29 2007 for MPQC 3.0.0-alpha using the documentation package Doxygen 1.5.2.
These pages are hosted on SourceForge.net