00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
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
00081
00082 void fix_diagonal_blocks() const;
00083 void clear();
00084
00085
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
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,
00334 const Ref<GaussianBasisSet> &basis3);
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
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
00431
00432
00433