本文整理汇总了C++中Wavefunction::Randomise方法的典型用法代码示例。如果您正苦于以下问题:C++ Wavefunction::Randomise方法的具体用法?C++ Wavefunction::Randomise怎么用?C++ Wavefunction::Randomise使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Wavefunction
的用法示例。
在下文中一共展示了Wavefunction::Randomise方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: setbuf
double SpinAdapted::Linear::MinResMethod(Wavefunction& xi, double normtol, Davidson_functor& h_multiply, std::vector<Wavefunction>& lowerStates)
{
setbuf(stdout, NULL);
p3out.precision (12);
int iter = 0, maxIter = 100;
double levelshift = 0.0, overlap2 = 0.0, oldError=0.0, functional=0.0, Error=0.0;
Wavefunction& targetState = lowerStates[0];
if (mpigetrank() == 0) {
makeOrthogonalToLowerStates(targetState, lowerStates);
makeOrthogonalToLowerStates(xi, lowerStates);
}
#ifndef SERIAL
mpi::communicator world;
mpi::broadcast(world, xi, 0);
#endif
Wavefunction pi, ri;
ri=xi; ri.Clear();
h_multiply(xi, ri);
//Check if we should even perform CG or just exit with a zero vector.
bool doCG = true;
if (mpigetrank() == 0) {
Wavefunction ricopy = ri; ricopy.Clear(); ricopy.Randomise();
Wavefunction ricopy2 = ricopy;
makeOrthogonalToLowerStates(ricopy2, lowerStates);
if (abs(DotProduct(ricopy2, targetState)) < NUMERICAL_ZERO) {
pout << "The problem is ill posed or the initial guess is very bad "<<DotProduct(ricopy, targetState)<<endl;
doCG = false;
}
}
#ifndef SERIAL
mpi::broadcast(world, doCG, 0);
#endif
if (!doCG) {
xi.Clear();
int success = 0;
functional = 0.0;
return functional;
}
if (mpigetrank() == 0) {
ScaleAdd(-1.0, targetState, ri);
Scale(-1.0, ri);
makeOrthogonalToLowerStates(ri, lowerStates);
pi = ri;
oldError = DotProduct(ri, ri);
printf("\t\t\t %15s %15s %15s\n", "iter", "Functional", "Error");
}
#ifndef SERIAL
mpi::broadcast(world, oldError, 0);
#endif
if (oldError < normtol) {
if (mpigetrank() == 0) {
functional = -DotProduct(xi, ri) - DotProduct(xi, targetState);
printf("\t\t\t %15i %15.8e %15.8e\n", 0, functional, oldError);
}
#ifndef SERIAL
mpi::broadcast(world, functional, 0);
#endif
return functional;
}
#ifndef SERIAL
mpi::broadcast(world, ri, 0);
#endif
double betaNumerator = 0, betaDenominator = 0;
Wavefunction Hr = ri; Hr.Clear();
h_multiply(ri, Hr);
betaDenominator = DotProduct(ri, Hr);
Wavefunction Hp = Hr;
if (mpigetrank() == 0) {
makeOrthogonalToLowerStates(Hp, lowerStates);
makeOrthogonalToLowerStates(Hr, lowerStates);
}
while(true) {
if (mpigetrank() == 0) {
double alpha = DotProduct(ri, Hr)/DotProduct(Hp, Hp);
ScaleAdd(alpha, pi, xi);
ScaleAdd(-alpha, Hp, ri);
Error = DotProduct(ri, ri);
functional = -DotProduct(xi, targetState);
//.........这里部分代码省略.........