author | cniehaus <cniehaus> | 2002-09-15 17:09:54 (UTC) |
---|---|---|
committer | cniehaus <cniehaus> | 2002-09-15 17:09:54 (UTC) |
commit | 33ec9ead7ce30bf9450b9048506f0bda49ba4791 (patch) (side-by-side diff) | |
tree | 1683b16a3cb06d7773427193fc4ea5284bf3bdaa /noncore/apps/oxygen/kmolelements.cpp | |
parent | 7a8dc6b0a16db160a1e50fde8f298eb9e3cb0099 (diff) | |
download | opie-33ec9ead7ce30bf9450b9048506f0bda49ba4791.zip opie-33ec9ead7ce30bf9450b9048506f0bda49ba4791.tar.gz opie-33ec9ead7ce30bf9450b9048506f0bda49ba4791.tar.bz2 |
Fell free to shoot me if I messed up CVS again... *fingercrossed*
Diffstat (limited to 'noncore/apps/oxygen/kmolelements.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/oxygen/kmolelements.cpp | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/noncore/apps/oxygen/kmolelements.cpp b/noncore/apps/oxygen/kmolelements.cpp new file mode 100644 index 0000000..ce8f9c1 --- a/dev/null +++ b/noncore/apps/oxygen/kmolelements.cpp @@ -0,0 +1,238 @@ +/* + * kmolelements.cpp + * + * Copyright (C) 2000 Tomislav Gountchev <tomi@idiom.com> + */ + +// classes that store and manipulate chemical formulas represented as +// lists of elements + +#include <stdio.h> +#include "kmolelements.h" + +/** + * A generic chemical entity. Can be an element or a group. + */ +SubUnit::SubUnit () {} + +SubUnit::~SubUnit () {} + +/** + * Construct a subunit and return a pointer to it. The syntax of LINE is + * the one used in the element definition file. + */ +SubUnit* SubUnit::makeSubUnit(QString line) { + QString name, grpname, weight, coef; + QTextStream str (line, IO_ReadOnly); + str >> name; + if (name != "-group") { // not a group - must be represented as Element + str >> weight >> ws; + return new Element(name, weight.toDouble()); + } + else { + str >> grpname; + ElementList* els = new ElementList(grpname); // group - make an ElementList + while (!str.eof()) { + str >> name >> ws; + str >> coef >> ws; + els->addElement(name, coef.toDouble()); + } + return els; + } +} + +QString SubUnit::getName() const { + return QString("None"); +} + +/** + * Get the molecular weight of THIS, based on the data from ELSTABLE. + */ +double SubUnit::getWeight(QDict<SubUnit>* elstable) const { + return -1; +} + +/** + * A group of elements. + */ +ElementList::ElementList () { + elements = new QList<ElementCoef>; +} + +ElementList::~ElementList () { + delete elements; +} + + +/** + * A group of elements. + */ +ElementList::ElementList (QString name) { + this->name = name; + elements = new QList<ElementCoef>; +} + +/** + * Write THIS to LINE, in a format suitable for the element definition file. + */ +void ElementList::writeOut(QString& line) { + QString coef; + line = "-group " + name; + ElementCoef* current = elements->first(); + while (current != 0) { + line += " " + current->name + " " + coef.setNum(current->coef, 'g', 10); + // precision set to 10 digits + current = elements->next(); + } +} + +/** + * Get the molecular weight of THIS, based on the data from ELSTABLE. + */ +double ElementList::getWeight(QDict<SubUnit>* elstable) const { + double weight = 0; + ElementCoef* current = elements->first(); + while (current != 0) { + SubUnit* e = elstable->find(current->name); + if (e != 0) { + weight += (current->coef) * (e->getWeight(elstable)); + } else return -1; //ERROR + current = elements->next(); + } + return weight; +} + +/** + * Return a string representing the elemental composition of THIS, as + * a tab-separated element - percentage pairs, separated by newlines. + */ +QString ElementList::getEA(QDict<SubUnit>* elstable, double mw) const { + if (mw == 0) mw = getWeight(elstable); + QString ea; + QString temp; + ElementCoef* current = elements->first(); + while (current != 0) { + SubUnit* e = elstable->find(current->name); + if (e != 0) { + double current_percent = 100 * (current->coef) * + (e->getWeight(elstable)) + / mw; + ea += current->name + "\t" + + temp.setNum(current_percent) + "\n"; + } else return QString("ERROR!\n"); //ERROR + current = elements->next(); + } + return ea; +} + +/** + * Return a string representing THIS as an empirical chemical formula. + */ +QString ElementList::getEmpFormula() const { + QString ef; + QString temp; + ElementCoef* current = elements->first(); + while (current != 0) { + ef += current->name + temp.setNum(current->coef); + current = elements->next(); + } + return ef; +} + +/** + * Multiply THIS (i.e. the coefficient of each element) by coef. + */ +void ElementList::multiplyBy(double coef) { + ElementCoef* current = elements->first(); + while (current != 0) { + (current->coef) *= coef; + current = elements->next(); + } +} + +/** + * Add THIS to ELS. THIS is not modified; ELS is. + */ +void ElementList::addTo(ElementList& els, double coef) { + ElementCoef* current = elements->first(); + while (current != 0) { + els.addElement(current->name, (current->coef) * coef); + current = elements->next(); + } +} + +/** + * Add an element to THIS, with a coefficient COEF. If THIS already contains + * an element with the same name, adjust its coefficient only; if not, create + * a new ElementCoef pair and add to THIS. + */ +void ElementList::addElement(const QString& name, double coef) { + ElementCoef* current = elements->first(); + while (current != 0) { + if (current->name == name) { + current->coef += coef; + return; + } + current = elements->next(); + } + elements->append(new ElementCoef(name, coef)); +} + +/** + * True iff THIS contains element named NAME. + */ +bool ElementList::contains(const QString& name) { + ElementCoef* current = elements->first(); + while (current != 0) { + if (current->name == name) + return true; + current = elements->next(); + } + return false; +} + +bool ElementList::isEmpty() { + return elements->isEmpty(); +} + +QString ElementList::getName() const { + return name; +} + +/** + * A chemical element. + */ +Element::Element(const QString& n, double w) + : weight(w), name(n) { } + + +Element::~Element() { +} + + +/** + * Write THIS to LINE, in a format suitable for the element definition file. + */ +void Element::writeOut(QString& line) { + line.setNum(weight); + line = name + " " + line; +} + +double Element::getWeight(QDict<SubUnit>* elstable) const { + return weight; +} + +void Element::addTo(ElementList& els, double coef) { + els.addElement(name, coef); +} + +QString Element::getName() const { + return name; +} + +/** + * An element - coefficient pair. Used to represent elements within an + * element list. + */ +ElementCoef::ElementCoef(const QString& n, double c) : name(n), coef(c) {} + |