source: src/Parser/PcpParser.cpp@ 41a467

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 41a467 was 41a467, checked in by Frederik Heber <heber@…>, 13 years ago

LARGE: config class is now just a tiny container.

  • this was loooooobg overdue. Config.cpp contained remnants from parsing pcp files and much else. Also fragmentation depended on it. Since refactoring of MoleculeListClass and the fragmentation, we don't need it anymore.
  • helper functions ParseForParameters(), LoadMolecule() extracted into new module PcpParser_helper.
  • config class now just contains 4 variables that are generally required (especially IsAngstroem) and they should probably remain with the world.
  • removed some places where config.hpp was no unnecessarily included.
  • Moved ConfigFileBuffer.* over to subfolder src/Parser/ where it rather belongs (associated with PcpParser).
  • Property mode set to 100644
File size: 36.0 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * PcpParser.cpp
10 *
11 * Created on: 12.06.2010
12 * Author: heber
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include "CodePatterns/MemDebug.hpp"
21
22#include <iostream>
23#include <iomanip>
24
25#include "atom.hpp"
26#include "Box.hpp"
27#include "CodePatterns/Assert.hpp"
28#include "CodePatterns/Log.hpp"
29#include "CodePatterns/Verbose.hpp"
30#include "Element/element.hpp"
31#include "Element/periodentafel.hpp"
32#include "LinearAlgebra/RealSpaceMatrix.hpp"
33#include "molecule.hpp"
34#include "MoleculeListClass.hpp"
35#include "PcpParser.hpp"
36#include "Parser/ConfigFileBuffer.hpp"
37#include "Parser/PcpParser_helper.hpp"
38#include "ThermoStatContainer.hpp"
39#include "World.hpp"
40
41
42// declare specialized static variables
43const std::string FormatParserTrait<pcp>::name = "pcp";
44const std::string FormatParserTrait<pcp>::suffix = "conf";
45const ParserTypes FormatParserTrait<pcp>::type = pcp;
46
47FormatParser< pcp >::StructParallelization::StructParallelization() :
48 ProcPEGamma(8),
49 ProcPEPsi(1)
50{}
51
52FormatParser< pcp >::StructParallelization::~StructParallelization()
53{}
54
55FormatParser< pcp >::StructPaths::StructPaths() :
56 databasepath(NULL),
57 configname(NULL),
58 mainname(NULL),
59 defaultpath(NULL),
60 pseudopotpath(NULL)
61{}
62
63FormatParser< pcp >::StructPaths::~StructPaths()
64{}
65
66FormatParser< pcp >::StructSwitches::StructSwitches() :
67 DoConstrainedMD(0),
68 DoOutVis(0),
69 DoOutMes(1),
70 DoOutNICS(0),
71 DoOutOrbitals(0),
72 DoOutCurrent(0),
73 DoFullCurrent(0),
74 DoPerturbation(0),
75 DoWannier(0)
76{}
77
78FormatParser< pcp >::StructSwitches::~StructSwitches()
79{}
80
81FormatParser< pcp >::StructLocalizedOrbitals::StructLocalizedOrbitals() :
82 CommonWannier(0),
83 SawtoothStart(0.01),
84 VectorPlane(0),
85 VectorCut(0),
86 UseAddGramSch(1),
87 Seed(1),
88 EpsWannier(1e-7)
89{}
90
91FormatParser< pcp >::StructLocalizedOrbitals::~StructLocalizedOrbitals()
92{}
93
94FormatParser< pcp >::StructStepCounts::StructStepCounts() :
95 MaxMinStopStep(1),
96 InitMaxMinStopStep(1),
97 OutVisStep(10),
98 OutSrcStep(5),
99 MaxPsiStep(0),
100 MaxOuterStep(0),
101 MaxMinStep(100),
102 RelEpsTotalEnergy(1e-07),
103 RelEpsKineticEnergy(1e-05),
104 MaxMinGapStopStep(0),
105 MaxInitMinStep(100),
106 InitRelEpsTotalEnergy(1e-05),
107 InitRelEpsKineticEnergy(0.0001),
108 InitMaxMinGapStopStep(0)
109{}
110
111FormatParser< pcp >::StructStepCounts::~StructStepCounts()
112{}
113
114FormatParser< pcp >::StructPlaneWaveSpecifics::StructPlaneWaveSpecifics() :
115 PsiType(0),
116 MaxPsiDouble(0),
117 PsiMaxNoUp(0),
118 PsiMaxNoDown(0),
119 ECut(128),
120 MaxLevel(5),
121 RiemannTensor(0),
122 LevRFactor(0),
123 RiemannLevel(0),
124 Lev0Factor(2),
125 RTActualUse(0),
126 AddPsis(0),
127 RCut(20)
128{}
129
130FormatParser< pcp >::StructPlaneWaveSpecifics::~StructPlaneWaveSpecifics()
131{}
132
133/** Constructor of PcpParser.
134 *
135 */
136FormatParser< pcp >::FormatParser() :
137 FormatParser_common(NULL),
138 FastParsing(false),
139 Deltat(0.01),
140 IsAngstroem(1),
141 RelativeCoord(0),
142 StructOpt(0),
143 MaxTypes(0)
144{}
145
146/** Destructor of PcpParser.
147 *
148 */
149FormatParser< pcp >::~FormatParser()
150{}
151
152void FormatParser< pcp >::load(std::istream* file)
153{
154 if (file->fail()) {
155 ELOG(1, "could not access given file");
156 return;
157 }
158
159 // ParseParameterFile
160 class ConfigFileBuffer *FileBuffer = new ConfigFileBuffer();
161 FileBuffer->InitFileBuffer(file);
162
163 /* Oeffne Hauptparameterdatei */
164 int di = 0;
165 double BoxLength[9];
166 string zeile;
167 string dummy;
168 int verbose = 0;
169
170 ParseThermostats(FileBuffer);
171
172 /* Namen einlesen */
173
174 // 1. parse in options
175 if (!ParseForParameter(verbose,FileBuffer, "mainname", 0, 1, 1, string_type, (Paths.mainname), 1, critical)) {
176 ELOG(1, "mainname is missing, is file empty?");
177 } else {
178 ParseForParameter(verbose,FileBuffer, "defaultpath", 0, 1, 1, string_type, (Paths.defaultpath), 1, critical);
179 ParseForParameter(verbose,FileBuffer, "pseudopotpath", 0, 1, 1, string_type, (Paths.pseudopotpath), 1, critical);
180 ParseForParameter(verbose,FileBuffer,"ProcPEGamma", 0, 1, 1, int_type, &(Parallelization.ProcPEGamma), 1, critical);
181 ParseForParameter(verbose,FileBuffer,"ProcPEPsi", 0, 1, 1, int_type, &(Parallelization.ProcPEPsi), 1, critical);
182
183 if (!ParseForParameter(verbose,FileBuffer,"Seed", 0, 1, 1, int_type, &(LocalizedOrbitals.Seed), 1, optional))
184 LocalizedOrbitals.Seed = 1;
185
186 if(!ParseForParameter(verbose,FileBuffer,"DoOutOrbitals", 0, 1, 1, int_type, &(Switches.DoOutOrbitals), 1, optional)) {
187 Switches.DoOutOrbitals = 0;
188 } else {
189 if (Switches.DoOutOrbitals < 0) Switches.DoOutOrbitals = 0;
190 if (Switches.DoOutOrbitals > 1) Switches.DoOutOrbitals = 1;
191 }
192 ParseForParameter(verbose,FileBuffer,"DoOutVis", 0, 1, 1, int_type, &(Switches.DoOutVis), 1, critical);
193 if (Switches.DoOutVis < 0) Switches.DoOutVis = 0;
194 if (Switches.DoOutVis > 1) Switches.DoOutVis = 1;
195 if (!ParseForParameter(verbose,FileBuffer,"VectorPlane", 0, 1, 1, int_type, &(LocalizedOrbitals.VectorPlane), 1, optional))
196 LocalizedOrbitals.VectorPlane = -1;
197 if (!ParseForParameter(verbose,FileBuffer,"VectorCut", 0, 1, 1, double_type, &(LocalizedOrbitals.VectorCut), 1, optional))
198 LocalizedOrbitals.VectorCut = 0.;
199 ParseForParameter(verbose,FileBuffer,"DoOutMes", 0, 1, 1, int_type, &(Switches.DoOutMes), 1, critical);
200 if (Switches.DoOutMes < 0) Switches.DoOutMes = 0;
201 if (Switches.DoOutMes > 1) Switches.DoOutMes = 1;
202 if (!ParseForParameter(verbose,FileBuffer,"DoOutCurr", 0, 1, 1, int_type, &(Switches.DoOutCurrent), 1, optional))
203 Switches.DoOutCurrent = 0;
204 if (Switches.DoOutCurrent < 0) Switches.DoOutCurrent = 0;
205 if (Switches.DoOutCurrent > 1) Switches.DoOutCurrent = 1;
206 ParseForParameter(verbose,FileBuffer,"AddGramSch", 0, 1, 1, int_type, &(LocalizedOrbitals.UseAddGramSch), 1, critical);
207 if (LocalizedOrbitals.UseAddGramSch < 0) LocalizedOrbitals.UseAddGramSch = 0;
208 if (LocalizedOrbitals.UseAddGramSch > 2) LocalizedOrbitals.UseAddGramSch = 2;
209 if(!ParseForParameter(verbose,FileBuffer,"DoWannier", 0, 1, 1, int_type, &(Switches.DoWannier), 1, optional)) {
210 Switches.DoWannier = 0;
211 } else {
212 if (Switches.DoWannier < 0) Switches.DoWannier = 0;
213 if (Switches.DoWannier > 1) Switches.DoWannier = 1;
214 }
215 if(!ParseForParameter(verbose,FileBuffer,"CommonWannier", 0, 1, 1, int_type, &(LocalizedOrbitals.CommonWannier), 1, optional)) {
216 LocalizedOrbitals.CommonWannier = 0;
217 } else {
218 if (LocalizedOrbitals.CommonWannier < 0) LocalizedOrbitals.CommonWannier = 0;
219 if (LocalizedOrbitals.CommonWannier > 4) LocalizedOrbitals.CommonWannier = 4;
220 }
221 if(!ParseForParameter(verbose,FileBuffer,"SawtoothStart", 0, 1, 1, double_type, &(LocalizedOrbitals.SawtoothStart), 1, optional)) {
222 LocalizedOrbitals.SawtoothStart = 0.01;
223 } else {
224 if (LocalizedOrbitals.SawtoothStart < 0.) LocalizedOrbitals.SawtoothStart = 0.;
225 if (LocalizedOrbitals.SawtoothStart > 1.) LocalizedOrbitals.SawtoothStart = 1.;
226 }
227
228 if (ParseForParameter(verbose,FileBuffer,"DoConstrainedMD", 0, 1, 1, int_type, &(Switches.DoConstrainedMD), 1, optional))
229 if (Switches.DoConstrainedMD < 0)
230 Switches.DoConstrainedMD = 0;
231 ParseForParameter(verbose,FileBuffer,"MaxOuterStep", 0, 1, 1, int_type, &(StepCounts.MaxOuterStep), 1, critical);
232 if (!ParseForParameter(verbose,FileBuffer,"Deltat", 0, 1, 1, double_type, &(Deltat), 1, optional))
233 Deltat = 1;
234 ParseForParameter(verbose,FileBuffer,"OutVisStep", 0, 1, 1, int_type, &(StepCounts.OutVisStep), 1, optional);
235 ParseForParameter(verbose,FileBuffer,"OutSrcStep", 0, 1, 1, int_type, &(StepCounts.OutSrcStep), 1, optional);
236 ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &(World::getInstance().getThermostats()->TargetTemp), 1, optional);
237 //ParseForParameter(verbose,FileBuffer,"Thermostat", 0, 1, 1, int_type, &(ScaleTempStep), 1, optional);
238 if (!ParseForParameter(verbose,FileBuffer,"EpsWannier", 0, 1, 1, double_type, &(LocalizedOrbitals.EpsWannier), 1, optional))
239 LocalizedOrbitals.EpsWannier = 1e-8;
240
241 // stop conditions
242 //if (MaxOuterStep <= 0) MaxOuterStep = 1;
243 ParseForParameter(verbose,FileBuffer,"MaxPsiStep", 0, 1, 1, int_type, &(StepCounts.MaxPsiStep), 1, critical);
244 if (StepCounts.MaxPsiStep <= 0) StepCounts.MaxPsiStep = 3;
245
246 ParseForParameter(verbose,FileBuffer,"MaxMinStep", 0, 1, 1, int_type, &(StepCounts.MaxMinStep), 1, critical);
247 ParseForParameter(verbose,FileBuffer,"RelEpsTotalE", 0, 1, 1, double_type, &(StepCounts.RelEpsTotalEnergy), 1, critical);
248 ParseForParameter(verbose,FileBuffer,"RelEpsKineticE", 0, 1, 1, double_type, &(StepCounts.RelEpsKineticEnergy), 1, critical);
249 ParseForParameter(verbose,FileBuffer,"MaxMinStopStep", 0, 1, 1, int_type, &(StepCounts.MaxMinStopStep), 1, critical);
250 ParseForParameter(verbose,FileBuffer,"MaxMinGapStopStep", 0, 1, 1, int_type, &(StepCounts.MaxMinGapStopStep), 1, critical);
251 if (StepCounts.MaxMinStep <= 0) StepCounts.MaxMinStep = StepCounts.MaxPsiStep;
252 if (StepCounts.MaxMinStopStep < 1) StepCounts.MaxMinStopStep = 1;
253 if (StepCounts.MaxMinGapStopStep < 1) StepCounts.MaxMinGapStopStep = 1;
254
255 ParseForParameter(verbose,FileBuffer,"MaxInitMinStep", 0, 1, 1, int_type, &(StepCounts.MaxInitMinStep), 1, critical);
256 ParseForParameter(verbose,FileBuffer,"InitRelEpsTotalE", 0, 1, 1, double_type, &(StepCounts.InitRelEpsTotalEnergy), 1, critical);
257 ParseForParameter(verbose,FileBuffer,"InitRelEpsKineticE", 0, 1, 1, double_type, &(StepCounts.InitRelEpsKineticEnergy), 1, critical);
258 ParseForParameter(verbose,FileBuffer,"InitMaxMinStopStep", 0, 1, 1, int_type, &(StepCounts.InitMaxMinStopStep), 1, critical);
259 ParseForParameter(verbose,FileBuffer,"InitMaxMinGapStopStep", 0, 1, 1, int_type, &(StepCounts.InitMaxMinGapStopStep), 1, critical);
260 if (StepCounts.MaxInitMinStep <= 0) StepCounts.MaxInitMinStep = StepCounts.MaxPsiStep;
261 if (StepCounts.InitMaxMinStopStep < 1) StepCounts.InitMaxMinStopStep = 1;
262 if (StepCounts.InitMaxMinGapStopStep < 1) StepCounts.InitMaxMinGapStopStep = 1;
263
264 // Unit cell and magnetic field
265 ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
266 double *cell_size = new double[6];
267 cell_size[0] = BoxLength[0];
268 cell_size[1] = BoxLength[3];
269 cell_size[2] = BoxLength[4];
270 cell_size[3] = BoxLength[6];
271 cell_size[4] = BoxLength[7];
272 cell_size[5] = BoxLength[8];
273 World::getInstance().setDomain(cell_size);
274 delete[] cell_size;
275 //if (1) fprintf(stderr,"\n");
276
277 ParseForParameter(verbose,FileBuffer,"DoPerturbation", 0, 1, 1, int_type, &(Switches.DoPerturbation), 1, optional);
278 ParseForParameter(verbose,FileBuffer,"DoOutNICS", 0, 1, 1, int_type, &(Switches.DoOutNICS), 1, optional);
279 if (!ParseForParameter(verbose,FileBuffer,"DoFullCurrent", 0, 1, 1, int_type, &(Switches.DoFullCurrent), 1, optional))
280 Switches.DoFullCurrent = 0;
281 if (Switches.DoFullCurrent < 0) Switches.DoFullCurrent = 0;
282 if (Switches.DoFullCurrent > 2) Switches.DoFullCurrent = 2;
283 if (Switches.DoOutNICS < 0) Switches.DoOutNICS = 0;
284 if (Switches.DoOutNICS > 2) Switches.DoOutNICS = 2;
285 if (Switches.DoPerturbation == 0) {
286 Switches.DoFullCurrent = 0;
287 Switches.DoOutNICS = 0;
288 }
289
290 ParseForParameter(verbose,FileBuffer,"ECut", 0, 1, 1, double_type, &(PlaneWaveSpecifics.ECut), 1, critical);
291 ParseForParameter(verbose,FileBuffer,"MaxLevel", 0, 1, 1, int_type, &(PlaneWaveSpecifics.MaxLevel), 1, critical);
292 ParseForParameter(verbose,FileBuffer,"Level0Factor", 0, 1, 1, int_type, &(PlaneWaveSpecifics.Lev0Factor), 1, critical);
293 if (PlaneWaveSpecifics.Lev0Factor < 2) {
294 PlaneWaveSpecifics.Lev0Factor = 2;
295 }
296 ParseForParameter(verbose,FileBuffer,"RiemannTensor", 0, 1, 1, int_type, &di, 1, critical);
297 if (di >= 0 && di < 2) {
298 PlaneWaveSpecifics.RiemannTensor = di;
299 } else {
300 cerr << "0 <= RiemanTensor < 2: 0 UseNotRT, 1 UseRT" << endl;
301 exit(1);
302 }
303 switch (PlaneWaveSpecifics.RiemannTensor) {
304 case 0: //UseNoRT
305 if (PlaneWaveSpecifics.MaxLevel < 2) {
306 PlaneWaveSpecifics.MaxLevel = 2;
307 }
308 PlaneWaveSpecifics.LevRFactor = 2;
309 PlaneWaveSpecifics.RTActualUse = 0;
310 break;
311 case 1: // UseRT
312 if (PlaneWaveSpecifics.MaxLevel < 3) {
313 PlaneWaveSpecifics.MaxLevel = 3;
314 }
315 ParseForParameter(verbose,FileBuffer,"RiemannLevel", 0, 1, 1, int_type, &(PlaneWaveSpecifics.RiemannLevel), 1, critical);
316 if (PlaneWaveSpecifics.RiemannLevel < 2) {
317 PlaneWaveSpecifics.RiemannLevel = 2;
318 }
319 if (PlaneWaveSpecifics.RiemannLevel > PlaneWaveSpecifics.MaxLevel-1) {
320 PlaneWaveSpecifics.RiemannLevel = PlaneWaveSpecifics.MaxLevel-1;
321 }
322 ParseForParameter(verbose,FileBuffer,"LevRFactor", 0, 1, 1, int_type, &(PlaneWaveSpecifics.LevRFactor), 1, critical);
323 if (PlaneWaveSpecifics.LevRFactor < 2) {
324 PlaneWaveSpecifics.LevRFactor = 2;
325 }
326 PlaneWaveSpecifics.Lev0Factor = 2;
327 PlaneWaveSpecifics.RTActualUse = 2;
328 break;
329 }
330 ParseForParameter(verbose,FileBuffer,"PsiType", 0, 1, 1, int_type, &di, 1, critical);
331 if (di >= 0 && di < 2) {
332 PlaneWaveSpecifics.PsiType = di;
333 } else {
334 cerr << "0 <= PsiType < 2: 0 UseSpinDouble, 1 UseSpinUpDown" << endl;
335 exit(1);
336 }
337 switch (PlaneWaveSpecifics.PsiType) {
338 case 0: // SpinDouble
339 ParseForParameter(verbose,FileBuffer,"MaxPsiDouble", 0, 1, 1, int_type, &(PlaneWaveSpecifics.MaxPsiDouble), 1, critical);
340 ParseForParameter(verbose,FileBuffer,"PsiMaxNoUp", 0, 1, 1, int_type, &(PlaneWaveSpecifics.PsiMaxNoUp), 1, optional);
341 ParseForParameter(verbose,FileBuffer,"PsiMaxNoDown", 0, 1, 1, int_type, &(PlaneWaveSpecifics.PsiMaxNoDown), 1, optional);
342 ParseForParameter(verbose,FileBuffer,"AddPsis", 0, 1, 1, int_type, &(PlaneWaveSpecifics.AddPsis), 1, optional);
343 break;
344 case 1: // SpinUpDown
345 if (Parallelization.ProcPEGamma % 2) Parallelization.ProcPEGamma*=2;
346 ParseForParameter(verbose,FileBuffer,"MaxPsiDouble", 0, 1, 1, int_type, &(PlaneWaveSpecifics.MaxPsiDouble), 1, optional);
347 ParseForParameter(verbose,FileBuffer,"PsiMaxNoUp", 0, 1, 1, int_type, &(PlaneWaveSpecifics.PsiMaxNoUp), 1, critical);
348 ParseForParameter(verbose,FileBuffer,"PsiMaxNoDown", 0, 1, 1, int_type, &(PlaneWaveSpecifics.PsiMaxNoDown), 1, critical);
349 ParseForParameter(verbose,FileBuffer,"AddPsis", 0, 1, 1, int_type, &(PlaneWaveSpecifics.AddPsis), 1, optional);
350 break;
351 }
352
353 // IonsInitRead
354
355 ParseForParameter(verbose,FileBuffer,"RCut", 0, 1, 1, double_type, &(PlaneWaveSpecifics.RCut), 1, critical);
356 ParseForParameter(verbose,FileBuffer,"IsAngstroem", 0, 1, 1, int_type, &(IsAngstroem), 1, critical);
357 ParseForParameter(verbose,FileBuffer,"MaxTypes", 0, 1, 1, int_type, &(MaxTypes), 1, critical);
358 if (!ParseForParameter(verbose,FileBuffer,"RelativeCoord", 0, 1, 1, int_type, &(RelativeCoord) , 1, optional))
359 RelativeCoord = 0;
360 if (!ParseForParameter(verbose,FileBuffer,"StructOpt", 0, 1, 1, int_type, &(StructOpt), 1, optional))
361 StructOpt = 0;
362 }
363
364 // 3. parse the molecule in
365 molecule *mol = World::getInstance().createMolecule();
366 mol->ActiveFlag = true;
367 // TODO: Remove the insertion into molecule when saving does not depend on them anymore. Also, remove molecule.hpp include
368 World::getInstance().getMolecules()->insert(mol);
369 LoadMolecule(mol, FileBuffer, World::getInstance().getPeriode(), FastParsing);
370
371 // refresh atom::nr and atom::name
372 mol->getAtomCount();
373
374 // 4. dissect the molecule into connected subgraphs
375 // don't do this here ...
376 //FragmentationSubgraphDissection();
377 //delete(mol);
378
379 delete(FileBuffer);
380}
381
382/**
383 * Saves the \a atoms into as a PCP file.
384 *
385 * \param file where to save the state
386 * \param atoms atoms to store
387 */
388void FormatParser< pcp >::save(std::ostream* file, const std::vector<atom *> &atoms)
389{
390 LOG(0, "Saving changes to pcp.");
391
392 const RealSpaceMatrix &domain = World::getInstance().getDomain().getM();
393 ThermoStatContainer *Thermostats = World::getInstance().getThermostats();
394 if (!file->fail()) {
395 // calculate number of Psis
396 CalculateOrbitals(atoms);
397 *file << "# ParallelCarParinello - main configuration file - created with molecuilder" << endl;
398 *file << endl;
399 if (Paths.mainname != NULL)
400 *file << "mainname\t" << Paths.mainname << "\t# programm name (for runtime files)" << endl;
401 else
402 *file << "mainname\tpcp\t# programm name (for runtime files)" << endl;
403 if (Paths.defaultpath != NULL)
404 *file << "defaultpath\t" << Paths.defaultpath << "\t# where to put files during runtime" << endl;
405 else
406 *file << "defaultpath\tnot specified\t# where to put files during runtime" << endl;
407 if (Paths.pseudopotpath != NULL)
408 *file << "pseudopotpath\t" << Paths.pseudopotpath << "\t# where to find pseudopotentials" << endl;
409 else
410 *file << "pseudopotpath\tnot specified\t# where to find pseudopotentials" << endl;
411 *file << endl;
412 *file << "ProcPEGamma\t" << Parallelization.ProcPEGamma << "\t# for parallel computing: share constants" << endl;
413 *file << "ProcPEPsi\t" << Parallelization.ProcPEPsi << "\t# for parallel computing: share wave functions" << endl;
414 *file << "DoOutVis\t" << Switches.DoOutVis << "\t# Output data for OpenDX" << endl;
415 *file << "DoOutMes\t" << Switches.DoOutMes << "\t# Output data for measurements" << endl;
416 *file << "DoOutOrbitals\t" << Switches.DoOutOrbitals << "\t# Output all Orbitals" << endl;
417 *file << "DoOutCurr\t" << Switches.DoOutCurrent << "\t# Ouput current density for OpenDx" << endl;
418 *file << "DoOutNICS\t" << Switches.DoOutNICS << "\t# Output Nucleus independent current shieldings" << endl;
419 *file << "DoPerturbation\t" << Switches.DoPerturbation << "\t# Do perturbation calculate and determine susceptibility and shielding" << endl;
420 *file << "DoFullCurrent\t" << Switches.DoFullCurrent << "\t# Do full perturbation" << endl;
421 *file << "DoConstrainedMD\t" << Switches.DoConstrainedMD << "\t# Do perform a constrained (>0, relating to current MD step) instead of unconstrained (0) MD" << endl;
422 ASSERT(Thermostats != NULL, "FormatParser< pcp >::save() - Thermostats not initialized!");
423 *file << "Thermostat\t" << Thermostats->activeThermostat->name() << "\t";
424 *file << Thermostats->activeThermostat->writeParams();
425 *file << "\t# Which Thermostat and its parameters to use in MD case." << endl;
426 *file << "CommonWannier\t" << LocalizedOrbitals.CommonWannier << "\t# Put virtual centers at indivual orbits, all common, merged by variance, to grid point, to cell center" << endl;
427 *file << "SawtoothStart\t" << LocalizedOrbitals.SawtoothStart << "\t# Absolute value for smooth transition at cell border " << endl;
428 *file << "VectorPlane\t" << LocalizedOrbitals.VectorPlane << "\t# Cut plane axis (x, y or z: 0,1,2) for two-dim current vector plot" << endl;
429 *file << "VectorCut\t" << LocalizedOrbitals.VectorCut << "\t# Cut plane axis value" << endl;
430 *file << "AddGramSch\t" << LocalizedOrbitals.UseAddGramSch << "\t# Additional GramSchmidtOrtogonalization to be safe" << endl;
431 *file << "Seed\t\t" << LocalizedOrbitals.Seed << "\t# initial value for random seed for Psi coefficients" << endl;
432 *file << endl;
433 *file << "MaxOuterStep\t" << StepCounts.MaxOuterStep << "\t# number of MolecularDynamics/Structure optimization steps" << endl;
434 *file << "Deltat\t" << Deltat << "\t# time per MD step" << endl;
435 *file << "OutVisStep\t" << StepCounts.OutVisStep << "\t# Output visual data every ...th step" << endl;
436 *file << "OutSrcStep\t" << StepCounts.OutSrcStep << "\t# Output \"restart\" data every ..th step" << endl;
437 *file << "TargetTemp\t" << Thermostats->TargetTemp << "\t# Target temperature" << endl;
438 *file << "MaxPsiStep\t" << StepCounts.MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl;
439 *file << "EpsWannier\t" << LocalizedOrbitals.EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl;
440 *file << endl;
441 *file << "# Values specifying when to stop" << endl;
442 *file << "MaxMinStep\t" << StepCounts.MaxMinStep << "\t# Maximum number of steps" << endl;
443 *file << "RelEpsTotalE\t" << StepCounts.RelEpsTotalEnergy << "\t# relative change in total energy" << endl;
444 *file << "RelEpsKineticE\t" << StepCounts.RelEpsKineticEnergy << "\t# relative change in kinetic energy" << endl;
445 *file << "MaxMinStopStep\t" << StepCounts.MaxMinStopStep << "\t# check every ..th steps" << endl;
446 *file << "MaxMinGapStopStep\t" << StepCounts.MaxMinGapStopStep << "\t# check every ..th steps" << endl;
447 *file << endl;
448 *file << "# Values specifying when to stop for INIT, otherwise same as above" << endl;
449 *file << "MaxInitMinStep\t" << StepCounts.MaxInitMinStep << "\t# Maximum number of steps" << endl;
450 *file << "InitRelEpsTotalE\t" << StepCounts.InitRelEpsTotalEnergy << "\t# relative change in total energy" << endl;
451 *file << "InitRelEpsKineticE\t" << StepCounts.InitRelEpsKineticEnergy << "\t# relative change in kinetic energy" << endl;
452 *file << "InitMaxMinStopStep\t" << StepCounts.InitMaxMinStopStep << "\t# check every ..th steps" << endl;
453 *file << "InitMaxMinGapStopStep\t" << StepCounts.InitMaxMinGapStopStep << "\t# check every ..th steps" << endl;
454 *file << endl;
455 *file << "BoxLength\t\t\t# (Length of a unit cell)" << endl;
456 *file << domain.at(0,0) << "\t" << endl;
457 *file << domain.at(1,0) << "\t" << domain.at(1,1) << "\t" << endl;
458 *file << domain.at(2,0) << "\t" << domain.at(2,1) << "\t" << domain.at(2,2) << "\t" << endl;
459 // FIXME
460 *file << endl;
461 *file << "ECut\t\t" << PlaneWaveSpecifics.ECut << "\t# energy cutoff for discretization in Hartrees" << endl;
462 *file << "MaxLevel\t" << PlaneWaveSpecifics.MaxLevel << "\t# number of different levels in the code, >=2" << endl;
463 *file << "Level0Factor\t" << PlaneWaveSpecifics.Lev0Factor << "\t# factor by which node number increases from S to 0 level" << endl;
464 *file << "RiemannTensor\t" << PlaneWaveSpecifics.RiemannTensor << "\t# (Use metric)" << endl;
465 switch (PlaneWaveSpecifics.RiemannTensor) {
466 case 0: //UseNoRT
467 break;
468 case 1: // UseRT
469 *file << "RiemannLevel\t" << PlaneWaveSpecifics.RiemannLevel << "\t# Number of Riemann Levels" << endl;
470 *file << "LevRFactor\t" << PlaneWaveSpecifics.LevRFactor << "\t# factor by which node number increases from 0 to R level from" << endl;
471 break;
472 }
473 *file << "PsiType\t\t" << PlaneWaveSpecifics.PsiType << "\t# 0 - doubly occupied, 1 - SpinUp,SpinDown" << endl;
474 *file << "MaxPsiDouble\t" << PlaneWaveSpecifics.MaxPsiDouble << "\t# here: specifying both maximum number of SpinUp- and -Down-states" << endl;
475 *file << "PsiMaxNoUp\t" << PlaneWaveSpecifics.PsiMaxNoUp << "\t# here: specifying maximum number of SpinUp-states" << endl;
476 *file << "PsiMaxNoDown\t" << PlaneWaveSpecifics.PsiMaxNoDown << "\t# here: specifying maximum number of SpinDown-states" << endl;
477 *file << "AddPsis\t\t" << PlaneWaveSpecifics.AddPsis << "\t# Additional unoccupied Psis for bandgap determination" << endl;
478 *file << endl;
479 *file << "RCut\t\t" << PlaneWaveSpecifics.RCut << "\t# R-cut for the ewald summation" << endl;
480 *file << "StructOpt\t" << StructOpt << "\t# Do structure optimization beforehand" << endl;
481 *file << "IsAngstroem\t" << IsAngstroem << "\t# 0 - Bohr, 1 - Angstroem" << endl;
482 *file << "RelativeCoord\t" << RelativeCoord << "\t# whether ion coordinates are relative (1) or absolute (0)" << endl;
483 map<int, int> ZtoIndexMap;
484 OutputElements(file, atoms, ZtoIndexMap);
485 OutputAtoms(file, atoms, ZtoIndexMap);
486 } else {
487 ELOG(1, "Cannot open output file.");
488 }
489}
490
491
492/** Counts necessary number of valence electrons and returns number and SpinType.
493 * \param &allatoms all atoms to store away
494 */
495void FormatParser< pcp >::CalculateOrbitals(const std::vector<atom *> &allatoms)
496{
497 PlaneWaveSpecifics.MaxPsiDouble = PlaneWaveSpecifics.PsiMaxNoDown = PlaneWaveSpecifics.PsiMaxNoUp = PlaneWaveSpecifics.PsiType = 0;
498 for (vector<atom *>::const_iterator runner = allatoms.begin(); runner != allatoms.end(); ++runner) {
499 PlaneWaveSpecifics.MaxPsiDouble += (*runner)->getType()->getNoValenceOrbitals();
500 }
501 cout << PlaneWaveSpecifics.MaxPsiDouble << endl;
502 PlaneWaveSpecifics.PsiMaxNoDown = PlaneWaveSpecifics.MaxPsiDouble/2 + (PlaneWaveSpecifics.MaxPsiDouble % 2);
503 PlaneWaveSpecifics.PsiMaxNoUp = PlaneWaveSpecifics.MaxPsiDouble/2;
504 PlaneWaveSpecifics.MaxPsiDouble /= 2;
505 PlaneWaveSpecifics.PsiType = (PlaneWaveSpecifics.PsiMaxNoDown == PlaneWaveSpecifics.PsiMaxNoUp) ? 0 : 1;
506 if ((PlaneWaveSpecifics.PsiType == 1) && (Parallelization.ProcPEPsi < 2) && ((PlaneWaveSpecifics.PsiMaxNoDown != 1) || (PlaneWaveSpecifics.PsiMaxNoUp != 0))) {
507 Parallelization.ProcPEGamma /= 2;
508 Parallelization.ProcPEPsi *= 2;
509 } else {
510 Parallelization.ProcPEGamma *= Parallelization.ProcPEPsi;
511 Parallelization.ProcPEPsi = 1;
512 }
513 cout << PlaneWaveSpecifics.PsiMaxNoDown << ">" << PlaneWaveSpecifics.PsiMaxNoUp << endl;
514 if (PlaneWaveSpecifics.PsiMaxNoDown > PlaneWaveSpecifics.PsiMaxNoUp) {
515 StepCounts.InitMaxMinStopStep = StepCounts.MaxMinStopStep = PlaneWaveSpecifics.PsiMaxNoDown;
516 cout << PlaneWaveSpecifics.PsiMaxNoDown << " " << StepCounts.InitMaxMinStopStep << endl;
517 } else {
518 StepCounts.InitMaxMinStopStep = StepCounts.MaxMinStopStep = PlaneWaveSpecifics.PsiMaxNoUp;
519 cout << PlaneWaveSpecifics.PsiMaxNoUp << " " << StepCounts.InitMaxMinStopStep << endl;
520 }
521};
522
523/** Prints MaxTypes and list of elements to strea,
524 * \param *file output stream
525 * \param &allatoms vector of all atoms in the system, such as by World::getAllAtoms()
526 * \param &ZtoIndexMap map of which atoms belong to which ion number
527 */
528void FormatParser< pcp >::OutputElements(ostream *file, const std::vector<atom *> &allatoms, map<int, int> &ZtoIndexMap)
529{
530 map<int, int> PresentElements;
531 pair < map<int, int>::iterator, bool > Inserter;
532 // insert all found elements into the map
533 for (vector<atom *>::const_iterator AtomRunner = allatoms.begin();AtomRunner != allatoms.end();++AtomRunner) {
534 Inserter = PresentElements.insert(pair<int, int>((*AtomRunner)->getType()->getAtomicNumber(), 1));
535 if (!Inserter.second) // increase if present
536 Inserter.first->second += 1;
537 }
538 // print total element count
539 *file << "MaxTypes\t" << PresentElements.size() << "\t# maximum number of different ion types" << endl;
540 *file << endl;
541 // print element list
542 *file << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl;
543 *file << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;
544 // elements are due to map sorted by Z value automatically, hence just count through them
545 int counter = 1;
546 for(map<int, int>::const_iterator iter=PresentElements.begin(); iter!=PresentElements.end();++iter) {
547 const element * const elemental = World::getInstance().getPeriode()->FindElement(iter->first);
548 ZtoIndexMap.insert( pair<int,int> (iter->first, counter) );
549 *file << "Ion_Type" << counter++ << "\t" << iter->second << "\t" << elemental->getAtomicNumber() << "\t1.0\t3\t3\t" << fixed << setprecision(11) << showpoint << elemental->getMass() << "\t" << elemental->getName() << "\t" << elemental->getSymbol() <<endl;
550 }
551}
552
553/** Output all atoms one per line.
554 * \param *file output stream
555 * \param &allatoms vector of all atoms in the system, such as by World::getAllAtoms()
556 * \param &ZtoIndexMap map of which atoms belong to which ion number
557 */
558void FormatParser< pcp >::OutputAtoms(ostream *file, const std::vector<atom *> &allatoms, map<int, int> &ZtoIndexMap)
559{
560 *file << "#Ion_TypeNr._Nr.R[0] R[1] R[2] MoveType (0 MoveIon, 1 FixedIon)" << endl;
561 map<int, int> ZtoCountMap;
562 map<atom *, int> AtomtoCountMap;
563 pair < map<int, int>::iterator, bool > Inserter;
564 bool ContinueStatus = true;
565 bool AddNewLine = false;
566 size_t step = 0;
567 do {
568 int nr = 0;
569 ContinueStatus = false;
570 for (vector<atom *>::const_iterator AtomRunner = allatoms.begin();AtomRunner != allatoms.end();++AtomRunner) {
571 if ((*AtomRunner)->getTrajectorySize() > step) {
572 if (step == 0) { // fill list only on first step
573 Inserter = ZtoCountMap.insert( pair<int, int>((*AtomRunner)->getType()->getAtomicNumber(), 1) );
574 if (!Inserter.second)
575 Inserter.first->second += 1;
576 AtomtoCountMap.insert( make_pair((*AtomRunner), Inserter.first->second) );
577 }
578 if (AddNewLine) {
579 AddNewLine = false;
580 *file << endl;
581 }
582 const int Z = (*AtomRunner)->getType()->getAtomicNumber();
583 *file << "Ion_Type" << ZtoIndexMap[Z] << "_" << AtomtoCountMap[(*AtomRunner)] << "\t" << fixed << setprecision(9) << showpoint;
584 *file << (*AtomRunner)->atStep(0, step)
585 << "\t" << (*AtomRunner)->atStep(1,step)
586 << "\t" << (*AtomRunner)->atStep(2,step);
587 *file << "\t" << (int)((*AtomRunner)->getFixedIon());
588 if ((*AtomRunner)->getAtomicVelocityAtStep(step).Norm() > MYEPSILON)
589 *file << "\t" << scientific << setprecision(6)
590 << (*AtomRunner)->getAtomicVelocityAtStep(step)[0] << "\t"
591 << (*AtomRunner)->getAtomicVelocityAtStep(step)[1] << "\t"
592 << (*AtomRunner)->getAtomicVelocityAtStep(step)[2] << "\t";
593 *file << " # molecule nr " << nr++ << endl;
594 ContinueStatus = true; // as long as a single atom still has trajectory points, continue
595 }
596 }
597 ++step;
598 if (ContinueStatus)
599 AddNewLine = true;
600 } while (ContinueStatus);
601}
602
603/** Reading of Thermostat related values from parameter file.
604 * \param *fb file buffer containing the config file
605 */
606void FormatParser< pcp >::ParseThermostats(class ConfigFileBuffer * const fb)
607{
608 char * const thermo = new char[12];
609 const int verbose = 0;
610 class ThermoStatContainer *Thermostats = World::getInstance().getThermostats();
611
612 // read desired Thermostat from file along with needed additional parameters
613 if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) {
614 Thermostats->makeActive(thermo,fb);
615 } else {
616 if ((Thermostats->TargetTemp != 0))
617 LOG(2, "No thermostat chosen despite finite temperature MD, falling back to None.");
618 Thermostats->chooseNone();
619 }
620 delete[](thermo);
621};
622
623bool FormatParser< pcp >::operator==(const FormatParser< pcp >& b) const
624{
625 ASSERT(Parallelization.ProcPEGamma == b.Parallelization.ProcPEGamma, "PcpParser ==: ProcPEGamma not");
626 ASSERT(Parallelization.ProcPEPsi == b.Parallelization.ProcPEPsi, "PcpParser ==: ProcPEPsi not");
627
628 if ((Paths.databasepath != NULL) && (b.Paths.databasepath != NULL))
629 ASSERT(strcmp(Paths.databasepath, b.Paths.databasepath), "PcpParser ==: databasepath not");
630 if ((Paths.configname != NULL) && (b.Paths.configname != NULL))
631 ASSERT(strcmp(Paths.configname, b.Paths.configname), "PcpParser ==: configname not");
632 if ((Paths.mainname != NULL) && (b.Paths.mainname != NULL))
633 ASSERT(strcmp(Paths.mainname, b.Paths.mainname), "PcpParser ==: mainname not");
634 if ((Paths.defaultpath != NULL) && (b.Paths.defaultpath != NULL))
635 ASSERT(strcmp(Paths.defaultpath, b.Paths.defaultpath), "PcpParser ==: defaultpath not");
636 if ((Paths.pseudopotpath != NULL) && (b.Paths.pseudopotpath != NULL))
637 ASSERT(strcmp(Paths.pseudopotpath, b.Paths.pseudopotpath), "PcpParser ==: pseudopotpath not");
638
639 ASSERT(Switches.DoConstrainedMD == b.Switches.DoConstrainedMD, "PcpParser ==: DoConstrainedMD not");
640 ASSERT(Switches.DoOutVis == b.Switches.DoOutVis, "PcpParser ==: DoOutVis not");
641 ASSERT(Switches.DoOutMes == b.Switches.DoOutMes, "PcpParser ==: DoOutMes not");
642 ASSERT(Switches.DoOutNICS == b.Switches.DoOutNICS, "PcpParser ==: DoOutNICS not");
643 ASSERT(Switches.DoOutOrbitals == b.Switches.DoOutOrbitals, "PcpParser ==: DoOutOrbitals not");
644 ASSERT(Switches.DoOutCurrent == b.Switches.DoOutCurrent, "PcpParser ==: DoOutCurrent not");
645 ASSERT(Switches.DoFullCurrent == b.Switches.DoFullCurrent, "PcpParser ==: DoFullCurrent not");
646 ASSERT(Switches.DoPerturbation == b.Switches.DoPerturbation, "PcpParser ==: DoPerturbation not");
647 ASSERT(Switches.DoWannier == b.Switches.DoWannier, "PcpParser ==: DoWannier not");
648
649 ASSERT(LocalizedOrbitals.CommonWannier == b.LocalizedOrbitals.CommonWannier, "PcpParser ==: CommonWannier not");
650 ASSERT(LocalizedOrbitals.SawtoothStart == b.LocalizedOrbitals.SawtoothStart, "PcpParser ==: SawtoothStart not");
651 ASSERT(LocalizedOrbitals.VectorPlane == b.LocalizedOrbitals.VectorPlane, "PcpParser ==: VectorPlane not");
652 ASSERT(LocalizedOrbitals.VectorCut == b.LocalizedOrbitals.VectorCut, "PcpParser ==: VectorCut not");
653 ASSERT(LocalizedOrbitals.UseAddGramSch == b.LocalizedOrbitals.UseAddGramSch, "PcpParser ==: UseAddGramSch not");
654 ASSERT(LocalizedOrbitals.Seed == b.LocalizedOrbitals.Seed, "PcpParser ==: Seed not");
655 ASSERT(LocalizedOrbitals.EpsWannier == b.LocalizedOrbitals.EpsWannier, "PcpParser ==: EpsWannier not");
656
657 ASSERT(StepCounts.MaxMinStopStep == b.StepCounts.MaxMinStopStep, "PcpParser ==: MaxMinStopStep not");
658 ASSERT(StepCounts.InitMaxMinStopStep == b.StepCounts.InitMaxMinStopStep, "PcpParser ==: InitMaxMinStopStep not");
659 ASSERT(StepCounts.OutVisStep == b.StepCounts.OutVisStep, "PcpParser ==: OutVisStep not");
660 ASSERT(StepCounts.OutSrcStep == b.StepCounts.OutSrcStep, "PcpParser ==: OutSrcStep not");
661 ASSERT(StepCounts.MaxPsiStep == b.StepCounts.MaxPsiStep, "PcpParser ==: MaxPsiStep not");
662 ASSERT(StepCounts.MaxOuterStep == b.StepCounts.MaxOuterStep, "PcpParser ==: MaxOuterStep not");
663 ASSERT(StepCounts.MaxMinStep == b.StepCounts.MaxMinStep, "PcpParser ==: MaxMinStep not");
664 ASSERT(StepCounts.RelEpsTotalEnergy == b.StepCounts.RelEpsTotalEnergy, "PcpParser ==: RelEpsTotalEnergy not");
665 ASSERT(StepCounts.MaxMinGapStopStep == b.StepCounts.MaxMinGapStopStep, "PcpParser ==: MaxMinGapStopStep not");
666 ASSERT(StepCounts.MaxInitMinStep == b.StepCounts.MaxInitMinStep, "PcpParser ==: MaxInitMinStep not");
667 ASSERT(StepCounts.InitRelEpsTotalEnergy == b.StepCounts.InitRelEpsTotalEnergy, "PcpParser ==: InitRelEpsTotalEnergy not");
668 ASSERT(StepCounts.InitRelEpsKineticEnergy == b.StepCounts.InitRelEpsKineticEnergy, "PcpParser ==: InitRelEpsKineticEnergy not");
669 ASSERT(StepCounts.InitMaxMinGapStopStep == b.StepCounts.InitMaxMinGapStopStep, "PcpParser ==: InitMaxMinGapStopStep not");
670
671 ASSERT(PlaneWaveSpecifics.PsiType == b.PlaneWaveSpecifics.PsiType, "PcpParser ==: PsiType not");
672 ASSERT(PlaneWaveSpecifics.MaxPsiDouble == b.PlaneWaveSpecifics.MaxPsiDouble, "PcpParser ==: MaxPsiDouble not");
673 ASSERT(PlaneWaveSpecifics.PsiMaxNoUp == b.PlaneWaveSpecifics.PsiMaxNoUp, "PcpParser ==: PsiMaxNoUp not");
674 ASSERT(PlaneWaveSpecifics.PsiMaxNoDown == b.PlaneWaveSpecifics.PsiMaxNoDown, "PcpParser ==: PsiMaxNoDown not");
675 ASSERT(PlaneWaveSpecifics.ECut == b.PlaneWaveSpecifics.ECut, "PcpParser ==: ECut not");
676 ASSERT(PlaneWaveSpecifics.MaxLevel == b.PlaneWaveSpecifics.MaxLevel, "PcpParser ==: MaxLevel not");
677 ASSERT(PlaneWaveSpecifics.RiemannTensor == b.PlaneWaveSpecifics.RiemannTensor, "PcpParser ==: RiemannTensor not");
678 ASSERT(PlaneWaveSpecifics.LevRFactor == b.PlaneWaveSpecifics.LevRFactor, "PcpParser ==: LevRFactor not");
679 ASSERT(PlaneWaveSpecifics.RiemannLevel == b.PlaneWaveSpecifics.RiemannLevel, "PcpParser ==: RiemannLevel not");
680 ASSERT(PlaneWaveSpecifics.Lev0Factor == b.PlaneWaveSpecifics.Lev0Factor, "PcpParser ==: Lev0Factor not");
681 ASSERT(PlaneWaveSpecifics.RTActualUse == b.PlaneWaveSpecifics.RTActualUse, "PcpParser ==: RTActualUse not");
682 ASSERT(PlaneWaveSpecifics.AddPsis == b.PlaneWaveSpecifics.AddPsis, "PcpParser ==: AddPsis not");
683 ASSERT(PlaneWaveSpecifics.AddPsis == b.PlaneWaveSpecifics.AddPsis, "PcpParser ==: AddPsis not");
684 ASSERT(PlaneWaveSpecifics.RCut == b.PlaneWaveSpecifics.RCut, "PcpParser ==: RCut not");
685
686 ASSERT(FastParsing == b.FastParsing, "PcpParser ==: FastParsing not");
687
688 ASSERT(Deltat == b.Deltat, "PcpParser ==: Deltat not");
689 ASSERT(IsAngstroem == b.IsAngstroem, "PcpParser ==: IsAngstroem not");
690 ASSERT(RelativeCoord == b.RelativeCoord, "PcpParser ==: RelativeCoord not");
691 ASSERT(StructOpt == b.StructOpt, "PcpParser ==: StructOpt not");
692 ASSERT(MaxTypes == b.MaxTypes, "PcpParser ==: MaxTypes not");
693 ASSERT(basis == b.basis, "PcpParser ==: basis not");
694
695 return true;
696}
Note: See TracBrowser for help on using the repository browser.