source: src/config.cpp@ ab3a0e

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 ab3a0e was 362b0e, checked in by Frederik Heber <heber@…>, 16 years ago

Adaptivity fixes, MD by VerletForceIntegration introduced, MD molecule::Trajectories, atom Max::Order, no more recursive going down the fragmentation level

MD
==
molecule::Trajectories is now a map to a struct trajectory list of all the MD steps.
struct Trajectory contains STL vectors of coordinates, velocities and forces. Both are needed for the new VerletForceIntegration.
Parsing of coordinates, velocities and forces from the config file was completely rewritten:

  • in the FastParsing case, we just scan for IonType1_1 to find the last step, set the file pointer there and scan all remaining ones
  • in the other case, we create the atoms in the first step and put them in a hash for lookup on later steps and read in sequentially (with file pointer moving on).
  • This is a lot faster than the old variant.

VerletForceIntegration() implemented in a working manner with force smoothing (mean of actual and last one).
OutputTrajectoriesXYZ() now concatenates the single MD steps into one xyz file, so that the animation can be viewed with e.g. jmol or vmd
config:Deltat is now public (lazy me) and set to 1 instead of 0 initially, also Deltat is parsed accordingly (if not present, defaults to 1)
MatrixContainer::ParseMatrix from parser.cpp is used during VerletForceIntegration() to parse the forces file. Consequently, we have included parser.* in the Makefile.am.
Fix: MoleculeListClass::OutputConfigForListOfFragments() stores config file under config::configpath, before it backup'd the path twice to PathBackup.

Adaptivity
==========
Adaptivity (CheckOrderAtSite()) had compared not absolute, but real values which caused sign problems and faulty behaviour.
Adapatvity (CheckOrderAtSite()) had included atoms by Order (desired one) not by FragOrder (current one) into the list of candidates, which caused faulty behaviour.
CheckOrderAtSite() did single stepping wrong as the mask bit (last in AtomMask) was checked for true not false! Also bit was not set to false initially in FragmentMolecule().
Adaptivity: FragmentMolecule now returns 1 - continue, 2 - don't ... to tell whether we still have to continue with the adaptive cycle (is given as return value from molecuilder)
introduced atom::MaxOrder
StoreOrderAtSiteFile() now also stores the MaxOrder and ParseOrderAtSiteFromFile() parses it back into atom class

Removed Fragmentation Recursion
===============================
As we switched in the prelude of the adaptivity to a monotonous increase from order 1 to the desired one, we don't need to recursively go down each level from a given current bond order, as all these fragments have already been created on the lower orders. Consequently, FragmentBOSSANOVA does not contain NumLevels or alike anymore. This simplified the code a bit, but probably is not yet completely done. (but is working, checked on heptan).
SPFragmentGenerator() does not need Labels anymore, global ones are used for checks. Consequently, PowerSetGenerator() and FragmentSearch structure don't initialise/contain them anymore. We always compare against ...->GetTrueFather()->nr.

  • Property mode set to 100644
File size: 62.5 KB
Line 
1/** \file config.cpp
2 *
3 * Function implementations for the class config.
4 *
5 */
6
7#include "molecules.hpp"
8
9/************************************* Functions for class config ***************************/
10
11/** Constructor for config file class.
12 */
13config::config()
14{
15 mainname = (char *) MallocString(sizeof(char)*MAXSTRINGSIZE,"config constructor: mainname");
16 defaultpath = (char *) MallocString(sizeof(char)*MAXSTRINGSIZE,"config constructor: mainname");
17 pseudopotpath = (char *) MallocString(sizeof(char)*MAXSTRINGSIZE,"config constructor: mainname");
18 configpath = (char *) MallocString(sizeof(char)*MAXSTRINGSIZE,"config constructor: mainname");
19 configname = (char *) MallocString(sizeof(char)*MAXSTRINGSIZE,"config constructor: mainname");
20 strcpy(mainname,"pcp");
21 strcpy(defaultpath,"not specified");
22 strcpy(pseudopotpath,"not specified");
23 configpath[0]='\0';
24 configname[0]='\0';
25
26 FastParsing = false;
27 ProcPEGamma=8;
28 ProcPEPsi=1;
29 DoOutVis=0;
30 DoOutMes=1;
31 DoOutNICS=0;
32 DoOutOrbitals=0;
33 DoOutCurrent=0;
34 DoPerturbation=0;
35 DoFullCurrent=0;
36 CommonWannier=0;
37 SawtoothStart=0.01;
38 VectorPlane=0;
39 VectorCut=0;
40 UseAddGramSch=1;
41 Seed=1;
42
43 MaxOuterStep=0;
44 Deltat=1;
45 OutVisStep=10;
46 OutSrcStep=5;
47 TargetTemp=0.00095004455;
48 ScaleTempStep=25;
49 MaxPsiStep=0;
50 EpsWannier=1e-7;
51
52 MaxMinStep=100;
53 RelEpsTotalEnergy=1e-7;
54 RelEpsKineticEnergy=1e-5;
55 MaxMinStopStep=1;
56 MaxMinGapStopStep=0;
57 MaxInitMinStep=100;
58 InitRelEpsTotalEnergy=1e-5;
59 InitRelEpsKineticEnergy=1e-4;
60 InitMaxMinStopStep=1;
61 InitMaxMinGapStopStep=0;
62
63 //BoxLength[NDIM*NDIM];
64
65 ECut=128.;
66 MaxLevel=5;
67 RiemannTensor=0;
68 LevRFactor=0;
69 RiemannLevel=0;
70 Lev0Factor=2;
71 RTActualUse=0;
72 PsiType=0;
73 MaxPsiDouble=0;
74 PsiMaxNoUp=0;
75 PsiMaxNoDown=0;
76 AddPsis=0;
77
78 RCut=20.;
79 StructOpt=0;
80 IsAngstroem=1;
81 RelativeCoord=0;
82 MaxTypes=0;
83};
84
85
86/** Destructor for config file class.
87 */
88config::~config()
89{
90 Free((void **)&mainname, "config::~config: *mainname");
91 Free((void **)&defaultpath, "config::~config: *defaultpath");
92 Free((void **)&pseudopotpath, "config::~config: *pseudopotpath");
93 Free((void **)&configpath, "config::~config: *configpath");
94 Free((void **)&configname, "config::~config: *configname");
95};
96
97/** Displays menu for editing each entry of the config file.
98 * Nothing fancy here, just lots of cout << Verbose(0)s for the menu and a switch/case
99 * for each entry of the config file structure.
100 */
101void config::Edit(molecule *mol)
102{
103 char choice;
104
105 do {
106 cout << Verbose(0) << "===========EDIT CONFIGURATION============================" << endl;
107 cout << Verbose(0) << " A - mainname (prefix for all runtime files)" << endl;
108 cout << Verbose(0) << " B - Default path (for runtime files)" << endl;
109 cout << Verbose(0) << " C - Path of pseudopotential files" << endl;
110 cout << Verbose(0) << " D - Number of coefficient sharing processes" << endl;
111 cout << Verbose(0) << " E - Number of wave function sharing processes" << endl;
112 cout << Verbose(0) << " F - 0: Don't output density for OpenDX, 1: do" << endl;
113 cout << Verbose(0) << " G - 0: Don't output physical data, 1: do" << endl;
114 cout << Verbose(0) << " H - 0: Don't output densities of each unperturbed orbital for OpenDX, 1: do" << endl;
115 cout << Verbose(0) << " I - 0: Don't output current density for OpenDX, 1: do" << endl;
116 cout << Verbose(0) << " J - 0: Don't do the full current calculation, 1: do" << endl;
117 cout << Verbose(0) << " K - 0: Don't do perturbation calculation to obtain susceptibility and shielding, 1: do" << endl;
118 cout << Verbose(0) << " L - 0: Wannier centres as calculated, 1: common centre for all, 2: unite centres according to spread, 3: cell centre, 4: shifted to nearest grid point" << endl;
119 cout << Verbose(0) << " M - Absolute begin of unphysical sawtooth transfer for position operator within cell" << endl;
120 cout << Verbose(0) << " N - (0,1,2) x,y,z-plane to do two-dimensional current vector cut" << endl;
121 cout << Verbose(0) << " O - Absolute position along vector cut axis for cut plane" << endl;
122 cout << Verbose(0) << " P - Additional Gram-Schmidt-Orthonormalization to stabilize numerics" << endl;
123 cout << Verbose(0) << " Q - Initial integer value of random number generator" << endl;
124 cout << Verbose(0) << " R - for perturbation 0, for structure optimization defines upper limit of iterations" << endl;
125 cout << Verbose(0) << " T - Output visual after ...th step" << endl;
126 cout << Verbose(0) << " U - Output source densities of wave functions after ...th step" << endl;
127 cout << Verbose(0) << " X - minimization iterations per wave function, if unsure leave at default value 0" << endl;
128 cout << Verbose(0) << " Y - tolerance value for total spread in iterative Jacobi diagonalization" << endl;
129 cout << Verbose(0) << " Z - Maximum number of minimization iterations" << endl;
130 cout << Verbose(0) << " a - Relative change in total energy to stop min. iteration" << endl;
131 cout << Verbose(0) << " b - Relative change in kinetic energy to stop min. iteration" << endl;
132 cout << Verbose(0) << " c - Check stop conditions every ..th step during min. iteration" << endl;
133 cout << Verbose(0) << " e - Maximum number of minimization iterations during initial level" << endl;
134 cout << Verbose(0) << " f - Relative change in total energy to stop min. iteration during initial level" << endl;
135 cout << Verbose(0) << " g - Relative change in kinetic energy to stop min. iteration during initial level" << endl;
136 cout << Verbose(0) << " h - Check stop conditions every ..th step during min. iteration during initial level" << endl;
137 cout << Verbose(0) << " j - six lower diagonal entries of matrix, defining the unit cell" << endl;
138 cout << Verbose(0) << " k - Energy cutoff of plane wave basis in Hartree" << endl;
139 cout << Verbose(0) << " l - Maximum number of levels in multi-level-ansatz" << endl;
140 cout << Verbose(0) << " m - Factor by which grid nodes increase between standard and upper level" << endl;
141 cout << Verbose(0) << " n - 0: Don't use RiemannTensor, 1: Do" << endl;
142 cout << Verbose(0) << " o - Factor by which grid nodes increase between Riemann and standard(?) level" << endl;
143 cout << Verbose(0) << " p - Number of Riemann levels" << endl;
144 cout << Verbose(0) << " r - 0: Don't Use RiemannTensor, 1: Do" << endl;
145 cout << Verbose(0) << " s - 0: Doubly occupied orbitals, 1: Up-/Down-Orbitals" << endl;
146 cout << Verbose(0) << " t - Number of orbitals (depends pn SpinType)" << endl;
147 cout << Verbose(0) << " u - Number of SpinUp orbitals (depends on SpinType)" << endl;
148 cout << Verbose(0) << " v - Number of SpinDown orbitals (depends on SpinType)" << endl;
149 cout << Verbose(0) << " w - Number of additional, unoccupied orbitals" << endl;
150 cout << Verbose(0) << " x - radial cutoff for ewald summation in Bohrradii" << endl;
151 cout << Verbose(0) << " y - 0: Don't do structure optimization beforehand, 1: Do" << endl;
152 cout << Verbose(0) << " z - 0: Units are in Bohr radii, 1: units are in Aengstrom" << endl;
153 cout << Verbose(0) << " i - 0: Coordinates given in file are absolute, 1: ... are relative to unit cell" << endl;
154 cout << Verbose(0) << "=========================================================" << endl;
155 cout << Verbose(0) << "INPUT: ";
156 cin >> choice;
157
158 switch (choice) {
159 case 'A': // mainname
160 cout << Verbose(0) << "Old: " << config::mainname << "\t new: ";
161 cin >> config::mainname;
162 break;
163 case 'B': // defaultpath
164 cout << Verbose(0) << "Old: " << config::defaultpath << "\t new: ";
165 cin >> config::defaultpath;
166 break;
167 case 'C': // pseudopotpath
168 cout << Verbose(0) << "Old: " << config::pseudopotpath << "\t new: ";
169 cin >> config::pseudopotpath;
170 break;
171
172 case 'D': // ProcPEGamma
173 cout << Verbose(0) << "Old: " << config::ProcPEGamma << "\t new: ";
174 cin >> config::ProcPEGamma;
175 break;
176 case 'E': // ProcPEPsi
177 cout << Verbose(0) << "Old: " << config::ProcPEPsi << "\t new: ";
178 cin >> config::ProcPEPsi;
179 break;
180 case 'F': // DoOutVis
181 cout << Verbose(0) << "Old: " << config::DoOutVis << "\t new: ";
182 cin >> config::DoOutVis;
183 break;
184 case 'G': // DoOutMes
185 cout << Verbose(0) << "Old: " << config::DoOutMes << "\t new: ";
186 cin >> config::DoOutMes;
187 break;
188 case 'H': // DoOutOrbitals
189 cout << Verbose(0) << "Old: " << config::DoOutOrbitals << "\t new: ";
190 cin >> config::DoOutOrbitals;
191 break;
192 case 'I': // DoOutCurrent
193 cout << Verbose(0) << "Old: " << config::DoOutCurrent << "\t new: ";
194 cin >> config::DoOutCurrent;
195 break;
196 case 'J': // DoFullCurrent
197 cout << Verbose(0) << "Old: " << config::DoFullCurrent << "\t new: ";
198 cin >> config::DoFullCurrent;
199 break;
200 case 'K': // DoPerturbation
201 cout << Verbose(0) << "Old: " << config::DoPerturbation << "\t new: ";
202 cin >> config::DoPerturbation;
203 break;
204 case 'L': // CommonWannier
205 cout << Verbose(0) << "Old: " << config::CommonWannier << "\t new: ";
206 cin >> config::CommonWannier;
207 break;
208 case 'M': // SawtoothStart
209 cout << Verbose(0) << "Old: " << config::SawtoothStart << "\t new: ";
210 cin >> config::SawtoothStart;
211 break;
212 case 'N': // VectorPlane
213 cout << Verbose(0) << "Old: " << config::VectorPlane << "\t new: ";
214 cin >> config::VectorPlane;
215 break;
216 case 'O': // VectorCut
217 cout << Verbose(0) << "Old: " << config::VectorCut << "\t new: ";
218 cin >> config::VectorCut;
219 break;
220 case 'P': // UseAddGramSch
221 cout << Verbose(0) << "Old: " << config::UseAddGramSch << "\t new: ";
222 cin >> config::UseAddGramSch;
223 break;
224 case 'Q': // Seed
225 cout << Verbose(0) << "Old: " << config::Seed << "\t new: ";
226 cin >> config::Seed;
227 break;
228
229 case 'R': // MaxOuterStep
230 cout << Verbose(0) << "Old: " << config::MaxOuterStep << "\t new: ";
231 cin >> config::MaxOuterStep;
232 break;
233 case 'T': // OutVisStep
234 cout << Verbose(0) << "Old: " << config::OutVisStep << "\t new: ";
235 cin >> config::OutVisStep;
236 break;
237 case 'U': // OutSrcStep
238 cout << Verbose(0) << "Old: " << config::OutSrcStep << "\t new: ";
239 cin >> config::OutSrcStep;
240 break;
241 case 'X': // MaxPsiStep
242 cout << Verbose(0) << "Old: " << config::MaxPsiStep << "\t new: ";
243 cin >> config::MaxPsiStep;
244 break;
245 case 'Y': // EpsWannier
246 cout << Verbose(0) << "Old: " << config::EpsWannier << "\t new: ";
247 cin >> config::EpsWannier;
248 break;
249
250 case 'Z': // MaxMinStep
251 cout << Verbose(0) << "Old: " << config::MaxMinStep << "\t new: ";
252 cin >> config::MaxMinStep;
253 break;
254 case 'a': // RelEpsTotalEnergy
255 cout << Verbose(0) << "Old: " << config::RelEpsTotalEnergy << "\t new: ";
256 cin >> config::RelEpsTotalEnergy;
257 break;
258 case 'b': // RelEpsKineticEnergy
259 cout << Verbose(0) << "Old: " << config::RelEpsKineticEnergy << "\t new: ";
260 cin >> config::RelEpsKineticEnergy;
261 break;
262 case 'c': // MaxMinStopStep
263 cout << Verbose(0) << "Old: " << config::MaxMinStopStep << "\t new: ";
264 cin >> config::MaxMinStopStep;
265 break;
266 case 'e': // MaxInitMinStep
267 cout << Verbose(0) << "Old: " << config::MaxInitMinStep << "\t new: ";
268 cin >> config::MaxInitMinStep;
269 break;
270 case 'f': // InitRelEpsTotalEnergy
271 cout << Verbose(0) << "Old: " << config::InitRelEpsTotalEnergy << "\t new: ";
272 cin >> config::InitRelEpsTotalEnergy;
273 break;
274 case 'g': // InitRelEpsKineticEnergy
275 cout << Verbose(0) << "Old: " << config::InitRelEpsKineticEnergy << "\t new: ";
276 cin >> config::InitRelEpsKineticEnergy;
277 break;
278 case 'h': // InitMaxMinStopStep
279 cout << Verbose(0) << "Old: " << config::InitMaxMinStopStep << "\t new: ";
280 cin >> config::InitMaxMinStopStep;
281 break;
282
283 case 'j': // BoxLength
284 cout << Verbose(0) << "enter lower triadiagonalo form of basis matrix" << endl << endl;
285 for (int i=6;i--;) {
286 cout << Verbose(0) << "Cell size" << i << ": ";
287 cin >> mol->cell_size[i];
288 }
289 break;
290
291 case 'k': // ECut
292 cout << Verbose(0) << "Old: " << config::ECut << "\t new: ";
293 cin >> config::ECut;
294 break;
295 case 'l': // MaxLevel
296 cout << Verbose(0) << "Old: " << config::MaxLevel << "\t new: ";
297 cin >> config::MaxLevel;
298 break;
299 case 'm': // RiemannTensor
300 cout << Verbose(0) << "Old: " << config::RiemannTensor << "\t new: ";
301 cin >> config::RiemannTensor;
302 break;
303 case 'n': // LevRFactor
304 cout << Verbose(0) << "Old: " << config::LevRFactor << "\t new: ";
305 cin >> config::LevRFactor;
306 break;
307 case 'o': // RiemannLevel
308 cout << Verbose(0) << "Old: " << config::RiemannLevel << "\t new: ";
309 cin >> config::RiemannLevel;
310 break;
311 case 'p': // Lev0Factor
312 cout << Verbose(0) << "Old: " << config::Lev0Factor << "\t new: ";
313 cin >> config::Lev0Factor;
314 break;
315 case 'r': // RTActualUse
316 cout << Verbose(0) << "Old: " << config::RTActualUse << "\t new: ";
317 cin >> config::RTActualUse;
318 break;
319 case 's': // PsiType
320 cout << Verbose(0) << "Old: " << config::PsiType << "\t new: ";
321 cin >> config::PsiType;
322 break;
323 case 't': // MaxPsiDouble
324 cout << Verbose(0) << "Old: " << config::MaxPsiDouble << "\t new: ";
325 cin >> config::MaxPsiDouble;
326 break;
327 case 'u': // PsiMaxNoUp
328 cout << Verbose(0) << "Old: " << config::PsiMaxNoUp << "\t new: ";
329 cin >> config::PsiMaxNoUp;
330 break;
331 case 'v': // PsiMaxNoDown
332 cout << Verbose(0) << "Old: " << config::PsiMaxNoDown << "\t new: ";
333 cin >> config::PsiMaxNoDown;
334 break;
335 case 'w': // AddPsis
336 cout << Verbose(0) << "Old: " << config::AddPsis << "\t new: ";
337 cin >> config::AddPsis;
338 break;
339
340 case 'x': // RCut
341 cout << Verbose(0) << "Old: " << config::RCut << "\t new: ";
342 cin >> config::RCut;
343 break;
344 case 'y': // StructOpt
345 cout << Verbose(0) << "Old: " << config::StructOpt << "\t new: ";
346 cin >> config::StructOpt;
347 break;
348 case 'z': // IsAngstroem
349 cout << Verbose(0) << "Old: " << config::IsAngstroem << "\t new: ";
350 cin >> config::IsAngstroem;
351 break;
352 case 'i': // RelativeCoord
353 cout << Verbose(0) << "Old: " << config::RelativeCoord << "\t new: ";
354 cin >> config::RelativeCoord;
355 break;
356 };
357 } while (choice != 'q');
358};
359
360/** Tests whether a given configuration file adhears to old or new syntax.
361 * \param *filename filename of config file to be tested
362 * \param *periode pointer to a periodentafel class with all elements
363 * \param *mol pointer to molecule containing all atoms of the molecule
364 * \return 0 - old syntax, 1 - new syntax, -1 - unknown syntax
365 */
366int config::TestSyntax(char *filename, periodentafel *periode, molecule *mol)
367{
368 int test;
369 ifstream file(filename);
370
371 // search file for keyword: ProcPEGamma (new syntax)
372 if (ParseForParameter(1,&file,"ProcPEGamma", 0, 1, 1, int_type, &test, 1, optional)) {
373 file.close();
374 return 1;
375 }
376 // search file for keyword: ProcsGammaPsi (old syntax)
377 if (ParseForParameter(1,&file,"ProcsGammaPsi", 0, 1, 1, int_type, &test, 1, optional)) {
378 file.close();
379 return 0;
380 }
381 file.close();
382 return -1;
383}
384
385/** Returns private config::IsAngstroem.
386 * \return IsAngstroem
387 */
388bool config::GetIsAngstroem() const
389{
390 return (IsAngstroem == 1);
391};
392
393/** Returns private config::*defaultpath.
394 * \return *defaultpath
395 */
396char * config::GetDefaultPath() const
397{
398 return defaultpath;
399};
400
401
402/** Returns private config::*defaultpath.
403 * \return *defaultpath
404 */
405void config::SetDefaultPath(const char *path)
406{
407 strcpy(defaultpath, path);
408};
409
410/** Retrieves the path in the given config file name.
411 * \param filename config file string
412 */
413void config::RetrieveConfigPathAndName(string filename)
414{
415 char *ptr = NULL;
416 char *buffer = new char[MAXSTRINGSIZE];
417 strncpy(buffer, filename.c_str(), MAXSTRINGSIZE);
418 int last = -1;
419 for(last=MAXSTRINGSIZE;last--;) {
420 if (buffer[last] == '/')
421 break;
422 }
423 if (last == -1) { // no path in front, set to local directory.
424 strcpy(configpath, "./");
425 ptr = buffer;
426 } else {
427 strncpy(configpath, buffer, last+1);
428 ptr = &buffer[last+1];
429 if (last < 254)
430 configpath[last+1]='\0';
431 }
432 strcpy(configname, ptr);
433 cout << "Found configpath: " << configpath << ", dir slash was found at " << last << ", config name is " << configname << "." << endl;
434 delete[](buffer);
435};
436
437
438/** Initializes config file structure by loading elements from a give file.
439 * \param *file input file stream being the opened config file
440 * \param *periode pointer to a periodentafel class with all elements
441 * \param *mol pointer to molecule containing all atoms of the molecule
442 */
443void config::Load(char *filename, periodentafel *periode, molecule *mol)
444{
445 ifstream *file = new ifstream(filename);
446 if (file == NULL) {
447 cerr << "ERROR: config file " << filename << " missing!" << endl;
448 return;
449 }
450 RetrieveConfigPathAndName(filename);
451 // ParseParameters
452
453 /* Oeffne Hauptparameterdatei */
454 int di;
455 double BoxLength[9];
456 string zeile;
457 string dummy;
458 element *elementhash[MAX_ELEMENTS];
459 char name[MAX_ELEMENTS];
460 char keyword[MAX_ELEMENTS];
461 int Z, No[MAX_ELEMENTS];
462 int verbose = 0;
463 double value[3];
464
465 /* Namen einlesen */
466
467 ParseForParameter(verbose,file, "mainname", 0, 1, 1, string_type, (config::mainname), 1, critical);
468 ParseForParameter(verbose,file, "defaultpath", 0, 1, 1, string_type, (config::defaultpath), 1, critical);
469 ParseForParameter(verbose,file, "pseudopotpath", 0, 1, 1, string_type, (config::pseudopotpath), 1, critical);
470 ParseForParameter(verbose,file,"ProcPEGamma", 0, 1, 1, int_type, &(config::ProcPEGamma), 1, critical);
471 ParseForParameter(verbose,file,"ProcPEPsi", 0, 1, 1, int_type, &(config::ProcPEPsi), 1, critical);
472
473 if (!ParseForParameter(verbose,file,"Seed", 0, 1, 1, int_type, &(config::Seed), 1, optional))
474 config::Seed = 1;
475
476 if(!ParseForParameter(verbose,file,"DoOutOrbitals", 0, 1, 1, int_type, &(config::DoOutOrbitals), 1, optional)) {
477 config::DoOutOrbitals = 0;
478 } else {
479 if (config::DoOutOrbitals < 0) config::DoOutOrbitals = 0;
480 if (config::DoOutOrbitals > 1) config::DoOutOrbitals = 1;
481 }
482 ParseForParameter(verbose,file,"DoOutVis", 0, 1, 1, int_type, &(config::DoOutVis), 1, critical);
483 if (config::DoOutVis < 0) config::DoOutVis = 0;
484 if (config::DoOutVis > 1) config::DoOutVis = 1;
485 if (!ParseForParameter(verbose,file,"VectorPlane", 0, 1, 1, int_type, &(config::VectorPlane), 1, optional))
486 config::VectorPlane = -1;
487 if (!ParseForParameter(verbose,file,"VectorCut", 0, 1, 1, double_type, &(config::VectorCut), 1, optional))
488 config::VectorCut = 0.;
489 ParseForParameter(verbose,file,"DoOutMes", 0, 1, 1, int_type, &(config::DoOutMes), 1, critical);
490 if (config::DoOutMes < 0) config::DoOutMes = 0;
491 if (config::DoOutMes > 1) config::DoOutMes = 1;
492 if (!ParseForParameter(verbose,file,"DoOutCurr", 0, 1, 1, int_type, &(config::DoOutCurrent), 1, optional))
493 config::DoOutCurrent = 0;
494 if (config::DoOutCurrent < 0) config::DoOutCurrent = 0;
495 if (config::DoOutCurrent > 1) config::DoOutCurrent = 1;
496 ParseForParameter(verbose,file,"AddGramSch", 0, 1, 1, int_type, &(config::UseAddGramSch), 1, critical);
497 if (config::UseAddGramSch < 0) config::UseAddGramSch = 0;
498 if (config::UseAddGramSch > 2) config::UseAddGramSch = 2;
499 if(!ParseForParameter(verbose,file,"CommonWannier", 0, 1, 1, int_type, &(config::CommonWannier), 1, optional)) {
500 config::CommonWannier = 0;
501 } else {
502 if (config::CommonWannier < 0) config::CommonWannier = 0;
503 if (config::CommonWannier > 4) config::CommonWannier = 4;
504 }
505 if(!ParseForParameter(verbose,file,"SawtoothStart", 0, 1, 1, double_type, &(config::SawtoothStart), 1, optional)) {
506 config::SawtoothStart = 0.01;
507 } else {
508 if (config::SawtoothStart < 0.) config::SawtoothStart = 0.;
509 if (config::SawtoothStart > 1.) config::SawtoothStart = 1.;
510 }
511
512 ParseForParameter(verbose,file,"MaxOuterStep", 0, 1, 1, int_type, &(config::MaxOuterStep), 1, critical);
513 if (!ParseForParameter(verbose,file,"Deltat", 0, 1, 1, double_type, &(config::Deltat), 1, optional))
514 config::Deltat = 1;
515 ParseForParameter(verbose,file,"OutVisStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional);
516 ParseForParameter(verbose,file,"OutSrcStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional);
517 ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &(config::TargetTemp), 1, optional);
518 //ParseForParameter(verbose,file,"Thermostat", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional);
519 if (!ParseForParameter(verbose,file,"EpsWannier", 0, 1, 1, double_type, &(config::EpsWannier), 1, optional))
520 config::EpsWannier = 1e-8;
521
522 // stop conditions
523 //if (config::MaxOuterStep <= 0) config::MaxOuterStep = 1;
524 ParseForParameter(verbose,file,"MaxPsiStep", 0, 1, 1, int_type, &(config::MaxPsiStep), 1, critical);
525 if (config::MaxPsiStep <= 0) config::MaxPsiStep = 3;
526
527 ParseForParameter(verbose,file,"MaxMinStep", 0, 1, 1, int_type, &(config::MaxMinStep), 1, critical);
528 ParseForParameter(verbose,file,"RelEpsTotalE", 0, 1, 1, double_type, &(config::RelEpsTotalEnergy), 1, critical);
529 ParseForParameter(verbose,file,"RelEpsKineticE", 0, 1, 1, double_type, &(config::RelEpsKineticEnergy), 1, critical);
530 ParseForParameter(verbose,file,"MaxMinStopStep", 0, 1, 1, int_type, &(config::MaxMinStopStep), 1, critical);
531 ParseForParameter(verbose,file,"MaxMinGapStopStep", 0, 1, 1, int_type, &(config::MaxMinGapStopStep), 1, critical);
532 if (config::MaxMinStep <= 0) config::MaxMinStep = config::MaxPsiStep;
533 if (config::MaxMinStopStep < 1) config::MaxMinStopStep = 1;
534 if (config::MaxMinGapStopStep < 1) config::MaxMinGapStopStep = 1;
535
536 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 1, 1, int_type, &(config::MaxInitMinStep), 1, critical);
537 ParseForParameter(verbose,file,"InitRelEpsTotalE", 0, 1, 1, double_type, &(config::InitRelEpsTotalEnergy), 1, critical);
538 ParseForParameter(verbose,file,"InitRelEpsKineticE", 0, 1, 1, double_type, &(config::InitRelEpsKineticEnergy), 1, critical);
539 ParseForParameter(verbose,file,"InitMaxMinStopStep", 0, 1, 1, int_type, &(config::InitMaxMinStopStep), 1, critical);
540 ParseForParameter(verbose,file,"InitMaxMinGapStopStep", 0, 1, 1, int_type, &(config::InitMaxMinGapStopStep), 1, critical);
541 if (config::MaxInitMinStep <= 0) config::MaxInitMinStep = config::MaxPsiStep;
542 if (config::InitMaxMinStopStep < 1) config::InitMaxMinStopStep = 1;
543 if (config::InitMaxMinGapStopStep < 1) config::InitMaxMinGapStopStep = 1;
544
545 // Unit cell and magnetic field
546 ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
547 mol->cell_size[0] = BoxLength[0];
548 mol->cell_size[1] = BoxLength[3];
549 mol->cell_size[2] = BoxLength[4];
550 mol->cell_size[3] = BoxLength[6];
551 mol->cell_size[4] = BoxLength[7];
552 mol->cell_size[5] = BoxLength[8];
553 if (1) fprintf(stderr,"\n");
554
555 ParseForParameter(verbose,file,"DoPerturbation", 0, 1, 1, int_type, &(config::DoPerturbation), 1, optional);
556 ParseForParameter(verbose,file,"DoOutNICS", 0, 1, 1, int_type, &(config::DoOutNICS), 1, optional);
557 if (!ParseForParameter(verbose,file,"DoFullCurrent", 0, 1, 1, int_type, &(config::DoFullCurrent), 1, optional))
558 config::DoFullCurrent = 0;
559 if (config::DoFullCurrent < 0) config::DoFullCurrent = 0;
560 if (config::DoFullCurrent > 2) config::DoFullCurrent = 2;
561 if (config::DoOutNICS < 0) config::DoOutNICS = 0;
562 if (config::DoOutNICS > 2) config::DoOutNICS = 2;
563 if (config::DoPerturbation == 0) {
564 config::DoFullCurrent = 0;
565 config::DoOutNICS = 0;
566 }
567
568 ParseForParameter(verbose,file,"ECut", 0, 1, 1, double_type, &(config::ECut), 1, critical);
569 ParseForParameter(verbose,file,"MaxLevel", 0, 1, 1, int_type, &(config::MaxLevel), 1, critical);
570 ParseForParameter(verbose,file,"Level0Factor", 0, 1, 1, int_type, &(config::Lev0Factor), 1, critical);
571 if (config::Lev0Factor < 2) {
572 config::Lev0Factor = 2;
573 }
574 ParseForParameter(verbose,file,"RiemannTensor", 0, 1, 1, int_type, &di, 1, critical);
575 if (di >= 0 && di < 2) {
576 config::RiemannTensor = di;
577 } else {
578 fprintf(stderr, "0 <= RiemanTensor < 2: 0 UseNotRT, 1 UseRT");
579 exit(1);
580 }
581 switch (config::RiemannTensor) {
582 case 0: //UseNoRT
583 if (config::MaxLevel < 2) {
584 config::MaxLevel = 2;
585 }
586 config::LevRFactor = 2;
587 config::RTActualUse = 0;
588 break;
589 case 1: // UseRT
590 if (config::MaxLevel < 3) {
591 config::MaxLevel = 3;
592 }
593 ParseForParameter(verbose,file,"RiemannLevel", 0, 1, 1, int_type, &(config::RiemannLevel), 1, critical);
594 if (config::RiemannLevel < 2) {
595 config::RiemannLevel = 2;
596 }
597 if (config::RiemannLevel > config::MaxLevel-1) {
598 config::RiemannLevel = config::MaxLevel-1;
599 }
600 ParseForParameter(verbose,file,"LevRFactor", 0, 1, 1, int_type, &(config::LevRFactor), 1, critical);
601 if (config::LevRFactor < 2) {
602 config::LevRFactor = 2;
603 }
604 config::Lev0Factor = 2;
605 config::RTActualUse = 2;
606 break;
607 }
608 ParseForParameter(verbose,file,"PsiType", 0, 1, 1, int_type, &di, 1, critical);
609 if (di >= 0 && di < 2) {
610 config::PsiType = di;
611 } else {
612 fprintf(stderr, "0 <= PsiType < 2: 0 UseSpinDouble, 1 UseSpinUpDown");
613 exit(1);
614 }
615 switch (config::PsiType) {
616 case 0: // SpinDouble
617 ParseForParameter(verbose,file,"MaxPsiDouble", 0, 1, 1, int_type, &(config::MaxPsiDouble), 1, critical);
618 ParseForParameter(verbose,file,"AddPsis", 0, 1, 1, int_type, &(config::AddPsis), 1, optional);
619 break;
620 case 1: // SpinUpDown
621 if (config::ProcPEGamma % 2) config::ProcPEGamma*=2;
622 ParseForParameter(verbose,file,"PsiMaxNoUp", 0, 1, 1, int_type, &(config::PsiMaxNoUp), 1, critical);
623 ParseForParameter(verbose,file,"PsiMaxNoDown", 0, 1, 1, int_type, &(config::PsiMaxNoDown), 1, critical);
624 ParseForParameter(verbose,file,"AddPsis", 0, 1, 1, int_type, &(config::AddPsis), 1, optional);
625 break;
626 }
627
628 // IonsInitRead
629
630 ParseForParameter(verbose,file,"RCut", 0, 1, 1, double_type, &(config::RCut), 1, critical);
631 ParseForParameter(verbose,file,"IsAngstroem", 0, 1, 1, int_type, &(config::IsAngstroem), 1, critical);
632 ParseForParameter(verbose,file,"MaxTypes", 0, 1, 1, int_type, &(config::MaxTypes), 1, critical);
633 if (!ParseForParameter(verbose,file,"RelativeCoord", 0, 1, 1, int_type, &(config::RelativeCoord) , 1, optional))
634 config::RelativeCoord = 0;
635 if (!ParseForParameter(verbose,file,"StructOpt", 0, 1, 1, int_type, &(config::StructOpt), 1, optional))
636 config::StructOpt = 0;
637 // prescan number of ions per type
638 cout << Verbose(0) << "Prescanning ions per type: " << endl;
639 for (int i=0; i < config::MaxTypes; i++) {
640 sprintf(name,"Ion_Type%i",i+1);
641 ParseForParameter(verbose,file, (const char*)name, 0, 1, 1, int_type, &No[i], 1, critical);
642 ParseForParameter(verbose,file, name, 0, 2, 1, int_type, &Z, 1, critical);
643 elementhash[i] = periode->FindElement(Z);
644 cout << Verbose(1) << i << ". Z = " << elementhash[i]->Z << " with " << No[i] << " ions." << endl;
645 }
646 int repetition = 0; // which repeated keyword shall be read
647
648 map<int, atom *> AtomList[config::MaxTypes];
649 if (!FastParsing) {
650 // parse in trajectories
651 bool status = true;
652 atom *neues = NULL;
653 while (status) {
654 for (int i=0; i < config::MaxTypes; i++) {
655 sprintf(name,"Ion_Type%i",i+1);
656 for(int j=0;j<No[i];j++) {
657 sprintf(keyword,"%s_%i",name, j+1);
658 if (repetition == 0) {
659 neues = new atom();
660 AtomList[i][j] = neues;
661 neues->type = elementhash[i]; // find element type
662 mol->AddAtom(neues);
663 } else
664 neues = AtomList[i][j];
665 status = (status &&
666 ParseForParameter(verbose,file, keyword, 0, 1, 1, double_type, &neues->x.x[0], 1, (repetition == 0) ? critical : optional) &&
667 ParseForParameter(verbose,file, keyword, 0, 2, 1, double_type, &neues->x.x[1], 1, (repetition == 0) ? critical : optional) &&
668 ParseForParameter(verbose,file, keyword, 0, 3, 1, double_type, &neues->x.x[2], 1, (repetition == 0) ? critical : optional) &&
669 ParseForParameter(verbose,file, keyword, 0, 4, 1, int_type, &neues->FixedIon, 1, (repetition == 0) ? critical : optional));
670 if (!status) break;
671
672 // check size of vectors
673 if (mol->Trajectories[neues].R.size() <= (unsigned int)(repetition)) {
674 //cout << "Increasing size for trajectory array of " << keyword << " to " << (repetition+10) << "." << endl;
675 mol->Trajectories[neues].R.resize(repetition+10);
676 mol->Trajectories[neues].U.resize(repetition+10);
677 mol->Trajectories[neues].F.resize(repetition+10);
678 }
679
680 // put into trajectories list
681 for (int d=0;d<NDIM;d++)
682 mol->Trajectories[neues].R.at(repetition).x[d] = neues->x.x[d];
683
684 // parse velocities if present
685 if(!ParseForParameter(verbose,file, keyword, 0, 5, 1, double_type, &neues->v.x[0], 1,optional))
686 neues->v.x[0] = 0.;
687 if(!ParseForParameter(verbose,file, keyword, 0, 6, 1, double_type, &neues->v.x[1], 1,optional))
688 neues->v.x[1] = 0.;
689 if(!ParseForParameter(verbose,file, keyword, 0, 7, 1, double_type, &neues->v.x[2], 1,optional))
690 neues->v.x[2] = 0.;
691 for (int d=0;d<NDIM;d++)
692 mol->Trajectories[neues].U.at(repetition).x[d] = neues->v.x[d];
693
694 // parse forces if present
695 if(!ParseForParameter(verbose,file, keyword, 0, 8, 1, double_type, &value[0], 1,optional))
696 value[0] = 0.;
697 if(!ParseForParameter(verbose,file, keyword, 0, 9, 1, double_type, &value[1], 1,optional))
698 value[1] = 0.;
699 if(!ParseForParameter(verbose,file, keyword, 1, 10, 1, double_type, &value[2], 1,optional))
700 value[2] = 0.;
701 for (int d=0;d<NDIM;d++)
702 mol->Trajectories[neues].F.at(repetition).x[d] = value[d];
703
704// cout << "Parsed position of step " << (repetition) << ": (";
705// for (int d=0;d<NDIM;d++)
706// cout << mol->Trajectories[neues].R.at(repetition).x[d] << " "; // next step
707// cout << ")\t(";
708// for (int d=0;d<NDIM;d++)
709// cout << mol->Trajectories[neues].U.at(repetition).x[d] << " "; // next step
710// cout << ")\t(";
711// for (int d=0;d<NDIM;d++)
712// cout << mol->Trajectories[neues].F.at(repetition).x[d] << " "; // next step
713// cout << ")" << endl;
714 }
715 }
716 repetition++;
717 }
718 repetition--;
719 cout << "Found " << repetition << " trajectory steps." << endl;
720 mol->MDSteps = repetition;
721 } else {
722 // find the maximum number of MD steps so that we may parse last one (Ion_Type1_1 must always be present, because is the first atom)
723 repetition = 0;
724 while ( ParseForParameter(verbose,file, "Ion_Type1_1", 0, 1, 1, double_type, &value[0], repetition, (repetition == 0) ? critical : optional) &&
725 ParseForParameter(verbose,file, "Ion_Type1_1", 0, 2, 1, double_type, &value[1], repetition, (repetition == 0) ? critical : optional) &&
726 ParseForParameter(verbose,file, "Ion_Type1_1", 0, 3, 1, double_type, &value[2], repetition, (repetition == 0) ? critical : optional))
727 repetition++;
728 cout << "I found " << repetition << " times the keyword Ion_Type1_1." << endl;
729 // parse in molecule coordinates
730 for (int i=0; i < config::MaxTypes; i++) {
731 sprintf(name,"Ion_Type%i",i+1);
732 for(int j=0;j<No[i];j++) {
733 sprintf(keyword,"%s_%i",name, j+1);
734 atom *neues = new atom();
735 // then parse for each atom the coordinates as often as present
736 ParseForParameter(verbose,file, keyword, 0, 1, 1, double_type, &neues->x.x[0], repetition,critical);
737 ParseForParameter(verbose,file, keyword, 0, 2, 1, double_type, &neues->x.x[1], repetition,critical);
738 ParseForParameter(verbose,file, keyword, 0, 3, 1, double_type, &neues->x.x[2], repetition,critical);
739 ParseForParameter(verbose,file, keyword, 0, 4, 1, int_type, &neues->FixedIon, repetition,critical);
740 if(!ParseForParameter(verbose,file, keyword, 0, 5, 1, double_type, &neues->v.x[0], repetition,optional))
741 neues->v.x[0] = 0.;
742 if(!ParseForParameter(verbose,file, keyword, 0, 6, 1, double_type, &neues->v.x[1], repetition,optional))
743 neues->v.x[1] = 0.;
744 if(!ParseForParameter(verbose,file, keyword, 0, 7, 1, double_type, &neues->v.x[2], repetition,optional))
745 neues->v.x[2] = 0.;
746 // here we don't care if forces are present (last in trajectories is always equal to current position)
747 neues->type = elementhash[i]; // find element type
748 mol->AddAtom(neues);
749 }
750 }
751 }
752 file->close();
753 delete(file);
754};
755
756/** Initializes config file structure by loading elements from a give file with old pcp syntax.
757 * \param *file input file stream being the opened config file with old pcp syntax
758 * \param *periode pointer to a periodentafel class with all elements
759 * \param *mol pointer to molecule containing all atoms of the molecule
760 */
761void config::LoadOld(char *filename, periodentafel *periode, molecule *mol)
762{
763 ifstream *file = new ifstream(filename);
764 if (file == NULL) {
765 cerr << "ERROR: config file " << filename << " missing!" << endl;
766 return;
767 }
768 RetrieveConfigPathAndName(filename);
769 // ParseParameters
770
771 /* Oeffne Hauptparameterdatei */
772 int l, i, di;
773 double a,b;
774 double BoxLength[9];
775 string zeile;
776 string dummy;
777 element *elementhash[128];
778 int Z, No, AtomNo, found;
779 int verbose = 0;
780
781 /* Namen einlesen */
782
783 ParseForParameter(verbose,file, "mainname", 0, 1, 1, string_type, (config::mainname), 1, critical);
784 ParseForParameter(verbose,file, "defaultpath", 0, 1, 1, string_type, (config::defaultpath), 1, critical);
785 ParseForParameter(verbose,file, "pseudopotpath", 0, 1, 1, string_type, (config::pseudopotpath), 1, critical);
786 ParseForParameter(verbose,file, "ProcsGammaPsi", 0, 1, 1, int_type, &(config::ProcPEGamma), 1, critical);
787 ParseForParameter(verbose,file, "ProcsGammaPsi", 0, 2, 1, int_type, &(config::ProcPEPsi), 1, critical);
788 config::Seed = 1;
789 config::DoOutOrbitals = 0;
790 ParseForParameter(verbose,file,"DoOutVis", 0, 1, 1, int_type, &(config::DoOutVis), 1, critical);
791 if (config::DoOutVis < 0) config::DoOutVis = 0;
792 if (config::DoOutVis > 1) config::DoOutVis = 1;
793 config::VectorPlane = -1;
794 config::VectorCut = 0.;
795 ParseForParameter(verbose,file,"DoOutMes", 0, 1, 1, int_type, &(config::DoOutMes), 1, critical);
796 if (config::DoOutMes < 0) config::DoOutMes = 0;
797 if (config::DoOutMes > 1) config::DoOutMes = 1;
798 config::DoOutCurrent = 0;
799 ParseForParameter(verbose,file,"AddGramSch", 0, 1, 1, int_type, &(config::UseAddGramSch), 1, critical);
800 if (config::UseAddGramSch < 0) config::UseAddGramSch = 0;
801 if (config::UseAddGramSch > 2) config::UseAddGramSch = 2;
802 config::CommonWannier = 0;
803 config::SawtoothStart = 0.01;
804
805 ParseForParameter(verbose,file,"MaxOuterStep", 0, 1, 1, double_type, &(config::MaxOuterStep), 1, critical);
806 ParseForParameter(verbose,file,"Deltat", 0, 1, 1, double_type, &(config::Deltat), 1, optional);
807 ParseForParameter(verbose,file,"VisOuterStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional);
808 ParseForParameter(verbose,file,"VisSrcOuterStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional);
809 ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &(config::TargetTemp), 1, optional);
810 ParseForParameter(verbose,file,"ScaleTempStep", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional);
811 config::EpsWannier = 1e-8;
812
813 // stop conditions
814 //if (config::MaxOuterStep <= 0) config::MaxOuterStep = 1;
815 ParseForParameter(verbose,file,"MaxPsiStep", 0, 1, 1, int_type, &(config::MaxPsiStep), 1, critical);
816 if (config::MaxPsiStep <= 0) config::MaxPsiStep = 3;
817
818 ParseForParameter(verbose,file,"MaxMinStep", 0, 1, 1, int_type, &(config::MaxMinStep), 1, critical);
819 ParseForParameter(verbose,file,"MaxMinStep", 0, 2, 1, double_type, &(config::RelEpsTotalEnergy), 1, critical);
820 ParseForParameter(verbose,file,"MaxMinStep", 0, 3, 1, double_type, &(config::RelEpsKineticEnergy), 1, critical);
821 ParseForParameter(verbose,file,"MaxMinStep", 0, 4, 1, int_type, &(config::MaxMinStopStep), 1, critical);
822 if (config::MaxMinStep <= 0) config::MaxMinStep = config::MaxPsiStep;
823 if (config::MaxMinStopStep < 1) config::MaxMinStopStep = 1;
824 config::MaxMinGapStopStep = 1;
825
826 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 1, 1, int_type, &(config::MaxInitMinStep), 1, critical);
827 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 2, 1, double_type, &(config::InitRelEpsTotalEnergy), 1, critical);
828 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 3, 1, double_type, &(config::InitRelEpsKineticEnergy), 1, critical);
829 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 4, 1, int_type, &(config::InitMaxMinStopStep), 1, critical);
830 if (config::MaxInitMinStep <= 0) config::MaxInitMinStep = config::MaxPsiStep;
831 if (config::InitMaxMinStopStep < 1) config::InitMaxMinStopStep = 1;
832 config::InitMaxMinGapStopStep = 1;
833
834 ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
835 mol->cell_size[0] = BoxLength[0];
836 mol->cell_size[1] = BoxLength[3];
837 mol->cell_size[2] = BoxLength[4];
838 mol->cell_size[3] = BoxLength[6];
839 mol->cell_size[4] = BoxLength[7];
840 mol->cell_size[5] = BoxLength[8];
841 if (1) fprintf(stderr,"\n");
842 config::DoPerturbation = 0;
843 config::DoFullCurrent = 0;
844
845 ParseForParameter(verbose,file,"ECut", 0, 1, 1, double_type, &(config::ECut), 1, critical);
846 ParseForParameter(verbose,file,"MaxLevel", 0, 1, 1, int_type, &(config::MaxLevel), 1, critical);
847 ParseForParameter(verbose,file,"Level0Factor", 0, 1, 1, int_type, &(config::Lev0Factor), 1, critical);
848 if (config::Lev0Factor < 2) {
849 config::Lev0Factor = 2;
850 }
851 ParseForParameter(verbose,file,"RiemannTensor", 0, 1, 1, int_type, &di, 1, critical);
852 if (di >= 0 && di < 2) {
853 config::RiemannTensor = di;
854 } else {
855 fprintf(stderr, "0 <= RiemanTensor < 2: 0 UseNotRT, 1 UseRT");
856 exit(1);
857 }
858 switch (config::RiemannTensor) {
859 case 0: //UseNoRT
860 if (config::MaxLevel < 2) {
861 config::MaxLevel = 2;
862 }
863 config::LevRFactor = 2;
864 config::RTActualUse = 0;
865 break;
866 case 1: // UseRT
867 if (config::MaxLevel < 3) {
868 config::MaxLevel = 3;
869 }
870 ParseForParameter(verbose,file,"RiemannLevel", 0, 1, 1, int_type, &(config::RiemannLevel), 1, critical);
871 if (config::RiemannLevel < 2) {
872 config::RiemannLevel = 2;
873 }
874 if (config::RiemannLevel > config::MaxLevel-1) {
875 config::RiemannLevel = config::MaxLevel-1;
876 }
877 ParseForParameter(verbose,file,"LevRFactor", 0, 1, 1, int_type, &(config::LevRFactor), 1, critical);
878 if (config::LevRFactor < 2) {
879 config::LevRFactor = 2;
880 }
881 config::Lev0Factor = 2;
882 config::RTActualUse = 2;
883 break;
884 }
885 ParseForParameter(verbose,file,"PsiType", 0, 1, 1, int_type, &di, 1, critical);
886 if (di >= 0 && di < 2) {
887 config::PsiType = di;
888 } else {
889 fprintf(stderr, "0 <= PsiType < 2: 0 UseSpinDouble, 1 UseSpinUpDown");
890 exit(1);
891 }
892 switch (config::PsiType) {
893 case 0: // SpinDouble
894 ParseForParameter(verbose,file,"MaxPsiDouble", 0, 1, 1, int_type, &(config::MaxPsiDouble), 1, critical);
895 config::AddPsis = 0;
896 break;
897 case 1: // SpinUpDown
898 if (config::ProcPEGamma % 2) config::ProcPEGamma*=2;
899 ParseForParameter(verbose,file,"MaxPsiUp", 0, 1, 1, int_type, &(config::PsiMaxNoUp), 1, critical);
900 ParseForParameter(verbose,file,"MaxPsiDown", 0, 1, 1, int_type, &(config::PsiMaxNoDown), 1, critical);
901 config::AddPsis = 0;
902 break;
903 }
904
905 // IonsInitRead
906
907 ParseForParameter(verbose,file,"RCut", 0, 1, 1, double_type, &(config::RCut), 1, critical);
908 ParseForParameter(verbose,file,"IsAngstroem", 0, 1, 1, int_type, &(config::IsAngstroem), 1, critical);
909 config::RelativeCoord = 0;
910 config::StructOpt = 0;
911
912 // Routine from builder.cpp
913
914
915 for (i=MAX_ELEMENTS;i--;)
916 elementhash[i] = NULL;
917 cout << Verbose(0) << "Parsing Ions ..." << endl;
918 No=0;
919 found = 0;
920 while (getline(*file,zeile,'\n')) {
921 if (zeile.find("Ions_Data") == 0) {
922 cout << Verbose(1) << "found Ions_Data...begin parsing" << endl;
923 found ++;
924 }
925 if (found > 0) {
926 if (zeile.find("Ions_Data") == 0)
927 getline(*file,zeile,'\n'); // read next line and parse this one
928 istringstream input(zeile);
929 input >> AtomNo; // number of atoms
930 input >> Z; // atomic number
931 input >> a;
932 input >> l;
933 input >> l;
934 input >> b; // element mass
935 elementhash[No] = periode->FindElement(Z);
936 cout << Verbose(1) << "AtomNo: " << AtomNo << "\tZ: " << Z << "\ta:" << a << "\tl:" << l << "\b:" << b << "\tElement:" << elementhash[No] << "\t:" << endl;
937 for(i=0;i<AtomNo;i++) {
938 if (!getline(*file,zeile,'\n')) {// parse on and on
939 cout << Verbose(2) << "Error: Too few items in ionic list of element" << elementhash[No] << "." << endl << "Exiting." << endl;
940 // return 1;
941 } else {
942 //cout << Verbose(2) << "Reading line: " << zeile << endl;
943 }
944 istringstream input2(zeile);
945 atom *neues = new atom();
946 input2 >> neues->x.x[0]; // x
947 input2 >> neues->x.x[1]; // y
948 input2 >> neues->x.x[2]; // z
949 input2 >> l;
950 neues->type = elementhash[No]; // find element type
951 mol->AddAtom(neues);
952 }
953 No++;
954 }
955 }
956 file->close();
957 delete(file);
958};
959
960/** Stores all elements of config structure from which they can be re-read.
961 * \param output open output *file stream to write to
962 * \param *periode pointer to a periodentafel class with all elements
963 * \param *mol pointer to molecule containing all atoms of the molecule
964 */
965bool config::Save(ofstream *output, periodentafel *periode, molecule *mol) const
966{
967 bool result = true;
968 // bring MaxTypes up to date
969 mol->CountElements();
970 if (output != NULL) {
971 *output << "# ParallelCarParinello - main configuration file - created with molecuilder" << endl;
972 *output << endl;
973 *output << "mainname\t" << config::mainname << "\t# programm name (for runtime files)" << endl;
974 *output << "defaultpath\t" << config::defaultpath << "\t# where to put files during runtime" << endl;
975 *output << "pseudopotpath\t" << config::pseudopotpath << "\t# where to find pseudopotentials" << endl;
976 *output << endl;
977 *output << "ProcPEGamma\t" << config::ProcPEGamma << "\t# for parallel computing: share constants" << endl;
978 *output << "ProcPEPsi\t" << config::ProcPEPsi << "\t# for parallel computing: share wave functions" << endl;
979 *output << "DoOutVis\t" << config::DoOutVis << "\t# Output data for OpenDX" << endl;
980 *output << "DoOutMes\t" << config::DoOutMes << "\t# Output data for measurements" << endl;
981 *output << "DoOutOrbitals\t" << config::DoOutOrbitals << "\t# Output all Orbitals" << endl;
982 *output << "DoOutCurr\t" << config::DoOutCurrent << "\t# Ouput current density for OpenDx" << endl;
983 *output << "DoOutNICS\t" << config::DoOutNICS << "\t# Output Nucleus independent current shieldings" << endl;
984 *output << "DoPerturbation\t" << config::DoPerturbation << "\t# Do perturbation calculate and determine susceptibility and shielding" << endl;
985 *output << "DoFullCurrent\t" << config::DoFullCurrent << "\t# Do full perturbation" << endl;
986 *output << "CommonWannier\t" << config::CommonWannier << "\t# Put virtual centers at indivual orbits, all common, merged by variance, to grid point, to cell center" << endl;
987 *output << "SawtoothStart\t" << config::SawtoothStart << "\t# Absolute value for smooth transition at cell border " << endl;
988 *output << "VectorPlane\t" << config::VectorPlane << "\t# Cut plane axis (x, y or z: 0,1,2) for two-dim current vector plot" << endl;
989 *output << "VectorCut\t" << config::VectorCut << "\t# Cut plane axis value" << endl;
990 *output << "AddGramSch\t" << config::UseAddGramSch << "\t# Additional GramSchmidtOrtogonalization to be safe" << endl;
991 *output << "Seed\t\t" << config::Seed << "\t# initial value for random seed for Psi coefficients" << endl;
992 *output << endl;
993 *output << "MaxOuterStep\t" << config::MaxOuterStep << "\t# number of MolecularDynamics/Structure optimization steps" << endl;
994 *output << "Deltat\t" << config::Deltat << "\t# time per MD step" << endl;
995 *output << "OutVisStep\t" << config::OutVisStep << "\t# Output visual data every ...th step" << endl;
996 *output << "OutSrcStep\t" << config::OutSrcStep << "\t# Output \"restart\" data every ..th step" << endl;
997 *output << "TargetTemp\t" << config::TargetTemp << "\t# Target temperature" << endl;
998 *output << "MaxPsiStep\t" << config::MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl;
999 *output << "EpsWannier\t" << config::EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl;
1000 *output << endl;
1001 *output << "# Values specifying when to stop" << endl;
1002 *output << "MaxMinStep\t" << config::MaxMinStep << "\t# Maximum number of steps" << endl;
1003 *output << "RelEpsTotalE\t" << config::RelEpsTotalEnergy << "\t# relative change in total energy" << endl;
1004 *output << "RelEpsKineticE\t" << config::RelEpsKineticEnergy << "\t# relative change in kinetic energy" << endl;
1005 *output << "MaxMinStopStep\t" << config::MaxMinStopStep << "\t# check every ..th steps" << endl;
1006 *output << "MaxMinGapStopStep\t" << config::MaxMinGapStopStep << "\t# check every ..th steps" << endl;
1007 *output << endl;
1008 *output << "# Values specifying when to stop for INIT, otherwise same as above" << endl;
1009 *output << "MaxInitMinStep\t" << config::MaxInitMinStep << "\t# Maximum number of steps" << endl;
1010 *output << "InitRelEpsTotalE\t" << config::InitRelEpsTotalEnergy << "\t# relative change in total energy" << endl;
1011 *output << "InitRelEpsKineticE\t" << config::InitRelEpsKineticEnergy << "\t# relative change in kinetic energy" << endl;
1012 *output << "InitMaxMinStopStep\t" << config::InitMaxMinStopStep << "\t# check every ..th steps" << endl;
1013 *output << "InitMaxMinGapStopStep\t" << config::InitMaxMinGapStopStep << "\t# check every ..th steps" << endl;
1014 *output << endl;
1015 *output << "BoxLength\t\t\t# (Length of a unit cell)" << endl;
1016 *output << mol->cell_size[0] << "\t" << endl;
1017 *output << mol->cell_size[1] << "\t" << mol->cell_size[2] << "\t" << endl;
1018 *output << mol->cell_size[3] << "\t" << mol->cell_size[4] << "\t" << mol->cell_size[5] << "\t" << endl;
1019 // FIXME
1020 *output << endl;
1021 *output << "ECut\t\t" << config::ECut << "\t# energy cutoff for discretization in Hartrees" << endl;
1022 *output << "MaxLevel\t" << config::MaxLevel << "\t# number of different levels in the code, >=2" << endl;
1023 *output << "Level0Factor\t" << config::Lev0Factor << "\t# factor by which node number increases from S to 0 level" << endl;
1024 *output << "RiemannTensor\t" << config::RiemannTensor << "\t# (Use metric)" << endl;
1025 switch (config::RiemannTensor) {
1026 case 0: //UseNoRT
1027 break;
1028 case 1: // UseRT
1029 *output << "RiemannLevel\t" << config::RiemannLevel << "\t# Number of Riemann Levels" << endl;
1030 *output << "LevRFactor\t" << config::LevRFactor << "\t# factor by which node number increases from 0 to R level from" << endl;
1031 break;
1032 }
1033 *output << "PsiType\t\t" << config::PsiType << "\t# 0 - doubly occupied, 1 - SpinUp,SpinDown" << endl;
1034 // write out both types for easier changing afterwards
1035 // switch (PsiType) {
1036 // case 0:
1037 *output << "MaxPsiDouble\t" << config::MaxPsiDouble << "\t# here: specifying both maximum number of SpinUp- and -Down-states" << endl;
1038 // break;
1039 // case 1:
1040 *output << "PsiMaxNoUp\t" << config::PsiMaxNoUp << "\t# here: specifying maximum number of SpinUp-states" << endl;
1041 *output << "PsiMaxNoDown\t" << config::PsiMaxNoDown << "\t# here: specifying maximum number of SpinDown-states" << endl;
1042 // break;
1043 // }
1044 *output << "AddPsis\t\t" << config::AddPsis << "\t# Additional unoccupied Psis for bandgap determination" << endl;
1045 *output << endl;
1046 *output << "RCut\t\t" << config::RCut << "\t# R-cut for the ewald summation" << endl;
1047 *output << "StructOpt\t" << config::StructOpt << "\t# Do structure optimization beforehand" << endl;
1048 *output << "IsAngstroem\t" << config::IsAngstroem << "\t# 0 - Bohr, 1 - Angstroem" << endl;
1049 *output << "RelativeCoord\t" << config::RelativeCoord << "\t# whether ion coordinates are relative (1) or absolute (0)" << endl;
1050 *output << "MaxTypes\t" << mol->ElementCount << "\t# maximum number of different ion types" << endl;
1051 *output << endl;
1052 result = result && mol->Checkout(output);
1053 if (mol->MDSteps <=1 )
1054 result = result && mol->Output(output);
1055 else
1056 result = result && mol->OutputTrajectories(output);
1057 return result;
1058 } else
1059 return false;
1060};
1061
1062/** Reads parameter from a parsed file.
1063 * The file is either parsed for a certain keyword or if null is given for
1064 * the value in row yth and column xth. If the keyword was necessity#critical,
1065 * then an error is thrown and the programme aborted.
1066 * \warning value is modified (both in contents and position)!
1067 * \param verbose 1 - print found value to stderr, 0 - don't
1068 * \param file file to be parsed
1069 * \param name Name of value in file (at least 3 chars!)
1070 * \param sequential 1 - do not reset file pointer to begin of file, 0 - set to beginning
1071 * (if file is sequentially parsed this can be way faster! However, beware of multiple values per line, as whole line is read -
1072 * best approach: 0 0 0 1 (not resetted only on last value of line) - and of yth, which is now
1073 * counted from this unresetted position!)
1074 * \param xth Which among a number of parameters it is (in grid case it's row number as grid is read as a whole!)
1075 * \param yth In grid case specifying column number, otherwise the yth \a name matching line
1076 * \param type Type of the Parameter to be read
1077 * \param value address of the value to be read (must have been allocated)
1078 * \param repetition determines, if the keyword appears multiply in the config file, which repetition shall be parsed, i.e. 1 if not multiply
1079 * \param critical necessity of this keyword being specified (optional, critical)
1080 * \return 1 - found, 0 - not found
1081 * \note Routine is taken from the pcp project and hack-a-slack adapted to C++
1082 */
1083int config::ParseForParameter(int verbose, ifstream *file, const char *name, int sequential, int const xth, int const yth, int type, void *value, int repetition, int critical) {
1084 int i,j; // loop variables
1085 int length = 0, maxlength = -1;
1086 long file_position = file->tellg(); // mark current position
1087 char *dummy1, *dummy, *free_dummy; // pointers in the line that is read in per step
1088 dummy1 = free_dummy = (char *) Malloc(256 * sizeof(char), "config::ParseForParameter: *free_dummy");
1089
1090 //fprintf(stderr,"Parsing for %s\n",name);
1091 if (repetition == 0)
1092 //Error(SomeError, "ParseForParameter(): argument repetition must not be 0!");
1093 return 0;
1094
1095 int line = 0; // marks line where parameter was found
1096 int found = (type >= grid) ? 0 : (-yth + 1); // marks if yth parameter name was found
1097 while((found != repetition)) {
1098 dummy1 = dummy = free_dummy;
1099 do {
1100 file->getline(dummy1, 256); // Read the whole line
1101 if (file->eof()) {
1102 if ((critical) && (found == 0)) {
1103 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1104 //Error(InitReading, name);
1105 fprintf(stderr,"Error:InitReading, critical %s not found\n", name);
1106 exit(255);
1107 } else {
1108 //if (!sequential)
1109 file->clear();
1110 file->seekg(file_position, ios::beg); // rewind to start position
1111 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1112 return 0;
1113 }
1114 }
1115 line++;
1116 } while (((dummy1[0] == '#') || (dummy1[0] == '\n')) && dummy != NULL); // skip commentary and empty lines
1117
1118 // C++ getline removes newline at end, thus re-add
1119 if ((dummy1 != NULL) && (strchr(dummy1,'\n') == NULL)) {
1120 i = strlen(dummy1);
1121 dummy1[i] = '\n';
1122 dummy1[i+1] = '\0';
1123 }
1124 //fprintf(stderr,"line ends at %i, newline at %i\n", strlen(dummy1), strchr(dummy1,'\n')-free_dummy);
1125 if (dummy1 == NULL) {
1126 if (verbose) fprintf(stderr,"Error reading line %i\n",line);
1127 } else {
1128 //fprintf(stderr,"Reading next line %i: %s\n", line, dummy1);
1129 }
1130 // Seek for possible end of keyword on line if given ...
1131 if (name != NULL) {
1132 dummy = strchr(dummy1,'\t'); // set dummy on first tab or space which ever's nearer
1133 if (dummy == NULL) {
1134 dummy = strchr(dummy1, ' '); // if not found seek for space
1135 while ((dummy != NULL) && ((*dummy == '\t') || (*dummy == ' '))) // skip some more tabs and spaces if necessary
1136 dummy++;
1137 }
1138 if (dummy == NULL) {
1139 dummy = strchr(dummy1, '\n'); // set on line end then (whole line = keyword)
1140 //fprintf(stderr,"Error: Cannot find tabs or spaces on line %i in search for %s\n", line, name);
1141 //Free((void **)&free_dummy);
1142 //Error(FileOpenParams, NULL);
1143 } else {
1144 //fprintf(stderr,"found tab at %i\n",(char *)dummy-(char *)dummy1);
1145 }
1146 } else dummy = dummy1;
1147 // ... and check if it is the keyword!
1148 //fprintf(stderr,"name %p, dummy %i/%c, dummy1 %i/%c, strlen(name) %i\n", &name, dummy, *dummy, dummy1, *dummy1, strlen(name));
1149 if ((name == NULL) || (((dummy-dummy1 >= 3) && (strncmp(dummy1, name, strlen(name)) == 0)) && ((unsigned int)(dummy-dummy1) == strlen(name)))) {
1150 found++; // found the parameter!
1151 //fprintf(stderr,"found %s at line %i between %i and %i\n", name, line, dummy1, dummy);
1152
1153 if (found == repetition) {
1154 for (i=0;i<xth;i++) { // i = rows
1155 if (type >= grid) {
1156 // grid structure means that grid starts on the next line, not right after keyword
1157 dummy1 = dummy = free_dummy;
1158 do {
1159 file->getline(dummy1, 256); // Read the whole line, skip commentary and empty ones
1160 if (file->eof()) {
1161 if ((critical) && (found == 0)) {
1162 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1163 //Error(InitReading, name);
1164 fprintf(stderr,"Error:InitReading, critical %s not found\n", name);
1165 exit(255);
1166 } else {
1167 //if (!sequential)
1168 file->clear();
1169 file->seekg(file_position, ios::beg); // rewind to start position
1170 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1171 return 0;
1172 }
1173 }
1174 line++;
1175 } while ((dummy1[0] == '#') || (dummy1[0] == '\n'));
1176 if (dummy1 == NULL){
1177 if (verbose) fprintf(stderr,"Error reading line %i\n", line);
1178 } else {
1179 //fprintf(stderr,"Reading next line %i: %s\n", line, dummy1);
1180 }
1181 } else { // simple int, strings or doubles start in the same line
1182 while ((*dummy == '\t') || (*dummy == ' ')) // skip interjacent tabs and spaces
1183 dummy++;
1184 }
1185 // C++ getline removes newline at end, thus re-add
1186 if ((dummy1 != NULL) && (strchr(dummy1,'\n') == NULL)) {
1187 j = strlen(dummy1);
1188 dummy1[j] = '\n';
1189 dummy1[j+1] = '\0';
1190 }
1191
1192 int start = (type >= grid) ? 0 : yth-1 ;
1193 for (j=start;j<yth;j++) { // j = columns
1194 // check for lower triangular area and upper triangular area
1195 if ( ((i > j) && (type == upper_trigrid)) || ((j > i) && (type == lower_trigrid))) {
1196 *((double *)value) = 0.0;
1197 fprintf(stderr,"%f\t",*((double *)value));
1198 value = (void *)((long)value + sizeof(double));
1199 //value += sizeof(double);
1200 } else {
1201 // otherwise we must skip all interjacent tabs and spaces and find next value
1202 dummy1 = dummy;
1203 dummy = strchr(dummy1, '\t'); // seek for tab or space
1204 if (dummy == NULL)
1205 dummy = strchr(dummy1, ' '); // if not found seek for space
1206 while ((dummy != NULL) && ((*dummy == '\t') || (*dummy == ' '))) // skip some more tabs and spaces if necessary
1207 dummy++;
1208/* while ((dummy != NULL) && ((*dummy == '\t') || (*dummy == ' '))) // skip some more tabs and spaces if necessary
1209 dummy++;*/
1210 if (dummy == NULL) { // if still zero returned ...
1211 dummy = strchr(dummy1, '\n'); // ... at line end then
1212 if ((j < yth-1) && (type < 4)) { // check if xth value or not yet
1213 if (critical) {
1214 if (verbose) fprintf(stderr,"Error: EoL at %i and still missing %i value(s) for parameter %s\n", line, yth-j, name);
1215 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1216 //return 0;
1217 exit(255);
1218 //Error(FileOpenParams, NULL);
1219 } else {
1220 //if (!sequential)
1221 file->clear();
1222 file->seekg(file_position, ios::beg); // rewind to start position
1223 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1224 return 0;
1225 }
1226 }
1227 } else {
1228 //fprintf(stderr,"found tab at %i\n",(char *)dummy-(char *)free_dummy);
1229 }
1230 if (*dummy1 == '#') {
1231 // found comment, skipping rest of line
1232 //if (verbose) fprintf(stderr,"Error: '#' at %i and still missing %i value(s) for parameter %s\n", line, yth-j, name);
1233 if (!sequential) { // here we need it!
1234 file->seekg(file_position, ios::beg); // rewind to start position
1235 }
1236 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1237 return 0;
1238 }
1239 //fprintf(stderr,"value from %i to %i\n",(char *)dummy1-(char *)free_dummy,(char *)dummy-(char *)free_dummy);
1240 switch(type) {
1241 case (row_int):
1242 *((int *)value) = atoi(dummy1);
1243 if ((verbose) && (i==0) && (j==0)) fprintf(stderr,"%s = ", name);
1244 if (verbose) fprintf(stderr,"%i\t",*((int *)value));
1245 value = (void *)((long)value + sizeof(int));
1246 //value += sizeof(int);
1247 break;
1248 case(row_double):
1249 case(grid):
1250 case(lower_trigrid):
1251 case(upper_trigrid):
1252 *((double *)value) = atof(dummy1);
1253 if ((verbose) && (i==0) && (j==0)) fprintf(stderr,"%s = ", name);
1254 if (verbose) fprintf(stderr,"%lg\t",*((double *)value));
1255 value = (void *)((long)value + sizeof(double));
1256 //value += sizeof(double);
1257 break;
1258 case(double_type):
1259 *((double *)value) = atof(dummy1);
1260 if ((verbose) && (i == xth-1)) fprintf(stderr,"%s = %lg\n", name, *((double *) value));
1261 //value += sizeof(double);
1262 break;
1263 case(int_type):
1264 *((int *)value) = atoi(dummy1);
1265 if ((verbose) && (i == xth-1)) fprintf(stderr,"%s = %i\n", name, *((int *) value));
1266 //value += sizeof(int);
1267 break;
1268 default:
1269 case(string_type):
1270 if (value != NULL) {
1271 //if (maxlength == -1) maxlength = strlen((char *)value); // get maximum size of string array
1272 maxlength = MAXSTRINGSIZE;
1273 length = maxlength > (dummy-dummy1) ? (dummy-dummy1) : maxlength; // cap at maximum
1274 strncpy((char *)value, dummy1, length); // copy as much
1275 ((char *)value)[length] = '\0'; // and set end marker
1276 if ((verbose) && (i == xth-1)) fprintf(stderr,"%s is '%s' (%i chars)\n",name,((char *) value), length);
1277 //value += sizeof(char);
1278 } else {
1279 }
1280 break;
1281 }
1282 }
1283 while (*dummy == '\t')
1284 dummy++;
1285 }
1286 }
1287 }
1288 }
1289 }
1290 if ((type >= row_int) && (verbose)) fprintf(stderr,"\n");
1291 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1292 if (!sequential) {
1293 file->clear();
1294 file->seekg(file_position, ios::beg); // rewind to start position
1295 }
1296 //fprintf(stderr, "End of Parsing\n\n");
1297
1298 return (found); // true if found, false if not
1299}
Note: See TracBrowser for help on using the repository browser.