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 #include <vector>
00033 #include <math/scmat/matrix.h>
00034 #include <chemistry/qc/mbptr12/spin.h>
00035 #include <chemistry/qc/mbptr12/pairiter.h>
00036
00037 #ifndef _chemistry_qc_mbptr12_utils_h
00038 #define _chemistry_qc_mbptr12_utils_h
00039
00040 namespace sc {
00041
00042 class OrbitalSpace;
00043
00048 template <PureSpinCase2 spin>
00049 RefSCMatrix spinadapt(const RefSCMatrix &A,
00050 const Ref<OrbitalSpace> &bra,
00051 const Ref<OrbitalSpace> &ket);
00056 void antisymmetrize(RefSCMatrix& Aanti, const RefSCMatrix& A,
00057 const Ref<OrbitalSpace>& bra,
00058 const Ref<OrbitalSpace>& ket,
00059 bool accumulate = false);
00071 template <bool accumulate>
00072 void antisymmetrize(RefSCMatrix& Aanti, const RefSCMatrix& A,
00073 const Ref<OrbitalSpace>& bra1,
00074 const Ref<OrbitalSpace>& bra2,
00075 const Ref<OrbitalSpace>& ket1,
00076 const Ref<OrbitalSpace>& ket2);
00084 template <bool accumulate>
00085 void antisymmetrize(RefSymmSCMatrix& Aanti, const RefSymmSCMatrix& A,
00086 const Ref<OrbitalSpace>& bra1);
00091 template <bool Accumulate>
00092 void symmetrize(RefSCMatrix& Asymm, const RefSCMatrix& A,
00093 const Ref<OrbitalSpace>& bra,
00094 const Ref<OrbitalSpace>& ket);
00095
00107 template <bool Accumulate, sc::fastpairiter::PairSymm BraSymm, sc::fastpairiter::PairSymm KetSymm>
00108 void symmetrize12(RefSCMatrix& Asymm, const RefSCMatrix& A,
00109 const Ref<OrbitalSpace>& bra1,
00110 const Ref<OrbitalSpace>& bra2,
00111 const Ref<OrbitalSpace>& ket1,
00112 const Ref<OrbitalSpace>& ket2);
00113
00123 template <bool Accumulate,
00124 sc::fastpairiter::PairSymm SrcBraSymm,
00125 sc::fastpairiter::PairSymm SrcKetSymm,
00126 sc::fastpairiter::PairSymm DstBraSymm,
00127 sc::fastpairiter::PairSymm DstKetSymm
00128 >
00129 void symmetrize(RefSCMatrix& Aanti, const RefSCMatrix& A,
00130 const Ref<OrbitalSpace>& bra1,
00131 const Ref<OrbitalSpace>& bra2,
00132 const Ref<OrbitalSpace>& ket1,
00133 const Ref<OrbitalSpace>& ket2);
00134
00137 std::vector<double> convert(const RefDiagSCMatrix& A);
00138
00140 void print_f77_mat(const std::string& comment,
00141 const double* A,
00142 unsigned int nrow,
00143 unsigned int ncol,
00144 bool transpose = false);
00145
00147 RefSymmSCMatrix to_lower_triangle(const RefSCMatrix& B);
00148
00149 }
00150
00151 #endif
00152