| [a0bcf1] | 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 |  | 
|---|
| [094b41] | 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 |  | 
|---|
| [32de28] | 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 |  | 
|---|
| [a0bcf1] | 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,..) | 
|---|
| [32de28] | 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) | 
|---|
| [a0bcf1] | 71 | double *U;                                    //!< Velocity of the ion (two-dim array, see IonType::R) | 
|---|
| [32de28] | 72 | double *FIon_old;             //!< Remembers prior force acting on the ion (two-dim array, see IonType::R) | 
|---|
| [a0bcf1] | 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 | 
|---|
| [32de28] | 86 | double **moment;     //!< magnetic moment | 
|---|
| [a0bcf1] | 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; | 
|---|
| [9b2f5d] | 109 | double *FTemp;                        //!< Array for temporary force | 
|---|
| [a0bcf1] | 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 | 
|---|
| [9b2f5d] | 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; | 
|---|
| [a0bcf1] | 118 | }; | 
|---|
|  | 119 |  | 
|---|
|  | 120 |  | 
|---|
|  | 121 | /* Functions */ | 
|---|
|  | 122 | void IonsInitRead(struct Problem *P, FILE *source); | 
|---|
| [b74e5e] | 123 | void InitThermostats(struct Problem *P, FILE *source); | 
|---|
| [a0bcf1] | 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); | 
|---|
| [32de28] | 129 | void ParseIonForce(struct Problem *P); | 
|---|
| [774ae8] | 130 | void OutputIonCoordinates(struct Problem *P, int actual); | 
|---|
| [a0bcf1] | 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); | 
|---|
| [9b2f5d] | 138 | void ResetForces(struct Problem *P); | 
|---|
| [a0bcf1] | 139 | void CorrectVelocity(struct Problem *P); | 
|---|
| [961b75] | 140 | struct IonConstrained * AddConstraintItem(struct IonType *I, int ion); | 
|---|
|  | 141 | int RemoveConstraintItem(struct IonType *I, int ion); | 
|---|
| [a0bcf1] | 142 | #endif | 
|---|