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 #ifdef __GNUG__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _chemistry_qc_mbptr12_mp2r12energyutil_h
00033 #define _chemistry_qc_mbptr12_mp2r12energyutil_h
00034
00035 #include <util/ref/ref.h>
00036 #include <math/scmat/matrix.h>
00037 #include <util/class/scexception.h>
00038 #include <chemistry/qc/mbptr12/spin.h>
00039 #include <chemistry/qc/mbptr12/svd.h>
00040
00041 namespace sc {
00042
00045 class MP2R12EnergyUtil_base : virtual public RefCount {
00046 protected:
00048 unsigned int nocc_act_;
00050 RefSCDimension oodim_;
00052 RefSCDimension xydim_;
00054 RefSCDimension f12dim_;
00056 RefSCDimension gdim_;
00058 unsigned int nf12_;
00059
00060 public:
00061 MP2R12EnergyUtil_base();
00062 MP2R12EnergyUtil_base(const RefSCDimension& oodim,
00063 const RefSCDimension& xydim,
00064 const RefSCDimension& f12dim,
00065 const unsigned int nocc_act);
00066 virtual ~MP2R12EnergyUtil_base();
00067
00069 void check_dims(const RefSCMatrix& A) const;
00071 void check_dims(const RefSymmSCMatrix& A) const;
00072
00074 virtual void print(const char* label, const RefSCMatrix& A, std::ostream& os = ExEnv::out0()) const = 0;
00076 virtual void print(const char* label, const RefSymmSCMatrix& A, std::ostream& os = ExEnv::out0()) const = 0;
00078 virtual void print(const char* label, const RefDiagSCMatrix& A, std::ostream& os = ExEnv::out0()) const = 0;
00080 virtual void invert(RefSymmSCMatrix& A) const = 0;
00082 virtual RefDiagSCMatrix eigenvalues(const RefSymmSCMatrix& A) const = 0;
00084 virtual void diagonalize(const RefSymmSCMatrix& A, RefDiagSCMatrix& evals, RefSCMatrix& evecs) const = 0;
00086 virtual void transform(const RefSymmSCMatrix& B, const RefDiagSCMatrix& A, const RefSCMatrix& U) const = 0;
00088 virtual void solve_linear_system(const RefSymmSCMatrix& A,
00089 RefSCMatrix& X,
00090 const RefSCMatrix& B) const = 0;
00091 virtual void solve_linear_system(unsigned int ij,
00092 const RefSymmSCMatrix& A,
00093 RefSCMatrix& X,
00094 const RefSCMatrix& B) const = 0;
00096 virtual void times(const RefSymmSCMatrix& A,
00097 const RefSCMatrix& x,
00098 RefSCMatrix& y) const = 0;
00100 virtual void times(unsigned int ij,
00101 const RefSymmSCMatrix& A,
00102 const RefSCMatrix& x,
00103 RefSCMatrix& y) const = 0;
00105 virtual RefSCVector dot_product(const RefSCMatrix& A,
00106 const RefSCMatrix& B) const = 0;
00107 };
00108
00109 class MP2R12EnergyUtil_Diag : virtual public RefCount {
00110 protected:
00112 unsigned int nocc_act_;
00114 RefSCDimension oodim_;
00116 RefSCDimension xydim_;
00118 RefSCDimension f12dim_;
00120 RefSCDimension gdim_;
00122 unsigned int nf12_;
00123
00124 public:
00125 MP2R12EnergyUtil_Diag();
00126 MP2R12EnergyUtil_Diag(const RefSCDimension& oodim,
00127 const RefSCDimension& xydim,
00128 const RefSCDimension& f12dim,
00129 const unsigned int nocc_act);
00130 virtual ~MP2R12EnergyUtil_Diag();
00131
00133 void check_dims(const RefSCMatrix& A) const;
00135 void check_dims(const RefSymmSCMatrix& A) const;
00136
00138 virtual void print(const char* label, const RefSCMatrix& A, std::ostream& os = ExEnv::out0()) const = 0;
00140 virtual void print(const char* label, const RefSymmSCMatrix& A, std::ostream& os = ExEnv::out0()) const = 0;
00142 virtual void print(const char* label, const RefDiagSCMatrix& A, std::ostream& os = ExEnv::out0()) const = 0;
00143
00145 virtual void get(unsigned int ij, const RefSCMatrix& A, const RefSCVector& Aij) const = 0;
00147 virtual void get(unsigned int ij, const RefSCMatrix& A, const RefSCMatrix& Aij) const =0;
00149 virtual void get(unsigned int ij, const RefSymmSCMatrix& A, const RefSymmSCMatrix& Aij) const = 0;
00151 virtual void get(unsigned int ij, const RefDiagSCMatrix& A, const RefDiagSCMatrix& Aij) const =0;
00152
00154 virtual void put(unsigned int ij, const RefSCMatrix& A, const RefSCVector& Aij) const =0;
00156 virtual void put(unsigned int ij, const RefSCMatrix& A, const RefSCMatrix& Aij) const =0;
00158 virtual void put(unsigned int ij, const RefSymmSCMatrix& A, const RefSymmSCMatrix& Aij) const = 0;
00160 virtual void put(unsigned int ij, const RefDiagSCMatrix& A, const RefDiagSCMatrix& Aij) const = 0;
00161
00163 virtual void invert(RefSymmSCMatrix& A) const = 0;
00165 virtual RefDiagSCMatrix eigenvalues(const RefSymmSCMatrix& A) const = 0;
00167 virtual void diagonalize(const RefSymmSCMatrix& A, RefDiagSCMatrix& evals, RefSCMatrix& evecs) const = 0;
00169 virtual void transform(const RefSymmSCMatrix& B, const RefDiagSCMatrix& A, const RefSCMatrix& U) const = 0;
00171 virtual void solve_linear_system(const RefSymmSCMatrix& A,
00172 RefSCMatrix& X,
00173 const RefSCMatrix& B) const = 0;
00174 virtual void solve_linear_system(unsigned int ij,
00175 const RefSymmSCMatrix& A,
00176 RefSCMatrix& X,
00177 const RefSCMatrix& B) const = 0;
00179 virtual void times(const RefSymmSCMatrix& A,
00180 const RefSCMatrix& x,
00181 RefSCMatrix& y) const = 0;
00183 virtual void times(unsigned int ij,
00184 const RefSymmSCMatrix& A,
00185 const RefSCMatrix& x,
00186 RefSCMatrix& y) const = 0;
00188 virtual RefSCVector dot_product(const RefSCMatrix& A,
00189 const RefSCMatrix& B) const = 0;
00190 };
00191
00197 class MP2R12EnergyUtil_Diag_DifferentSpin : public MP2R12EnergyUtil_Diag {
00198 private:
00199 SpinCase2 spincase2_;
00200 public:
00205 MP2R12EnergyUtil_Diag_DifferentSpin(const RefSCDimension& oodim,
00206 const RefSCDimension& xydim,
00207 const RefSCDimension& f12dim,
00208 const unsigned int nocc_act);
00209 ~MP2R12EnergyUtil_Diag_DifferentSpin() {}
00210
00212 unsigned int nrowblks(const RefSCMatrix& A) const;
00214 unsigned int ncolblks(const RefSCMatrix& A) const;
00216 unsigned int nblks(const RefSymmSCMatrix& A) const;
00217
00219 void get(unsigned int ij, const RefSCMatrix& A, const RefSCVector& Aij) const;
00221 void get(unsigned int ij, const RefSCMatrix& A, const RefSCMatrix& Aij) const;
00223 void get(unsigned int ij, const RefSymmSCMatrix& A, const RefSymmSCMatrix& Aij) const;
00225 void get(unsigned int ij, const RefDiagSCMatrix& A, const RefDiagSCMatrix& Aij) const;
00226
00228 void put(unsigned int ij, const RefSCMatrix& A, const RefSCVector& Aij) const;
00230 void put(unsigned int ij, const RefSCMatrix& A, const RefSCMatrix& Aij) const;
00232 void put(unsigned int ij, const RefSymmSCMatrix& A, const RefSymmSCMatrix& Aij) const;
00234 void put(unsigned int ij, const RefDiagSCMatrix& A, const RefDiagSCMatrix& Aij) const;
00235
00237 void invert(RefSymmSCMatrix& A) const;
00239 RefDiagSCMatrix eigenvalues(const RefSymmSCMatrix& A) const;
00241 void diagonalize(const RefSymmSCMatrix& A, RefDiagSCMatrix& evals, RefSCMatrix& evecs) const;
00243 void transform(const RefSymmSCMatrix& B, const RefDiagSCMatrix& A, const RefSCMatrix& U) const;
00245 void solve_linear_system(const RefSymmSCMatrix& A,
00246 RefSCMatrix& X,
00247 const RefSCMatrix& B) const;
00248 void solve_linear_system(unsigned int ij,
00249 const RefSymmSCMatrix& A,
00250 RefSCMatrix& X,
00251 const RefSCMatrix& B) const;
00253 void times(const RefSymmSCMatrix& A,
00254 const RefSCMatrix& x,
00255 RefSCMatrix& y) const;
00257 void times(unsigned int ij,
00258 const RefSymmSCMatrix& A,
00259 const RefSCMatrix& x,
00260 RefSCMatrix& y) const;
00262 RefSCVector dot_product(const RefSCMatrix& A,
00263 const RefSCMatrix& B) const;
00264
00266 void print(const char* label, const RefSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00268 void print(const char* label, const RefSymmSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00270 void print(const char* label, const RefDiagSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00271 };
00272
00273 class MP2R12EnergyUtil_Diag_SameSpin : public MP2R12EnergyUtil_Diag {
00274 private:
00275 SpinCase2 spincase2_;
00276 public:
00281 MP2R12EnergyUtil_Diag_SameSpin(const RefSCDimension& oodim,
00282 const RefSCDimension& xydim,
00283 const RefSCDimension& f12dim,
00284 const unsigned int nocc_act);
00285 ~MP2R12EnergyUtil_Diag_SameSpin() {}
00286
00288 unsigned int nrowblks(const RefSCMatrix& A) const;
00290 unsigned int ncolblks(const RefSCMatrix& A) const;
00292 unsigned int nblks(const RefSymmSCMatrix& A) const;
00293
00295 void get(unsigned int ij, const RefSCMatrix& A, const RefSCVector& Aij) const;
00297 void get(unsigned int ij, const RefSCMatrix& A, const RefSCMatrix& Aij) const;
00299 void get(unsigned int ij, const RefSymmSCMatrix& A, const RefSymmSCMatrix& Aij) const;
00301 void get(unsigned int ij, const RefDiagSCMatrix& A, const RefDiagSCMatrix& Aij) const;
00302
00304 void put(unsigned int ij, const RefSCMatrix& A, const RefSCVector& Aij) const;
00306 void put(unsigned int ij, const RefSCMatrix& A, const RefSCMatrix& Aij) const;
00308 void put(unsigned int ij, const RefSymmSCMatrix& A, const RefSymmSCMatrix& Aij) const;
00310 void put(unsigned int ij, const RefDiagSCMatrix& A, const RefDiagSCMatrix& Aij) const;
00311
00313 void invert(RefSymmSCMatrix& A) const;
00315 RefDiagSCMatrix eigenvalues(const RefSymmSCMatrix& A) const;
00317 void diagonalize(const RefSymmSCMatrix& A, RefDiagSCMatrix& evals, RefSCMatrix& evecs) const;
00319 void transform(const RefSymmSCMatrix& B, const RefDiagSCMatrix& A, const RefSCMatrix& U) const;
00321 void solve_linear_system(const RefSymmSCMatrix& A,
00322 RefSCMatrix& X,
00323 const RefSCMatrix& B) const;
00324 void solve_linear_system(unsigned int ij,
00325 const RefSymmSCMatrix& A,
00326 RefSCMatrix& X,
00327 const RefSCMatrix& B) const;
00329 void times(const RefSymmSCMatrix& A,
00330 const RefSCMatrix& x,
00331 RefSCMatrix& y) const;
00332 void times(unsigned int ij,
00333 const RefSymmSCMatrix& A,
00334 const RefSCMatrix& x,
00335 RefSCMatrix& y) const;
00337 RefSCVector dot_product(const RefSCMatrix& A,
00338 const RefSCMatrix& B) const;
00339
00341 void print(const char* label, const RefSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00343 void print(const char* label, const RefSymmSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00345 void print(const char* label, const RefDiagSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00346 };
00347
00348 class MP2R12EnergyUtil_Nondiag : public MP2R12EnergyUtil_base {
00349 public:
00353 MP2R12EnergyUtil_Nondiag(const RefSCDimension& oodim,
00354 const RefSCDimension& xydim,
00355 const RefSCDimension& f12dim,
00356 const unsigned int nocc_act);
00357 ~MP2R12EnergyUtil_Nondiag() {}
00358
00360 void print(const char* label, const RefSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00362 void print(const char* label, const RefSymmSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00364 void print(const char* label, const RefDiagSCMatrix& A, std::ostream& os = ExEnv::out0()) const;
00366 void invert(RefSymmSCMatrix& A) const;
00368 RefDiagSCMatrix eigenvalues(const RefSymmSCMatrix& A) const;
00370 void diagonalize(const RefSymmSCMatrix& A, RefDiagSCMatrix& evals, RefSCMatrix& evecs) const;
00372 void transform(const RefSymmSCMatrix& B, const RefDiagSCMatrix& A, const RefSCMatrix& U) const;
00374 void solve_linear_system(const RefSymmSCMatrix& A,
00375 RefSCMatrix& X,
00376 const RefSCMatrix& B) const;
00377 void solve_linear_system(unsigned int ij,
00378 const RefSymmSCMatrix& A,
00379 RefSCMatrix& X,
00380 const RefSCMatrix& B) const;
00382 void times(const RefSymmSCMatrix& A,
00383 const RefSCMatrix& x,
00384 RefSCMatrix& y) const;
00385 void times(unsigned int ij,
00386 const RefSymmSCMatrix& A,
00387 const RefSCMatrix& x,
00388 RefSCMatrix& y) const;
00390 RefSCVector dot_product(const RefSCMatrix& A,
00391 const RefSCMatrix& B) const;
00392
00394 unsigned int nrowblks(const RefSCMatrix& A) const;
00396 unsigned int ncolblks(const RefSCMatrix& A) const;
00398 unsigned int nblks(const RefSymmSCMatrix& A) const;
00399
00400 };
00401
00402 Ref<MP2R12EnergyUtil_Diag> generate_MP2R12EnergyUtil_Diag(SpinCase2 spincase2,
00403 const RefSCDimension& oodim,
00404 const RefSCDimension& xydim,
00405 const RefSCDimension& f12dim,
00406 const unsigned int nocc_act);
00407
00408 }
00409
00410 #endif // include guard