source: src/periodentafel.cpp@ 3e50ff

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 3e50ff was 49e1ae, checked in by Frederik Heber <heber@…>, 15 years ago

cstring header was missing in files, supplying definition of strlen, strcpy, and so on.

This was noted on laptop with gcc 4.1 (on workstation we have gcc 4.2)

  • Property mode set to 100755
File size: 9.9 KB
Line 
1/** \file periodentafel.cpp
2 *
3 * Function implementations for the class periodentafel.
4 *
5 */
6
7using namespace std;
8
9#include <iomanip>
10#include <fstream>
11#include <cstring>
12
13#include "element.hpp"
14#include "helpers.hpp"
15#include "lists.hpp"
16#include "log.hpp"
17#include "periodentafel.hpp"
18#include "verbose.hpp"
19
20/************************************* Functions for class periodentafel ***************************/
21
22/** constructor for class periodentafel
23 * Initialises start and end of list and resets periodentafel::checkliste to false.
24 */
25periodentafel::periodentafel() : start(new element), end(new element)
26{
27 start->previous = NULL;
28 start->next = end;
29 end->previous = start;
30 end->next = NULL;
31};
32
33/** destructor for class periodentafel
34 * Removes every element and afterwards deletes start and end of list.
35 */
36periodentafel::~periodentafel()
37{
38 CleanupPeriodtable();
39 delete(end);
40 delete(start);
41};
42
43/** Adds element to period table list
44 * \param *pointer element to be added
45 * \return true - succeeded, false - does not occur
46 */
47bool periodentafel::AddElement(element * const pointer)
48{
49 pointer->sort = &pointer->Z;
50 if (pointer->Z < 1 && pointer->Z >= MAX_ELEMENTS)
51 Log() << Verbose(0) << "Invalid Z number!\n";
52 return add(pointer, end);
53};
54
55/** Removes element from list.
56 * \param *pointer element to be removed
57 * \return true - succeeded, false - element not found
58 */
59bool periodentafel::RemoveElement(element * const pointer)
60{
61 return remove(pointer, start, end);
62};
63
64/** Removes every element from the period table.
65 * \return true - succeeded, false - does not occur
66 */
67bool periodentafel::CleanupPeriodtable()
68{
69 return cleanup(start,end);
70};
71
72/** Finds an element by its atomic number.
73 * If element is not yet in list, returns NULL.
74 * \param Z atomic number
75 * \return pointer to element or NULL if not found
76 */
77element * const periodentafel::FindElement(const int Z) const
78{
79 element *walker = find(&Z, start,end);
80 return(walker);
81};
82
83/** Finds an element by its atomic number.
84 * If element is not yet in list, datas are asked and stored in database.
85 * \param shorthand chemical symbol of the element, e.g. H for hydrogene
86 * \return pointer to element
87 */
88element * const periodentafel::FindElement(const char * const shorthand) const
89{
90 element *walker = periodentafel::start;
91 while (walker->next != periodentafel::end) {
92 walker = walker->next;
93 if (strncmp(walker->symbol, shorthand, 3) == 0)
94 return(walker);
95 }
96 return (NULL);
97};
98
99/** Asks for element number and returns pointer to element
100 */
101element * const periodentafel::AskElement() const
102{
103 element *walker = NULL;
104 int Z;
105 do {
106 Log() << Verbose(0) << "Atomic number Z: ";
107 cin >> Z;
108 walker = this->FindElement(Z); // give type
109 } while (walker == NULL);
110 return walker;
111};
112
113/** Asks for element and if not found, presents mask to enter info.
114 * \return pointer to either present or newly created element
115 */
116element * const periodentafel::EnterElement()
117{
118 element *walker = NULL;
119 int Z = -1;
120 Log() << Verbose(0) << "Atomic number: " << Z << endl;
121 cin >> Z;
122 walker = FindElement(Z);
123 if (walker == NULL) {
124 Log() << Verbose(0) << "Element not found in database, please enter." << endl;
125 walker = new element;
126 walker->Z = Z;
127 Log() << Verbose(0) << "Mass: " << endl;
128 cin >> walker->mass;
129 Log() << Verbose(0) << "Name [max 64 chars]: " << endl;
130 cin >> walker->name;
131 Log() << Verbose(0) << "Short form [max 3 chars]: " << endl;
132 cin >> walker->symbol;
133 periodentafel::AddElement(walker);
134 }
135 return(walker);
136};
137
138/** Prints period table to given stream.
139 * \param output stream
140 */
141bool periodentafel::Output(ofstream * const output) const
142{
143 bool result = true;
144 element *walker = start;
145 if (output != NULL) {
146 while (walker->next != end) {
147 walker = walker->next;
148 result = result && walker->Output(output);
149 }
150 return result;
151 } else
152 return false;
153};
154
155/** Prints period table to given stream.
156 * \param *output output stream
157 * \param *checkliste elements table for this molecule
158 */
159bool periodentafel::Checkout(ofstream * const output, const int * const checkliste) const
160{
161 element *walker = start;
162 bool result = true;
163 int No = 1;
164
165 if (output != NULL) {
166 *output << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl;
167 *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;
168 while (walker->next != end) {
169 walker = walker->next;
170 if ((walker != NULL) && (walker->Z > 0) && (walker->Z < MAX_ELEMENTS) && (checkliste[walker->Z])) {
171 walker->No = No;
172 result = result && walker->Checkout(output, No++, checkliste[walker->Z]);
173 }
174 }
175 return result;
176 } else
177 return false;
178};
179
180/** Loads element list from file.
181 * \param *path to to standard file names
182 */
183bool periodentafel::LoadPeriodentafel(const char *path)
184{
185 ifstream infile;
186 double tmp;
187 element *ptr;
188 bool status = true;
189 bool otherstatus = true;
190 char filename[255];
191
192 // fill elements DB
193 strncpy(filename, path, MAXSTRINGSIZE);
194 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
195 strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename));
196 infile.open(filename);
197 if (infile != NULL) {
198 infile.getline(header1, MAXSTRINGSIZE);
199 infile.getline(header2, MAXSTRINGSIZE); // skip first two header lines
200 Log() << Verbose(0) << "Parsed elements:";
201 while (!infile.eof()) {
202 element *neues = new element;
203 infile >> neues->name;
204 //infile >> ws;
205 infile >> neues->symbol;
206 //infile >> ws;
207 infile >> neues->period;
208 //infile >> ws;
209 infile >> neues->group;
210 //infile >> ws;
211 infile >> neues->block;
212 //infile >> ws;
213 infile >> neues->Z;
214 //infile >> ws;
215 infile >> neues->mass;
216 //infile >> ws;
217 infile >> neues->CovalentRadius;
218 //infile >> ws;
219 infile >> neues->VanDerWaalsRadius;
220 //infile >> ws;
221 infile >> ws;
222 Log() << Verbose(0) << " " << neues->symbol;
223 //neues->Output((ofstream *)&cout);
224 if ((neues->Z > 0) && (neues->Z < MAX_ELEMENTS))
225 periodentafel::AddElement(neues);
226 else {
227 Log() << Verbose(0) << "Could not parse element: ";
228 neues->Output((ofstream *)&cout);
229 delete(neues);
230 }
231 }
232 Log() << Verbose(0) << endl;
233 infile.close();
234 infile.clear();
235 } else
236 status = false;
237
238 // fill valence DB per element
239 strncpy(filename, path, MAXSTRINGSIZE);
240 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
241 strncat(filename, STANDARDVALENCEDB, MAXSTRINGSIZE-strlen(filename));
242 infile.open(filename);
243 if (infile != NULL) {
244 while (!infile.eof()) {
245 infile >> tmp;
246 infile >> ws;
247 infile >> FindElement((int)tmp)->Valence;
248 infile >> ws;
249 //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->Valence << " valence electrons." << endl;
250 }
251 infile.close();
252 infile.clear();
253 } else
254 otherstatus = false;
255
256 // fill valence DB per element
257 strncpy(filename, path, MAXSTRINGSIZE);
258 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
259 strncat(filename, STANDARDORBITALDB, MAXSTRINGSIZE-strlen(filename));
260 infile.open(filename);
261 if (infile != NULL) {
262 while (!infile.eof()) {
263 infile >> tmp;
264 infile >> ws;
265 infile >> FindElement((int)tmp)->NoValenceOrbitals;
266 infile >> ws;
267 //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->NoValenceOrbitals << " number of singly occupied valence orbitals." << endl;
268 }
269 infile.close();
270 infile.clear();
271 } else
272 otherstatus = false;
273
274 // fill H-BondDistance DB per element
275 strncpy(filename, path, MAXSTRINGSIZE);
276 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
277 strncat(filename, STANDARDHBONDDISTANCEDB, MAXSTRINGSIZE-strlen(filename));
278 infile.open(filename);
279 if (infile != NULL) {
280 while (!infile.eof()) {
281 infile >> tmp;
282 ptr = FindElement((int)tmp);
283 infile >> ws;
284 infile >> ptr->HBondDistance[0];
285 infile >> ptr->HBondDistance[1];
286 infile >> ptr->HBondDistance[2];
287 infile >> ws;
288 //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->HBondDistance[0] << " Angstrom typical distance to hydrogen." << endl;
289 }
290 infile.close();
291 infile.clear();
292 } else
293 otherstatus = false;
294
295 // fill H-BondAngle DB per element
296 strncpy(filename, path, MAXSTRINGSIZE);
297 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
298 strncat(filename, STANDARDHBONDANGLEDB, MAXSTRINGSIZE-strlen(filename));
299 infile.open(filename);
300 if (infile != NULL) {
301 while (!infile.eof()) {
302 infile >> tmp;
303 ptr = FindElement((int)tmp);
304 infile >> ws;
305 infile >> ptr->HBondAngle[0];
306 infile >> ptr->HBondAngle[1];
307 infile >> ptr->HBondAngle[2];
308 infile >> ws;
309 //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->HBondAngle[0] << ", " << FindElement((int)tmp)->HBondAngle[1] << ", " << FindElement((int)tmp)->HBondAngle[2] << " degrees bond angle for one, two, three connected hydrogens." << endl;
310 }
311 infile.close();
312 } else
313 otherstatus = false;
314
315 if (!otherstatus)
316 eLog() << Verbose(2) << "Something went wrong while parsing the other databases!" << endl;
317
318 return status;
319};
320
321/** Stores element list to file.
322 */
323bool periodentafel::StorePeriodentafel(const char *path) const
324{
325 bool result = true;
326 ofstream f;
327 char filename[MAXSTRINGSIZE];
328
329 strncpy(filename, path, MAXSTRINGSIZE);
330 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));
331 strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename));
332 f.open(filename);
333 if (f != NULL) {
334 f << header1 << endl;
335 f << header2 << endl;
336 element *walker = periodentafel::start;
337 while (walker->next != periodentafel::end) {
338 walker = walker->next;
339 result = result && walker->Output(&f);
340 }
341 f.close();
342 } else
343 result = false;
344 return result;
345};
Note: See TracBrowser for help on using the repository browser.