source: src/molecules.hpp@ df793a

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since df793a was df793a, checked in by Frederik Heber <heber@…>, 17 years ago

BUGFIXES: CyclicStructureAnalysis() now compatible to disconnected subgraphs, AssignKeySetsToFragment() and FillBondStructureFromReference() memory cleanup corrected

+ molecule::DepthFirstSearchAnalysis() now just returns BackEdgeStack, not MinimumRingSize. CyclicStructureAnalysis() is called during FragmentMolecule(), after subgraphs bonds list have been filled by FillBondStructureFromReference().
+ new function molecule::PickLocalBackEdges(), as the BackEdgeStack returned by DepthFirstSearchAnalysis() co
ntains only global bonds, not the local ones for the subgraph, we have to step through it and pick the right
ones out.
+ molecule::FragmentMolecule() now calls molecule::CyclicStructureAnalysis() separately for each subgraph, along with a BackEdgeStack filled by PickLocalBackEdges(), and allocates&initialises MinimumRingSize array. Als
o AssignKeySetsToFragment() frees the LocalListOfAtoms now (FreeList=true), now longer after the following wh
ile
+ molecule::CyclicStructureAnalysis() takes a local BackEdgeStack and analysis the subgraphs cycles, returnin
g minimum ring size
+ MoleculeLeafClass::AssignKeySetsToFragment() now frees memory for ListOfLocalAtoms when FreeList is set. BUGFIX: test of first key was testing against ..->nr != -1. However, LocalListOfAtoms was not even initialised correctly to NULL, hence ...->nr pointed in some cases to nowhere. Now it test atom* against NULL.
+ MoleculeLeafClass::FillBondStructureFromReference() now frees memory for ListOfLocalAtoms when FreeList is set correctly (only free initial pointer when FragmentCounter == 0, also it was decreased not before but after freeing, hence we free'd the wrong list). Also, father replaced by GetTrueFather() (makes the function moregenerally useable, was not a bug).
+ ParseCommandLineOptions() option 'D': adapted to changes in DepthFirstSearchAnalysis() in a similar manner
to FragmentMolecule()
+ molecule::CountCyclicBonds() adapted but does not perform CyclicStructureAnalysis()
+ molecule::CreateAdjacencyList() counts the bonds that could not be brought to covalently corrected degree (i.e. the remaining ionic atoms)
+ molecule::CreateListOfBondsPerAtom() prints atom names and number, which is helpful as name contains global

and number contains local number (helped in finding above bugs)

+ CreateFatherLookupTable(): BUGFIX: LookupTable was not initialised to NULL (see above)

  • Property mode set to 100644
File size: 18.7 KB
Line 
1/** \file molecules.hpp
2 *
3 * Class definitions of atom and molecule, element and periodentafel
4 */
5
6#ifndef MOLECULES_HPP_
7#define MOLECULES_HPP_
8
9using namespace std;
10
11// GSL headers
12#include <gsl/gsl_eigen.h>
13#include <gsl/gsl_heapsort.h>
14#include <gsl/gsl_linalg.h>
15#include <gsl/gsl_matrix.h>
16#include <gsl/gsl_multimin.h>
17#include <gsl/gsl_vector.h>
18#include <gsl/gsl_randist.h>
19
20// STL headers
21#include <map>
22#include <set>
23#include <deque>
24#include <list>
25#include <vector>
26
27#include "helpers.hpp"
28#include "parser.hpp"
29#include "periodentafel.hpp"
30#include "stackclass.hpp"
31#include "vector.hpp"
32
33class atom;
34class bond;
35class config;
36class molecule;
37class MoleculeListClass;
38class Verbose;
39
40/******************************** Some definitions for easier reading **********************************/
41
42#define KeyStack deque<int>
43#define KeySet set<int>
44#define NumberValuePair pair<int, double>
45#define Graph map <KeySet, NumberValuePair, KeyCompare >
46#define GraphPair pair <KeySet, NumberValuePair >
47#define KeySetTestPair pair<KeySet::iterator, bool>
48#define GraphTestPair pair<Graph::iterator, bool>
49
50#define DistancePair pair < double, atom* >
51#define DistanceMap multimap < double, atom* >
52#define DistanceTestPair pair < DistanceMap::iterator, bool>
53
54#define Boundaries map <double, DistancePair >
55#define BoundariesPair pair<double, DistancePair >
56#define BoundariesTestPair pair< Boundaries::iterator, bool>
57
58#define PointMap map < int, class BoundaryPointSet * >
59#define PointPair pair < int, class BoundaryPointSet * >
60#define PointTestPair pair < PointMap::iterator, bool >
61
62#define LineMap map < int, class BoundaryLineSet * >
63#define LinePair pair < int, class BoundaryLineSet * >
64#define LineTestPair pair < LinePair::iterator, bool >
65
66#define TriangleMap map < int, class BoundaryTriangleSet * >
67#define TrianglePair pair < int, class BoundaryTriangleSet * >
68#define TriangleTestPair pair < TrianglePair::iterator, bool >
69
70#define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> >
71#define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> >
72
73/******************************** Some small functions and/or structures **********************************/
74
75struct KeyCompare
76{
77 bool operator() (const KeySet SubgraphA, const KeySet SubgraphB) const;
78};
79
80struct Trajectory
81{
82 vector<Vector> R; //!< position vector
83 vector<Vector> U; //!< velocity vector
84 vector<Vector> F; //!< last force vector
85 atom *ptr; //!< pointer to atom whose trajectory we contain
86};
87
88//bool operator < (KeySet SubgraphA, KeySet SubgraphB); //note: this declaration is important, otherwise normal < is used (producing wrong order)
89inline void InsertFragmentIntoGraph(ofstream *out, struct UniqueFragments *Fragment); // Insert a KeySet into a Graph
90inline void InsertGraphIntoGraph(ofstream *out, Graph &graph1, Graph &graph2, int *counter); // Insert all KeySet's in a Graph into another Graph
91int CompareDoubles (const void * a, const void * b);
92
93
94/************************************* Class definitions ****************************************/
95
96
97// some algebraic matrix stuff
98#define RDET3(a) ((a)[0]*(a)[4]*(a)[8] + (a)[3]*(a)[7]*(a)[2] + (a)[6]*(a)[1]*(a)[5] - (a)[2]*(a)[4]*(a)[6] - (a)[5]*(a)[7]*(a)[0] - (a)[8]*(a)[1]*(a)[3]) //!< hard-coded determinant of a 3x3 matrix
99#define RDET2(a0,a1,a2,a3) ((a0)*(a3)-(a1)*(a2)) //!< hard-coded determinant of a 2x2 matrix
100
101
102/** Parameter structure for least square minimsation.
103 */
104struct LSQ_params {
105 Vector **vectors;
106 int num;
107};
108
109double LSQ(const gsl_vector * x, void * params);
110
111/** Parameter structure for least square minimsation.
112 */
113struct lsq_params {
114 gsl_vector *x;
115 const molecule *mol;
116 element *type;
117};
118
119
120
121/** Single atom.
122 * Class incoporates position, type
123 */
124class atom {
125 public:
126 Vector x; //!< coordinate array of atom, giving position within cell
127 Vector v; //!< velocity array of atom
128 element *type; //!< pointing to element
129 atom *previous; //!< previous atom in molecule list
130 atom *next; //!< next atom in molecule list
131 atom *father; //!< In many-body bond order fragmentations points to originating atom
132 atom *Ancestor; //!< "Father" in Depth-First-Search
133 char *Name; //!< unique name used during many-body bond-order fragmentation
134 int FixedIon; //!< config variable that states whether forces act on the ion or not
135 int *sort; //!< sort criteria
136 int nr; //!< continuous, unique number
137 int GraphNr; //!< unique number, given in DepthFirstSearchAnalysis()
138 int *ComponentNr;//!< belongs to this nonseparable components, given in DepthFirstSearchAnalysis() (if more than one, then is SeparationVertex)
139 int LowpointNr; //!< needed in DepthFirstSearchAnalysis() to detect nonseparable components, is the lowest possible number of an atom to reach via tree edges only followed by at most one back edge.
140 bool SeparationVertex; //!< whether this atom separates off subsets of atoms or not, determined in DepthFirstSearchAnalysis()
141 bool IsCyclic; //!< whether atom belong to as cycle or not, determined in DepthFirstSearchAnalysis()
142 unsigned char AdaptiveOrder; //!< current present bond order at site (0 means "not set")
143 bool MaxOrder; //!< whether this atom as a root in fragmentation still creates more fragments on higher orders or not
144
145 atom();
146 ~atom();
147
148 bool Output(int ElementNo, int AtomNo, ofstream *out) const;
149 bool OutputXYZLine(ofstream *out) const;
150 atom *GetTrueFather();
151 bool Compare(atom &ptr);
152
153 private:
154};
155
156ostream & operator << (ostream &ost, const atom &a);
157
158/** Bonds between atoms.
159 * Class incorporates bonds between atoms in a molecule,
160 * used to derive tge fragments in many-body bond order
161 * calculations.
162 */
163class bond {
164 public:
165 atom *leftatom; //!< first bond partner
166 atom *rightatom; //!< second bond partner
167 bond *previous; //!< previous atom in molecule list
168 bond *next; //!< next atom in molecule list
169 int HydrogenBond; //!< Number of hydrogen atoms in the bond
170 int BondDegree; //!< single, double, triple, ... bond
171 int nr; //!< unique number in a molecule, updated by molecule::CreateAdjacencyList()
172 bool Cyclic; //!< flag whether bond is part of a cycle or not, given in DepthFirstSearchAnalysis()
173 enum EdgeType Type;//!< whether this is a tree or back edge
174
175 atom * GetOtherAtom(atom *Atom) const;
176 bond * GetFirstBond();
177 bond * GetLastBond();
178
179 bool MarkUsed(enum Shading color);
180 enum Shading IsUsed();
181 void ResetUsed();
182 bool Contains(const atom *ptr);
183 bool Contains(const int nr);
184
185 bond();
186 bond(atom *left, atom *right);
187 bond(atom *left, atom *right, int degree);
188 bond(atom *left, atom *right, int degree, int number);
189 ~bond();
190
191 private:
192 enum Shading Used; //!< marker in depth-first search, DepthFirstSearchAnalysis()
193};
194
195
196ostream & operator << (ostream &ost, const bond &b);
197
198class MoleculeLeafClass;
199
200
201#define MaxThermostats 6 //!< maximum number of thermostat entries in Ions#ThermostatNames and Ions#ThermostatImplemented
202enum thermostats { None, Woodcock, Gaussian, Langevin, Berendsen, NoseHoover }; //!< Thermostat names for output
203
204
205/** The complete molecule.
206 * Class incorporates number of types
207 */
208class molecule {
209 public:
210 double cell_size[6];//!< cell size
211 periodentafel *elemente; //!< periodic table with each element
212 atom *start; //!< start of atom list
213 atom *end; //!< end of atom list
214 bond *first; //!< start of bond list
215 bond *last; //!< end of bond list
216 bond ***ListOfBondsPerAtom; //!< pointer list for each atom and each bond it has
217 map<atom *, struct Trajectory> Trajectories; //!< contains old trajectory points
218 int MDSteps; //!< The number of MD steps in Trajectories
219 int *NumberOfBondsPerAtom; //!< Number of Bonds each atom has
220 int AtomCount; //!< number of atoms, brought up-to-date by CountAtoms()
221 int BondCount; //!< number of atoms, brought up-to-date by CountBonds()
222 int ElementCount; //!< how many unique elements are therein
223 int ElementsInMolecule[MAX_ELEMENTS]; //!< list whether element (sorted by atomic number) is alread present or not
224 int NoNonHydrogen; //!< number of non-hydrogen atoms in molecule
225 int NoNonBonds; //!< number of non-hydrogen bonds in molecule
226 int NoCyclicBonds; //!< number of cyclic bonds in molecule, by DepthFirstSearchAnalysis()
227 double BondDistance; //!< typical bond distance used in CreateAdjacencyList() and furtheron
228
229 molecule(periodentafel *teil);
230 ~molecule();
231
232 /// remove atoms from molecule.
233 bool AddAtom(atom *pointer);
234 bool RemoveAtom(atom *pointer);
235 bool CleanupMolecule();
236
237 /// Add/remove atoms to/from molecule.
238 atom * AddCopyAtom(atom *pointer);
239 bool AddXYZFile(string filename);
240 bool AddHydrogenReplacementAtom(ofstream *out, bond *Bond, atom *BottomOrigin, atom *TopOrigin, atom *TopReplacement, bond **BondList, int NumBond, bool IsAngstroem);
241 bond * AddBond(atom *first, atom *second, int degree);
242 bool RemoveBond(bond *pointer);
243 bool RemoveBonds(atom *BondPartner);
244
245 /// Find atoms.
246 atom * FindAtom(int Nr) const;
247 atom * AskAtom(string text);
248
249 /// Count and change present atoms' coordination.
250 void CountAtoms(ofstream *out);
251 void CountElements();
252 void CalculateOrbitals(class config &configuration);
253 bool CenterInBox(ofstream *out, Vector *BoxLengths);
254 void CenterEdge(ofstream *out, Vector *max);
255 void CenterOrigin(ofstream *out, Vector *max);
256 void CenterGravity(ofstream *out, Vector *max);
257 void Translate(const Vector *x);
258 void Mirror(const Vector *x);
259 void Align(Vector *n);
260 void Scale(double **factor);
261 void DetermineCenter(Vector &center);
262 Vector * DetermineCenterOfGravity(ofstream *out);
263 Vector * DetermineCenterOfAll(ofstream *out);
264 void SetBoxDimension(Vector *dim);
265 double * ReturnFullMatrixforSymmetric(double *cell_size);
266 void ScanForPeriodicCorrection(ofstream *out);
267 void PrincipalAxisSystem(ofstream *out, bool DoRotate);
268 double VolumeOfConvexEnvelope(ofstream *out, bool IsAngstroem);
269
270 bool VerletForceIntegration(ofstream *out, char *file, config &configuration);
271 void Thermostats(config &configuration, double ActualTemp, int Thermostat);
272
273 double ConstrainedPotential(ofstream *out, atom **permutation, int start, int end, double *constants, bool IsAngstroem);
274 double MinimiseConstrainedPotential(ofstream *out, atom **&permutation, int startstep, int endstep, bool IsAngstroem);
275 void EvaluateConstrainedForces(ofstream *out, int startstep, int endstep, atom **PermutationMap, ForceMatrix *Force);
276 bool LinearInterpolationBetweenConfiguration(ofstream *out, int startstep, int endstep, const char *prefix, config &configuration);
277
278 bool CheckBounds(const Vector *x) const;
279 void GetAlignvector(struct lsq_params * par) const;
280
281 /// Initialising routines in fragmentation
282 void CreateAdjacencyList(ofstream *out, double bonddistance, bool IsAngstroem);
283 void CreateListOfBondsPerAtom(ofstream *out);
284
285 // Graph analysis
286 MoleculeLeafClass * DepthFirstSearchAnalysis(ofstream *out, class StackClass<bond *> *&BackEdgeStack);
287 void CyclicStructureAnalysis(ofstream *out, class StackClass<bond *> *BackEdgeStack, int *&MinimumRingSize);
288 bool PickLocalBackEdges(ofstream *out, atom **ListOfLocalAtoms, class StackClass<bond *> *&ReferenceStack, class StackClass<bond *> *&LocalStack);
289 bond * FindNextUnused(atom *vertex);
290 void SetNextComponentNumber(atom *vertex, int nr);
291 void InitComponentNumbers();
292 void OutputComponentNumber(ofstream *out, atom *vertex);
293 void ResetAllBondsToUnused();
294 void ResetAllAtomNumbers();
295 int CountCyclicBonds(ofstream *out);
296 bool CheckForConnectedSubgraph(ofstream *out, KeySet *Fragment);
297 string GetColor(enum Shading color);
298
299 molecule *CopyMolecule();
300
301 /// Fragment molecule by two different approaches:
302 int FragmentMolecule(ofstream *out, int Order, config *configuration);
303 bool CheckOrderAtSite(ofstream *out, bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, char *path = NULL);
304 bool StoreAdjacencyToFile(ofstream *out, char *path);
305 bool CheckAdjacencyFileAgainstMolecule(ofstream *out, char *path, atom **ListOfAtoms);
306 bool ParseOrderAtSiteFromFile(ofstream *out, char *path);
307 bool StoreOrderAtSiteFile(ofstream *out, char *path);
308 bool ParseKeySetFile(ofstream *out, char *filename, Graph *&FragmentList);
309 bool StoreKeySetFile(ofstream *out, Graph &KeySetList, char *path);
310 bool StoreForcesFile(ofstream *out, MoleculeListClass *BondFragments, char *path, int *SortIndex);
311 bool CreateMappingLabelsToConfigSequence(ofstream *out, int *&SortIndex);
312 bool ScanBufferIntoKeySet(ofstream *out, char *buffer, KeySet &CurrentSet);
313 void BreadthFirstSearchAdd(ofstream *out, molecule *Mol, atom **&AddedAtomList, bond **&AddedBondList, atom *Root, bond *Bond, int BondOrder, bool IsAngstroem);
314 /// -# BOSSANOVA
315 void FragmentBOSSANOVA(ofstream *out, Graph *&FragmentList, KeyStack &RootStack, int *MinimumRingSize);
316 int PowerSetGenerator(ofstream *out, int Order, struct UniqueFragments &FragmentSearch, KeySet RestrictedKeySet);
317 bool BuildInducedSubgraph(ofstream *out, const molecule *Father);
318 molecule * StoreFragmentFromKeySet(ofstream *out, KeySet &Leaflet, bool IsAngstroem);
319 void SPFragmentGenerator(ofstream *out, struct UniqueFragments *FragmentSearch, int RootDistance, bond **BondsSet, int SetDimension, int SubOrder);
320 int LookForRemovalCandidate(ofstream *&out, KeySet *&Leaf, int *&ShortestPathList);
321 int GuesstimateFragmentCount(ofstream *out, int order);
322
323 // Recognize doubly appearing molecules in a list of them
324 int * IsEqualToWithinThreshold(ofstream *out, molecule *OtherMolecule, double threshold);
325 int * GetFatherSonAtomicMap(ofstream *out, molecule *OtherMolecule);
326
327 // Output routines.
328 bool Output(ofstream *out);
329 bool OutputTrajectories(ofstream *out);
330 void OutputListOfBonds(ofstream *out) const;
331 bool OutputXYZ(ofstream *out) const;
332 bool OutputTrajectoriesXYZ(ofstream *out);
333 bool Checkout(ofstream *out) const;
334 bool OutputTemperatureFromTrajectories(ofstream *out, int startstep, int endstep, ofstream *output);
335
336 private:
337 int last_atom; //!< number given to last atom
338};
339
340/** A list of \a molecule classes.
341 */
342class MoleculeListClass {
343 public:
344 molecule **ListOfMolecules; //!< pointer list of fragment molecules to check for equality
345 int NumberOfMolecules; //!< Number of entries in \a **FragmentList and of to be returned one.
346 int NumberOfTopAtoms; //!< Number of atoms in the molecule from which all fragments originate
347
348 MoleculeListClass();
349 MoleculeListClass(int Num, int NumAtoms);
350 ~MoleculeListClass();
351
352 /// Output configs.
353 bool AddHydrogenCorrection(ofstream *out, char *path);
354 bool StoreForcesFile(ofstream *out, char *path, int *SortIndex);
355 bool OutputConfigForListOfFragments(ofstream *out, const char *fragmentprefix, config *configuration, int *SortIndex, bool DoPeriodic, bool DoCentering);
356 void Output(ofstream *out);
357
358 private:
359};
360
361
362/** A leaf for a tree of \a molecule class
363 * Wraps molecules in a tree structure
364 */
365class MoleculeLeafClass {
366 public:
367 molecule *Leaf; //!< molecule of this leaf
368 //MoleculeLeafClass *UpLeaf; //!< Leaf one level up
369 //MoleculeLeafClass *DownLeaf; //!< First leaf one level down
370 MoleculeLeafClass *previous; //!< Previous leaf on this level
371 MoleculeLeafClass *next; //!< Next leaf on this level
372
373 //MoleculeLeafClass(MoleculeLeafClass *Up, MoleculeLeafClass *Previous);
374 MoleculeLeafClass(MoleculeLeafClass *PreviousLeaf);
375 ~MoleculeLeafClass();
376
377 bool AddLeaf(molecule *ptr, MoleculeLeafClass *Previous);
378 bool FillBondStructureFromReference(ofstream *out, molecule *reference, int &FragmentCounter, atom ***&ListOfLocalAtoms, bool FreeList = false);
379 bool FillRootStackForSubgraphs(ofstream *out, KeyStack *&RootStack, bool *AtomMask, int &FragmentCounter);
380 bool AssignKeySetsToFragment(ofstream *out, molecule *reference, Graph *KeySetList, atom ***&ListOfLocalAtoms, Graph **&FragmentList, int &FragmentCounter, bool FreeList = false);
381 bool FillListOfLocalAtoms(ofstream *out, atom ***&ListOfLocalAtoms, const int FragmentCounter, const int GlobalAtomCount, bool &FreeList);
382 void TranslateIndicesToGlobalIDs(ofstream *out, Graph **FragmentList, int &FragmentCounter, int &TotalNumberOfKeySets, Graph &TotalGraph);
383 int Count() const;
384};
385
386/** The config file.
387 * The class contains all parameters that control a dft run also functions to load and save.
388 */
389class config {
390 public:
391 int PsiType;
392 int MaxPsiDouble;
393 int PsiMaxNoUp;
394 int PsiMaxNoDown;
395 int MaxMinStopStep;
396 int InitMaxMinStopStep;
397 int ProcPEGamma;
398 int ProcPEPsi;
399 char *configpath;
400 char *configname;
401 bool FastParsing;
402 double Deltat;
403 int DoConstrainedMD;
404 int MaxOuterStep;
405 int Thermostat;
406 int *ThermostatImplemented;
407 char **ThermostatNames;
408 double TempFrequency;
409 double alpha;
410 double HooverMass;
411 double TargetTemp;
412 int ScaleTempStep;
413
414 private:
415 char *mainname;
416 char *defaultpath;
417 char *pseudopotpath;
418
419 int DoOutVis;
420 int DoOutMes;
421 int DoOutNICS;
422 int DoOutOrbitals;
423 int DoOutCurrent;
424 int DoFullCurrent;
425 int DoPerturbation;
426 int DoWannier;
427 int CommonWannier;
428 double SawtoothStart;
429 int VectorPlane;
430 double VectorCut;
431 int UseAddGramSch;
432 int Seed;
433
434 int OutVisStep;
435 int OutSrcStep;
436 int MaxPsiStep;
437 double EpsWannier;
438
439 int MaxMinStep;
440 double RelEpsTotalEnergy;
441 double RelEpsKineticEnergy;
442 int MaxMinGapStopStep;
443 int MaxInitMinStep;
444 double InitRelEpsTotalEnergy;
445 double InitRelEpsKineticEnergy;
446 int InitMaxMinGapStopStep;
447
448 //double BoxLength[NDIM*NDIM];
449
450 double ECut;
451 int MaxLevel;
452 int RiemannTensor;
453 int LevRFactor;
454 int RiemannLevel;
455 int Lev0Factor;
456 int RTActualUse;
457 int AddPsis;
458
459 double RCut;
460 int StructOpt;
461 int IsAngstroem;
462 int RelativeCoord;
463 int MaxTypes;
464
465
466 int ParseForParameter(int verbose, ifstream *file, const char *name, int sequential, int const xth, int const yth, int type, void *value, int repetition, int critical);
467
468 public:
469 config();
470 ~config();
471
472 int TestSyntax(char *filename, periodentafel *periode, molecule *mol);
473 void Load(char *filename, periodentafel *periode, molecule *mol);
474 void LoadOld(char *filename, periodentafel *periode, molecule *mol);
475 void RetrieveConfigPathAndName(string filename);
476 bool Save(ofstream *file, periodentafel *periode, molecule *mol) const;
477 bool SaveMPQC(ofstream *file, molecule *mol) const;
478 void Edit(molecule *mol);
479 bool GetIsAngstroem() const;
480 char *GetDefaultPath() const;
481 void SetDefaultPath(const char *path);
482 void InitThermostats(ifstream *source);
483};
484
485#endif /*MOLECULES_HPP_*/
486
Note: See TracBrowser for help on using the repository browser.