summaryrefslogtreecommitdiff
path: root/noncore/apps/oxygen/kmolelements.cpp
Unidiff
Diffstat (limited to 'noncore/apps/oxygen/kmolelements.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/oxygen/kmolelements.cpp36
1 files changed, 18 insertions, 18 deletions
diff --git a/noncore/apps/oxygen/kmolelements.cpp b/noncore/apps/oxygen/kmolelements.cpp
index ce8f9c1..e76461b 100644
--- a/noncore/apps/oxygen/kmolelements.cpp
+++ b/noncore/apps/oxygen/kmolelements.cpp
@@ -1,238 +1,238 @@
1/* 1/*
2 * kmolelements.cpp 2 * kmolelements.cpp
3 * 3 *
4 * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com> 4 * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com>
5 */ 5 */
6 6
7// classes that store and manipulate chemical formulas represented as 7// classes that store and manipulate chemical formulas represented as
8// lists of elements 8// lists of elements
9 9
10#include <stdio.h> 10#include <stdio.h>
11#include "kmolelements.h" 11#include "kmolelements.h"
12 12
13/** 13/**
14 * A generic chemical entity. Can be an element or a group. 14 * A generic chemical entity. Can be an element or a group.
15 */ 15 */
16SubUnit::SubUnit () {} 16SubUnit::SubUnit () {}
17 17
18SubUnit::~SubUnit () {} 18SubUnit::~SubUnit () {}
19 19
20/** 20/**
21 * Construct a subunit and return a pointer to it. The syntax of LINE is 21 * Construct a subunit and return a pointer to it. The syntax of LINE is
22 * the one used in the element definition file. 22 * the one used in the element definition file.
23 */ 23 */
24SubUnit* SubUnit::makeSubUnit(QString line) { 24SubUnit* SubUnit::makeSubUnit(QString line) {
25 QString name, grpname, weight, coef; 25 QString name, grpname, weight, coef;
26 QTextStream str (line, IO_ReadOnly); 26 QTextStream str (line, IO_ReadOnly);
27 str >> name; 27 str >> name;
28 if (name != "-group") { // not a group - must be represented as Element 28 if (name != "-group") { // not a group - must be represented as Element
29 str >> weight >> ws; 29 str >> weight >> ws;
30 return new Element(name, weight.toDouble()); 30 return new Element(name, weight.toDouble());
31 } 31 }
32 else { 32 else {
33 str >> grpname; 33 str >> grpname;
34 ElementList* els = new ElementList(grpname); // group - make an ElementList 34 ElementList* els = new ElementList(grpname); // group - make an ElementList
35 while (!str.eof()) { 35 while (!str.eof()) {
36 str >> name >> ws; 36 str >> name >> ws;
37 str >> coef >> ws; 37 str >> coef >> ws;
38 els->addElement(name, coef.toDouble()); 38 els->addElement(name, coef.toDouble());
39 } 39 }
40 return els; 40 return els;
41 } 41 }
42} 42}
43 43
44QString SubUnit::getName() const { 44QString SubUnit::getName() const {
45 return QString("None"); 45 return QString("None");
46} 46}
47 47
48/** 48/**
49 * Get the molecular weight of THIS, based on the data from ELSTABLE. 49 * Get the molecular weight of THIS, based on the data from ELSTABLE.
50 */ 50 */
51double SubUnit::getWeight(QDict<SubUnit>* elstable) const { 51double SubUnit::getWeight(QDict<SubUnit>* ) const {
52 return -1; 52 return -1;
53} 53}
54 54
55/** 55/**
56 * A group of elements. 56 * A group of elements.
57 */ 57 */
58ElementList::ElementList () { 58ElementList::ElementList () {
59 elements = new QList<ElementCoef>; 59 elements = new QList<ElementCoef>;
60} 60}
61 61
62ElementList::~ElementList () { 62ElementList::~ElementList () {
63 delete elements; 63 delete elements;
64} 64}
65 65
66 66
67/** 67/**
68 * A group of elements. 68 * A group of elements.
69 */ 69 */
70ElementList::ElementList (QString name) { 70ElementList::ElementList (QString name) {
71 this->name = name; 71 this->name = name;
72 elements = new QList<ElementCoef>; 72 elements = new QList<ElementCoef>;
73} 73}
74 74
75/** 75/**
76 * Write THIS to LINE, in a format suitable for the element definition file. 76 * Write THIS to LINE, in a format suitable for the element definition file.
77 */ 77 */
78void ElementList::writeOut(QString& line) { 78void ElementList::writeOut(QString& line) {
79 QString coef; 79 QString coef;
80 line = "-group " + name; 80 line = "-group " + name;
81 ElementCoef* current = elements->first(); 81 ElementCoef* current = elements->first();
82 while (current != 0) { 82 while (current != 0) {
83 line += " " + current->name + " " + coef.setNum(current->coef, 'g', 10); 83 line += " " + current->name + " " + coef.setNum(current->coef, 'g', 10);
84 // precision set to 10 digits 84 // precision set to 10 digits
85 current = elements->next(); 85 current = elements->next();
86 } 86 }
87} 87}
88 88
89/** 89/**
90 * Get the molecular weight of THIS, based on the data from ELSTABLE. 90 * Get the molecular weight of THIS, based on the data from ELSTABLE.
91 */ 91 */
92double ElementList::getWeight(QDict<SubUnit>* elstable) const { 92double ElementList::getWeight(QDict<SubUnit>* elstable) const {
93 double weight = 0; 93 double weight = 0;
94 ElementCoef* current = elements->first(); 94 ElementCoef* current = elements->first();
95 while (current != 0) { 95 while (current != 0) {
96 SubUnit* e = elstable->find(current->name); 96 SubUnit* e = elstable->find(current->name);
97 if (e != 0) { 97 if (e != 0) {
98 weight += (current->coef) * (e->getWeight(elstable)); 98 weight += (current->coef) * (e->getWeight(elstable));
99 } else return -1; //ERROR 99 } else return -1; //ERROR
100 current = elements->next(); 100 current = elements->next();
101 } 101 }
102 return weight; 102 return weight;
103} 103}
104 104
105/** 105/**
106 * Return a string representing the elemental composition of THIS, as 106 * Return a string representing the elemental composition of THIS, as
107 * a tab-separated element - percentage pairs, separated by newlines. 107 * a tab-separated element - percentage pairs, separated by newlines.
108 */ 108 */
109QString ElementList::getEA(QDict<SubUnit>* elstable, double mw) const { 109QString ElementList::getEA(QDict<SubUnit>* elstable, double mw) const {
110 if (mw == 0) mw = getWeight(elstable); 110 if (mw == 0) mw = getWeight(elstable);
111 QString ea; 111 QString ea;
112 QString temp; 112 QString temp;
113 ElementCoef* current = elements->first(); 113 ElementCoef* current = elements->first();
114 while (current != 0) { 114 while (current != 0) {
115 SubUnit* e = elstable->find(current->name); 115 SubUnit* e = elstable->find(current->name);
116 if (e != 0) { 116 if (e != 0) {
117 double current_percent = 100 * (current->coef) * 117 double current_percent = 100 * (current->coef) *
118 (e->getWeight(elstable)) 118 (e->getWeight(elstable))
119 / mw; 119 / mw;
120 ea += current->name + "\t" + 120 ea += current->name + "\t" +
121 temp.setNum(current_percent) + "\n"; 121 temp.setNum(current_percent) + "\n";
122 } else return QString("ERROR!\n"); //ERROR 122 } else return QString("ERROR!\n"); //ERROR
123 current = elements->next(); 123 current = elements->next();
124 } 124 }
125 return ea; 125 return ea;
126} 126}
127 127
128/** 128/**
129 * Return a string representing THIS as an empirical chemical formula. 129 * Return a string representing THIS as an empirical chemical formula.
130 */ 130 */
131QString ElementList::getEmpFormula() const { 131QString ElementList::getEmpFormula() const {
132 QString ef; 132 QString ef;
133 QString temp; 133 QString temp;
134 ElementCoef* current = elements->first(); 134 ElementCoef* current = elements->first();
135 while (current != 0) { 135 while (current != 0) {
136 ef += current->name + temp.setNum(current->coef); 136 ef += current->name + temp.setNum(current->coef);
137 current = elements->next(); 137 current = elements->next();
138 } 138 }
139 return ef; 139 return ef;
140} 140}
141 141
142/** 142/**
143 * Multiply THIS (i.e. the coefficient of each element) by coef. 143 * Multiply THIS (i.e. the coefficient of each element) by coef.
144 */ 144 */
145void ElementList::multiplyBy(double coef) { 145void ElementList::multiplyBy(double coef) {
146 ElementCoef* current = elements->first(); 146 ElementCoef* current = elements->first();
147 while (current != 0) { 147 while (current != 0) {
148 (current->coef) *= coef; 148 (current->coef) *= coef;
149 current = elements->next(); 149 current = elements->next();
150 } 150 }
151} 151}
152 152
153/** 153/**
154 * Add THIS to ELS. THIS is not modified; ELS is. 154 * Add THIS to ELS. THIS is not modified; ELS is.
155 */ 155 */
156void ElementList::addTo(ElementList& els, double coef) { 156void ElementList::addTo(ElementList& els, double coef) {
157 ElementCoef* current = elements->first(); 157 ElementCoef* current = elements->first();
158 while (current != 0) { 158 while (current != 0) {
159 els.addElement(current->name, (current->coef) * coef); 159 els.addElement(current->name, (current->coef) * coef);
160 current = elements->next(); 160 current = elements->next();
161 } 161 }
162} 162}
163 163
164/** 164/**
165 * Add an element to THIS, with a coefficient COEF. If THIS already contains 165 * Add an element to THIS, with a coefficient COEF. If THIS already contains
166 * an element with the same name, adjust its coefficient only; if not, create 166 * an element with the same name, adjust its coefficient only; if not, create
167 * a new ElementCoef pair and add to THIS. 167 * a new ElementCoef pair and add to THIS.
168 */ 168 */
169void ElementList::addElement(const QString& name, double coef) { 169void ElementList::addElement(const QString& name, double coef) {
170 ElementCoef* current = elements->first(); 170 ElementCoef* current = elements->first();
171 while (current != 0) { 171 while (current != 0) {
172 if (current->name == name) { 172 if (current->name == name) {
173 current->coef += coef; 173 current->coef += coef;
174 return; 174 return;
175 } 175 }
176 current = elements->next(); 176 current = elements->next();
177 } 177 }
178 elements->append(new ElementCoef(name, coef)); 178 elements->append(new ElementCoef(name, coef));
179} 179}
180 180
181/** 181/**
182 * True iff THIS contains element named NAME. 182 * True iff THIS contains element named NAME.
183 */ 183 */
184bool ElementList::contains(const QString& name) { 184bool ElementList::contains(const QString& name) {
185 ElementCoef* current = elements->first(); 185 ElementCoef* current = elements->first();
186 while (current != 0) { 186 while (current != 0) {
187 if (current->name == name) 187 if (current->name == name)
188 return true; 188 return true;
189 current = elements->next(); 189 current = elements->next();
190 } 190 }
191 return false; 191 return false;
192} 192}
193 193
194bool ElementList::isEmpty() { 194bool ElementList::isEmpty() {
195 return elements->isEmpty(); 195 return elements->isEmpty();
196} 196}
197 197
198QString ElementList::getName() const { 198QString ElementList::getName() const {
199 return name; 199 return name;
200} 200}
201 201
202/** 202/**
203 * A chemical element. 203 * A chemical element.
204 */ 204 */
205Element::Element(const QString& n, double w) 205Element::Element(const QString& n, double w)
206 : weight(w), name(n) { } 206 : weight(w), name(n) { }
207 207
208 208
209Element::~Element() { 209Element::~Element() {
210} 210}
211 211
212 212
213/** 213/**
214 * Write THIS to LINE, in a format suitable for the element definition file. 214 * Write THIS to LINE, in a format suitable for the element definition file.
215 */ 215 */
216void Element::writeOut(QString& line) { 216void Element::writeOut(QString& line) {
217 line.setNum(weight); 217 line.setNum(weight);
218 line = name + " " + line; 218 line = name + " " + line;
219} 219}
220 220
221double Element::getWeight(QDict<SubUnit>* elstable) const { 221double Element::getWeight(QDict<SubUnit>* ) const {
222 return weight; 222 return weight;
223} 223}
224 224
225void Element::addTo(ElementList& els, double coef) { 225void Element::addTo(ElementList& els, double coef) {
226 els.addElement(name, coef); 226 els.addElement(name, coef);
227} 227}
228 228
229QString Element::getName() const { 229QString Element::getName() const {
230 return name; 230 return name;
231} 231}
232 232
233/** 233/**
234 * An element - coefficient pair. Used to represent elements within an 234 * An element - coefficient pair. Used to represent elements within an
235 * element list. 235 * element list.
236 */ 236 */
237ElementCoef::ElementCoef(const QString& n, double c) : name(n), coef(c) {} 237ElementCoef::ElementCoef(const QString& n, double c) : name(n), coef(c) {}
238 238