| [a0bcf1] | 1 | #ifndef data_h | 
|---|
|  | 2 | #define data_h | 
|---|
|  | 3 |  | 
|---|
|  | 4 | /** \file data.h | 
|---|
|  | 5 | * Defines most of the important data structures. | 
|---|
|  | 6 | * Such as structures containing command line options CallOptions, densities Density, energies Energy, | 
|---|
|  | 7 | * lattice information Lattice and levelwise LatticeLevel, for all wave functions Psis downto one Psi | 
|---|
|  | 8 | * OnePsiElement and OnePsiElementAddData, wave functions on the lattice level LevelPsi, the reciprocal | 
|---|
|  | 9 | * grid vector OneGData, filenames and paths FileData oder super structures containing the whole Problem | 
|---|
|  | 10 | * or data for the parallelisation ParallelSimulationData and the fft plans RPlans. | 
|---|
|  | 11 | * | 
|---|
|  | 12 | Project: ParallelCarParrinello | 
|---|
|  | 13 | Jan Hamaekers | 
|---|
|  | 14 | 2000 | 
|---|
|  | 15 |  | 
|---|
|  | 16 | File: data.h | 
|---|
|  | 17 | $Id: data.h,v 1.102 2007-02-09 09:13:48 foo Exp $ | 
|---|
|  | 18 | */ | 
|---|
|  | 19 | #include "mpi.h" | 
|---|
|  | 20 |  | 
|---|
|  | 21 | // use double precision fft when we have it | 
|---|
|  | 22 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 23 | #include <config.h> | 
|---|
|  | 24 | #endif | 
|---|
|  | 25 |  | 
|---|
|  | 26 | #ifdef HAVE_DFFTW_H | 
|---|
|  | 27 | #include "dfftw.h" | 
|---|
|  | 28 | #else | 
|---|
|  | 29 | #include "fftw.h" | 
|---|
|  | 30 | #endif | 
|---|
|  | 31 |  | 
|---|
|  | 32 | #include "defs.h" | 
|---|
|  | 33 | #include <signal.h> | 
|---|
|  | 34 | /*extern volatile sig_atomic_t cpulim;*/ | 
|---|
|  | 35 | #define PROCDIM (2)                     //!< specifying the number in \ref ParallelDivideDims | 
|---|
|  | 36 | #define MaxOutGroup 7           //!< specifying the number in \ref OutGroup | 
|---|
|  | 37 | //! various verbose output groups, individually associable with levels (LeaderOut = process 0,...) | 
|---|
|  | 38 | enum OutGroup { MinOut,         //!< minimum output | 
|---|
|  | 39 | NormalOut,      //!< normal output | 
|---|
|  | 40 | ValueOut,       //!< output of calculated value | 
|---|
|  | 41 | LeaderOut,      //!< output of process 0 | 
|---|
|  | 42 | ReadOut,        //!< output of parsed values | 
|---|
|  | 43 | PsiOut,         //!< output of Psi-related numbers | 
|---|
|  | 44 | StepLeaderOut   //!< output of minimsation step and NIDensity | 
|---|
|  | 45 | }; | 
|---|
|  | 46 | //! enumerating output verbosity levels | 
|---|
|  | 47 | enum OutType { OutNone,     //!< no -v specified (no output) | 
|---|
|  | 48 | OutNormal,   //!< -v (status information, minimum output, some calculate values) | 
|---|
|  | 49 | OutNormalP,  //!< -vv (status information, minimum output, more calculated values) | 
|---|
|  | 50 | OutMore,     //!< -vvv (steady output while minimising) | 
|---|
|  | 51 | OutMoreP,    //!< -vvvv (all processes) | 
|---|
|  | 52 | OutAll,      //!< not used | 
|---|
|  | 53 | OutAllP      //!< not used | 
|---|
|  | 54 | }; | 
|---|
|  | 55 | //! enumerating usage status | 
|---|
|  | 56 | enum UseType { NotInUse,  //!< is not in use | 
|---|
|  | 57 | InUse      //!< is in use | 
|---|
|  | 58 | }; | 
|---|
|  | 59 | //! enumerating the two groups in parallel divide&conquer strategy | 
|---|
|  | 60 | enum ParallelDivideDims { PEGamma, //!< process in Psi group among coefficients are shared | 
|---|
|  | 61 | PEPsi    //!< process groups among wave functions are shared | 
|---|
|  | 62 | }; | 
|---|
|  | 63 | //! enumerating RiemannTensor usage | 
|---|
|  | 64 | enum UseRiemannTensor { UseNotRT,   //!< don't use RiemannTensor calculus | 
|---|
|  | 65 | UseRT       //!< use RiemannTensor calculus | 
|---|
|  | 66 | }; | 
|---|
|  | 67 | //! enumerating how to deal with spin | 
|---|
|  | 68 | enum UseSpinType { UseSpinDouble,   //!< Spin is always double in each orbit (occupation number is 2) | 
|---|
|  | 69 | UseSpinUpDown    //!< Treat each orbit differently for its SpinType#SpinUp and SpinType#SpinDown part | 
|---|
|  | 70 | }; | 
|---|
|  | 71 | //! SpinType is separated Up and Down or combined Double | 
|---|
|  | 72 | enum SpinType { SpinDouble,   //!< Type is double, orbits always fully occupied | 
|---|
|  | 73 | SpinUp,       //!< Type of orbit spin is up | 
|---|
|  | 74 | SpinDown      //!< Type of orbit spin is down | 
|---|
|  | 75 | }; /*!< Double == 0 !!! */ | 
|---|
|  | 76 | #define MaxDensityTypes 22 //!< number of different densities | 
|---|
|  | 77 | #define MaxInitDensityTypes 13 //!< cardinal number of density up to which all before need to be reseted in InitDensityCalculation() | 
|---|
|  | 78 | //! enumerating the various density types | 
|---|
|  | 79 | enum DensityTypes { ActualDensity,      //!< current density (in calculation) | 
|---|
|  | 80 | TotalDensity,       //!< total density over all processes | 
|---|
|  | 81 | TotalLocalDensity,  //!< total density stored in this process | 
|---|
|  | 82 | TotalUpDensity,     //!< total density with spin up over all processes | 
|---|
|  | 83 | TotalDownDensity,   //!< total density with spin down over all processes | 
|---|
|  | 84 | CoreWaveDensity,    //!< density of the wave functions in the core range, see PseudoPot | 
|---|
|  | 85 | HGcDensity,         //!< sum of gaussian and local PseudoPot'ential density | 
|---|
|  | 86 | GapDensity,         //!< density of the all "unoccupied" additional wave functions | 
|---|
|  | 87 | GapUpDensity,       //!< density of the all "unoccupied" additional wave functions | 
|---|
|  | 88 | GapDownDensity,     //!< density of the all "unoccupied" additional wave functions | 
|---|
|  | 89 | GapLocalDensity,    //!< density of the "unoccupied" additional wave functions stored in this process | 
|---|
|  | 90 | TempDensity,        //!< temporal working array, used mostly in fft transforms | 
|---|
|  | 91 | Temp2Density,        //!< another temporal working array | 
|---|
|  | 92 | CurrentDensity0,     //!< current density[0][0] = d/dB_0 current[0] | 
|---|
|  | 93 | CurrentDensity1,     //!< current density[1][0] = d/dB_0 current[1] | 
|---|
|  | 94 | CurrentDensity2,     //!< current density[2][0] = d/dB_0 current[2] | 
|---|
|  | 95 | CurrentDensity3,     //!< current density[0][1] = d/dB_1 current[0] | 
|---|
|  | 96 | CurrentDensity4,     //!< current density[1][1] = d/dB_1 current[1] | 
|---|
|  | 97 | CurrentDensity5,     //!< current density[2][1] = d/dB_1 current[2] | 
|---|
|  | 98 | CurrentDensity6,     //!< current density[0][2] = d/dB_2 current[0] | 
|---|
|  | 99 | CurrentDensity7,     //!< current density[1][2] = d/dB_2 current[1] | 
|---|
|  | 100 | CurrentDensity8      //!< current density[2][2] = d/dB_2 current[2] | 
|---|
|  | 101 | }; | 
|---|
|  | 102 | /*! enumerating density types which differ for DensityArray and DensityCArray, as follows: | 
|---|
|  | 103 | CoreWave   only DensityArray (real) | 
|---|
|  | 104 | ActualPsiDensity only DensityCArray (complex) | 
|---|
|  | 105 | HGcDensity       only DensityArray (real) | 
|---|
|  | 106 | HGDensity  only DensityCArray (complex) | 
|---|
|  | 107 | */ | 
|---|
|  | 108 |  | 
|---|
|  | 109 | enum DoubleDensityTypes { HGDensity=HGcDensity,             //!< the local potential \f$V^H (G) + V^{ps,loc} (G)\f$ | 
|---|
|  | 110 | ActualPsiDensity=CoreWaveDensity  //!< the local psi coefficients | 
|---|
|  | 111 | }; | 
|---|
|  | 112 | #define MaxPsiNoType 7  //!< maximum number of different wave function types | 
|---|
|  | 113 | //! enumerating Psi numbering type | 
|---|
|  | 114 | enum PsiNoType { PsiMaxNo,        //!< maximum number of wave functions | 
|---|
|  | 115 | PsiMaxNoDouble,  //!< maximum number of wave functions in SpinType#SpinDouble case | 
|---|
|  | 116 | PsiMaxNoUp,      //!< maximum number of wave functions with spin up | 
|---|
|  | 117 | PsiMaxNoDown,    //!< maximum number of wave functions with spin down | 
|---|
|  | 118 | PsiMaxAdd       //!< number of additional (unoccupied) wave functions helpful in improving the minimisation | 
|---|
|  | 119 | }; | 
|---|
|  | 120 | //! Enumerating different G vector types, due to the gamma point symmetry! (mirroring of Gs) | 
|---|
|  | 121 | enum DoubleGType { DoubleGNot,    //!< not a reciprocal grid vector on (z=0)-plane (no symmetry can be utilized) | 
|---|
|  | 122 | DoubleG0,      //!< is the (0,0,0) reciprocal grid vector | 
|---|
|  | 123 | DoubleGUse,    //!< reciprocal grid vector which resides on the (z=0)-plane in the first and third sector and thus has symmetry \f$c_{i,G}^\ast = -c_{i,-G}\f$ | 
|---|
|  | 124 | DoubleGNotUse  //!< reciprocal grid vector which resides on the (z=0)-plane in the second and fourth sector | 
|---|
|  | 125 | }; | 
|---|
|  | 126 | //! Enumerating states of the current GramSchmidt-Orthonormalization of a wave function | 
|---|
|  | 127 | enum PsiGramSchStatusType { NotOrthogonal,  //!< is not yet orthogonalized | 
|---|
|  | 128 | IsOrthogonal,   //!< is orthohonal yet not normalized | 
|---|
|  | 129 | IsOrthonormal,  //!< is orthonormal | 
|---|
|  | 130 | NotUsedToOrtho  //!< not touched during GramSch() | 
|---|
|  | 131 | }; | 
|---|
|  | 132 | //! Enumerating what remains to do for this wave function | 
|---|
|  | 133 | enum PsiGramSchToDoType { Orthonormalize,  //!< must still be orthogonalized and normalized | 
|---|
|  | 134 | Orthogonalize    //!< must still be normalized | 
|---|
|  | 135 | }; | 
|---|
|  | 136 |  | 
|---|
|  | 137 | //! Enumerating the ToDo status for this wave function | 
|---|
|  | 138 | enum MinimisationStatusType { Minimalise,           //!< wave function ought to be minimalized | 
|---|
|  | 139 | DoNotMinimalise,       //!< wave function is used to evaluate however not itself minimised | 
|---|
|  | 140 | NotUsedToMinimalise   //!< ignore this wave function completely during minimisation | 
|---|
|  | 141 | }; | 
|---|
|  | 142 |  | 
|---|
|  | 143 |  | 
|---|
|  | 144 | #define perturbations 6 | 
|---|
|  | 145 |  | 
|---|
|  | 146 | //! Enumerating the Type of this wave function | 
|---|
|  | 147 | enum PsiTypeTag { Occupied,     //!< normal occupied wave function | 
|---|
|  | 148 | UnOccupied,    //!< additional unoccupied wave function foor gap energy | 
|---|
|  | 149 | Perturbed_P0,    //!< perturbed wave function \f$|\varphi^{(p_0)}\rangle\f$ used to evaluate current density | 
|---|
|  | 150 | Perturbed_P1,    //!< perturbed wave function \f$|\varphi^{(p_1)}\rangle\f$ used to evaluate current density | 
|---|
|  | 151 | Perturbed_P2,    //!< perturbed wave function \f$|\varphi^{(p_2)}\rangle\f$ used to evaluate current density | 
|---|
|  | 152 | Perturbed_RxP0,  //!< perturbed wave function \f$|\varphi^{(r\times p)_0}\rangle\f$ used to evaluate current density | 
|---|
|  | 153 | Perturbed_RxP1,  //!< perturbed wave function \f$|\varphi^{(r\times p)_1}\rangle\f$ used to evaluate current density | 
|---|
|  | 154 | Perturbed_RxP2,  //!< perturbed wave function \f$|\varphi^{(r\times p)_2}\rangle\f$ used to evaluate current density | 
|---|
|  | 155 | Extra        //!< extra wave function (used for gradient calculation) | 
|---|
|  | 156 | }; | 
|---|
|  | 157 |  | 
|---|
|  | 158 | //! Enumerating whether this is active or not (such as motion of ions, use of RiemannTensor, ...) | 
|---|
|  | 159 | enum ModeType { inactive,   //!< generally deactivated | 
|---|
|  | 160 | active,     //!< activated | 
|---|
|  | 161 | standby     //!< temporarily deactivated | 
|---|
|  | 162 | }; | 
|---|
|  | 163 | /* MPI Tags */ | 
|---|
|  | 164 | #define GramSchTag1 100   //!< Message consists of wave function coefficients needed during the Orthogonalization in GramSch() | 
|---|
|  | 165 | #define GramSchTag2 101   //!< Message consists of orthogonal projections calculated during the Orthogonalization in GramSch() | 
|---|
|  | 166 | #define GramSchTag3 102   //!< Message consists of wave function coefficients during Testing in TestGramSch() | 
|---|
|  | 167 | #define InterTag1 110 | 
|---|
|  | 168 | #define DensityTag1 120   //!< Message on exchange of complex TotalUpDensity, see InitDensityCalculation() | 
|---|
|  | 169 | #define DensityTag2 121   //!< Message on exchange of complex TotalDownDensity, see InitDensityCalculation() | 
|---|
|  | 170 | #define DensityTag3 122   //!< Message on exchange of TotalUpDensity, see InitDensityCalculation() | 
|---|
|  | 171 | #define DensityTag4 123   //!< Message on exchange of TotalDownDensity, see InitDensityCalculation() | 
|---|
|  | 172 | #define DensityTag5 124   //!< Message on exchange of NIUpDensity, see InitDensityCalculation() | 
|---|
|  | 173 | #define DensityTag6 125   //!< Message on exchange of NIDownDensity, see InitDensityCalculation() | 
|---|
|  | 174 | #define DensityTag7 126   //!< Message on exchange of complex GapUpDensity, see InitDensityCalculation() | 
|---|
|  | 175 | #define DensityTag8 127   //!< Message on exchange of complex GapDownDensity, see InitDensityCalculation() | 
|---|
|  | 176 | #define DensityTag9 128   //!< Message on exchange of GapUpDensity, see InitDensityCalculation() | 
|---|
|  | 177 | #define DensityTag0 129   //!< Message on exchange of GapDownDensity, see InitDensityCalculation() | 
|---|
|  | 178 | #define OutputDensTag 140   //!< Message consists of FileData::work being sent to process 0 on output of visual data, see OutputOutVisDensity() | 
|---|
|  | 179 | #define ReadSrcPsiTag 141 //!< Used during reading and send/recv of psi coefficients in ReadSrcPsiDensity() | 
|---|
|  | 180 | #define OutputSrcPsiTag 142 //!< Message consists of Density::DensityArray[TempDensity] being sent to process 0 on output of source Psis (saving of current state), see OutputSrcPsiDensity() | 
|---|
|  | 181 | #define ParseWannierTag 143 //!< Used during send/recv of wannier centres and spread in ParseWannierFile() | 
|---|
|  | 182 | #define PlotRealDensityTag 145 //!< 4 doubles exchanged during PlotRealDensity() storing to file | 
|---|
|  | 183 | #define AllMaxLocalNoTag1 150 | 
|---|
|  | 184 | #define AllMaxLocalNoTag2 151 | 
|---|
|  | 185 | #define HamiltonianTag 160  //!< Message consists of orbit coefficients sent/received during the setup of the hamiltonian matrix | 
|---|
|  | 186 | #define HamiltonianTag2 161  //!< Message consists of orbit coefficients sent/received during the setup of the hamiltonian matrix | 
|---|
|  | 187 | #define WannierTag1 170   //!< Message consists of orbital coefficients sent/received during iteration of wannier functions | 
|---|
|  | 188 | #define WannierTag2 171   //!< Message consists of orbital coefficients sent/received during application of transformation matrix | 
|---|
|  | 189 | #define WannierTag3 172   //!< Message consists of matrix elements A_ij sent/received during evaluating of operator matrices | 
|---|
|  | 190 | #define WannierTag4 173   //!< Message consists of matrix elements B_ij sent/received during evaluating of operator matrices | 
|---|
|  | 191 | #define OtherPsiTag1 180  //!< Message consists of OnePsiElement data from the Spinype#SpinUp group | 
|---|
|  | 192 | #define OtherPsiTag2 181  //!< Message consists of OnePsiElement data from the Spinype#SpinDown group | 
|---|
|  | 193 | #define StopTag1 190  //!< Message consists of stop flag from the Spinype#SpinUp group | 
|---|
|  | 194 | #define StopTag2 191  //!< Message consists of stop flag from the Spinype#SpinDown group | 
|---|
|  | 195 | #define EnergyTag1 200  //!< Message consists of Energy#AllUpPsiEnergy during EnergyAllReduce() | 
|---|
|  | 196 | #define EnergyTag2 201  //!< Message consists of Energy#AllDownPsiEnergy during EnergyAllReduce() | 
|---|
|  | 197 | #define EnergyTag3 203 | 
|---|
|  | 198 | #define EnergyTag4 204 | 
|---|
|  | 199 | #define EnergyTag5 205  //!< Message consists of partial Energy#TotalEnergy results, sent during EnergyAllReduce() | 
|---|
|  | 200 | #define EnergyTag6 206  //!< Message consists of partial Energy#TotalEnergy results, sent during EnergyAllReduce() | 
|---|
|  | 201 | #define OverlapTag 210  //!< Message consists of wave function coefficients sent during CalculatePerturbedOverlap() | 
|---|
|  | 202 | #define PerturbedTag 211 //!< Message consists of wave function coefficients sent during Calculate1stPerturbedDerivative() | 
|---|
|  | 203 | #define CurrentTag1 221 //!< Message consists of current density SpinType#SpinUp components sent during CalculateForce() | 
|---|
|  | 204 | #define CurrentTag2 222 //!< Message consists of current density Spinype#SpinDown components sent during CalculateForce() | 
|---|
|  | 205 | #define WannierCTag 230 //!< Wannier rotation exchange | 
|---|
|  | 206 | #define WannierSTag 231 //!< Wannier rotation exchange | 
|---|
|  | 207 | #define WannierALTag 240  //!< Wannier index exchange | 
|---|
|  | 208 | #define WannierARTag 241  //!< Wannier index exchange | 
|---|
|  | 209 |  | 
|---|
|  | 210 |  | 
|---|
|  | 211 | /** Options from command line. | 
|---|
|  | 212 | * This structure is generally filled with options from the command | 
|---|
|  | 213 | * line, scanned by \ref GetOptions() | 
|---|
|  | 214 | */ | 
|---|
|  | 215 | struct CallOptions { | 
|---|
|  | 216 | char* MainParameterFile;      //!< main parameter file | 
|---|
| [907086e] | 217 | char* ForcesFile;                                       //!< ForcesFile: is NULL if we don't parse forces from file and solve the ground state problem, otherwise don't solve and parse | 
|---|
| [a0bcf1] | 218 | int debug;                    //!< (1) debug, (2) debug on errors | 
|---|
|  | 219 | int nicelevel;                //!< nice level for executable | 
|---|
|  | 220 | int Out;                                              //!< verbosity level | 
|---|
|  | 221 | int out[MaxOutGroup];           //!< print stderr-msg? for each group -v | 
|---|
|  | 222 | unsigned int alarm;           //!< set alarm after alarm seconds | 
|---|
|  | 223 | int proc[PROCDIM];                //!< process per gamma point, process per wave fct | 
|---|
| [64ca279] | 224 | int ReadSrcFiles;                         //!< 0 - don't, 1 - read old source file containing previous calculations | 
|---|
|  | 225 | int WriteSrcFiles;                //!< 0 - don't, 1 - write source file on exit with so far made calculations | 
|---|
| [a0bcf1] | 226 | int AddNFactor;                             //!< ugly hack to fix read srcpsi | 
|---|
|  | 227 | }; | 
|---|
|  | 228 |  | 
|---|
|  | 229 | /** Structure containing file names and paths. | 
|---|
|  | 230 | * mainname, mainpath, path to config file, but also integers stating | 
|---|
|  | 231 | * whether outputfile (visual, measures) should be written and their | 
|---|
|  | 232 | * respective output file pointers | 
|---|
|  | 233 | */ | 
|---|
|  | 234 | struct FileData { | 
|---|
|  | 235 | char *mainname;        //!< full name of programme including path | 
|---|
|  | 236 | char *filename;        //!< name of programme | 
|---|
|  | 237 | char *mainpath;        //!< full path to programme | 
|---|
|  | 238 | char *default_path;    //!< path to default parameter file | 
|---|
|  | 239 | char *pseudopot_path;  //!< path ot pseudopotential files | 
|---|
| [cc46b0] | 240 | int *OutVisStep;       //!< Currently so and so often has visual data output occurred | 
|---|
| [a0bcf1] | 241 | int MeOutVis;         //!< 1 - visual data are written to files, 0 - no output (for this process) | 
|---|
|  | 242 | int MeOutCurr;        //!< 1 - visual data of current density written to file, 0 - no output, no calculation (for this process) | 
|---|
| [907086e] | 243 | int MeOutMes;         //!< 1 - energy, forces and temperatures are written to files, 0 - no output (for this process) | 
|---|
| [a0bcf1] | 244 | FILE *ForcesFile;                     //!< where the forces are written to | 
|---|
|  | 245 | FILE *EnergyFile;                     //!< where the energies are written to | 
|---|
|  | 246 | FILE *SpeedFile;                      //!< where the timing are written to | 
|---|
|  | 247 | FILE *HamiltonianFile;//!< where the explicit hamiltonian is written to (for retrieving Kohn-Sham-Eigenvalues) | 
|---|
| [907086e] | 248 | FILE *SpreadFile;     //!< where spread and wannier centers for each orbital are written to | 
|---|
|  | 249 | FILE *ReciSpreadFile; //!< where reciprocal spread for each orbital is written to | 
|---|
| [a0bcf1] | 250 | FILE *MinimisationFile; //!< where TE, ATE, delta and various other elements from each minimisation steps are written to | 
|---|
| [7b1792] | 251 | FILE *TemperatureFile;//!< where the temperatures are written to | 
|---|
| [a0bcf1] | 252 | /* Arrays */ | 
|---|
|  | 253 | int TotalSize;        //!< total number of coefficients (nodes) on all processes | 
|---|
|  | 254 | int LocalSizeR;       //!< local (total) number of real nodes, twice FileData::LocalSizeC | 
|---|
|  | 255 | int LocalSizeC;       //!< local (total) number of real nodes | 
|---|
|  | 256 | int MaxNUp; | 
|---|
|  | 257 | fftw_complex *PosC;   //!< complex coefficients array for the output of densities | 
|---|
|  | 258 | fftw_complex *PosTemp; | 
|---|
|  | 259 | fftw_complex *PosFactor; | 
|---|
|  | 260 | fftw_complex *work;   //!< working coefficients array for the output of densities | 
|---|
|  | 261 | fftw_real *PosR;      //!< real coefficients array for the output of densities | 
|---|
|  | 262 | enum ModeType *OutputPosType; //!< active - RiemannTensor is used, nonactive/standby - not | 
|---|
|  | 263 | int DoOutVis;         //!< 1 - visual data are written to files, 0 - no output (generally) | 
|---|
|  | 264 | int DoOutMes;         //!< 1 - energy and forces are written to files, 0 - no output (generally) | 
|---|
|  | 265 | int DoOutCurr;        //!< 1 - visual data of current density written to file, 0 - no output, no calculation | 
|---|
| [907086e] | 266 | int DoOutNICS;        //!< 1 - visual data of nuclear induced current shieldings written to file, 0 - no output, no calculation | 
|---|
| [a0bcf1] | 267 | int DoOutOrbitals;    //!< 1 - output each orbital density, 0 - just total density | 
|---|
|  | 268 | }; | 
|---|
|  | 269 |  | 
|---|
|  | 270 | /** Structure containing info for MPI interface. | 
|---|
|  | 271 | * Such as process number, various communicators (interfacing groups in MPI), TID. | 
|---|
|  | 272 | * Always it's my (of this current process) process number within the group, within | 
|---|
|  | 273 | * the communicator, etc. | 
|---|
|  | 274 | */ | 
|---|
|  | 275 | struct ParallelSimulationData { | 
|---|
|  | 276 | int procs;                    //!< overall number of processes | 
|---|
|  | 277 | int proc[PROCDIM];            //!< number of processes per gamma point and per wave function | 
|---|
|  | 278 | int mypos[PROCDIM];           //!< I am the mypos-th process with the per gamma point or per wave function group | 
|---|
|  | 279 | int me;                       //!< my process id among all | 
|---|
|  | 280 | int mytid;                                                                            //!< My TID | 
|---|
|  | 281 | int partid;                   //!< Parent TID | 
|---|
|  | 282 |  | 
|---|
|  | 283 | MPI_Comm world;               //!< Group: MPI_COMM_WORLD (including maybe callers) | 
|---|
|  | 284 | MPI_Comm comm;                //!< Group: all participating processe on this Problem at hand | 
|---|
|  | 285 |  | 
|---|
| [907086e] | 286 | MPI_Comm comm_ST;             //!< Communicator for SpinDouble or SpinUpDown, thus either the whold world of one half of the world | 
|---|
|  | 287 | int me_comm_ST;               //!< my number within this communicator (going from 0 to Max_me_comm_ST-1) | 
|---|
|  | 288 | int my_color_comm_ST;         //!< either just 0 color(SpinDouble) or 0,1 (SpinUp - SpinDown) | 
|---|
|  | 289 | int Max_me_comm_ST;           //!< maximum number of processes in this SinUp/Down communicator, full number of total processes in SpinDouble, half the number in SpinUpDown | 
|---|
|  | 290 | int Max_my_color_comm_ST;     //!< maximum number regarding color (either 1 for SpinDouble or 2 for SpinUpDown) | 
|---|
| [a0bcf1] | 291 |  | 
|---|
|  | 292 | MPI_Comm comm_STInter;        //!< InterComm needed for SpinUp/Down case | 
|---|
|  | 293 |  | 
|---|
|  | 294 | MPI_Comm comm_ST_Psi;         //!< SubComm for comm_ST Communicator Psi, these refer to the same wave function, sharing its coefficients on both grids | 
|---|
|  | 295 | int me_comm_ST_Psi;           //!< my number within this communicator | 
|---|
|  | 296 | int my_color_comm_ST_Psi;     //!< my number, either just one color(SpinDouble) or two (SpinUp - SpinDown) | 
|---|
|  | 297 | int Max_me_comm_ST_Psi;       //!< maximum number of processes in this Psi communicator | 
|---|
|  | 298 | int Max_my_color_comm_ST_Psi; //!< ??? maximum number regarding color (one or two) | 
|---|
|  | 299 |  | 
|---|
|  | 300 | MPI_Comm comm_ST_PsiT;        //!< SubComm of comm_ST Communicator of processes that need to exchange wave funcions (GramSch()) | 
|---|
|  | 301 | int me_comm_ST_PsiT;          //!< Transposed of comm_ST_Psi | 
|---|
|  | 302 | int my_color_comm_ST_PsiT;    //!< either just one color(SpinDouble) or two (SpinUp - SpinDown) | 
|---|
|  | 303 | int Max_me_comm_ST_PsiT;      //!< maximum number of processes in this GramSch communicator | 
|---|
|  | 304 | int Max_my_color_comm_ST_PsiT;//!< ??? maximum number regarding color (one or two) | 
|---|
|  | 305 | }; | 
|---|
|  | 306 |  | 
|---|
|  | 307 | struct RPlans { | 
|---|
|  | 308 | struct LevelPlan *plan; | 
|---|
|  | 309 | fftw_complex *cdata; | 
|---|
|  | 310 | fftw_real *rdata; | 
|---|
|  | 311 | }; | 
|---|
|  | 312 |  | 
|---|
|  | 313 | /** one reciprocal grid vector G. | 
|---|
|  | 314 | */ | 
|---|
|  | 315 | struct OneGData { | 
|---|
|  | 316 | int Index;       //!< index is needed to access elements in the upper Lev0, when densities are stored in reciprocal base, Density#DensityCArray | 
|---|
|  | 317 | int GlobalIndex; | 
|---|
|  | 318 | double GSq;              //!< squared norm of G vector | 
|---|
|  | 319 | double G[NDIM];        //!< integer cooefficients of reciprocal vector | 
|---|
|  | 320 | }; | 
|---|
|  | 321 |  | 
|---|
|  | 322 | struct GDataHash { | 
|---|
|  | 323 | int i;           //!< index running over each GArray from process zero to max. | 
|---|
|  | 324 | int myPE;        //!< to which process does it belong | 
|---|
|  | 325 | }; | 
|---|
|  | 326 |  | 
|---|
|  | 327 | /** Structure for the Psis per LatticeLevel. | 
|---|
|  | 328 | */ | 
|---|
|  | 329 | struct LevelPsi { | 
|---|
|  | 330 | fftw_complex **LocalPsi;  //!< are the current complex coefficients of Psis, stored locally in this process (OnePsiElement::LocalNo), initialised by PsiDat, used for orthonormlization of non-Psis | 
|---|
|  | 331 | fftw_complex **OldLocalPsi;//!< are the old complex coefficients of Psis, stored locally in this process (OnePsiElement::LocalNo), initialised by OldPsiDat. Needed to UpdateWavesAfterIonMove() and ComputeMLWF() | 
|---|
|  | 332 | fftw_complex *PsiDat;     //!< contains the initial complex coefficients of all wave functions (even temporary ones) | 
|---|
|  | 333 | fftw_complex *OldPsiDat;  //!< contains the old complex coefficients of all wave functions (even temporary ones) | 
|---|
|  | 334 | fftw_complex *TempPsi;    //!< temporal array used in GramSch(), size of LatticeLevel:MaxG, always the Psi to be orthogonalized | 
|---|
|  | 335 | fftw_complex *TempPsi2;   //!< pointer to a Psi used in GramSch(), always the Psi already orthogonalized | 
|---|
|  | 336 | }; | 
|---|
|  | 337 |  | 
|---|
|  | 338 | /** Structure containing one wave function. | 
|---|
|  | 339 | */ | 
|---|
|  | 340 | struct OnePsiElement { | 
|---|
|  | 341 | int me_comm_ST_Psi;       //!< this wave function belongs to this process in the communicator Psi | 
|---|
|  | 342 | int my_color_comm_ST_Psi; //!< this wave function belongs to this process in the communicator PsiT | 
|---|
|  | 343 | int MyLocalNo;            //!< continuing number among the Psis that are local to this process | 
|---|
|  | 344 | int MyGlobalNo;           //!< continuing global number among all Psis | 
|---|
|  | 345 | int/*enum PsiGramSchStatusType*/ PsiGramSchStatus;  //!< Status of how far the Gram-Schmidt-Orthonormalization has gone yet for this Psi | 
|---|
|  | 346 | enum MinimisationStatusType MinimisationStatus;     //!< Status of how far the Gram-Schmidt-Orthonormalization has gone yet for this Psi | 
|---|
|  | 347 | enum PsiTypeTag PsiType;                            //!< what type of wave function: normal (occupied), extra (gradient) or unoccupied Psi | 
|---|
|  | 348 | double PsiFactor;         //!< occupation number, hard-coded (2.0 in SpinDouble case or 1.0 in SpinUpDown case) | 
|---|
|  | 349 | double PsiReciNorm2;      //!< reciprocal norm of Psi being the Sum over all reciprocal grid vectors. | 
|---|
|  | 350 | int DoBrent;              //!< signals switching to brent iteration in line search | 
|---|
|  | 351 | }; | 
|---|
|  | 352 |  | 
|---|
|  | 353 | /** Additional Data to a wave function OnePsiElement. | 
|---|
|  | 354 | * Contains energy, kinetic eigenvalues, performed minimalization steps. | 
|---|
|  | 355 | */ | 
|---|
|  | 356 | struct OnePsiElementAddData { | 
|---|
|  | 357 | double Lambda;    //!< energy eigenvalue \f$\lambda_i = \langle \psi_i^{(m)}|H|\psi_i^{(m)} \rangle\f$ | 
|---|
|  | 358 | double T;         //!< kinetic eigenvalue \f$\langle \psi_i | \ \frac{1}{2} \nabla^2 | psi_i \rangle\f$ | 
|---|
|  | 359 | double Gamma;     //!< scalar product between the gradient of the wave function and the preconditioned one at this \ref Step | 
|---|
|  | 360 | int Step;         //!< holds count of currently made minimalization steps | 
|---|
|  | 361 | double WannierCentre[NDIM]; //!< NDIM coordinates of wannier centre of this orbital | 
|---|
|  | 362 | double WannierSpread;       //!< current spread of this orbital | 
|---|
|  | 363 | }; | 
|---|
|  | 364 |  | 
|---|
|  | 365 |  | 
|---|
|  | 366 | /** Structure about all wave functions a.k.a orbits. | 
|---|
|  | 367 | * Containing variables such as SpinType, LocalNo, PsiGroup, OnePsiElement array and | 
|---|
|  | 368 | * various densities. | 
|---|
|  | 369 | */ | 
|---|
|  | 370 | struct Psis { | 
|---|
|  | 371 | enum UseSpinType Use;                  //!< Use Spin Up/Down or not (Double) | 
|---|
|  | 372 | enum SpinType PsiST;                   //!< Spin Type: Up, Down or Double | 
|---|
|  | 373 | int GlobalNo[MaxPsiNoType];//!< global number of Psis for the four plus one cases: Max, MaxDouble, MaxUp, MaxDown, MaxAdd | 
|---|
|  | 374 | int LocalNo;                                       //!< number of occupied and unoccupied Psis that are local (ly accessible) in this process | 
|---|
|  | 375 | int LocalNoAdd;            //!< number of unoccupied Psis that are local (ly accessible) in this process (spinup/-down or double) | 
|---|
|  | 376 | int NoOfPsis;              //!< contains SpinType-dependent sum of GlobalNo, giving number of wave functions in the current minimisation group (except for PsiTypeTag#UnOccupied of course) | 
|---|
|  | 377 | int NoOfTotalPsis;         //!< contains SpinType-dependent sum of GlobalNo with added PsiTypeTag#UnOccupied states | 
|---|
|  | 378 | int TypeStartIndex[Extra+2];//!< index array where the respective PsiTypeTag type starts in LocalPsiStatus | 
|---|
|  | 379 | int AllMaxLocalNo;        //!< maximum local number of Psis on one process (some processes have one more due to modulo != 0 on sharing) | 
|---|
|  | 380 | int MaxPsiGroup;          //!< number of processes among which the Psis are divided | 
|---|
|  | 381 | int PsiGroup;             //!< rank of this process in the communicator ParallelSimulationData::comm_ST_Psi | 
|---|
|  | 382 | int MaxPsiOfType;         //!< overall number of Psis | 
|---|
|  | 383 | int *AllLocalNo;          //!< array over all processes in the GramSch() communicator ParallelSimulationData::comm_ST_PsiT containing their number of local Psis, AllLocalNo[i] = RealAllLocalNo[i] + 1 | 
|---|
|  | 384 | int *RealAllLocalNo;      //!< array over all processes in the GramSch() communicator ParallelSimulationData::comm_ST_PsiT containing their number of local Psis, i-th process: Psi->LocalNo = RealAllLocalNo[i] | 
|---|
|  | 385 | int MyStartNo;            //!< at which Psis do the locally accessible of this process start (going to MyStartNo+LocalNo) | 
|---|
|  | 386 | struct OnePsiElement *AllPsiStatus;         //!< array over all PsiTypeTag's of all wave functions, yet without coefficients (see Psis::LocalPsiStatus) | 
|---|
|  | 387 | struct OnePsiElement *AllPsiStatusForSort;  //!< temporary array of same size as *AllPsiStatus, only used in naturalmergesort() | 
|---|
|  | 388 | struct OnePsiElement *LocalPsiStatus;       //!< array over all PsiTypeTag's of the local wave functions which are accessible to/stored in this process | 
|---|
|  | 389 | int *TempSendA;           //!< In GramSch(): Holds count to which process in GramSch group a local wave function has been sent | 
|---|
|  | 390 | double NIDensity[Extra];                                //!< Density over all | 
|---|
|  | 391 | double NIDensityUp[Extra];                      //!< Density of SpinUp | 
|---|
|  | 392 | double NIDensityDown[Extra];                  //!< Density of SpinDown | 
|---|
|  | 393 | int *AllActualLocalPsiNo; | 
|---|
|  | 394 | int *AllOldActualLocalPsiNo; | 
|---|
|  | 395 | struct OnePsiElementAddData *AddData;   //!< some additional local data, such as energy eigenvalue | 
|---|
|  | 396 | double **lambda;            //!< contains \f$\lambda_{kl} = \langle \varphi_k^{(0)} | H^{(0)} | \varphi_l^{(0)} \rangle\f$, sa CalculateHamiltonian() | 
|---|
|  | 397 | double **Overlap;            //!< contains \f$S_{kl} = \langle \varphi_k^{(1)} | \varphi_l^{(1)} \rangle\f$, sa CalculatePerturbedOverlap() | 
|---|
|  | 398 | }; | 
|---|
|  | 399 |  | 
|---|
|  | 400 | /** Structure containing the various (radially discretized) densities. | 
|---|
|  | 401 | * Densities are always calculated on one level higher than the respective wave functions as the fftransformation then | 
|---|
|  | 402 | * becomes exact (fourier basis). | 
|---|
|  | 403 | */ | 
|---|
|  | 404 | struct Density { | 
|---|
|  | 405 | int TotalSize;    // total number of nodes | 
|---|
|  | 406 | int LocalSizeC;   // number of nodes in radial mesh of the complex density (locally accessible) | 
|---|
|  | 407 | int LocalSizeR;   // number of nodes in radial mesh of the density (locally accessible) | 
|---|
|  | 408 | enum UseType DensityTypeUse[MaxDensityTypes]; //!< Density is used or not (e.g. Up/Down not used in SpinType::SpinDouble case) | 
|---|
|  | 409 | fftw_real *DensityArray[MaxDensityTypes];     //!< density array (wave functions summed and squared, R-dependent) (radially discretized), \sa CalculateOneDensityR() | 
|---|
|  | 410 | fftw_complex *DensityCArray[MaxDensityTypes]; //!< density array (wave functions summed and squared, G-dependent), \sa CalculateOneDensityC() | 
|---|
|  | 411 | enum UseType LockArray[MaxDensityTypes];               //!< 1 - real density array is currently in use, 0 - array may be locked for sole | 
|---|
|  | 412 | enum UseType LockCArray[MaxDensityTypes];              //!< 1 - complex density array is currently in use, 0 - array may be locked for sole | 
|---|
|  | 413 | }; | 
|---|
|  | 414 |  | 
|---|
|  | 415 | enum complex { | 
|---|
|  | 416 | real,   //!< number is real | 
|---|
|  | 417 | imag    //!< number is complex | 
|---|
|  | 418 | }; | 
|---|
|  | 419 | /** Structure containing one lattice level. | 
|---|
|  | 420 | * Containing Level number LevelNo, maximum grid mesh points normal MaxN and reciprocal MaxG, factors | 
|---|
|  | 421 | * between this one and upper levels, array of the grid vectors GArray, wave function on this level | 
|---|
|  | 422 | * LPsi and densities Dens. | 
|---|
|  | 423 | */ | 
|---|
|  | 424 | struct LatticeLevel { | 
|---|
|  | 425 | int LevelNo;                //!< current number of this level | 
|---|
|  | 426 | int MaxN;                   //!< number of grid points | 
|---|
|  | 427 | int N[NDIM];                //!< number of grid points for this level in each dimension NDIM | 
|---|
|  | 428 | int NUp[NDIM];              //!< ratio of number of mesh points between this and the upper level for each dimension NDIM | 
|---|
|  | 429 | int NUp0[NDIM];             //!< ratio of number of mesh points this and the 0th level for each dimension NDIM | 
|---|
|  | 430 | int NUp1[NDIM];             //!< ratio of number of mesh points and the first level for each dimension NDIM | 
|---|
|  | 431 | int MaxNUp;                 //!< ratio of grid points between this and the upper level overall (all dimensions together) | 
|---|
|  | 432 | int MaxG;                                                                             //!< number of reciprocal grid vectors | 
|---|
|  | 433 | int MaxDoubleG;             //!< number of reciprocal grid vectors which are double by gamma point symmetry (only one is stored) | 
|---|
|  | 434 | int *AllMaxG;               //!< number of reciprocal grid vectors for each process | 
|---|
|  | 435 | int TotalAllMaxG;           //!< number of reciprocal grid (complex) vectors for all process | 
|---|
|  | 436 | int TotalRealAllMaxG;       //!< number of reciprocal grid (real) vectors for all process | 
|---|
|  | 437 | double ECut;                                                          //!< Cutoff energy (discretizes possible reciprocal vectors), here: maximum norm of reciprocal grid vector | 
|---|
|  | 438 | struct RPlans Plan0; | 
|---|
|  | 439 | struct OneGData *GArray;              //!< Array of reciprocal grid vectors | 
|---|
|  | 440 | struct GDataHash *HashG;    //!< Hash-array with global index for each G | 
|---|
|  | 441 | int *DoubleG;               //!< Array of indices of the doubly appearing grid vectors, with twice entries per vector: normal index and the inverse index (-x,-y,-z) | 
|---|
|  | 442 | int G0;                     //!< OneGData::Index of the reciprocal grid vector with zero components | 
|---|
|  | 443 | fftw_complex *PosFactorUp;  //!< precalculated position factor \f$P_p(G) \f$when going from wave coefficients to density, huge array of \ref MaxNUp times \ref MaxG, see CreatePosFacForG() | 
|---|
|  | 444 | struct LevelPsi *LPsi; | 
|---|
|  | 445 | struct Density *Dens;       //!< Density on this level | 
|---|
|  | 446 | int Step;                   //!< holds count of Molecular Dynamics steps | 
|---|
|  | 447 | }; | 
|---|
|  | 448 |  | 
|---|
|  | 449 |  | 
|---|
|  | 450 | //! List of NField types, for this level, for the upper level | 
|---|
|  | 451 | //! Enumerating entries in nFields for current and upper level | 
|---|
|  | 452 | enum FFTNFields { FFTNF1,   //!< Number of nFields in current level | 
|---|
|  | 453 | FFTNFUp   //!< Number of nFields in upper level | 
|---|
|  | 454 | }; | 
|---|
|  | 455 | enum FFTNFieldsS {                FFTNFSVecUp=2, | 
|---|
|  | 456 | FFTNFSVec | 
|---|
|  | 457 | }; | 
|---|
|  | 458 | enum FFTNFieldsR {                FFTNFRMatUp0=2, | 
|---|
|  | 459 | FFTNFRMatVecUpS, | 
|---|
|  | 460 | FFTNFRVecUp0 | 
|---|
|  | 461 | }; | 
|---|
|  | 462 | enum FFTNFields0 {        FFTNF0Vec=1 | 
|---|
|  | 463 | }; | 
|---|
|  | 464 |  | 
|---|
|  | 465 | #define MAXRTPOSFAC 2   //!< maximum number of different RiemannTensor position factors | 
|---|
|  | 466 | //! Enumerating to which level the position factor relates | 
|---|
|  | 467 | enum RTPosFacType { RTPFRtoS,   //!< position factor is relative to STANDARDLEVEL | 
|---|
|  | 468 | RTPFRto0    //!< position factor is relative to topmost level | 
|---|
|  | 469 | }; | 
|---|
|  | 470 |  | 
|---|
|  | 471 | #define MAXRTARRAYS 8   //!< maximum number of different RiemannTensor arrays | 
|---|
|  | 472 | //! Enumerating different RiemannTensor arrays | 
|---|
|  | 473 | enum RTArrayType { RTADetPreRT, | 
|---|
|  | 474 | RTAPreA, | 
|---|
|  | 475 | RTAA, | 
|---|
|  | 476 | RTAIRT, | 
|---|
|  | 477 | RTARTA, | 
|---|
|  | 478 | RTAARTA, | 
|---|
|  | 479 | RTAiGcg, | 
|---|
|  | 480 | RTAcg | 
|---|
|  | 481 | }; | 
|---|
|  | 482 |  | 
|---|
|  | 483 | struct RiemannTensor { | 
|---|
|  | 484 | int RiemannLevel; | 
|---|
|  | 485 | int NUpLevRS[NDIM]; | 
|---|
|  | 486 | int NUpLevR0[NDIM]; | 
|---|
|  | 487 | enum UseRiemannTensor Use; | 
|---|
|  | 488 | enum ModeType ActualUse; | 
|---|
|  | 489 | fftw_complex *Coeff; | 
|---|
|  | 490 | struct LatticeLevel *LevR; /* RiemannLevel */ | 
|---|
|  | 491 | struct LatticeLevel *LevS; /* StandartLevel */ | 
|---|
|  | 492 | struct LatticeLevel *Lev0; /*  0 Level */ | 
|---|
|  | 493 | int MaxNUp[MAXRTPOSFAC]; | 
|---|
|  | 494 | int TotalSize[MAXRTARRAYS]; | 
|---|
|  | 495 | int LocalSizeC[MAXRTARRAYS]; | 
|---|
|  | 496 | int LocalSizeR[MAXRTARRAYS]; | 
|---|
|  | 497 | int NFields[MAXRTARRAYS]; | 
|---|
|  | 498 | fftw_complex *PosFactor[MAXRTPOSFAC]; | 
|---|
|  | 499 | fftw_complex *DensityC[MAXRTARRAYS]; | 
|---|
|  | 500 | fftw_real *DensityR[MAXRTARRAYS]; | 
|---|
|  | 501 | fftw_complex *RTLaplaceS; | 
|---|
|  | 502 | fftw_complex *RTLaplace0; | 
|---|
|  | 503 | fftw_complex *TempC; | 
|---|
|  | 504 | size_t TempTotalSize; | 
|---|
|  | 505 | }; | 
|---|
|  | 506 |  | 
|---|
|  | 507 | #define MAXALLPSIENERGY 4  //!< number of different wave function energies | 
|---|
|  | 508 |  | 
|---|
|  | 509 | //! Enumerating energy types of wave function | 
|---|
|  | 510 | enum AllPsiEnergyTypes { KineticEnergy,   //!< kinetic energy | 
|---|
|  | 511 | NonLocalEnergy,  //!< non-local pseudo potential energy | 
|---|
|  | 512 | Perturbed1_0Energy,  //!< \f$\langle \varphi_l^{(1)} | H^{(1)} | \varphi_l^{(0)} \rangle \f$ | 
|---|
|  | 513 | Perturbed0_1Energy   //!< \f$\langle \varphi_l^{(0)} | H^{(1)} | \varphi_l^{(1)} \rangle \f$ | 
|---|
|  | 514 | }; | 
|---|
|  | 515 | #define MAXALLDENSITYENERGY 6  //!< number of different density energies | 
|---|
|  | 516 | //! Enumerating density energy types | 
|---|
|  | 517 | enum AllDensityEnergyTypes { CorrelationEnergy,       //!< correlation energy \f$E_C\f$ | 
|---|
|  | 518 | ExchangeEnergy,          //!< exchange energy \f$E_X\f$ | 
|---|
|  | 519 | GaussEnergy,             //!< gaussian energy \f$E_{gauss}\f$ | 
|---|
|  | 520 | PseudoEnergy,            //!< pseudopotential energy \f$E_{ps}\f$ | 
|---|
|  | 521 | HartreePotentialEnergy,  //!< Hartree potential energy including gaussian density \f$E_H\f$ | 
|---|
|  | 522 | HartreeEnergy           //!< Hartree energy \f$E_H\f$ | 
|---|
|  | 523 | }; | 
|---|
|  | 524 | #define MAXALLIONSENERGY 2  //!< number of different ion energies | 
|---|
|  | 525 | //! Enumerating different ion energy types | 
|---|
|  | 526 | enum AllIonsEnergyTypes { GaussSelfEnergy,  //!< Gaussian self energy due to charge | 
|---|
|  | 527 | EwaldEnergy       //!< core to core energy summed over all super cells by ewald summation | 
|---|
|  | 528 | }; | 
|---|
|  | 529 | #define MAXOLD 2                        //!< how many older calculated values are archived in various arrays | 
|---|
|  | 530 |  | 
|---|
|  | 531 | /** Energy structure. | 
|---|
|  | 532 | * Contains Total and local (i.e. within one process) energies of the | 
|---|
|  | 533 | * three classes: wave function, density and ion, also the first and | 
|---|
|  | 534 | * second time derivative, dating back to MAXOLD | 
|---|
|  | 535 | */ | 
|---|
|  | 536 | struct Energy { | 
|---|
|  | 537 | double AllTotalPsiEnergy[MAXALLPSIENERGY];    //!< Total energy in SpinType#SpinDouble case | 
|---|
|  | 538 | double AllLocalPsiEnergy[MAXALLPSIENERGY];    //!< Calculated energies of the local process, summed up via MPI_Allreduce to Energy::AllUpPsiEnergy, Energy::AllDownPsiEnergy or Energy::AllTotalPsiEnergy respectively | 
|---|
|  | 539 | double AllUpPsiEnergy[MAXALLPSIENERGY];       //!< Total energy in SpinType#SpinUp case | 
|---|
|  | 540 | double AllDownPsiEnergy[MAXALLPSIENERGY];     //!< Total energy in SpinType#SpinDown case | 
|---|
|  | 541 | double *PsiEnergy[MAXALLPSIENERGY]; | 
|---|
|  | 542 | double AllLocalDensityEnergy[MAXALLDENSITYENERGY];  //!< local total energy of electron density within one process | 
|---|
|  | 543 | double AllTotalDensityEnergy[MAXALLDENSITYENERGY];  //!< Total energy resulting from electron density | 
|---|
|  | 544 | double AllTotalIonsEnergy[MAXALLIONSENERGY];  //!< Total energy of the Ions, Ewald and gaussian | 
|---|
|  | 545 | double TotalEnergy[MAXOLD];                   //!< Total energy as the sum of AllTotalPsiEnergy, AllTotalDensityEnergy and AllTotalIonsEnergy | 
|---|
|  | 546 | double TotalEnergyOuter[MAXOLD]; | 
|---|
|  | 547 | double TotalEnergyFixed[MAXOLD]; | 
|---|
|  | 548 | double delta[MAXOLD]; | 
|---|
|  | 549 | double dEdt0[MAXOLD]; | 
|---|
|  | 550 | double ddEddt0[MAXOLD]; | 
|---|
|  | 551 | double ATE[MAXOLD]; | 
|---|
|  | 552 | double parts[3]; | 
|---|
|  | 553 | double bandgap; | 
|---|
| [907086e] | 554 | //double homolumo; | 
|---|
| [a0bcf1] | 555 | }; | 
|---|
|  | 556 |  | 
|---|
|  | 557 | /** Lattice structure. | 
|---|
|  | 558 | * containing real, inverted, reciprocal basis (squared and/or orthonormal), Volume, | 
|---|
|  | 559 | * ECut, LatticeLevel structure, Psis structure , the fft_plan_3d structure and | 
|---|
|  | 560 | * Energy structure | 
|---|
|  | 561 | */ | 
|---|
|  | 562 | struct Lattice { | 
|---|
|  | 563 | double RealBasis[NDIM_NDIM];  //!< Coefficients of the basis vectors | 
|---|
|  | 564 | double RealBasisSQ[NDIM];     //!< squared Norm of each basis vector | 
|---|
| [88e890] | 565 | double RealBasisCenter[NDIM]; //!< center of the unit cell ((0.5,0.5,0.5) transformed by RealBasis) | 
|---|
| [a0bcf1] | 566 | double InvBasis[NDIM_NDIM];   //!< Matrix-wise inverted basis vectors | 
|---|
|  | 567 | double ReciBasis[NDIM_NDIM];  //!< Coefficients of the transposed(!), inverse basis "matrix" (i.e. reciprocal basis) | 
|---|
|  | 568 | double ReciBasisSQ[NDIM];     //!< Norm of each reciprocal basis vectors | 
|---|
|  | 569 | double ReciBasisO[NDIM];      //!< Measure of how orthonormal each basis vectors is to the others | 
|---|
|  | 570 | double ReciBasisOSQ[NDIM];    //!< Square of the orthonormality measure ReciBasisO[] | 
|---|
|  | 571 | double Volume;                //!< volume as the determinant of the matrix of the basis vectors | 
|---|
|  | 572 | double ECut;                  //!< Energy cutoff, limiting number of reciprocal wave vectors | 
|---|
|  | 573 | double SawtoothStart; | 
|---|
|  | 574 | int Lev0Factor;               //!< LevelSizes of 0th level | 
|---|
|  | 575 | int LevRFactor;               //!< LevelSizes of (RL-1)th level (upper of RiemannLevel) | 
|---|
|  | 576 | int MaxLevel;                 //!< Maximum number of levels | 
|---|
|  | 577 | int AddNFactor; | 
|---|
|  | 578 | int *LevelSizes;              //!< Factor for all levels, stating the size in comparsion to the one below (most often factor 2) | 
|---|
|  | 579 | int *MaxNoOfnFields;          //!< maximum number of entries in NFields array per level | 
|---|
|  | 580 | int **NFields; | 
|---|
|  | 581 | struct LatticeLevel *Lev;     //!< Array of different LatticeLevels, up to MaxLevel | 
|---|
|  | 582 | struct OneGData *GArrayForSort; | 
|---|
|  | 583 | struct Psis Psi;              //!< Wave function structure residing within the lattice | 
|---|
|  | 584 | struct RiemannTensor RT; | 
|---|
|  | 585 | struct fft_plan_3d *plan; | 
|---|
|  | 586 | struct Energy Energy[Extra];  //!< Energy structure for this particular lattice setting | 
|---|
|  | 587 | struct Energy *E;             //!< pointer to current Energy structure within minimisation scheme | 
|---|
|  | 588 | }; | 
|---|
|  | 589 |  | 
|---|
|  | 590 | #define MAXTIMETYPES 19                 //!< specifying number of TimeTypes | 
|---|
|  | 591 | //! Enumerating timing groups, each having its own timer \warning LevSMaxG must be the last one */ | 
|---|
|  | 592 | enum TimeTypes { SimTime,           //!< simulation time | 
|---|
|  | 593 | InitSimTime,       //!< simulation time during which initialisation of calculations is performed | 
|---|
|  | 594 | InitTime,          //!< initialization time at programme start | 
|---|
|  | 595 | InitGramSchTime,   //!< initialization time for Gram-Schmidt-Orthogonalization | 
|---|
|  | 596 | InitLocTime,       //!< initialization time for local pseudopotential calculations | 
|---|
|  | 597 | InitNonLocTime,    //!< initialization time for non-local pseudopotential calculations | 
|---|
|  | 598 | InitDensityTime,   //!< initialization time for density calculations | 
|---|
|  | 599 | GramSchTime,       //!< time spent orthonormalizing the orbits | 
|---|
|  | 600 | LocTime,           //!< time spent evaluating local pseudopotential | 
|---|
|  | 601 | NonLocTime,        //!< time spent evaluating non-local pseudopotential | 
|---|
|  | 602 | DensityTime,       //!< time spent evaluating density | 
|---|
|  | 603 | LocFTime,          //!< time spent evaluating local form factors | 
|---|
|  | 604 | NonLocFTime,       //!< time spent evaluating non-local form factors | 
|---|
|  | 605 | EwaldTime,         //!< time spent evaluating ewald summation over ion core-to-core forces | 
|---|
|  | 606 | GapTime,           //!< time spent evaluating the gap energy | 
|---|
|  | 607 | CurrDensTime,      //!< time spent evaluating the current density | 
|---|
|  | 608 | WannierTime,       //!< time spent localizing the orbitals | 
|---|
|  | 609 | ReadnWriteTime,    //!< time spent during reading and writing of wave function coefficients | 
|---|
|  | 610 | LevSMaxG};         //!< number of reciprocal grid vectors to calculate standard deviation, must always be the last one! | 
|---|
|  | 611 |  | 
|---|
|  | 612 | //! enumerating if time is started or stopped | 
|---|
|  | 613 | enum TimeDoTypes { StartTimeDo,   //!< start timer | 
|---|
|  | 614 | StopTimeDo     //!< stop timer | 
|---|
|  | 615 | }; | 
|---|
|  | 616 |  | 
|---|
|  | 617 |  | 
|---|
|  | 618 | /** Array structure for timekeeping. | 
|---|
|  | 619 | * It consists of arrays for each timing group(!) for | 
|---|
|  | 620 | * steps, averages, stored times, deviations, min and max | 
|---|
|  | 621 | */ | 
|---|
|  | 622 | struct SpeedStruct { | 
|---|
|  | 623 | double SpeedStep[MAXTIMETYPES]; | 
|---|
|  | 624 | double time1[MAXTIMETYPES];                           //!< time before the time before current time | 
|---|
|  | 625 | double time2[MAXTIMETYPES];                           //!< time before current time | 
|---|
|  | 626 | double time[MAXTIMETYPES];                            //!< current time | 
|---|
|  | 627 | double average[MAXTIMETYPES];                 //!< storing average | 
|---|
|  | 628 | double stddev[MAXTIMETYPES];                  //!< standard deviation | 
|---|
|  | 629 | double min[MAXTIMETYPES];                                     //!< minimum time | 
|---|
|  | 630 | double max[MAXTIMETYPES];                                     //!< maximum time | 
|---|
|  | 631 | int InitSteps; | 
|---|
|  | 632 | int LevUpSteps; | 
|---|
|  | 633 | int Steps;                        //!< holds count of made Molecular dynamic steps | 
|---|
|  | 634 | }; | 
|---|
|  | 635 |  | 
|---|
|  | 636 | struct Problem; | 
|---|
|  | 637 | #include "ions.h" | 
|---|
|  | 638 | #include "pseudo.h" | 
|---|
|  | 639 | #include "excor.h" | 
|---|
|  | 640 | #include "grad.h" | 
|---|
|  | 641 | #include "run.h" | 
|---|
|  | 642 |  | 
|---|
|  | 643 | /** Physical problem superstructure. | 
|---|
|  | 644 | * This structure contains all the vital information specifying the | 
|---|
|  | 645 | * problem at hand, such as the command line and parameter file options, | 
|---|
|  | 646 | * also very important RunStruct for mpi groups and SpeedStruct for time measuring, | 
|---|
|  | 647 | * or simply all other structures. | 
|---|
|  | 648 | * \sa GetOptions() and ReadParameters() | 
|---|
|  | 649 | */ | 
|---|
|  | 650 | struct Problem { | 
|---|
|  | 651 | struct CallOptions Call; | 
|---|
|  | 652 | struct FileData Files; | 
|---|
|  | 653 | struct ParallelSimulationData Par; | 
|---|
|  | 654 | struct Lattice Lat; | 
|---|
|  | 655 | struct Ions Ion; | 
|---|
|  | 656 | struct PseudoPot PP; | 
|---|
|  | 657 | struct ExCor ExCo; | 
|---|
|  | 658 | struct Gradient Grad; | 
|---|
|  | 659 | struct RunStruct R; | 
|---|
|  | 660 | struct SpeedStruct Speed; | 
|---|
|  | 661 | }; | 
|---|
|  | 662 |  | 
|---|
|  | 663 |  | 
|---|
|  | 664 | #endif | 
|---|