示例#1
0
/*!

*/
void Wannier_method::run(Program_options & options, ostream & output) {
    int ngroups=orbital_groups.GetDim(0);

    int ntotorbs=0;
    for(int i=0; i< ngroups; i++) {
        ntotorbs+=orbital_groups(i).GetDim(0);
    }
    Array1 <int> allorbs(ntotorbs);


    int count=0;
    for(int i=0; i< ngroups; i++) {
        for(int j=0; j< orbital_groups(i).GetDim(0); j++) {
            allorbs(count++)=orbital_groups(i)(j);
        }
    }

    /*
    Array2 <doublevar> rtmp(allorbs.GetDim(0),allorbs.GetDim(0));
    rtmp=0.0;
    for(int i=0; i< allorbs.GetDim(0); i++) {
      rtmp(i,i)=1.0;
    }

    ofstream test("test.orb");
    mymomat->writeorb(test, rtmp,allorbs);
    test.close();

    return;
    */

    Array3 <dcomplex> eikr;
    Array2 <doublevar> phi2phi2;
    cout << "calc overlap " << endl;
    Array1 <Array2 <doublevar> > R(ngroups);

    for(int i=0; i< ngroups; i++) {
        calculate_overlap(orbital_groups(i),eikr,phi2phi2);
        optimize_rotation(eikr,R(i));
    }

    //int nmo_tot=mymomat->getNmo();
    //Array2 <doublevar> Rtot(nmo_tot,nmo_tot);
    //Rtot=0.0;
    //for(int i=0; i< nmo_tot; i++) Rtot(i,i)=1.0;

    Array2 <doublevar> Rtot(ntotorbs,ntotorbs);
    Rtot=0.0;

    count=0;
    for(int i=0; i< ngroups; i++) {
        int norb=orbital_groups(i).GetDim(0);
        for(int j=0; j < norb; j++) {
            for(int k=0; k< norb; k++) {
                Rtot(count+j,count+k)=R(i)(j,k);
            }
        }

        count+=norb;
    }



    ofstream testorb(out_orbs.c_str());
    mymomat->writeorb(testorb, Rtot,allorbs);
    testorb.close();



}
示例#2
0
void Node::optimize_rotations_all_frames() {
	for (unsigned int i = 0; i < quat_arr.size(); i++) {
		optimize_rotation(i);
	}
}