source: src/config.cpp@ a8aadf6

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

BUGFIX: config::load() parses endlessly if there are no atoms in the config file.

Since MaxTypes is 0, we check for it and don't scan if there are none according to it. If MaxTypes != 0 however there are no ions given, we break with an error message (which was missing before in config:ParseForParameters()).

  • Property mode set to 100644
File size: 64.6 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=0;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 if (MaxTypes == 0) {
638 cerr << "There are no atoms according to MaxTypes in this config file." << endl;
639 } else {
640 // prescan number of ions per type
641 cout << Verbose(0) << "Prescanning ions per type: " << endl;
642 for (int i=0; i < config::MaxTypes; i++) {
643 sprintf(name,"Ion_Type%i",i+1);
644 ParseForParameter(verbose,file, (const char*)name, 0, 1, 1, int_type, &No[i], 1, critical);
645 ParseForParameter(verbose,file, name, 0, 2, 1, int_type, &Z, 1, critical);
646 elementhash[i] = periode->FindElement(Z);
647 cout << Verbose(1) << i << ". Z = " << elementhash[i]->Z << " with " << No[i] << " ions." << endl;
648 }
649 int repetition = 0; // which repeated keyword shall be read
650
651 map<int, atom *> AtomList[config::MaxTypes];
652 if (!FastParsing) {
653 // parse in trajectories
654 bool status = true;
655 atom *neues = NULL;
656 while (status) {
657 cout << "Currently parsing MD step " << repetition << "." << endl;
658 for (int i=0; i < config::MaxTypes; i++) {
659 sprintf(name,"Ion_Type%i",i+1);
660 for(int j=0;j<No[i];j++) {
661 sprintf(keyword,"%s_%i",name, j+1);
662 if (repetition == 0) {
663 neues = new atom();
664 AtomList[i][j] = neues;
665 neues->type = elementhash[i]; // find element type
666 mol->AddAtom(neues);
667 } else
668 neues = AtomList[i][j];
669 status = (status &&
670 ParseForParameter(verbose,file, keyword, 0, 1, 1, double_type, &neues->x.x[0], 1, (repetition == 0) ? critical : optional) &&
671 ParseForParameter(verbose,file, keyword, 0, 2, 1, double_type, &neues->x.x[1], 1, (repetition == 0) ? critical : optional) &&
672 ParseForParameter(verbose,file, keyword, 0, 3, 1, double_type, &neues->x.x[2], 1, (repetition == 0) ? critical : optional) &&
673 ParseForParameter(verbose,file, keyword, 0, 4, 1, int_type, &neues->FixedIon, 1, (repetition == 0) ? critical : optional));
674 if (!status) break;
675
676 // check size of vectors
677 if (mol->Trajectories[neues].R.size() <= (unsigned int)(repetition)) {
678 //cout << "Increasing size for trajectory array of " << keyword << " to " << (repetition+10) << "." << endl;
679 mol->Trajectories[neues].R.resize(repetition+10);
680 mol->Trajectories[neues].U.resize(repetition+10);
681 mol->Trajectories[neues].F.resize(repetition+10);
682 }
683
684 // put into trajectories list
685 for (int d=0;d<NDIM;d++)
686 mol->Trajectories[neues].R.at(repetition).x[d] = neues->x.x[d];
687
688 // parse velocities if present
689 if(!ParseForParameter(verbose,file, keyword, 0, 5, 1, double_type, &neues->v.x[0], 1,optional))
690 neues->v.x[0] = 0.;
691 if(!ParseForParameter(verbose,file, keyword, 0, 6, 1, double_type, &neues->v.x[1], 1,optional))
692 neues->v.x[1] = 0.;
693 if(!ParseForParameter(verbose,file, keyword, 0, 7, 1, double_type, &neues->v.x[2], 1,optional))
694 neues->v.x[2] = 0.;
695 for (int d=0;d<NDIM;d++)
696 mol->Trajectories[neues].U.at(repetition).x[d] = neues->v.x[d];
697
698 // parse forces if present
699 if(!ParseForParameter(verbose,file, keyword, 0, 8, 1, double_type, &value[0], 1,optional))
700 value[0] = 0.;
701 if(!ParseForParameter(verbose,file, keyword, 0, 9, 1, double_type, &value[1], 1,optional))
702 value[1] = 0.;
703 if(!ParseForParameter(verbose,file, keyword, 1, 10, 1, double_type, &value[2], 1,optional))
704 value[2] = 0.;
705 for (int d=0;d<NDIM;d++)
706 mol->Trajectories[neues].F.at(repetition).x[d] = value[d];
707
708 // cout << "Parsed position of step " << (repetition) << ": (";
709 // for (int d=0;d<NDIM;d++)
710 // cout << mol->Trajectories[neues].R.at(repetition).x[d] << " "; // next step
711 // cout << ")\t(";
712 // for (int d=0;d<NDIM;d++)
713 // cout << mol->Trajectories[neues].U.at(repetition).x[d] << " "; // next step
714 // cout << ")\t(";
715 // for (int d=0;d<NDIM;d++)
716 // cout << mol->Trajectories[neues].F.at(repetition).x[d] << " "; // next step
717 // cout << ")" << endl;
718 }
719 }
720 repetition++;
721 }
722 repetition--;
723 cout << "Found " << repetition << " trajectory steps." << endl;
724 mol->MDSteps = repetition;
725 } else {
726 // 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)
727 repetition = 0;
728 while ( ParseForParameter(verbose,file, "Ion_Type1_1", 0, 1, 1, double_type, &value[0], repetition, (repetition == 0) ? critical : optional) &&
729 ParseForParameter(verbose,file, "Ion_Type1_1", 0, 2, 1, double_type, &value[1], repetition, (repetition == 0) ? critical : optional) &&
730 ParseForParameter(verbose,file, "Ion_Type1_1", 0, 3, 1, double_type, &value[2], repetition, (repetition == 0) ? critical : optional))
731 repetition++;
732 cout << "I found " << repetition << " times the keyword Ion_Type1_1." << endl;
733 // parse in molecule coordinates
734 for (int i=0; i < config::MaxTypes; i++) {
735 sprintf(name,"Ion_Type%i",i+1);
736 for(int j=0;j<No[i];j++) {
737 sprintf(keyword,"%s_%i",name, j+1);
738 atom *neues = new atom();
739 // then parse for each atom the coordinates as often as present
740 ParseForParameter(verbose,file, keyword, 0, 1, 1, double_type, &neues->x.x[0], repetition,critical);
741 ParseForParameter(verbose,file, keyword, 0, 2, 1, double_type, &neues->x.x[1], repetition,critical);
742 ParseForParameter(verbose,file, keyword, 0, 3, 1, double_type, &neues->x.x[2], repetition,critical);
743 ParseForParameter(verbose,file, keyword, 0, 4, 1, int_type, &neues->FixedIon, repetition,critical);
744 if(!ParseForParameter(verbose,file, keyword, 0, 5, 1, double_type, &neues->v.x[0], repetition,optional))
745 neues->v.x[0] = 0.;
746 if(!ParseForParameter(verbose,file, keyword, 0, 6, 1, double_type, &neues->v.x[1], repetition,optional))
747 neues->v.x[1] = 0.;
748 if(!ParseForParameter(verbose,file, keyword, 0, 7, 1, double_type, &neues->v.x[2], repetition,optional))
749 neues->v.x[2] = 0.;
750 // here we don't care if forces are present (last in trajectories is always equal to current position)
751 neues->type = elementhash[i]; // find element type
752 mol->AddAtom(neues);
753 }
754 }
755 }
756 }
757 file->close();
758 delete(file);
759};
760
761/** Initializes config file structure by loading elements from a give file with old pcp syntax.
762 * \param *file input file stream being the opened config file with old pcp syntax
763 * \param *periode pointer to a periodentafel class with all elements
764 * \param *mol pointer to molecule containing all atoms of the molecule
765 */
766void config::LoadOld(char *filename, periodentafel *periode, molecule *mol)
767{
768 ifstream *file = new ifstream(filename);
769 if (file == NULL) {
770 cerr << "ERROR: config file " << filename << " missing!" << endl;
771 return;
772 }
773 RetrieveConfigPathAndName(filename);
774 // ParseParameters
775
776 /* Oeffne Hauptparameterdatei */
777 int l, i, di;
778 double a,b;
779 double BoxLength[9];
780 string zeile;
781 string dummy;
782 element *elementhash[128];
783 int Z, No, AtomNo, found;
784 int verbose = 0;
785
786 /* Namen einlesen */
787
788 ParseForParameter(verbose,file, "mainname", 0, 1, 1, string_type, (config::mainname), 1, critical);
789 ParseForParameter(verbose,file, "defaultpath", 0, 1, 1, string_type, (config::defaultpath), 1, critical);
790 ParseForParameter(verbose,file, "pseudopotpath", 0, 1, 1, string_type, (config::pseudopotpath), 1, critical);
791 ParseForParameter(verbose,file, "ProcsGammaPsi", 0, 1, 1, int_type, &(config::ProcPEGamma), 1, critical);
792 ParseForParameter(verbose,file, "ProcsGammaPsi", 0, 2, 1, int_type, &(config::ProcPEPsi), 1, critical);
793 config::Seed = 1;
794 config::DoOutOrbitals = 0;
795 ParseForParameter(verbose,file,"DoOutVis", 0, 1, 1, int_type, &(config::DoOutVis), 1, critical);
796 if (config::DoOutVis < 0) config::DoOutVis = 0;
797 if (config::DoOutVis > 1) config::DoOutVis = 1;
798 config::VectorPlane = -1;
799 config::VectorCut = 0.;
800 ParseForParameter(verbose,file,"DoOutMes", 0, 1, 1, int_type, &(config::DoOutMes), 1, critical);
801 if (config::DoOutMes < 0) config::DoOutMes = 0;
802 if (config::DoOutMes > 1) config::DoOutMes = 1;
803 config::DoOutCurrent = 0;
804 ParseForParameter(verbose,file,"AddGramSch", 0, 1, 1, int_type, &(config::UseAddGramSch), 1, critical);
805 if (config::UseAddGramSch < 0) config::UseAddGramSch = 0;
806 if (config::UseAddGramSch > 2) config::UseAddGramSch = 2;
807 config::CommonWannier = 0;
808 config::SawtoothStart = 0.01;
809
810 ParseForParameter(verbose,file,"MaxOuterStep", 0, 1, 1, double_type, &(config::MaxOuterStep), 1, critical);
811 ParseForParameter(verbose,file,"Deltat", 0, 1, 1, double_type, &(config::Deltat), 1, optional);
812 ParseForParameter(verbose,file,"VisOuterStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional);
813 ParseForParameter(verbose,file,"VisSrcOuterStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional);
814 ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &(config::TargetTemp), 1, optional);
815 ParseForParameter(verbose,file,"ScaleTempStep", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional);
816 config::EpsWannier = 1e-8;
817
818 // stop conditions
819 //if (config::MaxOuterStep <= 0) config::MaxOuterStep = 1;
820 ParseForParameter(verbose,file,"MaxPsiStep", 0, 1, 1, int_type, &(config::MaxPsiStep), 1, critical);
821 if (config::MaxPsiStep <= 0) config::MaxPsiStep = 3;
822
823 ParseForParameter(verbose,file,"MaxMinStep", 0, 1, 1, int_type, &(config::MaxMinStep), 1, critical);
824 ParseForParameter(verbose,file,"MaxMinStep", 0, 2, 1, double_type, &(config::RelEpsTotalEnergy), 1, critical);
825 ParseForParameter(verbose,file,"MaxMinStep", 0, 3, 1, double_type, &(config::RelEpsKineticEnergy), 1, critical);
826 ParseForParameter(verbose,file,"MaxMinStep", 0, 4, 1, int_type, &(config::MaxMinStopStep), 1, critical);
827 if (config::MaxMinStep <= 0) config::MaxMinStep = config::MaxPsiStep;
828 if (config::MaxMinStopStep < 1) config::MaxMinStopStep = 1;
829 config::MaxMinGapStopStep = 1;
830
831 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 1, 1, int_type, &(config::MaxInitMinStep), 1, critical);
832 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 2, 1, double_type, &(config::InitRelEpsTotalEnergy), 1, critical);
833 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 3, 1, double_type, &(config::InitRelEpsKineticEnergy), 1, critical);
834 ParseForParameter(verbose,file,"MaxInitMinStep", 0, 4, 1, int_type, &(config::InitMaxMinStopStep), 1, critical);
835 if (config::MaxInitMinStep <= 0) config::MaxInitMinStep = config::MaxPsiStep;
836 if (config::InitMaxMinStopStep < 1) config::InitMaxMinStopStep = 1;
837 config::InitMaxMinGapStopStep = 1;
838
839 ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
840 mol->cell_size[0] = BoxLength[0];
841 mol->cell_size[1] = BoxLength[3];
842 mol->cell_size[2] = BoxLength[4];
843 mol->cell_size[3] = BoxLength[6];
844 mol->cell_size[4] = BoxLength[7];
845 mol->cell_size[5] = BoxLength[8];
846 if (1) fprintf(stderr,"\n");
847 config::DoPerturbation = 0;
848 config::DoFullCurrent = 0;
849
850 ParseForParameter(verbose,file,"ECut", 0, 1, 1, double_type, &(config::ECut), 1, critical);
851 ParseForParameter(verbose,file,"MaxLevel", 0, 1, 1, int_type, &(config::MaxLevel), 1, critical);
852 ParseForParameter(verbose,file,"Level0Factor", 0, 1, 1, int_type, &(config::Lev0Factor), 1, critical);
853 if (config::Lev0Factor < 2) {
854 config::Lev0Factor = 2;
855 }
856 ParseForParameter(verbose,file,"RiemannTensor", 0, 1, 1, int_type, &di, 1, critical);
857 if (di >= 0 && di < 2) {
858 config::RiemannTensor = di;
859 } else {
860 fprintf(stderr, "0 <= RiemanTensor < 2: 0 UseNotRT, 1 UseRT");
861 exit(1);
862 }
863 switch (config::RiemannTensor) {
864 case 0: //UseNoRT
865 if (config::MaxLevel < 2) {
866 config::MaxLevel = 2;
867 }
868 config::LevRFactor = 2;
869 config::RTActualUse = 0;
870 break;
871 case 1: // UseRT
872 if (config::MaxLevel < 3) {
873 config::MaxLevel = 3;
874 }
875 ParseForParameter(verbose,file,"RiemannLevel", 0, 1, 1, int_type, &(config::RiemannLevel), 1, critical);
876 if (config::RiemannLevel < 2) {
877 config::RiemannLevel = 2;
878 }
879 if (config::RiemannLevel > config::MaxLevel-1) {
880 config::RiemannLevel = config::MaxLevel-1;
881 }
882 ParseForParameter(verbose,file,"LevRFactor", 0, 1, 1, int_type, &(config::LevRFactor), 1, critical);
883 if (config::LevRFactor < 2) {
884 config::LevRFactor = 2;
885 }
886 config::Lev0Factor = 2;
887 config::RTActualUse = 2;
888 break;
889 }
890 ParseForParameter(verbose,file,"PsiType", 0, 1, 1, int_type, &di, 1, critical);
891 if (di >= 0 && di < 2) {
892 config::PsiType = di;
893 } else {
894 fprintf(stderr, "0 <= PsiType < 2: 0 UseSpinDouble, 1 UseSpinUpDown");
895 exit(1);
896 }
897 switch (config::PsiType) {
898 case 0: // SpinDouble
899 ParseForParameter(verbose,file,"MaxPsiDouble", 0, 1, 1, int_type, &(config::MaxPsiDouble), 1, critical);
900 config::AddPsis = 0;
901 break;
902 case 1: // SpinUpDown
903 if (config::ProcPEGamma % 2) config::ProcPEGamma*=2;
904 ParseForParameter(verbose,file,"MaxPsiUp", 0, 1, 1, int_type, &(config::PsiMaxNoUp), 1, critical);
905 ParseForParameter(verbose,file,"MaxPsiDown", 0, 1, 1, int_type, &(config::PsiMaxNoDown), 1, critical);
906 config::AddPsis = 0;
907 break;
908 }
909
910 // IonsInitRead
911
912 ParseForParameter(verbose,file,"RCut", 0, 1, 1, double_type, &(config::RCut), 1, critical);
913 ParseForParameter(verbose,file,"IsAngstroem", 0, 1, 1, int_type, &(config::IsAngstroem), 1, critical);
914 config::RelativeCoord = 0;
915 config::StructOpt = 0;
916
917 // Routine from builder.cpp
918
919
920 for (i=MAX_ELEMENTS;i--;)
921 elementhash[i] = NULL;
922 cout << Verbose(0) << "Parsing Ions ..." << endl;
923 No=0;
924 found = 0;
925 while (getline(*file,zeile,'\n')) {
926 if (zeile.find("Ions_Data") == 0) {
927 cout << Verbose(1) << "found Ions_Data...begin parsing" << endl;
928 found ++;
929 }
930 if (found > 0) {
931 if (zeile.find("Ions_Data") == 0)
932 getline(*file,zeile,'\n'); // read next line and parse this one
933 istringstream input(zeile);
934 input >> AtomNo; // number of atoms
935 input >> Z; // atomic number
936 input >> a;
937 input >> l;
938 input >> l;
939 input >> b; // element mass
940 elementhash[No] = periode->FindElement(Z);
941 cout << Verbose(1) << "AtomNo: " << AtomNo << "\tZ: " << Z << "\ta:" << a << "\tl:" << l << "\b:" << b << "\tElement:" << elementhash[No] << "\t:" << endl;
942 for(i=0;i<AtomNo;i++) {
943 if (!getline(*file,zeile,'\n')) {// parse on and on
944 cout << Verbose(2) << "Error: Too few items in ionic list of element" << elementhash[No] << "." << endl << "Exiting." << endl;
945 // return 1;
946 } else {
947 //cout << Verbose(2) << "Reading line: " << zeile << endl;
948 }
949 istringstream input2(zeile);
950 atom *neues = new atom();
951 input2 >> neues->x.x[0]; // x
952 input2 >> neues->x.x[1]; // y
953 input2 >> neues->x.x[2]; // z
954 input2 >> l;
955 neues->type = elementhash[No]; // find element type
956 mol->AddAtom(neues);
957 }
958 No++;
959 }
960 }
961 file->close();
962 delete(file);
963};
964
965/** Stores all elements of config structure from which they can be re-read.
966 * \param output open output *file stream to write to
967 * \param *periode pointer to a periodentafel class with all elements
968 * \param *mol pointer to molecule containing all atoms of the molecule
969 */
970bool config::Save(ofstream *output, periodentafel *periode, molecule *mol) const
971{
972 bool result = true;
973 // bring MaxTypes up to date
974 mol->CountElements();
975 if (output != NULL) {
976 *output << "# ParallelCarParinello - main configuration file - created with molecuilder" << endl;
977 *output << endl;
978 *output << "mainname\t" << config::mainname << "\t# programm name (for runtime files)" << endl;
979 *output << "defaultpath\t" << config::defaultpath << "\t# where to put files during runtime" << endl;
980 *output << "pseudopotpath\t" << config::pseudopotpath << "\t# where to find pseudopotentials" << endl;
981 *output << endl;
982 *output << "ProcPEGamma\t" << config::ProcPEGamma << "\t# for parallel computing: share constants" << endl;
983 *output << "ProcPEPsi\t" << config::ProcPEPsi << "\t# for parallel computing: share wave functions" << endl;
984 *output << "DoOutVis\t" << config::DoOutVis << "\t# Output data for OpenDX" << endl;
985 *output << "DoOutMes\t" << config::DoOutMes << "\t# Output data for measurements" << endl;
986 *output << "DoOutOrbitals\t" << config::DoOutOrbitals << "\t# Output all Orbitals" << endl;
987 *output << "DoOutCurr\t" << config::DoOutCurrent << "\t# Ouput current density for OpenDx" << endl;
988 *output << "DoOutNICS\t" << config::DoOutNICS << "\t# Output Nucleus independent current shieldings" << endl;
989 *output << "DoPerturbation\t" << config::DoPerturbation << "\t# Do perturbation calculate and determine susceptibility and shielding" << endl;
990 *output << "DoFullCurrent\t" << config::DoFullCurrent << "\t# Do full perturbation" << endl;
991 *output << "CommonWannier\t" << config::CommonWannier << "\t# Put virtual centers at indivual orbits, all common, merged by variance, to grid point, to cell center" << endl;
992 *output << "SawtoothStart\t" << config::SawtoothStart << "\t# Absolute value for smooth transition at cell border " << endl;
993 *output << "VectorPlane\t" << config::VectorPlane << "\t# Cut plane axis (x, y or z: 0,1,2) for two-dim current vector plot" << endl;
994 *output << "VectorCut\t" << config::VectorCut << "\t# Cut plane axis value" << endl;
995 *output << "AddGramSch\t" << config::UseAddGramSch << "\t# Additional GramSchmidtOrtogonalization to be safe" << endl;
996 *output << "Seed\t\t" << config::Seed << "\t# initial value for random seed for Psi coefficients" << endl;
997 *output << endl;
998 *output << "MaxOuterStep\t" << config::MaxOuterStep << "\t# number of MolecularDynamics/Structure optimization steps" << endl;
999 *output << "Deltat\t" << config::Deltat << "\t# time per MD step" << endl;
1000 *output << "OutVisStep\t" << config::OutVisStep << "\t# Output visual data every ...th step" << endl;
1001 *output << "OutSrcStep\t" << config::OutSrcStep << "\t# Output \"restart\" data every ..th step" << endl;
1002 *output << "TargetTemp\t" << config::TargetTemp << "\t# Target temperature" << endl;
1003 *output << "MaxPsiStep\t" << config::MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl;
1004 *output << "EpsWannier\t" << config::EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl;
1005 *output << endl;
1006 *output << "# Values specifying when to stop" << endl;
1007 *output << "MaxMinStep\t" << config::MaxMinStep << "\t# Maximum number of steps" << endl;
1008 *output << "RelEpsTotalE\t" << config::RelEpsTotalEnergy << "\t# relative change in total energy" << endl;
1009 *output << "RelEpsKineticE\t" << config::RelEpsKineticEnergy << "\t# relative change in kinetic energy" << endl;
1010 *output << "MaxMinStopStep\t" << config::MaxMinStopStep << "\t# check every ..th steps" << endl;
1011 *output << "MaxMinGapStopStep\t" << config::MaxMinGapStopStep << "\t# check every ..th steps" << endl;
1012 *output << endl;
1013 *output << "# Values specifying when to stop for INIT, otherwise same as above" << endl;
1014 *output << "MaxInitMinStep\t" << config::MaxInitMinStep << "\t# Maximum number of steps" << endl;
1015 *output << "InitRelEpsTotalE\t" << config::InitRelEpsTotalEnergy << "\t# relative change in total energy" << endl;
1016 *output << "InitRelEpsKineticE\t" << config::InitRelEpsKineticEnergy << "\t# relative change in kinetic energy" << endl;
1017 *output << "InitMaxMinStopStep\t" << config::InitMaxMinStopStep << "\t# check every ..th steps" << endl;
1018 *output << "InitMaxMinGapStopStep\t" << config::InitMaxMinGapStopStep << "\t# check every ..th steps" << endl;
1019 *output << endl;
1020 *output << "BoxLength\t\t\t# (Length of a unit cell)" << endl;
1021 *output << mol->cell_size[0] << "\t" << endl;
1022 *output << mol->cell_size[1] << "\t" << mol->cell_size[2] << "\t" << endl;
1023 *output << mol->cell_size[3] << "\t" << mol->cell_size[4] << "\t" << mol->cell_size[5] << "\t" << endl;
1024 // FIXME
1025 *output << endl;
1026 *output << "ECut\t\t" << config::ECut << "\t# energy cutoff for discretization in Hartrees" << endl;
1027 *output << "MaxLevel\t" << config::MaxLevel << "\t# number of different levels in the code, >=2" << endl;
1028 *output << "Level0Factor\t" << config::Lev0Factor << "\t# factor by which node number increases from S to 0 level" << endl;
1029 *output << "RiemannTensor\t" << config::RiemannTensor << "\t# (Use metric)" << endl;
1030 switch (config::RiemannTensor) {
1031 case 0: //UseNoRT
1032 break;
1033 case 1: // UseRT
1034 *output << "RiemannLevel\t" << config::RiemannLevel << "\t# Number of Riemann Levels" << endl;
1035 *output << "LevRFactor\t" << config::LevRFactor << "\t# factor by which node number increases from 0 to R level from" << endl;
1036 break;
1037 }
1038 *output << "PsiType\t\t" << config::PsiType << "\t# 0 - doubly occupied, 1 - SpinUp,SpinDown" << endl;
1039 // write out both types for easier changing afterwards
1040 // switch (PsiType) {
1041 // case 0:
1042 *output << "MaxPsiDouble\t" << config::MaxPsiDouble << "\t# here: specifying both maximum number of SpinUp- and -Down-states" << endl;
1043 // break;
1044 // case 1:
1045 *output << "PsiMaxNoUp\t" << config::PsiMaxNoUp << "\t# here: specifying maximum number of SpinUp-states" << endl;
1046 *output << "PsiMaxNoDown\t" << config::PsiMaxNoDown << "\t# here: specifying maximum number of SpinDown-states" << endl;
1047 // break;
1048 // }
1049 *output << "AddPsis\t\t" << config::AddPsis << "\t# Additional unoccupied Psis for bandgap determination" << endl;
1050 *output << endl;
1051 *output << "RCut\t\t" << config::RCut << "\t# R-cut for the ewald summation" << endl;
1052 *output << "StructOpt\t" << config::StructOpt << "\t# Do structure optimization beforehand" << endl;
1053 *output << "IsAngstroem\t" << config::IsAngstroem << "\t# 0 - Bohr, 1 - Angstroem" << endl;
1054 *output << "RelativeCoord\t" << config::RelativeCoord << "\t# whether ion coordinates are relative (1) or absolute (0)" << endl;
1055 *output << "MaxTypes\t" << mol->ElementCount << "\t# maximum number of different ion types" << endl;
1056 *output << endl;
1057 result = result && mol->Checkout(output);
1058 if (mol->MDSteps <=1 )
1059 result = result && mol->Output(output);
1060 else
1061 result = result && mol->OutputTrajectories(output);
1062 return result;
1063 } else
1064 return false;
1065};
1066
1067/** Stores all elements in a MPQC input file.
1068 * Note that this format cannot be parsed again.
1069 * \param output open output *file stream to write to
1070 * \param *mol pointer to molecule containing all atoms of the molecule
1071 */
1072bool config::SaveMPQC(ofstream *output, molecule *mol) const
1073{
1074 int ElementNo;
1075 int AtomNo;
1076 atom *Walker = NULL;
1077 element *runner;
1078 Vector center;
1079
1080 *output << "% Created by MoleCuilder" << endl;
1081 *output << "mpqc: (" << endl;
1082 *output << "\tsavestate = no" << endl;
1083 *output << "\tdo_gradient = yes" << endl;
1084 *output << "\tmole<CLHF>: (" << endl;
1085 *output << "\t\tmolecule<Molecule>: (" << endl;
1086 *output << "\t\t\tunit = " << (IsAngstroem ? "angstrom" : "bohr" ) << endl;
1087 *output << "\t\t\t{ atoms geometry } = {" << endl;
1088 mol->DetermineCenter(center);
1089 // output of atoms
1090 ElementNo = 0;
1091 runner = mol->elemente->start;
1092 while (runner->next != mol->elemente->end) { // go through every element
1093 runner = runner->next;
1094 if (mol->ElementsInMolecule[runner->Z]) { // if this element got atoms
1095 ElementNo++;
1096 AtomNo = 0;
1097 Walker = mol->start;
1098 while (Walker->next != mol->end) { // go through every atom of this element
1099 Walker = Walker->next;
1100 if (Walker->type == runner) { // if this atom fits to element
1101 AtomNo++;
1102 *output << "\t\t\t\t" << Walker->type->symbol << " [ " << Walker->x.x[0]-center.x[0] << "\t" << Walker->x.x[1]-center.x[1] << "\t" << Walker->x.x[2]-center.x[2] << " ]" << endl;
1103 }
1104 }
1105 }
1106 }
1107 *output << "\t\t\t}" << endl;
1108 *output << "\t\t)" << endl;
1109 *output << "\t\tbasis<GaussianBasisSet>: (" << endl;
1110 *output << "\t\t\tname = \"STO-3G\"" << endl;
1111 *output << "\t\t\tmolecule = $:mpqc:mole:molecule" << endl;
1112 *output << "\t\t)" << endl;
1113 *output << "\t)" << endl;
1114 *output << ")" << endl;
1115 return true;
1116};
1117
1118/** Reads parameter from a parsed file.
1119 * The file is either parsed for a certain keyword or if null is given for
1120 * the value in row yth and column xth. If the keyword was necessity#critical,
1121 * then an error is thrown and the programme aborted.
1122 * \warning value is modified (both in contents and position)!
1123 * \param verbose 1 - print found value to stderr, 0 - don't
1124 * \param file file to be parsed
1125 * \param name Name of value in file (at least 3 chars!)
1126 * \param sequential 1 - do not reset file pointer to begin of file, 0 - set to beginning
1127 * (if file is sequentially parsed this can be way faster! However, beware of multiple values per line, as whole line is read -
1128 * best approach: 0 0 0 1 (not resetted only on last value of line) - and of yth, which is now
1129 * counted from this unresetted position!)
1130 * \param xth Which among a number of parameters it is (in grid case it's row number as grid is read as a whole!)
1131 * \param yth In grid case specifying column number, otherwise the yth \a name matching line
1132 * \param type Type of the Parameter to be read
1133 * \param value address of the value to be read (must have been allocated)
1134 * \param repetition determines, if the keyword appears multiply in the config file, which repetition shall be parsed, i.e. 1 if not multiply
1135 * \param critical necessity of this keyword being specified (optional, critical)
1136 * \return 1 - found, 0 - not found
1137 * \note Routine is taken from the pcp project and hack-a-slack adapted to C++
1138 */
1139int 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) {
1140 int i,j; // loop variables
1141 int length = 0, maxlength = -1;
1142 long file_position = file->tellg(); // mark current position
1143 char *dummy1, *dummy, *free_dummy; // pointers in the line that is read in per step
1144 dummy1 = free_dummy = (char *) Malloc(256 * sizeof(char), "config::ParseForParameter: *free_dummy");
1145
1146 //fprintf(stderr,"Parsing for %s\n",name);
1147 if (repetition == 0)
1148 //Error(SomeError, "ParseForParameter(): argument repetition must not be 0!");
1149 return 0;
1150
1151 int line = 0; // marks line where parameter was found
1152 int found = (type >= grid) ? 0 : (-yth + 1); // marks if yth parameter name was found
1153 while((found != repetition)) {
1154 dummy1 = dummy = free_dummy;
1155 do {
1156 file->getline(dummy1, 256); // Read the whole line
1157 if (file->eof()) {
1158 if ((critical) && (found == 0)) {
1159 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1160 //Error(InitReading, name);
1161 fprintf(stderr,"Error:InitReading, critical %s not found\n", name);
1162 exit(255);
1163 } else {
1164 //if (!sequential)
1165 file->clear();
1166 file->seekg(file_position, ios::beg); // rewind to start position
1167 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1168 return 0;
1169 }
1170 }
1171 line++;
1172 } while (dummy != NULL && dummy1 != NULL && ((dummy1[0] == '#') || (dummy1[0] == '\0'))); // skip commentary and empty lines
1173
1174 // C++ getline removes newline at end, thus re-add
1175 if ((dummy1 != NULL) && (strchr(dummy1,'\n') == NULL)) {
1176 i = strlen(dummy1);
1177 dummy1[i] = '\n';
1178 dummy1[i+1] = '\0';
1179 }
1180 //fprintf(stderr,"line %i ends at %i, newline at %i\n", line, strlen(dummy1), strchr(dummy1,'\n')-free_dummy);
1181
1182 if (dummy1 == NULL) {
1183 if (verbose) fprintf(stderr,"Error reading line %i\n",line);
1184 } else {
1185 //fprintf(stderr,"Now parsing the line %i: %s\n", line, dummy1);
1186 }
1187 // Seek for possible end of keyword on line if given ...
1188 if (name != NULL) {
1189 dummy = strchr(dummy1,'\t'); // set dummy on first tab or space which ever's nearer
1190 if (dummy == NULL) {
1191 dummy = strchr(dummy1, ' '); // if not found seek for space
1192 while ((dummy != NULL) && ((*dummy == '\t') || (*dummy == ' '))) // skip some more tabs and spaces if necessary
1193 dummy++;
1194 }
1195 if (dummy == NULL) {
1196 dummy = strchr(dummy1, '\n'); // set on line end then (whole line = keyword)
1197 //fprintf(stderr,"Error: Cannot find tabs or spaces on line %i in search for %s\n", line, name);
1198 //Free((void **)&free_dummy);
1199 //Error(FileOpenParams, NULL);
1200 } else {
1201 //fprintf(stderr,"found tab at %i\n",(char *)dummy-(char *)dummy1);
1202 }
1203 } else dummy = dummy1;
1204 // ... and check if it is the keyword!
1205 //fprintf(stderr,"name %p, dummy %i/%c, dummy1 %i/%c, strlen(name) %i\n", &name, dummy, *dummy, dummy1, *dummy1, strlen(name));
1206 if ((name == NULL) || (((dummy-dummy1 >= 3) && (strncmp(dummy1, name, strlen(name)) == 0)) && ((unsigned int)(dummy-dummy1) == strlen(name)))) {
1207 found++; // found the parameter!
1208 //fprintf(stderr,"found %s at line %i between %i and %i\n", name, line, dummy1, dummy);
1209
1210 if (found == repetition) {
1211 for (i=0;i<xth;i++) { // i = rows
1212 if (type >= grid) {
1213 // grid structure means that grid starts on the next line, not right after keyword
1214 dummy1 = dummy = free_dummy;
1215 do {
1216 file->getline(dummy1, 256); // Read the whole line, skip commentary and empty ones
1217 if (file->eof()) {
1218 if ((critical) && (found == 0)) {
1219 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1220 //Error(InitReading, name);
1221 fprintf(stderr,"Error:InitReading, critical %s not found\n", name);
1222 exit(255);
1223 } else {
1224 //if (!sequential)
1225 file->clear();
1226 file->seekg(file_position, ios::beg); // rewind to start position
1227 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1228 return 0;
1229 }
1230 }
1231 line++;
1232 } while ((dummy1[0] == '#') || (dummy1[0] == '\n'));
1233 if (dummy1 == NULL){
1234 if (verbose) fprintf(stderr,"Error reading line %i\n", line);
1235 } else {
1236 //fprintf(stderr,"Reading next line %i: %s\n", line, dummy1);
1237 }
1238 } else { // simple int, strings or doubles start in the same line
1239 while ((*dummy == '\t') || (*dummy == ' ')) // skip interjacent tabs and spaces
1240 dummy++;
1241 }
1242 // C++ getline removes newline at end, thus re-add
1243 if ((dummy1 != NULL) && (strchr(dummy1,'\n') == NULL)) {
1244 j = strlen(dummy1);
1245 dummy1[j] = '\n';
1246 dummy1[j+1] = '\0';
1247 }
1248
1249 int start = (type >= grid) ? 0 : yth-1 ;
1250 for (j=start;j<yth;j++) { // j = columns
1251 // check for lower triangular area and upper triangular area
1252 if ( ((i > j) && (type == upper_trigrid)) || ((j > i) && (type == lower_trigrid))) {
1253 *((double *)value) = 0.0;
1254 fprintf(stderr,"%f\t",*((double *)value));
1255 value = (void *)((long)value + sizeof(double));
1256 //value += sizeof(double);
1257 } else {
1258 // otherwise we must skip all interjacent tabs and spaces and find next value
1259 dummy1 = dummy;
1260 dummy = strchr(dummy1, '\t'); // seek for tab or space
1261 if (dummy == NULL)
1262 dummy = strchr(dummy1, ' '); // if not found seek for space
1263 if (dummy == NULL) { // if still zero returned ...
1264 dummy = strchr(dummy1, '\n'); // ... at line end then
1265 if ((j < yth-1) && (type < 4)) { // check if xth value or not yet
1266 if (critical) {
1267 if (verbose) fprintf(stderr,"Error: EoL at %i and still missing %i value(s) for parameter %s\n", line, yth-j, name);
1268 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1269 //return 0;
1270 exit(255);
1271 //Error(FileOpenParams, NULL);
1272 } else {
1273 //if (!sequential)
1274 file->clear();
1275 file->seekg(file_position, ios::beg); // rewind to start position
1276 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1277 return 0;
1278 }
1279 }
1280 } else {
1281 //fprintf(stderr,"found tab at %i\n",(char *)dummy-(char *)free_dummy);
1282 }
1283 if (*dummy1 == '#') {
1284 // found comment, skipping rest of line
1285 //if (verbose) fprintf(stderr,"Error: '#' at %i and still missing %i value(s) for parameter %s\n", line, yth-j, name);
1286 if (!sequential) { // here we need it!
1287 file->seekg(file_position, ios::beg); // rewind to start position
1288 }
1289 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1290 return 0;
1291 }
1292 //fprintf(stderr,"value from %i to %i\n",(char *)dummy1-(char *)free_dummy,(char *)dummy-(char *)free_dummy);
1293 switch(type) {
1294 case (row_int):
1295 *((int *)value) = atoi(dummy1);
1296 if ((verbose) && (i==0) && (j==0)) fprintf(stderr,"%s = ", name);
1297 if (verbose) fprintf(stderr,"%i\t",*((int *)value));
1298 value = (void *)((long)value + sizeof(int));
1299 //value += sizeof(int);
1300 break;
1301 case(row_double):
1302 case(grid):
1303 case(lower_trigrid):
1304 case(upper_trigrid):
1305 *((double *)value) = atof(dummy1);
1306 if ((verbose) && (i==0) && (j==0)) fprintf(stderr,"%s = ", name);
1307 if (verbose) fprintf(stderr,"%lg\t",*((double *)value));
1308 value = (void *)((long)value + sizeof(double));
1309 //value += sizeof(double);
1310 break;
1311 case(double_type):
1312 *((double *)value) = atof(dummy1);
1313 if ((verbose) && (i == xth-1)) fprintf(stderr,"%s = %lg\n", name, *((double *) value));
1314 //value += sizeof(double);
1315 break;
1316 case(int_type):
1317 *((int *)value) = atoi(dummy1);
1318 if ((verbose) && (i == xth-1)) fprintf(stderr,"%s = %i\n", name, *((int *) value));
1319 //value += sizeof(int);
1320 break;
1321 default:
1322 case(string_type):
1323 if (value != NULL) {
1324 //if (maxlength == -1) maxlength = strlen((char *)value); // get maximum size of string array
1325 maxlength = MAXSTRINGSIZE;
1326 length = maxlength > (dummy-dummy1) ? (dummy-dummy1) : maxlength; // cap at maximum
1327 strncpy((char *)value, dummy1, length); // copy as much
1328 ((char *)value)[length] = '\0'; // and set end marker
1329 if ((verbose) && (i == xth-1)) fprintf(stderr,"%s is '%s' (%i chars)\n",name,((char *) value), length);
1330 //value += sizeof(char);
1331 } else {
1332 }
1333 break;
1334 }
1335 }
1336 while (*dummy == '\t')
1337 dummy++;
1338 }
1339 }
1340 }
1341 }
1342 }
1343 if ((type >= row_int) && (verbose)) fprintf(stderr,"\n");
1344 Free((void **)&free_dummy, "config::ParseForParameter: *free_dummy");
1345 if (!sequential) {
1346 file->clear();
1347 file->seekg(file_position, ios::beg); // rewind to start position
1348 }
1349 //fprintf(stderr, "End of Parsing\n\n");
1350
1351 return (found); // true if found, false if not
1352}
Note: See TracBrowser for help on using the repository browser.