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