46 unsigned long long maxlinsize = 0;
50 if (linsize_irrep > maxlinsize)
51 maxlinsize = linsize_irrep;
55 auto& maxBlockSize = maxlinsize;
57 auto maxBSpower4 = maxBlockSize * maxBlockSize * maxBlockSize * maxBlockSize;
58 auto sizeWorkmem1 = max( max( maxBSpower4 , 3*maxlinsize*maxlinsize ) , 1uLL * L * L );
59 auto sizeWorkmem2 = max( max( maxBSpower4 , 2*maxlinsize*maxlinsize ) , L*(L + 1uLL) );
60 mem1.reset(
new double[sizeWorkmem1]);
61 mem2.reset(
new double[sizeWorkmem2]);
86 if ((linsize1>0) && (linsize2>0) && (linsize3>0) && (linsize4>0))
88 for (
int cnt1=0; cnt1<linsize1; cnt1++)
89 for (
int cnt2=0; cnt2<linsize2; cnt2++)
90 for (
int cnt3=0; cnt3<linsize3; cnt3++)
91 for (
int cnt4=0; cnt4<linsize4; cnt4++)
92 mem1[cnt1 + linsize1 * ( cnt2 + linsize2 * (cnt3 + linsize3 * cnt4) ) ]
100 int rightdim = linsize2 * linsize3 * linsize4;
101 double * Umx =
_unitary->getBlock(irrep1);
102 dgemm_(¬ra, ¬ra, &linsize1, &rightdim, &linsize1, &alpha, Umx, &linsize1,
mem1.get(), &linsize1, &beta,
mem2.get(), &linsize1);
104 int leftdim = linsize1 * linsize2 * linsize3;
106 dgemm_(¬ra, &trans, &leftdim, &linsize4, &linsize4, &alpha,
mem2.get(), &leftdim, Umx, &linsize4, &beta,
mem1.get(), &leftdim);
108 int jump1 = linsize1 * linsize2 * linsize3;
109 int jump2 = linsize1 * linsize2 * linsize3;
110 leftdim = linsize1 * linsize2;
112 for (
int bla=0; bla<linsize4; bla++)
113 dgemm_(¬ra, &trans, &leftdim, &linsize3, &linsize3, &alpha,
mem1.get()+jump1*bla, &leftdim, Umx, &linsize3, &beta,
mem2.get()+jump2*bla, &leftdim);
115 jump2 = linsize1 * linsize2;
116 jump1 = linsize1 * linsize2;
117 rightdim = linsize3 * linsize4;
119 for (
int bla=0; bla<rightdim; bla++)
120 dgemm_(¬ra, &trans, &linsize1, &linsize2, &linsize2, &alpha,
mem2.get()+jump2*bla, &linsize1, Umx, &linsize2, &beta,
mem1.get()+jump1*bla, &linsize1);
122 for (
int cnt1=0; cnt1<linsize1; cnt1++)
123 for (
int cnt2=0; cnt2<linsize2; cnt2++)
124 for (
int cnt3=0; cnt3<linsize3; cnt3++)
125 for (
int cnt4=0; cnt4<linsize4; cnt4++)
157 for (
int row=0; row<linsize; row++)
162 for (
int col=row+1; col<linsize; col++)
188 double * Umx =
_unitary->getBlock(irrep);
194 dgemm_(¬rans,¬rans,&linsize,&linsize,&linsize,&alpha,Umx,&linsize,matrix[irrep].
get(),&linsize,&beta,
QmatrixWork[irrep].
get(),&linsize);
196 dgemm_(¬rans,&trans, &linsize,&linsize,&linsize,&alpha,
QmatrixWork[irrep].
get(),&linsize,Umx,&linsize,&beta,matrix[irrep].
get(),&linsize);
205 std::cerr <<
"First build the OneBodyMatrixElements!" << std::endl;
209 const int irrep1 =
_hamorig->getOrbitalIrrep(index1);
210 const int irrep2 =
_hamorig->getOrbitalIrrep(index2);
212 if (irrep1 != irrep2)
224 double value =
_hamorig->getEconst();
231 for (
int cnt1=0; cnt1<linsize; cnt1++)
232 for (
int cnt2=cnt1; cnt2<linsize; cnt2++)
235 Ham.
setTmat( cnt1 + shift , cnt2 + shift ,
TmatRotated(cnt1 + shift , cnt2 + shift) );
296 const int k2 = k - shift;
297 const int l2 = l - shift;
299 const double cos = std::cos(theta);
300 const double sin = std::sin(theta);
305 const double tmpkk = ham_rot.
getTmat(k,k);
306 const double tmpll = ham_rot.
getTmat(l,l);
307 const double tmpkl = ham_rot.
getTmat(k,l);
310 tmp = cos*cos*tmpkk+sin*sin*tmpll-2*cos*sin*tmpkl;
313 tmp = cos*cos*tmpll+sin*sin*tmpkk+2*cos*sin*tmpkl;
316 tmp = tmpkl*(cos*cos-sin*sin)+cos*sin*(tmpkk-tmpll);
319 for(
int a=shift;a<linsize+shift;a++)
324 const double tmpk = ham_rot.
getTmat(k,a);
325 const double tmpl = ham_rot.
getTmat(l,a);
327 tmp = cos * tmpk - sin * tmpl;
330 tmp = cos * tmpl + sin * tmpk;
347 if(irrep4>=irrep2 && (irrep4==irrep || irrep3==irrep || irrep2==irrep || irrep1==irrep))
354 if ((linsize1>0) && (linsize2>0) && (linsize3>0) && (linsize4>0))
356 for (
int cnt1=0; cnt1<linsize1; cnt1++)
357 for (
int cnt2=0; cnt2<linsize2; cnt2++)
358 for (
int cnt3=0; cnt3<linsize3; cnt3++)
359 for (
int cnt4=0; cnt4<linsize4; cnt4++)
360 mem1[cnt1 + linsize1 * ( cnt2 + linsize2 * (cnt3 + linsize3 * cnt4) ) ]
363 int rightdim = linsize2 * linsize3 * linsize4;
366 for(
int d=0;d<rightdim;d++)
368 const double tmpk =
mem1[d*linsize1+k2];
369 const double tmpl =
mem1[d*linsize1+l2];
371 mem1[d*linsize1+k2] = cos*tmpk-sin*tmpl;
372 mem1[d*linsize1+l2] = cos*tmpl+sin*tmpk;
375 int leftdim = linsize1 * linsize2 * linsize3;
378 for(
int d=0;d<leftdim;d++)
380 const double tmpk =
mem1[k2*leftdim+d];
381 const double tmpl =
mem1[l2*leftdim+d];
383 mem1[k2*leftdim+d] = cos*tmpk-sin*tmpl;
384 mem1[l2*leftdim+d] = cos*tmpl+sin*tmpk;
387 int jump = linsize1 * linsize2 * linsize3;
388 leftdim = linsize1 * linsize2;
391 for (
int strideidx=0;strideidx<linsize4;strideidx++)
392 for(
int d=0;d<leftdim;d++)
394 const double tmpk =
mem1[k2*leftdim+d+jump*strideidx];
395 const double tmpl =
mem1[l2*leftdim+d+jump*strideidx];
397 mem1[k2*leftdim+d+jump*strideidx] = cos*tmpk-sin*tmpl;
398 mem1[l2*leftdim+d+jump*strideidx] = cos*tmpl+sin*tmpk;
402 jump = linsize1 * linsize2;
403 rightdim = linsize3 * linsize4;
406 for (
int strideidx=0;strideidx<rightdim;strideidx++)
407 for(
int d=0;d<linsize1;d++)
409 const double tmpk =
mem1[k2*linsize1+d+jump*strideidx];
410 const double tmpl =
mem1[l2*linsize1+d+jump*strideidx];
412 mem1[k2*linsize1+d+jump*strideidx] = cos*tmpk-sin*tmpl;
413 mem1[l2*linsize1+d+jump*strideidx] = cos*tmpl+sin*tmpk;
416 for (
int cnt1=0; cnt1<linsize1; cnt1++)
417 for (
int cnt2=0; cnt2<linsize2; cnt2++)
418 for (
int cnt3=0; cnt3<linsize3; cnt3++)
419 for (
int cnt4=0; cnt4<linsize4; cnt4++)
bool setGroup(const int nGroup)
Set the group.
void setTmat(const int index1, const int index2, const double val)
Set a Tmat element.
int getOrbitalIrrep(const int nOrb) const
Get an orbital irrep number.
double getVmat(const int index1, const int index2, const int index3, const int index4) const
Get a Vmat element.
void setVmat(const int index1, const int index2, const int index3, const int index4, const double val)
Set a Vmat element.
void setEconst(const double val)
Set the constant energy.
void dgemm_(char *transA, char *transB, int *m, int *n, int *k, double *alpha, double *A, int *lda, double *B, int *ldb, double *beta, double *C, int *ldc)
double getTmat(const int index1, const int index2) const
Get a Tmat element.
int getNORB(const int irrep) const
int getNstart(const int irrep) const
static int directProd(const int Irrep1, const int Irrep2)
Get the direct product of the irreps with numbers Irrep1 and Irrep2: a bitwise XOR for Psi4's convent...
int getNGroup() const
Get the group number.
int getL() const
Get the number of orbitals.