1 | #ifndef pseudo_h
|
---|
2 | #define pseudo_h
|
---|
3 |
|
---|
4 | /** \file pseudo.h
|
---|
5 | * Header file for \ref pseudo.c
|
---|
6 | *
|
---|
7 | * Contains declarations of the functions implemented in \ref pseudo.c and
|
---|
8 | * the PseudoPot'ential structure.
|
---|
9 | *
|
---|
10 | Project: ParallelCarParrinello
|
---|
11 | Jan Hamaekers
|
---|
12 | 2000
|
---|
13 |
|
---|
14 | File: pseudo.h
|
---|
15 | $Id: pseudo.h,v 1.19 2007/02/05 16:04:23 foo Exp $
|
---|
16 | */
|
---|
17 |
|
---|
18 |
|
---|
19 | // use double precision fft when we have it
|
---|
20 | #ifdef HAVE_CONFIG_H
|
---|
21 | #include <config.h>
|
---|
22 | #endif
|
---|
23 |
|
---|
24 | #ifdef HAVE_DFFTW_H
|
---|
25 | #include "dfftw.h"
|
---|
26 | #else
|
---|
27 | #include "fftw.h"
|
---|
28 | #endif
|
---|
29 |
|
---|
30 | struct Problem;
|
---|
31 |
|
---|
32 | /** Pseudopotential structure.
|
---|
33 | * Contains paramaters, form factors, positions of the for the plane waves
|
---|
34 | * needed Pseudopotentials which merge fixed core electron with the core itself.
|
---|
35 | */
|
---|
36 | struct PseudoPot {
|
---|
37 | double *zval;
|
---|
38 | int *nang;
|
---|
39 | /* Potential Parameters */
|
---|
40 | double **r; //!< radial mesh for ion type
|
---|
41 | double ***v; //!< Potential
|
---|
42 | double ***R; //!< Radial density \f$R_{I_s,l} (r)\f$
|
---|
43 | double ***v_loc; //!< Pseudo potentials \f$\nu^{ps}_{I_s} \f$, read from file in InitPseudoRead()
|
---|
44 | double *clog; //!< Integration width in Simpson formula, see Simps()
|
---|
45 | int *mmax; //!< array of number of mesh points (array size of \a **r and others) over ion type
|
---|
46 | /* Gaussian */
|
---|
47 | double **core;
|
---|
48 | double **rc;
|
---|
49 | double ***rcl;
|
---|
50 | double ***al;
|
---|
51 | double ***bl;
|
---|
52 | double **FacGauss; //!< Gaussian form factor \f$\phi_{I_s}^{Gauss} (G)\f$
|
---|
53 | /* formfacLocPot */
|
---|
54 | int Mmax; //!< maximum number of mesh points of all ion types
|
---|
55 | double **integrand2; //!< temporary array containing integrand in evaluating form factor **vpsloc
|
---|
56 | double *integrand; //!< temporary array containing integrand in evaluating form factor **vpsloc
|
---|
57 | double *integrand1; //!< temporary array containing partial integrand in evaluating form factor **vpsloc
|
---|
58 | double ***phi_ps_nl; //!< non-local pseudopotential form factor for certain ion type, l and m (2l+1 ones per l!) value \f$\phi^{ps,nl}_{I_s,l,m}\f$, \sa FormFacNonLocPot()
|
---|
59 | //double ***phi_ps_nl_a; //!< sort of backup array for PseudoPot::pkg
|
---|
60 | double **phi_ps_loc; //!< local pseudo potential form factor for certain ion type on reciprocal mesh \f$\phi^{ps,loc}_{I_s}\f$, \sa FormFacLocPot()
|
---|
61 | double **wNonLoc; //!< non-local pseudopotential weight \f$w^{nl}_{I_s,l}\f$, \sa FormFacNonLocPot()
|
---|
62 | fftw_complex ****fnl; //!< factors of non-local pseudopotential energy, array containing \f$f^{nl}_{i,I_s,I_a,l,m}\f$ for a certain wave function i, ion of type, ion of type \f$I_s \f$and lm value, \sa CalculateNonLocalEnergyNoRT()
|
---|
63 | fftw_complex ***CDfnl; //!< factors of non-local pseudopotential energy for conjugate direction (CD), array for a certain ion type, ion of type and lm value
|
---|
64 | fftw_complex *dfnl; //!< temporary array containing part (of one process) of non-local factors \f$f^{nl}_{i,I_s,I_a,l,m}\f$ for a certain ion of type, , \sa CalculateNonLocalEnergyNoRT()
|
---|
65 | fftw_complex *VCoulombc; //!< Coulomb or Hartree potential and local pseudopotenial \f$\frac{4\pi}{V|G|^2} |\hat{\widetilde{n}}(G)|^2 + \sum_{I_s} S_{I_s} (G) \phi^{ps,loc}_{I_s} (G) \hat{n}^\ast (G)\f$
|
---|
66 | fftw_complex ***ei; //!< topmost (zeroth) level: \f$\exp(i R_{I_s,I_a}\cdot G)\f$, three-dimensional array over ion type, ion of type and grid vector in LatticeLevel::GArray
|
---|
67 | fftw_complex ***expiGR; //!< standard level: \f$\exp(i(G \cdot R))\f$ for each ion type, ion of type and grid vector, \sa CalcExpiGR()
|
---|
68 | int *lm_end; //!< array of over ion type \f$I_S\f$ containing its topmost m eigenvalue
|
---|
69 | int lm_endmax; //!< maximum m eigenvalue of all ion types
|
---|
70 | double *rr;
|
---|
71 | fftw_complex *t;
|
---|
72 | struct Plans *P;
|
---|
73 | double fac1sqrt2PI; //!< factor: \f$\frac{1}{\sqrt{2\pi}}\f$
|
---|
74 | double fac1sqrtPI; //!< factor: \f$\frac{1}{\sqrt{\pi}}\f$
|
---|
75 | double **corewave;
|
---|
76 | double **formfCore; //!< partial core form factor, \f$\phi^{pc}_{I_s}(G)\f$
|
---|
77 | enum CoreCorrType corecorr;
|
---|
78 | };
|
---|
79 |
|
---|
80 |
|
---|
81 | void InitPseudoRead(struct Problem *P, char *mainname);
|
---|
82 | void ChangePseudoToLevUp(struct Problem *P);
|
---|
83 | void UpdatePseudoToNewWaves(struct Problem *P);
|
---|
84 | void RemovePseudoRead(struct Problem *P);
|
---|
85 | void CalculateNonLocalEnergyNoRT(struct Problem *P, const int i);
|
---|
86 | void CalculateNonLocalEnergyUseRT(struct Problem *P, const int i);
|
---|
87 |
|
---|
88 | void CalculateGaussSelfEnergyNoRT(struct Problem *P, struct PseudoPot *PP, struct Ions *I);
|
---|
89 | void CalculateSomeEnergyAndHGNoRT(struct Problem *P);
|
---|
90 |
|
---|
91 | void CalculateAddNLPot(struct Problem *P, fftw_complex *HNL, fftw_complex ***fnl, double PsiFactor);
|
---|
92 | void CalculateCDfnl(struct Problem *P, fftw_complex *ConDir, fftw_complex ***CDfnl);
|
---|
93 | void CalculateIonLocalForce(struct Problem *P);
|
---|
94 | void CalculateIonNonLocalForce(struct Problem *P);
|
---|
95 | #endif
|
---|