本文整理汇总了C++中Wavefunction::conjugacy方法的典型用法代码示例。如果您正苦于以下问题:C++ Wavefunction::conjugacy方法的具体用法?C++ Wavefunction::conjugacy怎么用?C++ Wavefunction::conjugacy使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Wavefunction
的用法示例。
在下文中一共展示了Wavefunction::conjugacy方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
void SpinAdapted::operatorfunctions::braTensorMultiply(const SpinBlock *ablock, const Baseoperator<Matrix>& a, const SpinBlock *cblock, Wavefunction& c, Wavefunction& v, double scale, int num_thrds)
{
//It get a result of <\Psi|O.
//It is similar to Transposeview(O)|\Psi>
//However, spin coupling coefficients is different for transpose.
//It is convenient for npdm with intermediate.
const int leftBraOpSz = cblock->get_leftBlock()->get_braStateInfo().quanta.size ();
const int leftKetOpSz = cblock->get_leftBlock()->get_ketStateInfo().quanta.size ();
const int rightBraOpSz = cblock->get_rightBlock()->get_braStateInfo().quanta.size ();
const int rightKetOpSz = cblock->get_rightBlock()->get_ketStateInfo().quanta.size ();
const StateInfo* lbraS = cblock->get_braStateInfo().leftStateInfo, *lketS = cblock->get_ketStateInfo().leftStateInfo;
const StateInfo* rbraS = cblock->get_braStateInfo().rightStateInfo, *rketS = cblock->get_ketStateInfo().rightStateInfo;
assert (cblock->get_leftBlock() == ablock || cblock->get_rightBlock() == ablock);
if (cblock->get_leftBlock() == ablock)
{
//#pragma omp parallel default(shared) num_threads(num_thrds)
{
//#pragma omp for schedule(dynamic)
for (int lQ = 0; lQ < leftKetOpSz; ++lQ) {
for (int lQPrime = 0; lQPrime < leftBraOpSz; ++lQPrime)
{
if (a.allowed(lQPrime, lQ))
{
const Matrix& aop = a.operator_element(lQPrime, lQ);
for (int rQ = 0; rQ < rightBraOpSz; ++rQ)
if (c.allowed(lQPrime, rQ) && v.allowed(lQ, rQ))
{
double fac=scale;
fac *= dmrginp.get_ninej()(lbraS->quanta[lQPrime].get_s().getirrep(), rbraS->quanta[rQ].get_s().getirrep() , c.get_deltaQuantum(0).get_s().getirrep(),
(-a.get_spin()).getirrep(), 0, (-a.get_spin()).getirrep(),
lketS->quanta[lQ].get_s().getirrep(), rbraS->quanta[rQ].get_s().getirrep() , v.get_deltaQuantum(0).get_s().getirrep());
fac *= Symmetry::spatial_ninej(lbraS->quanta[lQPrime].get_symm().getirrep() , rbraS->quanta[rQ].get_symm().getirrep(), c.get_symm().getirrep(),
(-a.get_symm()).getirrep(), 0, (-a.get_symm()).getirrep(),
lketS->quanta[lQ].get_symm().getirrep() , rbraS->quanta[rQ].get_symm().getirrep(), v.get_symm().getirrep());
fac *= a.get_scaling(lbraS->quanta[lQPrime], lketS->quanta[lQ]);
MatrixMultiply (aop, TransposeOf(a.conjugacy()), c.operator_element(lQPrime, rQ), c.conjugacy(),
v.operator_element(lQ, rQ), fac);
}
}
}
}
}
}
else
{
//#pragma omp parallel default(shared) num_threads(num_thrds)
{
//#pragma omp for schedule(dynamic)
for (int rQ = 0; rQ < rightKetOpSz; ++rQ) {
for (int rQPrime = 0; rQPrime < rightBraOpSz; ++rQPrime)
if (a.allowed(rQPrime, rQ))
{
const Matrix& aop = a.operator_element(rQ, rQPrime);
for (int lQPrime = 0; lQPrime < leftBraOpSz; ++lQPrime)
if (v.allowed(lQPrime, rQ) && c.allowed(lQPrime, rQPrime)) {
double fac = scale;
fac *= dmrginp.get_ninej()(lbraS->quanta[lQPrime].get_s().getirrep(), rbraS->quanta[rQPrime].get_s().getirrep() , c.get_deltaQuantum(0).get_s().getirrep(),
0, (-a.get_spin()).getirrep(), (-a.get_spin()).getirrep(),
lbraS->quanta[lQPrime].get_s().getirrep(), rketS->quanta[rQ].get_s().getirrep() , v.get_deltaQuantum(0).get_s().getirrep());
fac *= Symmetry::spatial_ninej(lbraS->quanta[lQPrime].get_symm().getirrep() , rbraS->quanta[rQPrime].get_symm().getirrep(), c.get_symm().getirrep(),
0, (-a.get_symm()).getirrep(), (-a.get_symm()).getirrep(),
lbraS->quanta[lQPrime].get_symm().getirrep() , rketS->quanta[rQ].get_symm().getirrep(), v.get_symm().getirrep());
fac *= a.get_scaling(rbraS->quanta[rQPrime], rketS->quanta[rQ]);
double parity = a.get_fermion() && IsFermion(lbraS->quanta[lQPrime]) ? -1 : 1;
MatrixMultiply (c.operator_element(lQPrime, rQPrime), c.conjugacy(),
aop, a.conjugacy(), v.operator_element(lQPrime, rQ), fac*parity);
}
}
}
}
}
}
示例2: MatrixMultiply
void SpinAdapted::operatorfunctions::TensorMultiply(const Baseoperator<Matrix>& a, const StateInfo *brastateinfo, const StateInfo *ketstateinfo, const Wavefunction& c, Wavefunction& v, const SpinQuantum dQ, bool left, double scale, int num_thrds)
{
//Calculate O_{l or r} |\Psi> without building big block.
const StateInfo* lbraS = brastateinfo->leftStateInfo, *lketS = ketstateinfo->leftStateInfo;
const StateInfo* rbraS = brastateinfo->rightStateInfo, *rketS = ketstateinfo->rightStateInfo;
const int leftBraOpSz = brastateinfo->leftStateInfo->quanta.size ();
const int leftKetOpSz = ketstateinfo->leftStateInfo->quanta.size ();
const int rightBraOpSz = brastateinfo->rightStateInfo->quanta.size ();
const int rightKetOpSz = ketstateinfo->rightStateInfo->quanta.size ();
if (left)
{
//#pragma omp parallel default(shared) num_threads(num_thrds)
{
//#pragma omp for schedule(dynamic)
for (int lQ = 0; lQ < leftBraOpSz; ++lQ) {
for (int lQPrime = 0; lQPrime < leftKetOpSz; ++lQPrime)
{
if (a.allowed(lQ, lQPrime))
{
const Matrix& aop = a.operator_element(lQ, lQPrime);
for (int rQ = 0; rQ < rightKetOpSz; ++rQ)
if (c.allowed(lQPrime, rQ) && v.allowed(lQ, rQ))
{
double fac=scale;
fac *= dmrginp.get_ninej()(lketS->quanta[lQPrime].get_s().getirrep(), rketS->quanta[rQ].get_s().getirrep() , c.get_deltaQuantum(0).get_s().getirrep(),
a.get_spin().getirrep(), 0, a.get_spin().getirrep(),
lbraS->quanta[lQ].get_s().getirrep(), rbraS->quanta[rQ].get_s().getirrep() , v.get_deltaQuantum(0).get_s().getirrep());
fac *= Symmetry::spatial_ninej(lketS->quanta[lQPrime].get_symm().getirrep() , rketS->quanta[rQ].get_symm().getirrep(), c.get_symm().getirrep(),
a.get_symm().getirrep(), 0, a.get_symm().getirrep(),
lbraS->quanta[lQ].get_symm().getirrep() , rbraS->quanta[rQ].get_symm().getirrep(), v.get_symm().getirrep());
fac *= a.get_scaling(lbraS->quanta[lQ], lketS->quanta[lQPrime]);
MatrixMultiply (aop, a.conjugacy(), c.operator_element(lQPrime, rQ), c.conjugacy(),
v.operator_element(lQ, rQ), fac);
}
}
}
}
}
}
else
{
//#pragma omp parallel default(shared) num_threads(num_thrds)
{
//#pragma omp for schedule(dynamic)
for (int rQ = 0; rQ < rightBraOpSz; ++rQ) {
for (int rQPrime = 0; rQPrime < rightKetOpSz; ++rQPrime)
if (a.allowed(rQ, rQPrime))
{
const Matrix& aop = a.operator_element(rQ, rQPrime);
for (int lQPrime = 0; lQPrime < leftKetOpSz; ++lQPrime)
if (v.allowed(lQPrime, rQ) && c.allowed(lQPrime, rQPrime)) {
double fac = scale;
fac *= dmrginp.get_ninej()(lketS->quanta[lQPrime].get_s().getirrep(), rketS->quanta[rQPrime].get_s().getirrep() , c.get_deltaQuantum(0).get_s().getirrep(),
0, a.get_spin().getirrep(), a.get_spin().getirrep(),
lbraS->quanta[lQPrime].get_s().getirrep(), rbraS->quanta[rQ].get_s().getirrep() , v.get_deltaQuantum(0).get_s().getirrep());
fac *= Symmetry::spatial_ninej(lketS->quanta[lQPrime].get_symm().getirrep() , rketS->quanta[rQPrime].get_symm().getirrep(), c.get_symm().getirrep(),
0, a.get_symm().getirrep(), a.get_symm().getirrep(),
lbraS->quanta[lQPrime].get_symm().getirrep() , rbraS->quanta[rQ].get_symm().getirrep(), v.get_symm().getirrep());
fac *= a.get_scaling(rbraS->quanta[rQ], rketS->quanta[rQPrime]);
double parity = a.get_fermion() && IsFermion(lketS->quanta[lQPrime]) ? -1 : 1;
MatrixMultiply (c.operator_element(lQPrime, rQPrime), c.conjugacy(),
aop, TransposeOf(a.conjugacy()), v.operator_element(lQPrime, rQ), fac*parity);
}
}
}
}
}
}