Molmodel

Element.h

Go to the documentation of this file.
00001 #ifndef SimTK_MOLMODEL_ELEMENT_H_
00002 #define SimTK_MOLMODEL_ELEMENT_H_
00003 
00004 /* -------------------------------------------------------------------------- *
00005  *                      SimTK Core: SimTK Molmodel                            *
00006  * -------------------------------------------------------------------------- *
00007  * This is part of the SimTK Core biosimulation toolkit originating from      *
00008  * Simbios, the NIH National Center for Physics-Based Simulation of           *
00009  * Biological Structures at Stanford, funded under the NIH Roadmap for        *
00010  * Medical Research, grant U54 GM072970. See https://simtk.org.               *
00011  *                                                                            *
00012  * Portions copyright (c) 2007 Stanford University and the Authors.           *
00013  * Authors: Michael Sherman, Christopher Bruns                                *
00014  * Contributors:                                                              *
00015  *                                                                            *
00016  * Permission is hereby granted, free of charge, to any person obtaining a    *
00017  * copy of this software and associated documentation files (the "Software"), *
00018  * to deal in the Software without restriction, including without limitation  *
00019  * the rights to use, copy, modify, merge, publish, distribute, sublicense,   *
00020  * and/or sell copies of the Software, and to permit persons to whom the      *
00021  * Software is furnished to do so, subject to the following conditions:       *
00022  *                                                                            *
00023  * The above copyright notice and this permission notice shall be included in *
00024  * all copies or substantial portions of the Software.                        *
00025  *                                                                            *
00026  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
00027  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   *
00028  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    *
00029  * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,    *
00030  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR      *
00031  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE  *
00032  * USE OR OTHER DEALINGS IN THE SOFTWARE.                                     *
00033  * -------------------------------------------------------------------------- */
00034 
00035 #include "SimTKcommon.h"
00036 #include "molmodel/internal/common.h"
00037 #include "molmodel/internal/GrinPointer.h"
00038 #include "molmodel/internal/units.h"
00039 
00040 namespace SimTK {
00041 
00042 // Element is a chemical element from the periodic table of
00043 // the elements, e.g. hydrogen, carbon, gold, etc.
00044 // class Element;
00045 // class ElementRep;
00046 
00047 // Avoid instantiating template class except in one particular library compilation unit
00048 // #ifndef DO_INSTANTIATE_ELEMENT_PIMPL_HANDLE
00049 //     extern template class SimTK_MOLMODEL_EXPORT PIMPLHandle<Element, ElementRep>;
00050 // #endif
00051 
00052 class SimTK_MOLMODEL_EXPORT Element // : public PIMPLHandle<SimTK_MOLMODEL_EXPORT Element,ElementRep> 
00053 {
00054 public:
00055     typedef String Name; // e.g. "gold"
00056     typedef String Symbol; // e.g. "Au"
00057     static const int InvalidAtomicNumber = -1;
00058 
00059     Element();
00060     Element(int atomicNumber, Name name, Symbol symbol, mdunits::Mass typicalMass);
00061 
00062     Symbol getSymbol() const;
00063     Name getName() const;
00064     int getAtomicNumber() const;
00065     mdunits::Mass getMass() const;
00066     
00067     bool operator==(const Element& rhs) const {
00068         if (getAtomicNumber() != rhs.getAtomicNumber()) return false;
00069         if (getMass() != rhs.getMass()) return false;
00070         return true;
00071     }
00072 
00073     static Element getByAtomicNumber(int atomicNumber);
00074     static Element getBySymbol(const SimTK::String& symbol); 
00075 
00076     class Hydrogen;
00077     class Deuterium;
00078     class Helium;
00079     class Lithium;
00080     class Beryllium;
00081     class Boron;
00082     class Carbon;
00083     class Nitrogen;
00084     class Oxygen;
00085     class Fluorine;
00086     class Neon;
00087     class Sodium;
00088     class Magnesium;
00089     class Aluminum;
00090     class Silicon;
00091     class Phosphorus;
00092     class Sulfur;
00093     class Chlorine;
00094     class Argon;
00095     class Potassium;
00096     class Calcium;
00097     class Scandium;
00098     class Titanium;
00099     class Vanadium;
00100     class Chromium;
00101     class Manganese;
00102     class Iron;
00103     class Cobalt;
00104     class Nickel;
00105     class Copper;
00106     class Zinc;
00107     class Gallium;
00108     class Germanium;
00109     class Arsenic;
00110     class Selenium;
00111     class Bromine;
00112     class Krypton;
00113     class Rubidium;
00114     class Strontium;
00115     class Yttrium;
00116     class Zirconium;
00117     class Niobium;
00118     class Molybdenum;
00119     class Technetium;
00120     class Ruthenium;
00121     class Rhodium;
00122     class Palladium;
00123     class Silver;
00124     class Cadmium;
00125     class Indium;
00126     class Tin;
00127     class Antimony;
00128     class Tellurium;
00129     class Iodine;
00130     class Xenon;
00131     class Cesium;
00132     class Barium;
00133     class Lanthanum;
00134     class Cerium;
00135     class Praseodymium;
00136     class Neodymium;
00137     class Promethium;
00138     class Samarium;
00139     class Europium;
00140     class Gadolinium;
00141     class Terbium;
00142     class Dysprosium;
00143     class Holmium;
00144     class Erbium;
00145     class Thulium;
00146     class Ytterbium;
00147     class Lutetium;
00148     class Hafnium;
00149     class Tantalum;
00150     class Tungsten;
00151     class Rhenium;
00152     class Osmium;
00153     class Iridium;
00154     class Platinum;
00155     class Gold;
00156     class Mercury;
00157     class Thallium;
00158     class Lead;
00159     class Bismuth;
00160     class Polonium;
00161     class Astatine;
00162     class Radon;
00163     class Francium;
00164     class Radium;
00165     class Actinium;
00166     class Thorium;
00167     class Protactinium;
00168     class Uranium;
00169     class Neptunium;
00170     class Plutonium;
00171     class Americium;
00172     class Curium;
00173     class Berkelium;
00174     class Californium;
00175     class Einsteinium;
00176     class Fermium;
00177     class Mendelevium;
00178     class Nobelium;
00179     class Lawrencium;
00180     class Rutherfordium;
00181     class Dubnium;
00182     class Seaborgium;
00183     class Bohrium;
00184     class Hassium;
00185     class Meitnerium;
00186     class Darmstadtium;
00187     class Roentgenium;
00188     class Ununbium;
00189     class Ununtrium;
00190     class Ununquadium;
00191     class Ununpentium;
00192     class Ununhexium;
00193 
00194     // typedefs for multiply named elements
00195     typedef Sulfur Sulphur;
00196     typedef Aluminum Aluminium;
00197     typedef Cesium Caesium;
00198     typedef Darmstadtium Ununnilium;
00199     typedef Roentgenium Unununium;
00200 
00201 private:
00202 
00203 // No, Microsoft Visual Studio, private data do not need to be exported
00204 #if defined(_MSC_VER)
00205 #pragma warning(push)
00206 #pragma warning(disable:4251)
00207 #endif
00208 
00209     class Impl;
00210     GrinPointer<Impl> impl;
00211 
00212 #if defined(_MSC_VER)
00213 #pragma warning(pop)
00214 #endif
00215 
00216 
00217 };
00218 
00219 SimTK_MOLMODEL_EXPORT std::ostream& operator<<(std::ostream&, const Element&);
00220 
00221 // TODO - populate parameters
00222 class Element::Hydrogen : public Element {public: Hydrogen() : 
00223     Element(1, "hydrogen", "H", 1.007947) {} };
00224 class Element::Deuterium : public Element {public: Deuterium() :
00225     Element(1, "deuterium", "D", 2.01355321270) {} };
00226 class Element::Helium : public Element {public: Helium() :
00227     Element(2, "helium", "He", 4.003) {} };
00228 class Element::Lithium : public Element {public: Lithium() :
00229     Element(3, "lithium", "Li", 6.9412) {} };
00230 class Element::Beryllium : public Element {public: Beryllium() :
00231     Element(4, "beryllium", "Be", 9.0121823) {} };
00232 class Element::Boron : public Element {public: Boron() :
00233     Element(5, "boron", "B", 10.8117) {} };
00234 class Element::Carbon : public Element {public: Carbon() :
00235     Element(6, "carbon", "C", 12.01078) {} };
00236 class Element::Nitrogen : public Element {public: Nitrogen() :
00237     Element(7, "nitrogen", "N", 14.00672) {} };
00238 class Element::Oxygen : public Element {public: Oxygen() :
00239     Element(8, "oxygen", "O", 15.99943) {} };
00240 class Element::Fluorine : public Element {public: Fluorine() :
00241     Element(9, "fluorine", "F", 18.99840325) {} };
00242 class Element::Neon : public Element {public: Neon() :
00243     Element(10, "neon", "Ne", 20.17976) {} };
00244 class Element::Sodium : public Element {public: Sodium() :
00245     Element(11, "sodium", "Na", 22.989769282) {} };
00246 class Element::Magnesium : public Element {public: Magnesium() :
00247     Element(12, "magnesium", "Mg", 24.30506) {} };
00248 class Element::Aluminum : public Element {public: Aluminum() :
00249     Element(13, "aluminum", "Al", 26.98153868) {} };
00250 class Element::Silicon : public Element {public: Silicon() :
00251     Element(14, "silicon", "Si", 28.08553) {} };
00252 class Element::Phosphorus : public Element {public: Phosphorus() :
00253     Element(15, "phosphorus", "P", 30.9737622) {} };
00254 class Element::Sulfur : public Element {public: Sulfur() :
00255     Element(16, "sulfur", "S", 32.0655) {} };
00256 class Element::Chlorine : public Element {public: Chlorine() :
00257     Element(17, "chlorine", "Cl", 35.4532) {} };
00258 class Element::Argon : public Element {public: Argon() :
00259     Element(18, "argon", "Ar", 39.9481) {} };
00260 class Element::Potassium : public Element {public: Potassium() :
00261     Element(19, "potassium", "K", 39.09831) {} };
00262 class Element::Calcium : public Element {public: Calcium() :
00263     Element(20, "calcium", "Ca", 40.0784) {} };
00264 class Element::Scandium : public Element {public: Scandium() :
00265     Element(21, "scandium", "Sc", 44.9559126) {} };
00266 class Element::Titanium : public Element {public: Titanium() :
00267     Element(22, "titanium", "Ti", 47.8671) {} };
00268 class Element::Vanadium : public Element {public: Vanadium() :
00269     Element(23, "vanadium", "V", 50.94151) {} };
00270 class Element::Chromium : public Element {public: Chromium() :
00271     Element(24, "chromium", "Cr", 51.99616) {} };
00272 class Element::Manganese : public Element {public: Manganese() :
00273     Element(25, "manganese", "Mn", 54.9380455) {} };
00274 class Element::Iron : public Element {public: Iron() :
00275     Element(26, "iron", "Fe", 55.8452) {} };
00276 class Element::Cobalt : public Element {public: Cobalt() :
00277     Element(27, "cobalt", "Co", 58.9331955) {} };
00278 class Element::Nickel : public Element {public: Nickel() :
00279     Element(28, "nickel", "Ni", 58.69342) {} };
00280 class Element::Copper : public Element {public: Copper() :
00281     Element(29, "copper", "Cu", 63.5463) {} };
00282 class Element::Zinc : public Element {public: Zinc() :
00283     Element(30, "zinc", "Zn", 65.4094) {} };
00284 class Element::Gallium : public Element {public: Gallium() :
00285     Element(31, "gallium", "Ga", 69.7231) {} };
00286 class Element::Germanium : public Element {public: Germanium() :
00287     Element(32, "germanium", "Ge", 72.641) {} };
00288 class Element::Arsenic : public Element {public: Arsenic() :
00289     Element(33, "arsenic", "As", 74.921602) {} };
00290 class Element::Selenium : public Element {public: Selenium() :
00291     Element(34, "selenium", "Se", 78.963) {} };
00292  class Element::Bromine : public Element {public: Bromine() :
00293     Element(35, "bromine", "Br", 79.9041) {} };
00294 class Element::Krypton : public Element {public: Krypton() :
00295     Element(36, "krypton", "Kr", 83.7982) {} };
00296 class Element::Rubidium : public Element {public: Rubidium() :
00297     Element(37, "rubidium", "Rb", 85.46783) {} };
00298 class Element::Strontium : public Element {public: Strontium() :
00299     Element(38, "strontium", "Sr", 87.621) {} };
00300 class Element::Yttrium : public Element {public: Yttrium() :
00301     Element(39, "yttrium", "Y", 88.905852) {} };
00302 class Element::Zirconium : public Element {public: Zirconium() :
00303     Element(40, "zirconium", "Zr", 91.2242) {} };
00304 class Element::Niobium : public Element {public: Niobium() :
00305     Element(41, "niobium", "Nb", 92.906382) {} };
00306 class Element::Molybdenum : public Element {public: Molybdenum() :
00307     Element(42, "molybdenum", "Mo", 95.942) {} };
00308 class Element::Technetium : public Element {public: Technetium() :
00309     Element(43, "technetium", "Tc", 98) {} };
00310 class Element::Ruthenium : public Element {public: Ruthenium() :
00311     Element(44, "ruthenium", "Ru", 101.072) {} };
00312 class Element::Rhodium : public Element {public: Rhodium() :
00313     Element(45, "rhodium", "Rh", 102.905502) {} };
00314 class Element::Palladium : public Element {public: Palladium() :
00315     Element(46, "palladium", "Pd", 106.421) {} };
00316 class Element::Silver : public Element {public: Silver() :
00317     Element(47, "silver", "Ag", 107.86822) {} };
00318 class Element::Cadmium : public Element {public: Cadmium() :
00319     Element(48, "cadmium", "Cd", 112.4118) {} };
00320 class Element::Indium : public Element {public: Indium() :
00321     Element(49, "indium", "In", 114.8183) {} };
00322 class Element::Tin : public Element {public: Tin() :
00323     Element(50, "tin", "Sn", 118.7107) {} };
00324 class Element::Antimony : public Element {public: Antimony() :
00325     Element(51, "antimony", "Sb", 121.7601) {} };
00326 class Element::Tellurium : public Element {public: Tellurium() :
00327     Element(52, "tellurium", "Te", 127.603) {} };
00328 class Element::Iodine : public Element {public: Iodine() :
00329     Element(53, "iodine", "I", 126.904473) {} };
00330 class Element::Xenon : public Element {public: Xenon() :
00331     Element(54, "xenon", "Xe", 131.2936) {} };
00332 class Element::Cesium : public Element {public: Cesium() :
00333     Element(55, "cesium", "Cs", 132.90545192) {} };
00334 class Element::Barium : public Element {public: Barium() :
00335     Element(56, "barium", "Ba", 137.3277) {} };
00336 class Element::Lanthanum : public Element {public: Lanthanum() :
00337     Element(57, "lanthanum", "La", 138.905477) {} };
00338 class Element::Cerium : public Element {public: Cerium() :
00339     Element(58, "cerium", "Ce", 140.1161) {} };
00340 class Element::Praseodymium : public Element {public: Praseodymium() :
00341     Element(59, "praseodymium", "Pr", 140.907652) {} };
00342 class Element::Neodymium : public Element {public: Neodymium() :
00343     Element(60, "neodymium", "Nd", 144.2423) {} };
00344 class Element::Promethium : public Element {public: Promethium() :
00345     Element(61, "promethium", "Pm", 145) {} };
00346 class Element::Samarium : public Element {public: Samarium() :
00347     Element(62, "samarium", "Sm", 150.362) {} };
00348 class Element::Europium : public Element {public: Europium() :
00349     Element(63, "europium", "Eu", 151.9641) {} };
00350 class Element::Gadolinium : public Element {public: Gadolinium() :
00351     Element(64, "gadolinium", "Gd", 157.253) {} };
00352 class Element::Terbium : public Element {public: Terbium() :
00353     Element(65, "terbium", "Tb", 158.925352) {} };
00354 class Element::Dysprosium : public Element {public: Dysprosium() :
00355     Element(66, "dysprosium", "Dy", 162.5001) {} };
00356 class Element::Holmium : public Element {public: Holmium() :
00357     Element(67, "holmium", "Ho", 164.930322) {} };
00358 class Element::Erbium : public Element {public: Erbium() :
00359     Element(68, "erbium", "Er", 167.2593) {} };
00360 class Element::Thulium : public Element {public: Thulium() :
00361     Element(69, "thulium", "Tm", 168.934212) {} };
00362 class Element::Ytterbium : public Element {public: Ytterbium() :
00363     Element(70, "ytterbium", "Yb", 173.043) {} };
00364 class Element::Lutetium : public Element {public: Lutetium() :
00365     Element(71, "lutetium", "Lu", 174.9671) {} };
00366 class Element::Hafnium : public Element {public: Hafnium() :
00367     Element(72, "hafnium", "Hf", 178.492) {} };
00368 class Element::Tantalum : public Element {public: Tantalum() :
00369     Element(73, "tantalum", "Ta", 180.947882) {} };
00370 class Element::Tungsten : public Element {public: Tungsten() :
00371     Element(74, "tungsten", "W", 183.841) {} };
00372 class Element::Rhenium : public Element {public: Rhenium() :
00373     Element(75, "rhenium", "Re", 186.2071) {} };
00374 class Element::Osmium : public Element {public: Osmium() :
00375     Element(76, "osmium", "Os", 190.233) {} };
00376 class Element::Iridium : public Element {public: Iridium() :
00377     Element(77, "iridium", "Ir", 192.2173) {} };
00378 class Element::Platinum : public Element {public: Platinum() :
00379     Element(78, "platinum", "Pt", 195.0849) {} };
00380 class Element::Gold : public Element {public: Gold() :
00381     Element(79, "gold", "Au", 196.9665694) {} };
00382 class Element::Mercury : public Element {public: Mercury() :
00383     Element(80, "mercury", "Hg", 200.592) {} };
00384 class Element::Thallium : public Element {public: Thallium() :
00385     Element(81, "thallium", "Tl", 204.38332) {} };
00386 class Element::Lead : public Element {public: Lead() :
00387     Element(82, "lead", "Pb", 207.21) {} };
00388 class Element::Bismuth : public Element {public: Bismuth() :
00389     Element(83, "bismuth", "Bi", 208.980401) {} };
00390 class Element::Polonium : public Element {public: Polonium() :
00391     Element(84, "polonium", "Po", 209) {} };
00392 class Element::Astatine : public Element {public: Astatine() :
00393     Element(85, "astatine", "At", 210) {} };
00394 class Element::Radon : public Element {public: Radon() :
00395     Element(86, "radon", "Rn", 222.018) {} };
00396 class Element::Francium : public Element {public: Francium() :
00397     Element(87, "francium", "Fr", 223) {} };
00398 class Element::Radium : public Element {public: Radium() :
00399     Element(88, "radium", "Ra", 226) {} };
00400 class Element::Actinium : public Element {public: Actinium() :
00401     Element(89, "actinium", "Ac", 227) {} };
00402 class Element::Thorium : public Element {public: Thorium() :
00403     Element(90, "thorium", "Th", 232.038062) {} };
00404 class Element::Protactinium : public Element {public: Protactinium() :
00405     Element(91, "protactinium", "Pa", 231.035882) {} };
00406 class Element::Uranium : public Element {public: Uranium() :
00407     Element(92, "uranium", "U", 238.028913) {} };
00408 class Element::Neptunium : public Element {public: Neptunium() :
00409     Element(93, "neptunium", "Np", 237) {} };
00410 class Element::Plutonium : public Element {public: Plutonium() :
00411     Element(94, "plutonium", "Pu", 244) {} };
00412 class Element::Americium : public Element {public: Americium() :
00413     Element(95, "americium", "Am", 243) {} };
00414 class Element::Curium : public Element {public: Curium() :
00415     Element(96, "curium", "Cm", 247) {} };
00416 class Element::Berkelium : public Element {public: Berkelium() :
00417     Element(97, "berkelium", "Bk", 247) {} };
00418 class Element::Californium : public Element {public: Californium() :
00419     Element(98, "californium", "Cf", 251) {} };
00420 class Element::Einsteinium : public Element {public: Einsteinium() :
00421     Element(99, "einsteinium", "Es", 252) {} };
00422 class Element::Fermium : public Element {public: Fermium() :
00423     Element(100, "fermium", "Fm", 257) {} };
00424 class Element::Mendelevium : public Element {public: Mendelevium() :
00425     Element(101, "mendelevium", "Md", 258) {} };
00426 class Element::Nobelium : public Element {public: Nobelium() :
00427     Element(102, "nobelium", "No", 259) {} };
00428 class Element::Lawrencium : public Element {public: Lawrencium() :
00429     Element(103, "lawrencium", "Lr", 262) {} };
00430 class Element::Rutherfordium : public Element {public: Rutherfordium() :
00431     Element(104, "rutherfordium", "Rf", 261) {} };
00432 class Element::Dubnium : public Element {public: Dubnium() :
00433     Element(105, "dubnium", "Db", 262) {} };
00434 class Element::Seaborgium : public Element {public: Seaborgium() :
00435     Element(106, "seaborgium", "Sg", 266) {} };
00436 class Element::Bohrium : public Element {public: Bohrium() :
00437     Element(107, "bohrium", "Bh", 264) {} };
00438 class Element::Hassium : public Element {public: Hassium() :
00439     Element(108, "hassium", "Hs", 269) {} };
00440 class Element::Meitnerium : public Element {public: Meitnerium() :
00441     Element(109, "meitnerium", "Mt", 268) {} };
00442 class Element::Darmstadtium : public Element {public: Darmstadtium() :
00443     Element(110, "darmstadtium", "Ds", 281) {} };
00444 class Element::Roentgenium : public Element {public: Roentgenium() :
00445     Element(111, "roentgenium", "Rg", 272) {} };
00446 class Element::Ununbium : public Element {public: Ununbium() :
00447     Element(112, "ununbium", "Uub", 285) {} };
00448 class Element::Ununtrium : public Element {public: Ununtrium() :
00449     Element(113, "ununtrium", "Uut", 284) {} };
00450 class Element::Ununquadium : public Element {public: Ununquadium() :
00451     Element(114, "ununquadium", "Uuq", 289) {} };
00452 class Element::Ununpentium : public Element {public: Ununpentium() :
00453     Element(115, "ununpentium", "Uup", 288) {} };
00454 class Element::Ununhexium : public Element {public: Ununhexium() :
00455     Element(116, "ununhexium", "Uuh", 292) {} };
00456 
00457 
00458 } // namespace SimTK
00459 
00460 #endif // SimTK_MOLMODEL_ELEMENT_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines