| 1 | #ifndef ions_h | 
|---|
| 2 | #define ions_h | 
|---|
| 3 |  | 
|---|
| 4 | /** \file ions.h | 
|---|
| 5 | * Header file for \ref ions.c | 
|---|
| 6 | * | 
|---|
| 7 | * Contains declarations of the functions implemented in \ref ions.c, | 
|---|
| 8 | * enumerations such CoreCorrType - whether the config file has values for the | 
|---|
| 9 | * core electron density - or IonMoveType - is the ion allowed to move or not - | 
|---|
| 10 | * and structures for IonType, containg all Ions of a atomic type, which are all | 
|---|
| 11 | * attached to Ions. | 
|---|
| 12 | * | 
|---|
| 13 | Project: ParallelCarParrinello | 
|---|
| 14 | Jan Hamaekers | 
|---|
| 15 | 2000 | 
|---|
| 16 |  | 
|---|
| 17 | File: ions.h | 
|---|
| 18 | $Id: ions.h,v 1.19 2007/02/09 09:13:48 foo Exp $ | 
|---|
| 19 | */ | 
|---|
| 20 |  | 
|---|
| 21 |  | 
|---|
| 22 | // use double precision fft when available | 
|---|
| 23 | #ifdef HAVE_CONFIG_H | 
|---|
| 24 | #include <config.h> | 
|---|
| 25 | #endif | 
|---|
| 26 |  | 
|---|
| 27 | #ifdef HAVE_DFFTW_H | 
|---|
| 28 | #include "dfftw.h" | 
|---|
| 29 | #else | 
|---|
| 30 | #include "fftw.h" | 
|---|
| 31 | #endif | 
|---|
| 32 |  | 
|---|
| 33 | enum CoreCorrType { NotCoreCorrected, CoreCorrected};    //!< Pseudopotential: Whether there is a correction factor for the potential ansatz or not | 
|---|
| 34 | #define MaxIonMoveType 2                                                                        //!< Number of different IonMoveType | 
|---|
| 35 | enum IonMoveType { MoveIon, FixedIon};          //!< Whether the Ion is movable or not (influences kinetic energy among others) | 
|---|
| 36 |  | 
|---|
| 37 | #define MaxThermostats 6      //!< maximum number of thermostat entries in Ions#ThermostatNames and Ions#ThermostatImplemented | 
|---|
| 38 | enum thermostats { None, Woodcock, Gaussian, Langevin, Berendsen, NoseHoover };   //!< Thermostat names for output | 
|---|
| 39 |  | 
|---|
| 40 | /** Structure containing coordinate and velocity of one ion for a single MD step. | 
|---|
| 41 | * This is an item in a forward-referenced list, such that at each step the current | 
|---|
| 42 | * constrained can be extracted and the item subsequently removed from the list. | 
|---|
| 43 | */ | 
|---|
| 44 | struct IonConstrained { | 
|---|
| 45 | int step;           //!< constrained motion for MD step ... | 
|---|
| 46 | double *R;          //!< ion coordinates (null if not specified) | 
|---|
| 47 | double *U;          //!< ion velocity (null if not specified) | 
|---|
| 48 | enum IonMoveType IMT;  //!< Ion MoveType for this step | 
|---|
| 49 | struct IonConstrained *next;  //!< pointer to next item in forward-referenced list | 
|---|
| 50 | }; | 
|---|
| 51 |  | 
|---|
| 52 | /** Structure containing data for a single ion type. | 
|---|
| 53 | * Contains Mass, atomic number, number of types, coordinates (current and the | 
|---|
| 54 | * last two old positions), forces (and last one), velocity, some Pseudopotential | 
|---|
| 55 | * values | 
|---|
| 56 | */ | 
|---|
| 57 | struct IonType { /* A single Ion */ | 
|---|
| 58 | int Z;                                                        //!< Atomic number of ion | 
|---|
| 59 | double IonMass;                       //!< Mass of ion | 
|---|
| 60 | int Max_IonsOfType;   //!< Maximum number of ions of this type (needed for memory allocation) | 
|---|
| 61 | double *R;                                    //!< coordinate (x,y,z) array for all ions of this type R[i][j] (i=x,y,z;j=1,..) | 
|---|
| 62 | double *R_old;                        //!< Remembers last position (two-dim array, see IonType::R) | 
|---|
| 63 | double *R_old_old;    //!< Remembers position before the last one (two-dim array, see IonType::R) | 
|---|
| 64 | struct IonConstrained **Constraints; //!< pointer to each Ion of this IonType with a pointer to the current start item of a list of constrained values | 
|---|
| 65 | double *FIon;                         //!< Overall force acting on the ion (two-dim array, see IonType::R) | 
|---|
| 66 | double *FIonL;                        //!< Linear force acting on the ion (two-dim array, see IonType::R) | 
|---|
| 67 | double *FIonNL;                       //!< Nonlinear force acting on the ion (two-dim array, see IonType::R) | 
|---|
| 68 | double *FEwald;     //!< Ewald force (two-dim array, see IonType::R) | 
|---|
| 69 | double *FMagnetic;  //!< Magnetic force acting on the ion (two-dim array, see IonType::R) | 
|---|
| 70 | double *FConstraint;//!< Constraint force acting on the ion, needed for Thermostat() (two-dim array, see IonType::R) | 
|---|
| 71 | double *U;                                    //!< Velocity of the ion (two-dim array, see IonType::R) | 
|---|
| 72 | double *FIon_old;             //!< Remembers prior force acting on the ion (two-dim array, see IonType::R) | 
|---|
| 73 | double IonFac;      //!< mass-like factor in CG structure optimization to determinte step width | 
|---|
| 74 | double *GammaA;     //!< | 
|---|
| 75 | double *SearchDir;  //!< | 
|---|
| 76 | double rgauss;                        //!< Gauss radius | 
|---|
| 77 | double *alpha;      //!< parameter for CSDGT gauge, see ShiftGaugeOrigin() | 
|---|
| 78 | int l_max;                                    //!< (?) Pseudopotential specific value | 
|---|
| 79 | int l_loc;                                    //!< (?) Pseudopotential specific value | 
|---|
| 80 | double ZFactor;               //!< (?) CalcVIFactor | 
|---|
| 81 | fftw_complex *SFactor;      //!< structure factor, \f$S_{I_s} (G) \f$, thereby the centre of a potential is shifted away from the origin | 
|---|
| 82 | enum CoreCorrType corecorr;   //!< (?) Core correction due to pseudo potential ansatz | 
|---|
| 83 | enum IonMoveType *IMT;                //!< Ion is moving or fixed | 
|---|
| 84 | char *Name;         //!< name of ion's element | 
|---|
| 85 | char *Symbol; //!< short form of ion's element | 
|---|
| 86 | double **moment;     //!< magnetic moment | 
|---|
| 87 | double **sigma;     //!< shielding tensor | 
|---|
| 88 | double **sigma_rezi;      //!< shielding tensor for reciprocal calculation | 
|---|
| 89 | double **sigma_PAS;       //!< Principal Axis System shielding tensor | 
|---|
| 90 | double **sigma_rezi_PAS;  //!< Principal Axis System  shielding tensor for reciprocal calculation | 
|---|
| 91 | double chi[NDIM*NDIM];  //!< magnetic susceptibility | 
|---|
| 92 | double chi_PAS[NDIM];  //!< Principal Axis System  magnetic susceptibility | 
|---|
| 93 | }; | 
|---|
| 94 |  | 
|---|
| 95 | /** Containing structure for all ion data. | 
|---|
| 96 | * Contains max types, counts, cut values, temperature and total mass among others | 
|---|
| 97 | */ | 
|---|
| 98 | struct Ions { /* All Ions */ | 
|---|
| 99 | int Max_Types;                        //!< Number of types overall (needed for memory allocation) | 
|---|
| 100 | int Max_TotalIons;    //!< Maximum of of total ions (needed for memory allocation) | 
|---|
| 101 | int Max_Max_IonsOfType; //!< Maximum of ions per type (needed for memory allocation) | 
|---|
| 102 | int TotalZval; | 
|---|
| 103 | struct IonType *I;    //!< Structure containing data for each type | 
|---|
| 104 | /* Ewald */ | 
|---|
| 105 | double R_cut;                         //!< Radial cut value | 
|---|
| 106 | int MaxVec; | 
|---|
| 107 | int MaxLocalVec; | 
|---|
| 108 | double *RLatticeVec; | 
|---|
| 109 | double *FTemp;                        //!< Array for temporary force | 
|---|
| 110 | double EKin;                          //!< Kinetic energy of electrons | 
|---|
| 111 | double ActualTemp;    //!< Actual temperature | 
|---|
| 112 | double TotalMass;             //!< Total mass of all ions in the structure | 
|---|
| 113 | int StructOpt;      //!< whether structure optimization (1) (with CG) or MD (0) shall be done | 
|---|
| 114 | int IsAngstroem;    //!< 1 - lengths in config file in angstroem, 0 - lengths in atomic units | 
|---|
| 115 | enum thermostats Thermostat;     //!< 0 - none, 1 - Woodcock, 2 - Gaussian, 3 - Langevin, 4 - Berendsen, 5 - Nose-Hoover | 
|---|
| 116 | char **ThermostatNames; | 
|---|
| 117 | int *ThermostatImplemented; | 
|---|
| 118 | }; | 
|---|
| 119 |  | 
|---|
| 120 |  | 
|---|
| 121 | /* Functions */ | 
|---|
| 122 | void IonsInitRead(struct Problem *P, FILE *source); | 
|---|
| 123 | void InitThermostats(struct Problem *P, FILE *source); | 
|---|
| 124 | void CalculateEwald(struct Problem *P, int first); | 
|---|
| 125 | void RemoveIonsRead(struct Ions *I); | 
|---|
| 126 | /*void CalculateIonLocalForce(struct Problem *P);*/ | 
|---|
| 127 | void CalculateIonForce(struct Problem *P); | 
|---|
| 128 | void OutputIonForce(struct Problem *P); | 
|---|
| 129 | void ParseIonForce(struct Problem *P); | 
|---|
| 130 | void OutputIonCoordinates(struct Problem *P, int actual); | 
|---|
| 131 | void UpdateIons(struct Problem *P); | 
|---|
| 132 | void UpdateIonsR(struct Problem *P); | 
|---|
| 133 | void UpdateIonsU(struct Problem *P); | 
|---|
| 134 | void CalculateEnergyIonsU(struct Problem *P); | 
|---|
| 135 | void ScaleTemp(struct Problem *P); | 
|---|
| 136 | void GetOuterStop(struct Problem *P); | 
|---|
| 137 | void CorrectForces(struct Problem *P); | 
|---|
| 138 | void ResetForces(struct Problem *P); | 
|---|
| 139 | void CorrectVelocity(struct Problem *P); | 
|---|
| 140 | struct IonConstrained * AddConstraintItem(struct IonType *I, int ion); | 
|---|
| 141 | int RemoveConstraintItem(struct IonType *I, int ion); | 
|---|
| 142 | #endif | 
|---|