| [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
 | 
|---|