testChargeDensity.C 4.39 KB
Newer Older
Francois Gygi committed
1 2
////////////////////////////////////////////////////////////////////////////////
//
Francois Gygi committed
3 4 5 6
// Copyright (c) 2008 The Regents of the University of California
//
// This file is part of Qbox
//
Francois Gygi committed
7 8
// Qbox is distributed under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 2 of
Francois Gygi committed
9 10 11 12 13 14
// the License, or (at your option) any later version.
// See the file COPYING in the root directory of this distribution
// or <http://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////////////
//
Francois Gygi committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
// testChargeDensity.C
//
////////////////////////////////////////////////////////////////////////////////

#include "Context.h"
#include "Wavefunction.h"
#include "ChargeDensity.h"
#include "SlaterDet.h"
#include "FourierTransform.h"
#include "Timer.h"

#include <iostream>
#include <iomanip>
#include <cassert>
using namespace std;

#ifdef USE_MPI
#include <mpi.h>
#endif

int main(int argc, char **argv)
{
#if USE_MPI
  MPI_Init(&argc,&argv);
#endif
  {
41
    // use:
42 43
    // testChargeDensity a0 a1 a2 b0 b1 b2 c0 c1 c2 ecut nel nspin nkp
    assert(argc==14);
Francois Gygi committed
44 45 46 47 48 49 50
    D3vector a(atof(argv[1]),atof(argv[2]),atof(argv[3]));
    D3vector b(atof(argv[4]),atof(argv[5]),atof(argv[6]));
    D3vector c(atof(argv[7]),atof(argv[8]),atof(argv[9]));
    UnitCell cell(a,b,c);
    cout << " volume: " << cell.volume() << endl;
    double ecut = atof(argv[10]);
    int nel = atoi(argv[11]);
51 52
    int nspin = atoi(argv[12]);
    int nkp = atoi(argv[13]);
53

Francois Gygi committed
54
    Timer tm;
55

56
    Context ctxt(MPI_COMM_WORLD);
Francois Gygi committed
57
    Wavefunction wf(ctxt);
58

Francois Gygi committed
59 60 61
    tm.reset(); tm.start();
    wf.resize(cell,cell,ecut);
    tm.stop();
62
    cout << " wf.resize: CPU/Real: "
Francois Gygi committed
63 64 65 66 67
         << tm.cpu() << " / " << tm.real() << endl;

    tm.reset(); tm.start();
    wf.set_nel(nel);
    tm.stop();
68
    cout << " wf.set_nel: CPU/Real: "
Francois Gygi committed
69
         << tm.cpu() << " / " << tm.real() << endl;
70

Francois Gygi committed
71 72 73
    tm.reset(); tm.start();
    wf.set_nspin(nspin);
    tm.stop();
74
    cout << " wf.set_nspin: CPU/Real: "
Francois Gygi committed
75
         << tm.cpu() << " / " << tm.real() << endl;
76

Francois Gygi committed
77 78 79 80
    for ( int ikp = 0; ikp < nkp-1; ikp++ )
    {
      wf.add_kpoint(D3vector((0.5*(ikp+1))/(nkp-1),0,0),1.0);
    }
81

Francois Gygi committed
82 83 84 85
    for ( int ispin = 0; ispin < wf.nspin(); ispin++ )
    {
      for ( int ikp = 0; ikp < wf.nkp(); ikp++ )
      {
86
        if ( wf.sd(ispin,ikp) != 0 && wf.sd(ispin,ikp)->context().active() )
Francois Gygi committed
87 88 89 90 91
        {
        cout << "wf.sd(ispin=" << ispin << ",ikp=" << ikp << "): "
             << wf.sd(ispin,ikp)->c().m() << "x"
             << wf.sd(ispin,ikp)->c().n() << endl;
        cout << ctxt.mype() << ":"
92
             << " sdcontext[" << ispin << "][" << ikp << "]: "
Francois Gygi committed
93 94 95 96 97 98 99 100 101
             << wf.sd(ispin,ikp)->context();
        }
      }
    }

    tm.reset();
    tm.start();
    wf.randomize(0.1);
    tm.stop();
102
    cout << " wf.randomize: CPU/Real: "
Francois Gygi committed
103 104 105 106 107
         << tm.cpu() << " / " << tm.real() << endl;

    tm.reset();
    tm.start();
    wf.gram();
108
    cout << " wf.gram: CPU/Real: "
Francois Gygi committed
109
         << tm.cpu() << " / " << tm.real() << endl;
110

111
    // wf.update_occ();
112

Francois Gygi committed
113 114 115 116 117 118
    // compute charge density in real space
    Timer tmrho;
    tmrho.reset();
    tmrho.start();
    cout << " ChargeDensity::ctor..." << endl;
    ChargeDensity cd(wf);
119

Francois Gygi committed
120
    cout << "done" << endl;
121

Francois Gygi committed
122
    tmrho.stop();
123
    cout << " ChargeDensity::ctor: CPU/Real: "
Francois Gygi committed
124
         << tmrho.cpu() << " / " << tmrho.real() << endl;
125

Francois Gygi committed
126 127 128 129 130
    tmrho.reset();
    tmrho.start();
    cout << " ChargeDensity::update_density..." << endl;
    cd.update_density();
    tmrho.stop();
131
    cout << " ChargeDensity::update_density: CPU/Real: "
Francois Gygi committed
132
         << tmrho.cpu() << " / " << tmrho.real() << endl;
133

Francois Gygi committed
134 135 136 137 138
    // print the first few Fourier coefficients of the charge density
    for ( int ispin = 0; ispin < wf.nspin(); ispin++ )
    {
      for ( int i = 0; i < cd.vbasis()->localsize(); i++ )
      {
139
        cout << ctxt.mype() << ": rho(ispin=" << ispin << ",ig=" << i << " ("
Francois Gygi committed
140 141 142 143 144
        << cd.vbasis()->idx(3*i) << " "
        << cd.vbasis()->idx(3*i+1) << " " << cd.vbasis()->idx(3*i+2) << ") "
        << cd.rhog[ispin][i] << endl;
      }
    }
145

Francois Gygi committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
#if 0
    // integral of rho in r space
    double sum = 0.0;
    for ( int i = 0; i < rho.size(); i++ )
      sum += rho[i];
#if USE_MPI
    double tsum;
    int mycol = sd.context().mycol();
    MPI_Allreduce(&sum,&tsum,1,MPI_DOUBLE,MPI_SUM,sd.context().comm());
    sum = tsum;
#endif
    cout << ctxt.mype() << ": " << " rho: " << sum / ft.np012() << endl;

#endif

  }
#if USE_MPI
  MPI_Finalize();
#endif
}