[CPMD-list] opeigr.F

Juerg Hutter hutter at pci.unizh.ch
Fri Mar 11 17:33:01 CET 2005


Hi
>
> I am reading the codes. The way to calcualte XYZMAT implemented in
> opeigr.F seems not being described in PRB-61-10040. Is there anybody
> can give some hints to understand how opergr.F works?
>
This routine is rather difficult to read because of special code
for special types of machines/machine types and because of
a non-trivial parallelization scheme.
The basics of the routine are rather simple.
Input is a set of orbitals C0(g,i) and an operator (NOP1,NOP2).
The quantity calculated is
             < C0 | exp(ikr) | C0 >
The key is to calculate C2 = exp(ikr) | C0 > efficiently.
This is done using the fact that exp(ikr) shifts g-space
components of a vector along principle axis(x,y,z) by one
unit.
To do this C0(.,i) is mapped from the 1-d storage mode
onto a three-dimensional grid (gx,gy,gz). Then the
operator is applied (OPAPP) and the result is gathered
again in 1-d storage mode. Finally the
matrix elements are calculated as < C0 | C2 >.

Because CPMD uses symmetry (C0 is real) we do the whole
procedure twice and recover once the +g and once the
-g part of C2.

I know this routine is very hard to understand and
I hope my little explaination helps a little.

regards

Juerg Hutter



More information about the CPMD-list mailing list