source: src/config.cpp@ c1fc22

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

new function SaveMPQC(), bugfixes in ParseForParameter()

ParseForParameter(): first while loop tested dummy[0] although it might occur that dummy = NULL, this is now checked beforehand. On stepping through the values in the keyword line, the end marker (dummy) was shifted to the start of the next value, hence included the tabs. This lead to strings being stored with tabs at the end and on consecutive loading&storing in an MD run to an accumulation of tabs till MD step 152, where the config file could not be parsed anymore due to the size of the string value. This is fixed (the shifthing further is removed, as unnecessary).
SaveMPQC(): molecuilder now stores input files for MPQC directly, i.e. they don't have to be converted from the ESPACK format externally. This saves a lot of time during BOSSANOVA MD.

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